diff --git a/CMakeLists.txt b/CMakeLists.txt index b34f583906d..cc306ab0ce1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,12 +21,17 @@ project(TrinityCore) cmake_policy(SET CMP0005 NEW) cmake_policy(SET CMP0043 NEW) # Ignore COMPILE_DEFINITIONS_ properties cmake_policy(SET CMP0054 NEW) # Only interpret if() arguments as variables or keywords when unquoted - prevents intepreting if(SOME_STRING_VARIABLE MATCHES "MSVC") as if(SOME_STRING_VARIABLE MATCHES "1") +cmake_policy(SET CMP0067 NEW) # Honor language standard in try_compile() source-file signature cmake_policy(SET CMP0074 NEW) # find_package() uses _ROOT variables if(POLICY CMP0144) cmake_policy(SET CMP0144 NEW) # find_package() uses upper-case _ROOT variables endif() +if(POLICY CMP0153) + cmake_policy(SET CMP0153 NEW) # The exec_program() command should not be called +endif() + # Set RPATH-handing (CMake parameters) set(CMAKE_SKIP_BUILD_RPATH 0) set(CMAKE_BUILD_WITH_INSTALL_RPATH 0) diff --git a/README.md b/README.md index 84675eb0414..789e2ebd995 100644 --- a/README.md +++ b/README.md @@ -19,11 +19,12 @@ ## Build Status -master | 3.3.5 | wotlk_classic +master | 3.3.5 | cata_classic :------------: | :------------: | :------------: -[![master Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/master.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/master) | [![3.3.5 Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/3.3.5.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/3.3.5) | [![wotlk_classic Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/wotlk_classic.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/wotlk_classic) -[![master Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/master?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/3.3.5?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/3.3.5) | [![Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/wotlk_classic?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/wotlk_classic) -[![master GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=master&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Amaster+event%3Apush) | [![3.3.5 GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=3.3.5&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3A3.3.5+event%3Apush) | [![wotlk_classic GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=wotlk_classic&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Awotlk_classic+event%3Apush) +[![master Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/master.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/master) | [![3.3.5 Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/3.3.5.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/3.3.5) | [![cata_classic Build Status](https://circleci.com/gh/TrinityCore/TrinityCore/tree/cata_classic.svg?style=shield)](https://circleci.com/gh/TrinityCore/TrinityCore/tree/cata_classic) +[![master Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/master?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/3.3.5?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/3.3.5) | [![Build status](https://ci.appveyor.com/api/projects/status/54d0u1fxe50ad80o/branch/cata_classic?svg=true)](https://ci.appveyor.com/project/DDuarte/trinitycore/branch/cata_classic) +[![master GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=master&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Amaster+event%3Apush) | [![3.3.5 GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=3.3.5&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3A3.3.5+event%3Apush) | [![cata_classic GCC Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/gcc-build.yml/badge.svg?branch=cata_classic&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Acata_classic+event%3Apush) +[![master macOS arm64 Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/macos-arm-build.yml/badge.svg?branch=master&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Amaster+event%3Apush) | | [![cata_classic macOS arm64 Build status](https://github.com/TrinityCore/TrinityCore/actions/workflows/macos-arm-build.yml/badge.svg?branch=cata_classic&event=push)](https://github.com/TrinityCore/TrinityCore/actions?query=workflow%3AGCC+branch%3Acata_classic+event%3Apush) [![Coverity Scan Build Status](https://scan.coverity.com/projects/435/badge.svg)](https://scan.coverity.com/projects/435) | [![Coverity Scan Build Status](https://scan.coverity.com/projects/4656/badge.svg)](https://scan.coverity.com/projects/4656) | ## Introduction diff --git a/cfpve.cpp b/cfpve.cpp new file mode 100644 index 00000000000..d87a1b273e1 --- /dev/null +++ b/cfpve.cpp @@ -0,0 +1,108 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 . + */ + + +#include "ScriptMgr.h" +#include "Player.h" +#include "Group.h" +#include "ObjectAccessor.h" + +enum MiscCrossFactionPVE +{ + ZONE_ICECROWN_CITADEL = 4812, + ICC_MAP_ID = 631, + ZONE_TRIAL_OF_THE_CHAMPION = 4723, + TOCHAMPION_MAP_ID = 650, + ZONE_TRIAL_OF_THE_CRUSADER = 4722, + TOCRUSADER_MAP_ID = 649, + ZONE_PIT_OF_SARON = 4813, + POS_MAP_ID = 658, + ZONE_HALLS_OF_REFLECTION = 4820, + HOR_MAP_ID = 668, + ZONE_FORGE_OF_SOULS = 4809, + FOS_MAP_ID = 632, + ZONE_HALLS_OF_STONE = 4264, + HOS_MAP_ID = 599, + ZONE_THE_NEXUS = 4265, + TN_MAP_ID = 576, + ZONE_WARSONG_GULCH = 3277, + WSG_MAP_ID = 489, + ZONE_ARATHI_BASIN = 3358, + AB_MAP_ID = 529 +}; + +class CfPlayerScript : public PlayerScript +{ +public: + CfPlayerScript() : PlayerScript("CfPlayerScript") {} + + // Called when a player enters the world (logs in or teleports) + void OnLogin(Player* player, bool /* firstLogin */) override + { + HandleFactionChange(player, player->GetMapId()); + } + + // Called when a player changes zones + void OnUpdateZone(Player* player, uint32 newZone, uint32 /*newArea*/) override + { + HandleFactionChange(player, newZone); + } + +private: + // Store the original faction in a map + std::unordered_map originalFactionMap; + + void HandleFactionChange(Player* player, uint32 zoneOrMapId) + { + static const std::set zoneSet = { + ICC_MAP_ID, TOCHAMPION_MAP_ID, TOCRUSADER_MAP_ID, POS_MAP_ID, + HOR_MAP_ID, FOS_MAP_ID, HOS_MAP_ID, TN_MAP_ID, WSG_MAP_ID, AB_MAP_ID + }; + + if (zoneSet.count(zoneOrMapId)) + { + // Change faction to match the group leader + if (Group* group = player->GetGroup()) + { + if (Player* leader = ObjectAccessor::FindPlayer(group->GetLeaderGUID())) + { + if (originalFactionMap.find(player->GetGUID()) == originalFactionMap.end()) + { + // Store the original faction + originalFactionMap[player->GetGUID()] = player->GetFaction(); + } + player->SetFaction(leader->GetFaction()); + } + } + } + else + { + // Restore player's original faction + auto it = originalFactionMap.find(player->GetGUID()); + if (it != originalFactionMap.end()) + { + player->SetFaction(it->second); + originalFactionMap.erase(it); // Clean up the map after restoring + } + } + } +}; + +void AddSC_cfpve() +{ + new CfPlayerScript(); +} diff --git a/cmake/compiler/clang/settings.cmake b/cmake/compiler/clang/settings.cmake index eec7bf581a7..7b5084f4423 100644 --- a/cmake/compiler/clang/settings.cmake +++ b/cmake/compiler/clang/settings.cmake @@ -1,8 +1,3 @@ -# Set build-directive (used in core to tell which buildtype we used) -target_compile_definitions(trinity-compile-option-interface - INTERFACE - -D_BUILD_DIRECTIVE="$") - set(CLANG_EXPECTED_VERSION 11.0.0) if(CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") # apple doesnt like to do the sane thing which would be to use the same version numbering as regular clang @@ -38,7 +33,7 @@ if (NOT CLANG_HAVE_PROPER_CHARCONV) message(STATUS "Clang: Detected from_chars bug for 64-bit integers, workaround enabled") target_compile_definitions(trinity-compile-option-interface INTERFACE - -DTRINITY_NEED_CHARCONV_WORKAROUND) + TRINITY_NEED_CHARCONV_WORKAROUND) endif() if(WITH_WARNINGS) diff --git a/cmake/compiler/gcc/settings.cmake b/cmake/compiler/gcc/settings.cmake index 99417c1fbf9..4861f48dccc 100644 --- a/cmake/compiler/gcc/settings.cmake +++ b/cmake/compiler/gcc/settings.cmake @@ -1,8 +1,3 @@ -# Set build-directive (used in core to tell which buildtype we used) -target_compile_definitions(trinity-compile-option-interface - INTERFACE - -D_BUILD_DIRECTIVE="$") - set(GCC_EXPECTED_VERSION 11.1.0) if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS GCC_EXPECTED_VERSION) @@ -11,6 +6,10 @@ else() message(STATUS "GCC: Minimum version required is ${GCC_EXPECTED_VERSION}, found ${CMAKE_CXX_COMPILER_VERSION} - ok!") endif() +target_compile_options(trinity-compile-option-interface + INTERFACE + -fno-delete-null-pointer-checks) + if(PLATFORM EQUAL 32) # Required on 32-bit systems to enable SSE2 (standard on x64) target_compile_options(trinity-compile-option-interface @@ -21,8 +20,8 @@ endif() if(TRINITY_SYSTEM_PROCESSOR MATCHES "x86|amd64") target_compile_definitions(trinity-compile-option-interface INTERFACE - -DHAVE_SSE2 - -D__SSE2__) + HAVE_SSE2 + __SSE2__) message(STATUS "GCC: SFMT enabled, SSE2 flags forced") endif() @@ -36,7 +35,8 @@ if(WITH_WARNINGS) -Winvalid-pch -Wfatal-errors -Woverloaded-virtual - -Wno-missing-field-initializers) # this warning is useless when combined with structure members that have default initializers + -Wno-missing-field-initializers # this warning is useless when combined with structure members that have default initializers + -Wno-maybe-uninitialized) # this warning causes many false positives with std::optional message(STATUS "GCC: All warnings enabled") endif() diff --git a/cmake/compiler/icc/settings.cmake b/cmake/compiler/icc/settings.cmake index 87187cc3a5c..a17e2c45d2a 100644 --- a/cmake/compiler/icc/settings.cmake +++ b/cmake/compiler/icc/settings.cmake @@ -1,7 +1,3 @@ -target_compile_definitions(trinity-compile-option-interface - INTERFACE - -D_BUILD_DIRECTIVE="$") - if(PLATFORM EQUAL 32) target_compile_options(trinity-compile-option-interface INTERFACE diff --git a/cmake/compiler/mingw/settings.cmake b/cmake/compiler/mingw/settings.cmake deleted file mode 100644 index 94cb2f9d522..00000000000 --- a/cmake/compiler/mingw/settings.cmake +++ /dev/null @@ -1,42 +0,0 @@ -# set up output paths for executable binaries (.exe-files, and .dll-files on DLL-capable platforms) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - -# Set build-directive (used in core to tell which buildtype we used) -target_compile_definitions(trinity-compile-option-interface - INTERFACE - -D_BUILD_DIRECTIVE="$") - -if(PLATFORM EQUAL 32) - # Required on 32-bit systems to enable SSE2 (standard on x64) - target_compile_options(trinity-compile-option-interface - INTERFACE - -msse2 - -mfpmath=sse) -endif() -target_compile_definitions(trinity-compile-option-interface - INTERFACE - -DHAVE_SSE2 - -D__SSE2__) -message(STATUS "GCC: SFMT enabled, SSE2 flags forced") - -if(WITH_WARNINGS) - target_compile_options(trinity-warning-interface - INTERFACE - -W - -Wall - -Wextra - -Winit-self - -Winvalid-pch - -Wfatal-errors - -Woverloaded-virtual) - - message(STATUS "GCC: All warnings enabled") -endif() - -if(WITH_COREDEBUG) - target_compile_options(trinity-compile-option-interface - INTERFACE - -g3) - - message(STATUS "GCC: Debug-flags set (-g3)") -endif() diff --git a/cmake/compiler/msvc/settings.cmake b/cmake/compiler/msvc/settings.cmake index a8be99d6bae..0dfab0255ea 100644 --- a/cmake/compiler/msvc/settings.cmake +++ b/cmake/compiler/msvc/settings.cmake @@ -1,6 +1,3 @@ -# set up output paths for executable binaries (.exe-files, and .dll-files on DLL-capable platforms) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - set(MSVC_EXPECTED_VERSION 19.32) set(MSVC_EXPECTED_VERSION_STRING "Microsoft Visual Studio 2022 17.2") @@ -31,17 +28,13 @@ target_compile_options(trinity-compile-option-interface INTERFACE /permissive-) -# set up output paths ofr static libraries etc (commented out - shown here as an example only) -#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - if(PLATFORM EQUAL 64) # This definition is necessary to work around a bug with Intellisense described # here: http://tinyurl.com/2cb428. Syntax highlighting is important for proper # debugger functionality. target_compile_definitions(trinity-compile-option-interface INTERFACE - -D_WIN64) + _WIN64) message(STATUS "MSVC: 64-bit platform, enforced -D_WIN64 parameter") @@ -59,24 +52,19 @@ else() message(STATUS "MSVC: Disabled Safe Exception Handlers for debug builds") endif() -# Set build-directive (used in core to tell which buildtype we used) -# msbuild/devenv don't set CMAKE_MAKE_PROGRAM, you can choose build type from a dropdown after generating projects if("${CMAKE_MAKE_PROGRAM}" MATCHES "MSBuild") - target_compile_definitions(trinity-compile-option-interface + # multithreaded compiling on VS + target_compile_options(trinity-compile-option-interface INTERFACE - -D_BUILD_DIRECTIVE="$(ConfigurationName)") + /MP) else() - # while all make-like generators do (nmake, ninja) - target_compile_definitions(trinity-compile-option-interface + # Forces writes to the PDB file to be serialized through mspdbsrv.exe (/FS) + # Enable faster PDB generation in parallel builds by minimizing RPC calls to mspdbsrv.exe (/Zf) + target_compile_options(trinity-compile-option-interface INTERFACE - -D_BUILD_DIRECTIVE="$") + $<$:/FS /Zf>) endif() -# multithreaded compiling on VS -target_compile_options(trinity-compile-option-interface - INTERFACE - /MP) - if((PLATFORM EQUAL 64) OR (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0.23026.0) OR BUILD_SHARED_LIBS) # Enable extended object support target_compile_options(trinity-compile-option-interface @@ -86,36 +74,38 @@ if((PLATFORM EQUAL 64) OR (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0.2302 message(STATUS "MSVC: Enabled increased number of sections in object files") endif() -# /Zc:throwingNew. -# When you specify Zc:throwingNew on the command line, it instructs the compiler to assume -# that the program will eventually be linked with a conforming operator new implementation, -# and can omit all of these extra null checks from your program. -# http://blogs.msdn.com/b/vcblog/archive/2015/08/06/new-in-vs-2015-zc-throwingnew.aspx -target_compile_options(trinity-compile-option-interface - INTERFACE - /Zc:throwingNew) +if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + # /Zc:throwingNew. + # When you specify Zc:throwingNew on the command line, it instructs the compiler to assume + # that the program will eventually be linked with a conforming operator new implementation, + # and can omit all of these extra null checks from your program. + # http://blogs.msdn.com/b/vcblog/archive/2015/08/06/new-in-vs-2015-zc-throwingnew.aspx + target_compile_options(trinity-compile-option-interface + INTERFACE + /Zc:throwingNew) +endif() # Define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES - eliminates the warning by changing the strcpy call to strcpy_s, which prevents buffer overruns target_compile_definitions(trinity-compile-option-interface INTERFACE - -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) + _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) message(STATUS "MSVC: Overloaded standard names") # Ignore warnings about older, less secure functions target_compile_definitions(trinity-compile-option-interface INTERFACE - -D_CRT_SECURE_NO_WARNINGS) + _CRT_SECURE_NO_WARNINGS) message(STATUS "MSVC: Disabled NON-SECURE warnings") # Ignore warnings about POSIX deprecation target_compile_definitions(trinity-compile-option-interface INTERFACE - -D_CRT_NONSTDC_NO_WARNINGS) + _CRT_NONSTDC_NO_WARNINGS) # Force math constants like M_PI to be available target_compile_definitions(trinity-compile-option-interface INTERFACE - -D_USE_MATH_DEFINES) + _USE_MATH_DEFINES) message(STATUS "MSVC: Disabled POSIX warnings") @@ -167,8 +157,8 @@ target_compile_options(trinity-compile-option-interface if(ASAN) target_compile_definitions(trinity-compile-option-interface INTERFACE - -D_DISABLE_STRING_ANNOTATION - -D_DISABLE_VECTOR_ANNOTATION) + _DISABLE_STRING_ANNOTATION + _DISABLE_VECTOR_ANNOTATION) target_compile_options(trinity-compile-option-interface INTERFACE diff --git a/cmake/macros/CheckPlatform.cmake b/cmake/macros/CheckPlatform.cmake index 5dbd52a8773..c5aa63cceea 100644 --- a/cmake/macros/CheckPlatform.cmake +++ b/cmake/macros/CheckPlatform.cmake @@ -35,3 +35,13 @@ if(WIN32) elseif(UNIX) include("${CMAKE_SOURCE_DIR}/cmake/platform/unix/settings.cmake") endif() + +if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") + include("${CMAKE_SOURCE_DIR}/cmake/compiler/msvc/settings.cmake") +elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + include("${CMAKE_SOURCE_DIR}/cmake/compiler/clang/settings.cmake") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + include("${CMAKE_SOURCE_DIR}/cmake/compiler/gcc/settings.cmake") +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + include("${CMAKE_SOURCE_DIR}/cmake/compiler/icc/settings.cmake") +endif() diff --git a/cmake/macros/ConfigureBaseTargets.cmake b/cmake/macros/ConfigureBaseTargets.cmake index 26878eec1ba..77a66d085b2 100644 --- a/cmake/macros/ConfigureBaseTargets.cmake +++ b/cmake/macros/ConfigureBaseTargets.cmake @@ -13,14 +13,16 @@ add_library(trinity-compile-option-interface INTERFACE) # Use -std=c++11 instead of -std=gnu++11 set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_CXX_STANDARD 20) + +# Set build-directive (used in core to tell which buildtype we used) +target_compile_definitions(trinity-compile-option-interface + INTERFACE + _BUILD_DIRECTIVE="$") # An interface library to make the target features available to other targets add_library(trinity-feature-interface INTERFACE) -target_compile_features(trinity-feature-interface - INTERFACE - cxx_std_20) - # An interface library to make the warnings level available to other targets # This interface taget is set-up through the platform specific script add_library(trinity-warning-interface INTERFACE) diff --git a/cmake/macros/FindMySQL.cmake b/cmake/macros/FindMySQL.cmake index 0123f86a9dc..1f3f8d406c5 100644 --- a/cmake/macros/FindMySQL.cmake +++ b/cmake/macros/FindMySQL.cmake @@ -69,18 +69,20 @@ if(UNIX) if(MYSQL_CONFIG) message(STATUS "Using mysql-config: ${MYSQL_CONFIG}") # set INCLUDE_DIR - exec_program(${MYSQL_CONFIG} - ARGS --include + execute_process( + COMMAND "${MYSQL_CONFIG}" --include OUTPUT_VARIABLE MY_TMP + OUTPUT_STRIP_TRAILING_WHITESPACE ) string(REGEX REPLACE "-I([^ ]*)( .*)?" "\\1" MY_TMP "${MY_TMP}") set(MYSQL_ADD_INCLUDE_PATH ${MY_TMP} CACHE FILEPATH INTERNAL) #message("[DEBUG] MYSQL ADD_INCLUDE_PATH : ${MYSQL_ADD_INCLUDE_PATH}") # set LIBRARY_DIR - exec_program(${MYSQL_CONFIG} - ARGS --libs_r + execute_process( + COMMAND "${MYSQL_CONFIG}" --libs_r OUTPUT_VARIABLE MY_TMP + OUTPUT_STRIP_TRAILING_WHITESPACE ) set(MYSQL_ADD_LIBRARIES "") string(REGEX MATCHALL "-l[^ ]*" MYSQL_LIB_LIST "${MY_TMP}") @@ -104,10 +106,61 @@ if(UNIX) endif(MYSQL_CONFIG) endif(UNIX) +set(_MYSQL_ROOT_PATHS) + if(WIN32) # read environment variables and change \ to / file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" PROGRAM_FILES_32) file(TO_CMAKE_PATH "$ENV{ProgramW6432}" PROGRAM_FILES_64) + + cmake_host_system_information( + RESULT + _MYSQL_ROOT_HINTS_SUBKEYS + QUERY + WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB" SUBKEYS + VIEW BOTH + ) + list(SORT _MYSQL_ROOT_HINTS_SUBKEYS COMPARE NATURAL ORDER DESCENDING) + + set(_MYSQL_ROOT_HINTS_REGISTRY_LOCATIONS) + foreach(subkey IN LISTS _MYSQL_ROOT_HINTS_SUBKEYS) + cmake_host_system_information( + RESULT + _MYSQL_ROOT_HINTS_REGISTRY_LOCATION + QUERY + WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\${subkey}" VALUE "Location" + VIEW BOTH + ) + list(APPEND _MYSQL_ROOT_HINTS_REGISTRY_LOCATIONS ${_MYSQL_ROOT_HINTS_REGISTRY_LOCATION}) + endforeach() + + set(_MYSQL_ROOT_HINTS + ${_MYSQL_ROOT_HINTS} + ${_MYSQL_ROOT_HINTS_REGISTRY_LOCATIONS} + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.4;INSTALLDIR]" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.4 (x64);INSTALLDIR]" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.5;INSTALLDIR]" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.5 (x64);INSTALLDIR]" + ) + + file(GLOB _MYSQL_ROOT_PATHS_VERSION_SUBDIRECTORIES + LIST_DIRECTORIES TRUE + "${PROGRAM_FILES_64}/MySQL/MySQL Server *" + "${PROGRAM_FILES_32}/MySQL/MySQL Server *" + "$ENV{SystemDrive}/MySQL/MySQL Server *" + ) + + list(SORT _MYSQL_ROOT_PATHS_VERSION_SUBDIRECTORIES COMPARE NATURAL ORDER DESCENDING) + + set(_MYSQL_ROOT_PATHS + ${_MYSQL_ROOT_PATHS} + ${_MYSQL_ROOT_PATHS_VERSION_SUBDIRECTORIES} + "${PROGRAM_FILES_64}/MySQL" + "${PROGRAM_FILES_32}/MySQL" + "$ENV{SystemDrive}/MySQL" + ) endif(WIN32) find_path(MYSQL_INCLUDE_DIR @@ -122,40 +175,7 @@ find_path(MYSQL_INCLUDE_DIR /usr/local/include /usr/local/include/mysql /usr/local/mysql/include - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.3" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.2" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.1" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.0" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 5.7" - "${PROGRAM_FILES_64}/MySQL" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.3" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.2" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.1" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.0" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 5.7" - "${PROGRAM_FILES_32}/MySQL" - "C:/MySQL" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.3;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.2;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.1;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.0;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.3;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.2;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.1;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.0;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.3" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.2" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.1" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.0" - "$ENV{SystemDrive}/MySQL/MySQL Server 5.7" - "c:/msys/local/include" - "$ENV{MYSQL_ROOT}" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.4;INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.4 (x64);INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.5;INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.5 (x64);INSTALLDIR]" + ${_MYSQL_ROOT_PATHS} PATH_SUFFIXES include include/mysql @@ -188,40 +208,7 @@ if(WIN32) ${_MYSQL_ROOT_HINTS} PATHS ${MYSQL_ADD_LIBRARIES_PATH} - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.3" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.2" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.1" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.0" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 5.7" - "${PROGRAM_FILES_64}/MySQL/lib" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.3" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.2" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.1" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.0" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 5.7" - "${PROGRAM_FILES_32}/MySQL/lib" - "C:/MySQL/lib/debug" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.3;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.2;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.1;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.0;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.3;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.2;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.1;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.0;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.3" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.2" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.1" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.0" - "$ENV{SystemDrive}/MySQL/MySQL Server 5.7" - "c:/msys/local/lib" - "$ENV{MYSQL_ROOT}" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.4;INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.4 (x64);INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.5;INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.5 (x64);INSTALLDIR]" + ${_MYSQL_ROOT_PATHS} PATH_SUFFIXES lib lib/opt @@ -263,40 +250,7 @@ if(WIN32) HINTS ${_MYSQL_ROOT_HINTS} PATHS - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.3" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.2" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.1" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 8.0" - "${PROGRAM_FILES_64}/MySQL/MySQL Server 5.7" - "${PROGRAM_FILES_64}/MySQL" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.3" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.2" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.1" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 8.0" - "${PROGRAM_FILES_32}/MySQL/MySQL Server 5.7" - "${PROGRAM_FILES_32}/MySQL" - "C:/MySQL/bin/debug" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.3;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.2;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.1;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.0;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.3;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.2;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.1;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.0;Location]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.3" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.2" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.1" - "$ENV{SystemDrive}/MySQL/MySQL Server 8.0" - "$ENV{SystemDrive}/MySQL/MySQL Server 5.7" - "c:/msys/local/bin" - "$ENV{MYSQL_ROOT}" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.4;INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.4 (x64);INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.5;INSTALLDIR]" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MariaDB 10.5 (x64);INSTALLDIR]" + ${_MYSQL_ROOT_PATHS} PATH_SUFFIXES bin bin/opt diff --git a/cmake/platform/unix/settings.cmake b/cmake/platform/unix/settings.cmake index 846742906b0..dbed87ed6d8 100644 --- a/cmake/platform/unix/settings.cmake +++ b/cmake/platform/unix/settings.cmake @@ -46,14 +46,6 @@ if(APPLE) endif() message(STATUS "UNIX: Detected compiler: ${CMAKE_C_COMPILER}") -if(CMAKE_C_COMPILER MATCHES "gcc" OR CMAKE_C_COMPILER_ID STREQUAL "GNU") - include(${CMAKE_SOURCE_DIR}/cmake/compiler/gcc/settings.cmake) -elseif(CMAKE_C_COMPILER MATCHES "icc") - include(${CMAKE_SOURCE_DIR}/cmake/compiler/icc/settings.cmake) -elseif(CMAKE_C_COMPILER MATCHES "clang" OR CMAKE_C_COMPILER_ID MATCHES "Clang") - include(${CMAKE_SOURCE_DIR}/cmake/compiler/clang/settings.cmake) -else() - target_compile_definitions(trinity-compile-option-interface - INTERFACE - -D_BUILD_DIRECTIVE="${CMAKE_BUILD_TYPE}") -endif() + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$/bin") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$/lib") diff --git a/cmake/platform/win/settings.cmake b/cmake/platform/win/settings.cmake index 63c118f76e0..efae7696e17 100644 --- a/cmake/platform/win/settings.cmake +++ b/cmake/platform/win/settings.cmake @@ -1,13 +1,10 @@ -add_definitions(-D_WIN32_WINNT=0x0A00) # Windows 10 -add_definitions(-DNTDDI_VERSION=0x0A000007) # 19H1 (1903) -add_definitions(-DWIN32_LEAN_AND_MEAN) -add_definitions(-DNOMINMAX) -add_definitions(-DTRINITY_REQUIRED_WINDOWS_BUILD=18362) +target_compile_definitions(trinity-compile-option-interface + INTERFACE + _WIN32_WINNT=0x0A00 # Windows 10 + NTDDI_VERSION=0x0A000007 # 19H1 (1903) + WIN32_LEAN_AND_MEAN + NOMINMAX + TRINITY_REQUIRED_WINDOWS_BUILD=18362) -if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") - include(${CMAKE_SOURCE_DIR}/cmake/compiler/msvc/settings.cmake) -elseif(CMAKE_CXX_PLATFORM_ID MATCHES "MinGW") - include(${CMAKE_SOURCE_DIR}/cmake/compiler/mingw/settings.cmake) -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - include(${CMAKE_SOURCE_DIR}/cmake/compiler/clang/settings.cmake) -endif() +# set up output paths for executable binaries (.exe-files, and .dll-files on DLL-capable platforms) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$") diff --git a/cmake/showoptions.cmake b/cmake/showoptions.cmake index 260431843d2..385065a52bb 100644 --- a/cmake/showoptions.cmake +++ b/cmake/showoptions.cmake @@ -1,7 +1,8 @@ # output generic information about the core and buildtype chosen message("") message("* TrinityCore revision : ${rev_hash} ${rev_date} (${rev_branch} branch)") -if(UNIX) +get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(NOT IS_MULTI_CONFIG) message("* TrinityCore buildtype : ${CMAKE_BUILD_TYPE}") endif() message("") @@ -72,7 +73,9 @@ if(WITH_COREDEBUG) message(" *** -DCMAKE_BUILD_TYPE=RelWithDebInfo") message(" *** DO NOT ENABLE IT UNLESS YOU KNOW WHAT YOU'RE DOING!") message("* Use coreside debug : Yes") - add_definitions(-DTRINITY_DEBUG) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + TRINITY_DEBUG) else() message("* Use coreside debug : No (default)") endif() @@ -111,60 +114,70 @@ if(HELGRIND) message(" *** HELGRIND - WARNING!") message(" *** Please specify the valgrind include directory in VALGRIND_INCLUDE_DIR option if you get build errors") message(" *** Please note that this is for DEBUGGING WITH HELGRIND only!") - add_definitions(-DHELGRIND) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + HELGRIND) endif() if(ASAN) message("") message(" *** ASAN - WARNING!") message(" *** Please note that this is for DEBUGGING WITH ADDRESS SANITIZER only!") - add_definitions(-DASAN) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + ASAN) endif() if(MSAN) message("") message(" *** MSAN - WARNING!") message(" *** Please note that this is for DEBUGGING WITH MEMORY SANITIZER only!") - add_definitions(-DMSAN) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + MSAN) endif() if(UBSAN) message("") message(" *** UBSAN - WARNING!") message(" *** Please note that this is for DEBUGGING WITH UNDEFINED BEHAVIOR SANITIZER only!") - add_definitions(-DUBSAN) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + UBSAN) endif() if(TSAN) message("") message(" *** TSAN - WARNING!") message(" *** Please note that this is for DEBUGGING WITH THREAD SANITIZER only!") - add_definitions(-DTSAN -DNO_BUFFERPOOL) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + TSAN) endif() if(PERFORMANCE_PROFILING) message("") message(" *** PERFORMANCE_PROFILING - WARNING!") message(" *** Please note that this is for PERFORMANCE PROFILING only! Do NOT report any issue when enabling this configuration!") - add_definitions(-DPERFORMANCE_PROFILING) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + PERFORMANCE_PROFILING) endif() if(WITHOUT_METRICS) message("") message(" *** WITHOUT_METRICS - WARNING!") message(" *** Please note that this will disable all metrics output (i.e. InfluxDB and Grafana)") - add_definitions(-DWITHOUT_METRICS) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + WITHOUT_METRICS) elseif (WITH_DETAILED_METRICS) message("") message(" *** WITH_DETAILED_METRICS - WARNING!") message(" *** Please note that this will enable detailed metrics output (i.e. time each session takes to update)") - add_definitions(-DWITH_DETAILED_METRICS) -endif() - -if(WITH_BOOST_STACKTRACE) - if (BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE) - add_definitions(-DBOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE="${BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE}") - endif() + target_compile_definitions(trinity-compile-option-interface + INTERFACE + WITH_DETAILED_METRICS) endif() if(BUILD_SHARED_LIBS) @@ -176,7 +189,9 @@ if(BUILD_SHARED_LIBS) message("") message(" *** Dynamic linking was enforced through a dynamic script module!") endif() - add_definitions(-DTRINITY_API_USE_DYNAMIC_LINKING) + target_compile_definitions(trinity-compile-option-interface + INTERFACE + TRINITY_API_USE_DYNAMIC_LINKING) WarnAboutSpacesInBuildPath() endif() diff --git a/dep/SFMT/CMakeLists.txt b/dep/SFMT/CMakeLists.txt index 117fae8ba4c..700118e9b5f 100644 --- a/dep/SFMT/CMakeLists.txt +++ b/dep/SFMT/CMakeLists.txt @@ -36,7 +36,7 @@ target_include_directories(sfmt ${CMAKE_CURRENT_SOURCE_DIR}) # using the standard Mersenne exponent 19937 -target_compile_definitions(sfmt PUBLIC -DSFMT_MEXP=19937) +target_compile_definitions(sfmt PUBLIC SFMT_MEXP=19937) # enable SIMD instructions if available include(CheckCXXCompilerFlag) @@ -67,11 +67,11 @@ else () endif () if (HAVE_NEON) - target_compile_definitions(sfmt PUBLIC -DHAVE_NEON) + target_compile_definitions(sfmt PUBLIC HAVE_NEON) endif () if (HAVE_SSE2) - target_compile_definitions(sfmt PUBLIC -DHAVE_SSE2) + target_compile_definitions(sfmt PUBLIC HAVE_SSE2) endif () set_target_properties(sfmt PROPERTIES LINKER_LANGUAGE CXX) diff --git a/dep/argon2/CMakeLists.txt b/dep/argon2/CMakeLists.txt index f503afaa6d9..7b9a993e2a2 100644 --- a/dep/argon2/CMakeLists.txt +++ b/dep/argon2/CMakeLists.txt @@ -23,7 +23,7 @@ add_library(argon2 STATIC target_compile_definitions(argon2 PRIVATE - -DARGON2_NO_THREADS) + ARGON2_NO_THREADS) set_target_properties(argon2 PROPERTIES LINKER_LANGUAGE CXX) diff --git a/dep/boost/CMakeLists.txt b/dep/boost/CMakeLists.txt index aa7315f1e49..baebfdbf3c8 100644 --- a/dep/boost/CMakeLists.txt +++ b/dep/boost/CMakeLists.txt @@ -8,20 +8,31 @@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +set(BOOST_SEARCH_HINTS) if(WIN32) if(DEFINED ENV{BOOST_ROOT}) set(BOOST_ROOT $ENV{BOOST_ROOT}) endif() + if(DEFINED BOOST_ROOT AND MSVC) + # insert a dot (.) character before last digit of MSVC_TOOLSET_VERSION + # turn 143 into 14.3 + string(LENGTH "${MSVC_TOOLSET_VERSION}" _BOOST_MSVC_TOOLSET_VERSION_LENGTH) + math(EXPR _BOOST_MSVC_TOOLSET_VERSION_LENGTH "${_BOOST_MSVC_TOOLSET_VERSION_LENGTH} - 1" OUTPUT_FORMAT DECIMAL) + string(SUBSTRING "${MSVC_TOOLSET_VERSION}" 0 ${_BOOST_MSVC_TOOLSET_VERSION_LENGTH} _BOOST_MSVC_TOOLSET_VERSION_MAJOR) + string(SUBSTRING "${MSVC_TOOLSET_VERSION}" ${_BOOST_MSVC_TOOLSET_VERSION_LENGTH} -1 _BOOST_MSVC_TOOLSET_VERSION_MINOR) + + set(BOOST_SEARCH_HINTS "${BOOST_ROOT}/lib${PLATFORM}-msvc-${_BOOST_MSVC_TOOLSET_VERSION_MAJOR}.${_BOOST_MSVC_TOOLSET_VERSION_MINOR}/cmake") + + unset(_BOOST_MSVC_TOOLSET_VERSION_LENGTH) + unset(_BOOST_MSVC_TOOLSET_VERSION_MAJOR) + unset(_BOOST_MSVC_TOOLSET_VERSION_MINOR) + endif() set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) endif() -set(Boost_NO_WARN_NEW_VERSIONS ON) - -include (CheckCXXSourceCompiles) - if (WIN32) # On windows the requirements are higher according to the wiki. set(BOOST_REQUIRED_VERSION 1.78) @@ -29,7 +40,17 @@ else() set(BOOST_REQUIRED_VERSION 1.74) endif() -find_package(Boost ${BOOST_REQUIRED_VERSION} REQUIRED system filesystem program_options iostreams regex locale) +find_package(Boost ${BOOST_REQUIRED_VERSION} + REQUIRED + COMPONENTS + system + filesystem + program_options + regex + locale + CONFIG + HINTS + ${BOOST_SEARCH_HINTS}) if(NOT Boost_FOUND) if(NOT DEFINED ENV{BOOST_ROOT} AND NOT DEFINED Boost_DIR AND NOT DEFINED BOOST_ROOT AND NOT DEFINED BOOSTROOT) @@ -49,22 +70,24 @@ target_include_directories(boost target_compile_definitions(boost INTERFACE - -DBOOST_DATE_TIME_NO_LIB - -DBOOST_REGEX_NO_LIB - -DBOOST_CHRONO_NO_LIB - -DBOOST_SERIALIZATION_NO_LIB - -DBOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE - -DBOOST_ASIO_NO_DEPRECATED - -DBOOST_SYSTEM_USE_UTF8 - -DBOOST_BIND_NO_PLACEHOLDERS) + BOOST_ALL_NO_LIB + BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE + BOOST_ASIO_NO_DEPRECATED + BOOST_BIND_NO_PLACEHOLDERS + BOOST_SYSTEM_USE_UTF8) if (WITH_BOOST_STACKTRACE AND NOT WIN32) - message("*** libbacktrace will be linked") + message(STATUS "libbacktrace will be linked") + + include(CheckIncludeFile) if (BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE) - CHECK_INCLUDE_FILE(${BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE} HAS_BACKTRACE) + check_include_file("${BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE}" HAS_BACKTRACE) + target_compile_definitions(boost + INTERFACE + BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE=${BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE}) else() - CHECK_INCLUDE_FILE("backtrace.h" HAS_BACKTRACE) + check_include_file("backtrace.h" HAS_BACKTRACE) endif() if (NOT HAS_BACKTRACE) @@ -73,7 +96,7 @@ if (WITH_BOOST_STACKTRACE AND NOT WIN32) target_compile_definitions(boost INTERFACE - -DBOOST_STACKTRACE_USE_BACKTRACE) + BOOST_STACKTRACE_USE_BACKTRACE) target_link_libraries(boost INTERFACE diff --git a/dep/fmt/CMakeLists.txt b/dep/fmt/CMakeLists.txt index 176d23058b5..fc9b1f79134 100644 --- a/dep/fmt/CMakeLists.txt +++ b/dep/fmt/CMakeLists.txt @@ -8,8 +8,6 @@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -include(CheckSymbolExists) - set(FMT_HEADERS include/fmt/args.h include/fmt/chrono.h diff --git a/dep/g3dlite/CMakeLists.txt b/dep/g3dlite/CMakeLists.txt index 90d2280cc7b..fc22b4e10b8 100644 --- a/dep/g3dlite/CMakeLists.txt +++ b/dep/g3dlite/CMakeLists.txt @@ -60,6 +60,12 @@ target_include_directories(g3dlib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) +if((CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) OR TSAN) + target_compile_definitions(g3dlib + PRIVATE + NO_BUFFERPOOL) +endif() + target_link_libraries(g3dlib PRIVATE trinity-dependency-interface diff --git a/dep/gsoap/CMakeLists.txt b/dep/gsoap/CMakeLists.txt index 853e7cb8a8f..aae532880a6 100644 --- a/dep/gsoap/CMakeLists.txt +++ b/dep/gsoap/CMakeLists.txt @@ -31,5 +31,5 @@ if (MSVC) # Little fix for MSVC / Windows platforms target_compile_definitions(gsoap PRIVATE - -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=0) + _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=0) endif() diff --git a/dep/jemalloc/CMakeLists.txt b/dep/jemalloc/CMakeLists.txt index fb68395a40b..48e7c36d9de 100644 --- a/dep/jemalloc/CMakeLists.txt +++ b/dep/jemalloc/CMakeLists.txt @@ -8,9 +8,11 @@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +include(CheckSymbolExists) + if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) # We need to generate the jemalloc_def.h header based on platform-specific settings - CHECK_SYMBOL_EXISTS(MADV_FREE "sys/mman.h" HAVE_MADV_FREE) + check_symbol_exists(MADV_FREE "sys/mman.h" HAVE_MADV_FREE) if (PLATFORM EQUAL 32) set(JEM_SIZEDEF 2) @@ -89,11 +91,9 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT NOJEM) ${CMAKE_CURRENT_SOURCE_DIR}/include) target_compile_definitions(jemalloc - PUBLIC - -DNO_BUFFERPOOL PRIVATE - -D_GNU_SOURCE - -D_REENTRAN) + _GNU_SOURCE + _REENTRAN) target_link_libraries(jemalloc PRIVATE diff --git a/revision_data.h.in.cmake b/revision_data.h.in.cmake index 761a7211723..e206a88e529 100644 --- a/revision_data.h.in.cmake +++ b/revision_data.h.in.cmake @@ -9,7 +9,7 @@ #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.24081_2024_08_17.sql" + #define _FULL_DATABASE "TDB_full_world_335.24111_2024_11_22.sql" #define VER_COMPANYNAME_STR "TrinityCore Developers" #define VER_LEGALCOPYRIGHT_STR "(c)2008-@rev_year@ TrinityCore" #define VER_FILEVERSION 0,0,0 diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index dc4eca2c47e..bd52ab0edd4 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -1,8 +1,8 @@ --- MySQL dump 10.13 Distrib 8.0.39, for Linux (x86_64) +-- MySQL dump 10.13 Distrib 8.0.40, for Linux (x86_64) -- -- Host: localhost Database: auth -- ------------------------------------------------------ --- Server version 8.0.39-0ubuntu0.22.04.1 +-- Server version 8.0.40-0ubuntu0.22.04.1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1672,7 +1672,7 @@ INSERT INTO `rbac_permissions` VALUES (44,'Receive global GM messages/texts'), (45,'Join channels without announce'), (46,'Change channel settings without being channel moderator'), -(47,'Enables lower security than target check'), +(47,'Can ignore non-strong lower security checks if it\'s disabled in config'), (48,'Enable IP, Last Login and EMail output in pinfo'), (49,'Forces to enter the email for confirmation on password change'), (50,'Allow user to check his own email with .account'), @@ -2347,7 +2347,7 @@ CREATE TABLE `realmlist` ( `flag` tinyint unsigned NOT NULL DEFAULT '2', `timezone` tinyint unsigned NOT NULL DEFAULT '0', `allowedSecurityLevel` tinyint unsigned NOT NULL DEFAULT '0', - `population` float unsigned NOT NULL DEFAULT '0', + `population` float NOT NULL DEFAULT '0', `gamebuild` int unsigned NOT NULL DEFAULT '12340', PRIMARY KEY (`id`), UNIQUE KEY `idx_name` (`name`) @@ -2528,8 +2528,11 @@ INSERT INTO `updates` VALUES ('2024_01_21_00_auth.sql','B45B95D7B608D6ACF1BCBA656718C7DEED8CFF00','ARCHIVED','2024-01-21 11:38:22',0), ('2024_04_10_00_auth.sql','CE8BD4D6DF6DE85DBF892507B1B18B746FE4A71D','ARCHIVED','2024-04-10 16:07:02',0), ('2024_08_17_00_auth.sql','B6D7D00D5573958EE84321B029D869C52793F924','ARCHIVED','2024-08-17 22:26:12',0), -('2024_08_28_01_auth.sql','BC5D74553AF2D92606F55C1C462D2700FE73BD34','RELEASED','2024-08-28 14:55:05',0), -('2024_08_30_00_auth.sql','BD76942F1C29AAA2450E051E7CA552672B5E331B','RELEASED','2024-08-30 19:24:30',0); +('2024_08_28_01_auth.sql','BC5D74553AF2D92606F55C1C462D2700FE73BD34','ARCHIVED','2024-08-28 14:55:05',0), +('2024_08_30_00_auth.sql','BD76942F1C29AAA2450E051E7CA552672B5E331B','ARCHIVED','2024-08-30 19:24:30',0), +('2024_09_26_00_auth.sql','E37C3997FD7851EA360774AC568912846C448272','ARCHIVED','2024-09-26 18:27:26',0), +('2024_11_22_00_auth.sql','F2C1D1572A3968E9E9D778EF7DC82778DF3EF887','ARCHIVED','2024-11-22 23:18:14',0), +('2025_02_14_00_auth.sql','4A30E92FF519BB41C520CDBF90019291217C26A2','RELEASED','2025-02-14 17:20:00',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; @@ -2631,11 +2634,11 @@ SET character_set_client = @saved_cs_client; /*!50001 SET @saved_cs_client = @@character_set_client */; /*!50001 SET @saved_cs_results = @@character_set_results */; /*!50001 SET @saved_col_connection = @@collation_connection */; -/*!50001 SET character_set_client = utf8mb3 */; -/*!50001 SET character_set_results = utf8mb3 */; -/*!50001 SET collation_connection = utf8mb3_general_ci */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_unicode_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ -/*!50013 */ +/*!50013 SQL SECURITY INVOKER */ /*!50001 VIEW `vw_log_history` AS select from_unixtime(min(`logs`.`time`)) AS `First Logged`,from_unixtime(max(`logs`.`time`)) AS `Last Logged`,count(0) AS `Occurrences`,`realmlist`.`name` AS `Realm`,`logs`.`type` AS `type`,`logs`.`level` AS `level`,`logs`.`string` AS `string` from (`logs` left join `realmlist` on((`logs`.`realm` = `realmlist`.`id`))) group by `logs`.`string`,`logs`.`type`,`logs`.`realm` */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; @@ -2649,11 +2652,11 @@ SET character_set_client = @saved_cs_client; /*!50001 SET @saved_cs_client = @@character_set_client */; /*!50001 SET @saved_cs_results = @@character_set_results */; /*!50001 SET @saved_col_connection = @@collation_connection */; -/*!50001 SET character_set_client = utf8mb3 */; -/*!50001 SET character_set_results = utf8mb3 */; -/*!50001 SET collation_connection = utf8mb3_general_ci */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_unicode_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ -/*!50013 */ +/*!50013 SQL SECURITY INVOKER */ /*!50001 VIEW `vw_rbac` AS select `t1`.`linkedId` AS `Permission ID`,`t1`.`id` AS `Permission Group`,ifnull(`t2`.`secId`,'linked') AS `Security Level`,`t3`.`name` AS `Permission` from ((`rbac_linked_permissions` `t1` left join `rbac_default_permissions` `t2` on((`t1`.`id` = `t2`.`permissionId`))) left join `rbac_permissions` `t3` on((`t1`.`linkedId` = `t3`.`id`))) */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; @@ -2668,4 +2671,4 @@ SET character_set_client = @saved_cs_client; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2024-08-17 22:26:14 +-- Dump completed on 2024-11-22 23:18:17 diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 5612d8f3b89..dddc50c1ff4 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1,8 +1,8 @@ --- MySQL dump 10.13 Distrib 8.0.39, for Linux (x86_64) +-- MySQL dump 10.13 Distrib 8.0.40, for Linux (x86_64) -- -- Host: localhost Database: characters -- ------------------------------------------------------ --- Server version 8.0.39-0ubuntu0.22.04.1 +-- Server version 8.0.40-0ubuntu0.22.04.1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1340,7 +1340,7 @@ DROP TABLE IF EXISTS `characters`; CREATE TABLE `characters` ( `guid` int unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier', `account` int unsigned NOT NULL DEFAULT '0' COMMENT 'Account Identifier', - `name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, + `name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `race` tinyint unsigned NOT NULL DEFAULT '0', `class` tinyint unsigned NOT NULL DEFAULT '0', `gender` tinyint unsigned NOT NULL DEFAULT '0', @@ -1415,9 +1415,9 @@ CREATE TABLE `characters` ( `deleteInfos_Name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `deleteDate` int unsigned DEFAULT NULL, PRIMARY KEY (`guid`), + UNIQUE KEY `idx_name` (`name`), KEY `idx_account` (`account`), - KEY `idx_online` (`online`), - KEY `idx_name` (`name`) + KEY `idx_online` (`online`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Player System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2686,7 +2686,9 @@ INSERT INTO `updates` VALUES ('2024_01_21_00_characters.sql','4D27D8DAC9F78795DB6938B54F32502EF8D8AAE6','ARCHIVED','2024-01-21 11:38:22',0), ('2024_02_05_00_characters.sql','1777CBCA822AD85777DA4A390DF7AAF41AF68EBD','ARCHIVED','2024-02-05 12:17:19',0), ('2024_04_10_00_characters.sql','E0D6E19ACE6759332402FA27C23B0F7745C49742','ARCHIVED','2024-04-10 16:07:02',0), -('2024_08_17_00_characters.sql','08705FBCB8504E8B1009FDAF955F56D734FAD782','ARCHIVED','2024-08-17 22:26:12',0); +('2024_08_17_00_characters.sql','08705FBCB8504E8B1009FDAF955F56D734FAD782','ARCHIVED','2024-08-17 22:26:12',0), +('2024_10_03_00_characters.sql','408249A6992999A36EB94089D184972E8E0767A3','ARCHIVED','2024-10-03 11:10:18',0), +('2024_11_22_00_characters.sql','9EA2A4F88036D1D5F47EE8A6B634D52D0014986E','ARCHIVED','2024-11-22 23:18:14',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; @@ -2857,4 +2859,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2024-08-17 22:26:14 +-- Dump completed on 2024-11-22 23:18:18 diff --git a/sql/base/dev/world_database.sql b/sql/base/dev/world_database.sql index 6c2b3747ac6..857872f96af 100644 --- a/sql/base/dev/world_database.sql +++ b/sql/base/dev/world_database.sql @@ -1,8 +1,8 @@ --- MySQL dump 10.13 Distrib 8.0.39, for Linux (x86_64) +-- MySQL dump 10.13 Distrib 8.0.40, for Linux (x86_64) -- -- Host: localhost Database: world -- ------------------------------------------------------ --- Server version 8.0.39-0ubuntu0.22.04.1 +-- Server version 8.0.40-0ubuntu0.22.04.1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -342,6 +342,7 @@ CREATE TABLE `creature` ( `unit_flags` int unsigned NOT NULL DEFAULT '0', `dynamicflags` int unsigned NOT NULL DEFAULT '0', `ScriptName` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '', + `StringId` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `VerifiedBuild` int DEFAULT '0', PRIMARY KEY (`guid`), KEY `idx_map` (`map`), @@ -676,6 +677,7 @@ CREATE TABLE `creature_template` ( `spell_school_immune_mask` int unsigned NOT NULL DEFAULT '0', `flags_extra` int unsigned NOT NULL DEFAULT '0', `ScriptName` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + `StringId` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, `VerifiedBuild` int DEFAULT NULL, PRIMARY KEY (`entry`), KEY `idx_name` (`name`) @@ -1223,6 +1225,7 @@ CREATE TABLE `gameobject` ( `animprogress` tinyint unsigned NOT NULL DEFAULT '0', `state` tinyint unsigned NOT NULL DEFAULT '0', `ScriptName` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '', + `StringId` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `VerifiedBuild` int DEFAULT NULL, PRIMARY KEY (`guid`) ) ENGINE=InnoDB AUTO_INCREMENT=2134507 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Gameobject System'; @@ -1370,6 +1373,7 @@ CREATE TABLE `gameobject_template` ( `Data23` int unsigned NOT NULL DEFAULT '0', `AIName` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `ScriptName` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + `StringId` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `VerifiedBuild` int DEFAULT NULL, PRIMARY KEY (`entry`), KEY `idx_name` (`name`) @@ -4016,7 +4020,7 @@ CREATE TABLE `waypoints` ( /*!50001 SET character_set_results = utf8mb3 */; /*!50001 SET collation_connection = utf8mb3_general_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ -/*!50013 */ +/*!50013 SQL SECURITY DEFINER */ /*!50001 VIEW `vw_conditions_with_labels` AS select (case when (`conditions`.`SourceTypeOrReferenceId` = 0) then 'CONDITION_SOURCE_TYPE_NONE' when (`conditions`.`SourceTypeOrReferenceId` = 1) then 'CONDITION_SOURCE_TYPE_CREATURE_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 2) then 'CONDITION_SOURCE_TYPE_DISENCHANT_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 3) then 'CONDITION_SOURCE_TYPE_FISHING_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 4) then 'CONDITION_SOURCE_TYPE_GAMEOBJECT_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 5) then 'CONDITION_SOURCE_TYPE_ITEM_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 6) then 'CONDITION_SOURCE_TYPE_MAIL_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 7) then 'CONDITION_SOURCE_TYPE_MILLING_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 8) then 'CONDITION_SOURCE_TYPE_PICKPOCKETING_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 9) then 'CONDITION_SOURCE_TYPE_PROSPECTING_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 10) then 'CONDITION_SOURCE_TYPE_REFERENCE_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 11) then 'CONDITION_SOURCE_TYPE_SKINNING_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 12) then 'CONDITION_SOURCE_TYPE_SPELL_LOOT_TEMPLATE' when (`conditions`.`SourceTypeOrReferenceId` = 13) then 'CONDITION_SOURCE_TYPE_SPELL_IMPLICIT_TARGET' when (`conditions`.`SourceTypeOrReferenceId` = 14) then 'CONDITION_SOURCE_TYPE_GOSSIP_MENU' when (`conditions`.`SourceTypeOrReferenceId` = 15) then 'CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION' when (`conditions`.`SourceTypeOrReferenceId` = 16) then 'CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE' when (`conditions`.`SourceTypeOrReferenceId` = 17) then 'CONDITION_SOURCE_TYPE_SPELL' when (`conditions`.`SourceTypeOrReferenceId` = 18) then 'CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT' when (`conditions`.`SourceTypeOrReferenceId` = 19) then 'CONDITION_SOURCE_TYPE_QUEST_AVAILABLE' when (`conditions`.`SourceTypeOrReferenceId` = 21) then 'CONDITION_SOURCE_TYPE_VEHICLE_SPELL' when (`conditions`.`SourceTypeOrReferenceId` = 22) then 'CONDITION_SOURCE_TYPE_SMART_EVENT' when (`conditions`.`SourceTypeOrReferenceId` = 23) then 'CONDITION_SOURCE_TYPE_NPC_VENDOR' when (`conditions`.`SourceTypeOrReferenceId` = 24) then 'CONDITION_SOURCE_TYPE_SPELL_PROC' when (`conditions`.`SourceTypeOrReferenceId` = 25) then 'CONDITION_SOURCE_TYPE_TERRAIN_SWAP' when (`conditions`.`SourceTypeOrReferenceId` = 26) then 'CONDITION_SOURCE_TYPE_PHASE' when (`conditions`.`SourceTypeOrReferenceId` = 27) then 'CONDITION_SOURCE_TYPE_GRAVEYARD' else `conditions`.`SourceTypeOrReferenceId` end) AS `SourceTypeOrReferenceId`,`conditions`.`SourceGroup` AS `SourceGroup`,`conditions`.`SourceEntry` AS `SourceEntry`,`conditions`.`SourceId` AS `SourceId`,`conditions`.`ElseGroup` AS `ElseGroup`,(case when (`conditions`.`SourceTypeOrReferenceId` = 0) then 'CONDITION_NONE' when (`conditions`.`SourceTypeOrReferenceId` = 1) then 'CONDITION_AURA' when (`conditions`.`SourceTypeOrReferenceId` = 2) then 'CONDITION_ITEM' when (`conditions`.`SourceTypeOrReferenceId` = 3) then 'CONDITION_ITEM_EQUIPPED' when (`conditions`.`SourceTypeOrReferenceId` = 4) then 'CONDITION_ZONEID' when (`conditions`.`SourceTypeOrReferenceId` = 5) then 'CONDITION_REPUTATION_RANK' when (`conditions`.`SourceTypeOrReferenceId` = 6) then 'CONDITION_TEAM' when (`conditions`.`SourceTypeOrReferenceId` = 7) then 'CONDITION_SKILL' when (`conditions`.`SourceTypeOrReferenceId` = 8) then 'CONDITION_QUESTREWARDED' when (`conditions`.`SourceTypeOrReferenceId` = 9) then 'CONDITION_QUESTTAKEN' when (`conditions`.`SourceTypeOrReferenceId` = 10) then 'CONDITION_DRUNKENSTATE' when (`conditions`.`SourceTypeOrReferenceId` = 11) then 'CONDITION_WORLD_STATE' when (`conditions`.`SourceTypeOrReferenceId` = 12) then 'CONDITION_ACTIVE_EVENT' when (`conditions`.`SourceTypeOrReferenceId` = 13) then 'CONDITION_INSTANCE_INFO' when (`conditions`.`SourceTypeOrReferenceId` = 14) then 'CONDITION_QUEST_NONE' when (`conditions`.`SourceTypeOrReferenceId` = 15) then 'CONDITION_CLASS' when (`conditions`.`SourceTypeOrReferenceId` = 16) then 'CONDITION_RACE' when (`conditions`.`SourceTypeOrReferenceId` = 17) then 'CONDITION_ACHIEVEMENT' when (`conditions`.`SourceTypeOrReferenceId` = 18) then 'CONDITION_TITLE' when (`conditions`.`SourceTypeOrReferenceId` = 19) then 'CONDITION_SPAWNMASK' when (`conditions`.`SourceTypeOrReferenceId` = 20) then 'CONDITION_GENDER' when (`conditions`.`SourceTypeOrReferenceId` = 21) then 'CONDITION_UNIT_STATE' when (`conditions`.`SourceTypeOrReferenceId` = 22) then 'CONDITION_MAPID' when (`conditions`.`SourceTypeOrReferenceId` = 23) then 'CONDITION_AREAID' when (`conditions`.`SourceTypeOrReferenceId` = 24) then 'CONDITION_CREATURE_TYPE' when (`conditions`.`SourceTypeOrReferenceId` = 25) then 'CONDITION_SPELL' when (`conditions`.`SourceTypeOrReferenceId` = 26) then 'CONDITION_PHASEMASK' when (`conditions`.`SourceTypeOrReferenceId` = 27) then 'CONDITION_LEVEL' when (`conditions`.`SourceTypeOrReferenceId` = 28) then 'CONDITION_QUEST_COMPLETE' when (`conditions`.`SourceTypeOrReferenceId` = 29) then 'CONDITION_NEAR_CREATURE' when (`conditions`.`SourceTypeOrReferenceId` = 30) then 'CONDITION_NEAR_GAMEOBJECT' when (`conditions`.`SourceTypeOrReferenceId` = 31) then 'CONDITION_OBJECT_ENTRY_GUID' when (`conditions`.`SourceTypeOrReferenceId` = 32) then 'CONDITION_TYPE_MASK' when (`conditions`.`SourceTypeOrReferenceId` = 33) then 'CONDITION_RELATION_TO' when (`conditions`.`SourceTypeOrReferenceId` = 34) then 'CONDITION_REACTION_TO' when (`conditions`.`SourceTypeOrReferenceId` = 35) then 'CONDITION_DISTANCE_TO' when (`conditions`.`SourceTypeOrReferenceId` = 36) then 'CONDITION_ALIVE' when (`conditions`.`SourceTypeOrReferenceId` = 37) then 'CONDITION_HP_VAL' when (`conditions`.`SourceTypeOrReferenceId` = 38) then 'CONDITION_HP_PCT' when (`conditions`.`SourceTypeOrReferenceId` = 39) then 'CONDITION_REALM_ACHIEVEMENT' when (`conditions`.`SourceTypeOrReferenceId` = 40) then 'CONDITION_IN_WATER' when (`conditions`.`SourceTypeOrReferenceId` = 41) then 'CONDITION_TERRAIN_SWAP' when (`conditions`.`SourceTypeOrReferenceId` = 42) then 'CONDITION_STAND_STATE' when (`conditions`.`SourceTypeOrReferenceId` = 43) then 'CONDITION_DAILY_QUEST_DONE' when (`conditions`.`SourceTypeOrReferenceId` = 44) then 'CONDITION_CHARMED' when (`conditions`.`SourceTypeOrReferenceId` = 45) then 'CONDITION_PET_TYPE' when (`conditions`.`SourceTypeOrReferenceId` = 46) then 'CONDITION_TAXI' when (`conditions`.`SourceTypeOrReferenceId` = 47) then 'CONDITION_QUESTSTATE' when (`conditions`.`SourceTypeOrReferenceId` = 48) then 'CONDITION_QUEST_OBJECTIVE_PROGRESS' when (`conditions`.`SourceTypeOrReferenceId` = 49) then 'CONDITION_DIFFICULTY_ID' when (`conditions`.`SourceTypeOrReferenceId` = 50) then 'CONDITION_GAMEMASTER' when (`conditions`.`SourceTypeOrReferenceId` = 51) then 'CONDITION_OBJECT_ENTRY_GUID_MASTER' when (`conditions`.`SourceTypeOrReferenceId` = 52) then 'CONDITION_TYPE_MASK_MASTER' else `conditions`.`ConditionTypeOrReference` end) AS `ConditionTypeOrReference`,`conditions`.`ConditionTarget` AS `ConditionTarget`,`conditions`.`ConditionValue1` AS `ConditionValue1`,`conditions`.`ConditionValue2` AS `ConditionValue2`,`conditions`.`ConditionValue3` AS `ConditionValue3`,`conditions`.`NegativeCondition` AS `NegativeCondition`,`conditions`.`ErrorType` AS `ErrorType`,`conditions`.`ErrorTextId` AS `ErrorTextId`,`conditions`.`ScriptName` AS `ScriptName`,`conditions`.`Comment` AS `Comment` from `conditions` */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; @@ -4034,7 +4038,7 @@ CREATE TABLE `waypoints` ( /*!50001 SET character_set_results = utf8mb3 */; /*!50001 SET collation_connection = utf8mb3_general_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ -/*!50013 */ +/*!50013 SQL SECURITY DEFINER */ /*!50001 VIEW `vw_disables_with_labels` AS select (case when (`disables`.`sourceType` = 0) then 'DISABLE_TYPE_SPELL' when (`disables`.`sourceType` = 1) then 'DISABLE_TYPE_QUEST' when (`disables`.`sourceType` = 2) then 'DISABLE_TYPE_MAP' when (`disables`.`sourceType` = 3) then 'DISABLE_TYPE_BATTLEGROUND' when (`disables`.`sourceType` = 4) then 'DISABLE_TYPE_ACHIEVEMENT_CRITERIA' when (`disables`.`sourceType` = 5) then 'DISABLE_TYPE_OUTDOORPVP' when (`disables`.`sourceType` = 6) then 'DISABLE_TYPE_VMAP' when (`disables`.`sourceType` = 7) then 'DISABLE_TYPE_MMAP' when (`disables`.`sourceType` = 8) then 'DISABLE_TYPE_LFG_MAP' else `disables`.`sourceType` end) AS `sourceType`,`disables`.`entry` AS `entry`,`disables`.`flags` AS `flags`,`disables`.`params_0` AS `params_0`,`disables`.`params_1` AS `params_1`,`disables`.`comment` AS `comment` from `disables` */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; @@ -4052,7 +4056,7 @@ CREATE TABLE `waypoints` ( /*!50001 SET character_set_results = utf8mb3 */; /*!50001 SET collation_connection = utf8mb3_general_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ -/*!50013 */ +/*!50013 SQL SECURITY DEFINER */ /*!50001 VIEW `vw_smart_scripts_with_labels` AS select `smart_scripts`.`entryorguid` AS `entryorguid`,`smart_scripts`.`source_type` AS `source_type`,`smart_scripts`.`id` AS `id`,`smart_scripts`.`link` AS `link`,(case when (`smart_scripts`.`event_type` = 0) then 'SMART_EVENT_UPDATE_IC' when (`smart_scripts`.`event_type` = 1) then 'SMART_EVENT_UPDATE_OOC' when (`smart_scripts`.`event_type` = 2) then 'SMART_EVENT_HEALTH_PCT' when (`smart_scripts`.`event_type` = 3) then 'SMART_EVENT_MANA_PCT' when (`smart_scripts`.`event_type` = 4) then 'SMART_EVENT_AGGRO' when (`smart_scripts`.`event_type` = 5) then 'SMART_EVENT_KILL' when (`smart_scripts`.`event_type` = 6) then 'SMART_EVENT_DEATH' when (`smart_scripts`.`event_type` = 7) then 'SMART_EVENT_EVADE' when (`smart_scripts`.`event_type` = 8) then 'SMART_EVENT_SPELLHIT' when (`smart_scripts`.`event_type` = 9) then 'SMART_EVENT_RANGE' when (`smart_scripts`.`event_type` = 10) then 'SMART_EVENT_OOC_LOS' when (`smart_scripts`.`event_type` = 11) then 'SMART_EVENT_RESPAWN' when (`smart_scripts`.`event_type` = 12) then 'SMART_EVENT_TARGET_HEALTH_PCT' when (`smart_scripts`.`event_type` = 13) then 'SMART_EVENT_VICTIM_CASTING' when (`smart_scripts`.`event_type` = 14) then 'SMART_EVENT_FRIENDLY_HEALTH' when (`smart_scripts`.`event_type` = 15) then 'SMART_EVENT_FRIENDLY_IS_CC' when (`smart_scripts`.`event_type` = 16) then 'SMART_EVENT_FRIENDLY_MISSING_BUFF' when (`smart_scripts`.`event_type` = 17) then 'SMART_EVENT_SUMMONED_UNIT' when (`smart_scripts`.`event_type` = 18) then 'SMART_EVENT_TARGET_MANA_PCT' when (`smart_scripts`.`event_type` = 19) then 'SMART_EVENT_ACCEPTED_QUEST' when (`smart_scripts`.`event_type` = 20) then 'SMART_EVENT_REWARD_QUEST' when (`smart_scripts`.`event_type` = 21) then 'SMART_EVENT_REACHED_HOME' when (`smart_scripts`.`event_type` = 22) then 'SMART_EVENT_RECEIVE_EMOTE' when (`smart_scripts`.`event_type` = 23) then 'SMART_EVENT_HAS_AURA' when (`smart_scripts`.`event_type` = 24) then 'SMART_EVENT_TARGET_BUFFED' when (`smart_scripts`.`event_type` = 25) then 'SMART_EVENT_RESET' when (`smart_scripts`.`event_type` = 26) then 'SMART_EVENT_IC_LOS' when (`smart_scripts`.`event_type` = 27) then 'SMART_EVENT_PASSENGER_BOARDED' when (`smart_scripts`.`event_type` = 28) then 'SMART_EVENT_PASSENGER_REMOVED' when (`smart_scripts`.`event_type` = 29) then 'SMART_EVENT_CHARMED' when (`smart_scripts`.`event_type` = 30) then 'SMART_EVENT_CHARMED_TARGET' when (`smart_scripts`.`event_type` = 31) then 'SMART_EVENT_SPELLHIT_TARGET' when (`smart_scripts`.`event_type` = 32) then 'SMART_EVENT_DAMAGED' when (`smart_scripts`.`event_type` = 33) then 'SMART_EVENT_DAMAGED_TARGET' when (`smart_scripts`.`event_type` = 34) then 'SMART_EVENT_MOVEMENTINFORM' when (`smart_scripts`.`event_type` = 35) then 'SMART_EVENT_SUMMON_DESPAWNED' when (`smart_scripts`.`event_type` = 36) then 'SMART_EVENT_CORPSE_REMOVED' when (`smart_scripts`.`event_type` = 37) then 'SMART_EVENT_AI_INIT' when (`smart_scripts`.`event_type` = 38) then 'SMART_EVENT_DATA_SET' when (`smart_scripts`.`event_type` = 39) then 'SMART_EVENT_WAYPOINT_START' when (`smart_scripts`.`event_type` = 40) then 'SMART_EVENT_WAYPOINT_REACHED' when (`smart_scripts`.`event_type` = 41) then 'SMART_EVENT_TRANSPORT_ADDPLAYER' when (`smart_scripts`.`event_type` = 42) then 'SMART_EVENT_TRANSPORT_ADDCREATURE' when (`smart_scripts`.`event_type` = 43) then 'SMART_EVENT_TRANSPORT_REMOVE_PLAYER' when (`smart_scripts`.`event_type` = 44) then 'SMART_EVENT_TRANSPORT_RELOCATE' when (`smart_scripts`.`event_type` = 45) then 'SMART_EVENT_INSTANCE_PLAYER_ENTER' when (`smart_scripts`.`event_type` = 46) then 'SMART_EVENT_AREATRIGGER_ONTRIGGER' when (`smart_scripts`.`event_type` = 47) then 'SMART_EVENT_QUEST_ACCEPTED' when (`smart_scripts`.`event_type` = 48) then 'SMART_EVENT_QUEST_OBJ_COPLETETION' when (`smart_scripts`.`event_type` = 49) then 'SMART_EVENT_QUEST_COMPLETION' when (`smart_scripts`.`event_type` = 50) then 'SMART_EVENT_QUEST_REWARDED' when (`smart_scripts`.`event_type` = 51) then 'SMART_EVENT_QUEST_FAIL' when (`smart_scripts`.`event_type` = 52) then 'SMART_EVENT_TEXT_OVER' when (`smart_scripts`.`event_type` = 53) then 'SMART_EVENT_RECEIVE_HEAL' when (`smart_scripts`.`event_type` = 54) then 'SMART_EVENT_JUST_SUMMONED' when (`smart_scripts`.`event_type` = 55) then 'SMART_EVENT_WAYPOINT_PAUSED' when (`smart_scripts`.`event_type` = 56) then 'SMART_EVENT_WAYPOINT_RESUMED' when (`smart_scripts`.`event_type` = 57) then 'SMART_EVENT_WAYPOINT_STOPPED' when (`smart_scripts`.`event_type` = 58) then 'SMART_EVENT_WAYPOINT_ENDED' when (`smart_scripts`.`event_type` = 59) then 'SMART_EVENT_TIMED_EVENT_TRIGGERED' when (`smart_scripts`.`event_type` = 60) then 'SMART_EVENT_UPDATE' when (`smart_scripts`.`event_type` = 61) then 'SMART_EVENT_LINK' when (`smart_scripts`.`event_type` = 62) then 'SMART_EVENT_GOSSIP_SELECT' when (`smart_scripts`.`event_type` = 63) then 'SMART_EVENT_JUST_CREATED' when (`smart_scripts`.`event_type` = 64) then 'SMART_EVENT_GOSSIP_HELLO' when (`smart_scripts`.`event_type` = 65) then 'SMART_EVENT_FOLLOW_COMPLETED' when (`smart_scripts`.`event_type` = 66) then 'SMART_EVENT_EVENT_PHASE_CHANGE' when (`smart_scripts`.`event_type` = 67) then 'SMART_EVENT_IS_BEHIND_TARGET' when (`smart_scripts`.`event_type` = 68) then 'SMART_EVENT_GAME_EVENT_START' when (`smart_scripts`.`event_type` = 69) then 'SMART_EVENT_GAME_EVENT_END' when (`smart_scripts`.`event_type` = 70) then 'SMART_EVENT_GO_LOOT_STATE_CHANGED' when (`smart_scripts`.`event_type` = 71) then 'SMART_EVENT_GO_EVENT_INFORM' when (`smart_scripts`.`event_type` = 72) then 'SMART_EVENT_ACTION_DONE' when (`smart_scripts`.`event_type` = 73) then 'SMART_EVENT_ON_SPELLCLICK' when (`smart_scripts`.`event_type` = 74) then 'SMART_EVENT_FRIENDLY_HEALTH_PCT' when (`smart_scripts`.`event_type` = 75) then 'SMART_EVENT_DISTANCE_CREATURE' when (`smart_scripts`.`event_type` = 76) then 'SMART_EVENT_DISTANCE_GAMEOBJECT' when (`smart_scripts`.`event_type` = 77) then 'SMART_EVENT_COUNTER_SET' when (`smart_scripts`.`event_type` = 78) then 'SMART_EVENT_SCENE_START' when (`smart_scripts`.`event_type` = 79) then 'SMART_EVENT_SCENE_TRIGGER' when (`smart_scripts`.`event_type` = 80) then 'SMART_EVENT_SCENE_CANCEL' when (`smart_scripts`.`event_type` = 81) then 'SMART_EVENT_SCENE_COMPLETE' when (`smart_scripts`.`event_type` = 82) then 'SMART_EVENT_SUMMONED_UNIT_DIES' else `smart_scripts`.`event_type` end) AS `event_type`,`smart_scripts`.`event_phase_mask` AS `event_phase_mask`,`smart_scripts`.`event_chance` AS `event_chance`,`smart_scripts`.`event_flags` AS `event_flags`,`smart_scripts`.`event_param1` AS `event_param1`,`smart_scripts`.`event_param2` AS `event_param2`,`smart_scripts`.`event_param3` AS `event_param3`,`smart_scripts`.`event_param4` AS `event_param4`,`smart_scripts`.`event_param5` AS `event_param5`,(case when (`smart_scripts`.`action_type` = 0) then 'SMART_ACTION_NONE' when (`smart_scripts`.`action_type` = 1) then 'SMART_ACTION_TALK' when (`smart_scripts`.`action_type` = 2) then 'SMART_ACTION_SET_FACTION' when (`smart_scripts`.`action_type` = 3) then 'SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL' when (`smart_scripts`.`action_type` = 4) then 'SMART_ACTION_SOUND' when (`smart_scripts`.`action_type` = 5) then 'SMART_ACTION_PLAY_EMOTE' when (`smart_scripts`.`action_type` = 6) then 'SMART_ACTION_FAIL_QUEST' when (`smart_scripts`.`action_type` = 7) then 'SMART_ACTION_OFFER_QUEST' when (`smart_scripts`.`action_type` = 8) then 'SMART_ACTION_SET_REACT_STATE' when (`smart_scripts`.`action_type` = 9) then 'SMART_ACTION_ACTIVATE_GOBJECT' when (`smart_scripts`.`action_type` = 10) then 'SMART_ACTION_RANDOM_EMOTE' when (`smart_scripts`.`action_type` = 11) then 'SMART_ACTION_CAST' when (`smart_scripts`.`action_type` = 12) then 'SMART_ACTION_SUMMON_CREATURE' when (`smart_scripts`.`action_type` = 13) then 'SMART_ACTION_THREAT_SINGLE_PCT' when (`smart_scripts`.`action_type` = 14) then 'SMART_ACTION_THREAT_ALL_PCT' when (`smart_scripts`.`action_type` = 15) then 'SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS' when (`smart_scripts`.`action_type` = 16) then 'SMART_ACTION_RESERVED_16' when (`smart_scripts`.`action_type` = 17) then 'SMART_ACTION_SET_EMOTE_STATE' when (`smart_scripts`.`action_type` = 18) then 'SMART_ACTION_SET_UNIT_FLAG' when (`smart_scripts`.`action_type` = 19) then 'SMART_ACTION_REMOVE_UNIT_FLAG' when (`smart_scripts`.`action_type` = 20) then 'SMART_ACTION_AUTO_ATTACK' when (`smart_scripts`.`action_type` = 21) then 'SMART_ACTION_ALLOW_COMBAT_MOVEMENT' when (`smart_scripts`.`action_type` = 22) then 'SMART_ACTION_SET_EVENT_PHASE' when (`smart_scripts`.`action_type` = 23) then 'SMART_ACTION_INC_EVENT_PHASE' when (`smart_scripts`.`action_type` = 24) then 'SMART_ACTION_EVADE' when (`smart_scripts`.`action_type` = 25) then 'SMART_ACTION_FLEE_FOR_ASSIST' when (`smart_scripts`.`action_type` = 26) then 'SMART_ACTION_CALL_GROUPEVENTHAPPENS' when (`smart_scripts`.`action_type` = 27) then 'SMART_ACTION_COMBAT_STOP' when (`smart_scripts`.`action_type` = 28) then 'SMART_ACTION_REMOVEAURASFROMSPELL' when (`smart_scripts`.`action_type` = 29) then 'SMART_ACTION_FOLLOW' when (`smart_scripts`.`action_type` = 30) then 'SMART_ACTION_RANDOM_PHASE' when (`smart_scripts`.`action_type` = 31) then 'SMART_ACTION_RANDOM_PHASE_RANGE' when (`smart_scripts`.`action_type` = 32) then 'SMART_ACTION_RESET_GOBJECT' when (`smart_scripts`.`action_type` = 33) then 'SMART_ACTION_CALL_KILLEDMONSTER' when (`smart_scripts`.`action_type` = 34) then 'SMART_ACTION_SET_INST_DATA' when (`smart_scripts`.`action_type` = 35) then 'SMART_ACTION_SET_INST_DATA64' when (`smart_scripts`.`action_type` = 36) then 'SMART_ACTION_UPDATE_TEMPLATE' when (`smart_scripts`.`action_type` = 37) then 'SMART_ACTION_DIE' when (`smart_scripts`.`action_type` = 38) then 'SMART_ACTION_SET_IN_COMBAT_WITH_ZONE' when (`smart_scripts`.`action_type` = 39) then 'SMART_ACTION_CALL_FOR_HELP' when (`smart_scripts`.`action_type` = 40) then 'SMART_ACTION_SET_SHEATH' when (`smart_scripts`.`action_type` = 41) then 'SMART_ACTION_FORCE_DESPAWN' when (`smart_scripts`.`action_type` = 42) then 'SMART_ACTION_SET_INVINCIBILITY_HP_LEVEL' when (`smart_scripts`.`action_type` = 43) then 'SMART_ACTION_MOUNT_TO_ENTRY_OR_MODEL' when (`smart_scripts`.`action_type` = 44) then 'SMART_ACTION_SET_INGAME_PHASE_MASK' when (`smart_scripts`.`action_type` = 45) then 'SMART_ACTION_SET_DATA' when (`smart_scripts`.`action_type` = 46) then 'SMART_ACTION_ATTACK_STOP' when (`smart_scripts`.`action_type` = 47) then 'SMART_ACTION_SET_VISIBILITY' when (`smart_scripts`.`action_type` = 48) then 'SMART_ACTION_SET_ACTIVE' when (`smart_scripts`.`action_type` = 49) then 'SMART_ACTION_ATTACK_START' when (`smart_scripts`.`action_type` = 50) then 'SMART_ACTION_SUMMON_GO' when (`smart_scripts`.`action_type` = 51) then 'SMART_ACTION_KILL_UNIT' when (`smart_scripts`.`action_type` = 52) then 'SMART_ACTION_ACTIVATE_TAXI' when (`smart_scripts`.`action_type` = 53) then 'SMART_ACTION_WP_START' when (`smart_scripts`.`action_type` = 54) then 'SMART_ACTION_WP_PAUSE' when (`smart_scripts`.`action_type` = 55) then 'SMART_ACTION_WP_STOP' when (`smart_scripts`.`action_type` = 56) then 'SMART_ACTION_ADD_ITEM' when (`smart_scripts`.`action_type` = 57) then 'SMART_ACTION_REMOVE_ITEM' when (`smart_scripts`.`action_type` = 58) then 'SMART_ACTION_INSTALL_AI_TEMPLATE' when (`smart_scripts`.`action_type` = 59) then 'SMART_ACTION_SET_RUN' when (`smart_scripts`.`action_type` = 60) then 'SMART_ACTION_SET_DISABLE_GRAVITY' when (`smart_scripts`.`action_type` = 61) then 'SMART_ACTION_SET_SWIM' when (`smart_scripts`.`action_type` = 62) then 'SMART_ACTION_TELEPORT' when (`smart_scripts`.`action_type` = 63) then 'SMART_ACTION_SET_COUNTER' when (`smart_scripts`.`action_type` = 64) then 'SMART_ACTION_STORE_TARGET_LIST' when (`smart_scripts`.`action_type` = 65) then 'SMART_ACTION_WP_RESUME' when (`smart_scripts`.`action_type` = 66) then 'SMART_ACTION_SET_ORIENTATION' when (`smart_scripts`.`action_type` = 67) then 'SMART_ACTION_CREATE_TIMED_EVENT' when (`smart_scripts`.`action_type` = 68) then 'SMART_ACTION_PLAYMOVIE' when (`smart_scripts`.`action_type` = 69) then 'SMART_ACTION_MOVE_TO_POS' when (`smart_scripts`.`action_type` = 70) then 'SMART_ACTION_ENABLE_TEMP_GOBJ' when (`smart_scripts`.`action_type` = 71) then 'SMART_ACTION_EQUIP' when (`smart_scripts`.`action_type` = 72) then 'SMART_ACTION_CLOSE_GOSSIP' when (`smart_scripts`.`action_type` = 73) then 'SMART_ACTION_TRIGGER_TIMED_EVENT' when (`smart_scripts`.`action_type` = 74) then 'SMART_ACTION_REMOVE_TIMED_EVENT' when (`smart_scripts`.`action_type` = 75) then 'SMART_ACTION_ADD_AURA' when (`smart_scripts`.`action_type` = 76) then 'SMART_ACTION_OVERRIDE_SCRIPT_BASE_OBJECT' when (`smart_scripts`.`action_type` = 77) then 'SMART_ACTION_RESET_SCRIPT_BASE_OBJECT' when (`smart_scripts`.`action_type` = 78) then 'SMART_ACTION_CALL_SCRIPT_RESET' when (`smart_scripts`.`action_type` = 79) then 'SMART_ACTION_SET_RANGED_MOVEMENT' when (`smart_scripts`.`action_type` = 80) then 'SMART_ACTION_CALL_TIMED_ACTIONLIST' when (`smart_scripts`.`action_type` = 81) then 'SMART_ACTION_SET_NPC_FLAG' when (`smart_scripts`.`action_type` = 82) then 'SMART_ACTION_ADD_NPC_FLAG' when (`smart_scripts`.`action_type` = 83) then 'SMART_ACTION_REMOVE_NPC_FLAG' when (`smart_scripts`.`action_type` = 84) then 'SMART_ACTION_SIMPLE_TALK' when (`smart_scripts`.`action_type` = 85) then 'SMART_ACTION_SELF_CAST' when (`smart_scripts`.`action_type` = 86) then 'SMART_ACTION_CROSS_CAST' when (`smart_scripts`.`action_type` = 87) then 'SMART_ACTION_CALL_RANDOM_TIMED_ACTIONLIST' when (`smart_scripts`.`action_type` = 88) then 'SMART_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST' when (`smart_scripts`.`action_type` = 89) then 'SMART_ACTION_RANDOM_MOVE' when (`smart_scripts`.`action_type` = 90) then 'SMART_ACTION_SET_UNIT_FIELD_BYTES_1' when (`smart_scripts`.`action_type` = 91) then 'SMART_ACTION_REMOVE_UNIT_FIELD_BYTES_1' when (`smart_scripts`.`action_type` = 92) then 'SMART_ACTION_INTERRUPT_SPELL' when (`smart_scripts`.`action_type` = 93) then 'SMART_ACTION_SEND_GO_CUSTOM_ANIM' when (`smart_scripts`.`action_type` = 94) then 'SMART_ACTION_SET_DYNAMIC_FLAG' when (`smart_scripts`.`action_type` = 95) then 'SMART_ACTION_ADD_DYNAMIC_FLAG' when (`smart_scripts`.`action_type` = 96) then 'SMART_ACTION_REMOVE_DYNAMIC_FLAG' when (`smart_scripts`.`action_type` = 97) then 'SMART_ACTION_JUMP_TO_POS' when (`smart_scripts`.`action_type` = 98) then 'SMART_ACTION_SEND_GOSSIP_MENU' when (`smart_scripts`.`action_type` = 99) then 'SMART_ACTION_GO_SET_LOOT_STATE' when (`smart_scripts`.`action_type` = 100) then 'SMART_ACTION_SEND_TARGET_TO_TARGET' when (`smart_scripts`.`action_type` = 101) then 'SMART_ACTION_SET_HOME_POS' when (`smart_scripts`.`action_type` = 102) then 'SMART_ACTION_SET_HEALTH_REGEN' when (`smart_scripts`.`action_type` = 103) then 'SMART_ACTION_SET_ROOT' when (`smart_scripts`.`action_type` = 104) then 'SMART_ACTION_SET_GO_FLAG' when (`smart_scripts`.`action_type` = 105) then 'SMART_ACTION_ADD_GO_FLAG' when (`smart_scripts`.`action_type` = 106) then 'SMART_ACTION_REMOVE_GO_FLAG' when (`smart_scripts`.`action_type` = 107) then 'SMART_ACTION_SUMMON_CREATURE_GROUP' when (`smart_scripts`.`action_type` = 108) then 'SMART_ACTION_SET_POWER' when (`smart_scripts`.`action_type` = 109) then 'SMART_ACTION_ADD_POWER' when (`smart_scripts`.`action_type` = 110) then 'SMART_ACTION_REMOVE_POWER' when (`smart_scripts`.`action_type` = 111) then 'SMART_ACTION_GAME_EVENT_STOP' when (`smart_scripts`.`action_type` = 112) then 'SMART_ACTION_GAME_EVENT_START' when (`smart_scripts`.`action_type` = 113) then 'SMART_ACTION_START_CLOSEST_WAYPOINT' when (`smart_scripts`.`action_type` = 114) then 'SMART_ACTION_MOVE_OFFSET' when (`smart_scripts`.`action_type` = 115) then 'SMART_ACTION_RANDOM_SOUND' when (`smart_scripts`.`action_type` = 116) then 'SMART_ACTION_SET_CORPSE_DELAY' when (`smart_scripts`.`action_type` = 117) then 'SMART_ACTION_DISABLE_EVADE' when (`smart_scripts`.`action_type` = 118) then 'SMART_ACTION_GO_SET_GO_STATE' when (`smart_scripts`.`action_type` = 119) then 'SMART_ACTION_SET_CAN_FLY' when (`smart_scripts`.`action_type` = 120) then 'SMART_ACTION_REMOVE_AURAS_BY_TYPE' when (`smart_scripts`.`action_type` = 121) then 'SMART_ACTION_SET_SIGHT_DIST' when (`smart_scripts`.`action_type` = 122) then 'SMART_ACTION_FLEE' when (`smart_scripts`.`action_type` = 123) then 'SMART_ACTION_ADD_THREAT' when (`smart_scripts`.`action_type` = 124) then 'SMART_ACTION_LOAD_EQUIPMENT' when (`smart_scripts`.`action_type` = 125) then 'SMART_ACTION_TRIGGER_RANDOM_TIMED_EVENT' when (`smart_scripts`.`action_type` = 126) then 'SMART_ACTION_REMOVE_ALL_GAMEOBJECTS' when (`smart_scripts`.`action_type` = 127) then 'SMART_ACTION_PAUSE_MOVEMENT' when (`smart_scripts`.`action_type` = 128) then 'SMART_ACTION_PLAY_ANIMKIT' when (`smart_scripts`.`action_type` = 129) then 'SMART_ACTION_SCENE_PLAY' when (`smart_scripts`.`action_type` = 130) then 'SMART_ACTION_SCENE_CANCEL' when (`smart_scripts`.`action_type` = 131) then 'SMART_ACTION_SPAWN_SPAWNGROUP' when (`smart_scripts`.`action_type` = 132) then 'SMART_ACTION_DESPAWN_SPAWNGROUP' when (`smart_scripts`.`action_type` = 133) then 'SMART_ACTION_RESPAWN_BY_SPAWNID' when (`smart_scripts`.`action_type` = 134) then 'SMART_ACTION_INVOKER_CAST' when (`smart_scripts`.`action_type` = 135) then 'SMART_ACTION_PLAY_CINEMATIC' when (`smart_scripts`.`action_type` = 136) then 'SMART_ACTION_SET_MOVEMENT_SPEED' when (`smart_scripts`.`action_type` = 137) then 'SMART_ACTION_PLAY_SPELL_VISUAL_KIT' when (`smart_scripts`.`action_type` = 138) then 'SMART_ACTION_OVERRIDE_LIGHT' when (`smart_scripts`.`action_type` = 139) then 'SMART_ACTION_OVERRIDE_WEATHER' else `smart_scripts`.`action_type` end) AS `action_type`,`smart_scripts`.`action_param1` AS `action_param1`,`smart_scripts`.`action_param2` AS `action_param2`,`smart_scripts`.`action_param3` AS `action_param3`,`smart_scripts`.`action_param4` AS `action_param4`,`smart_scripts`.`action_param5` AS `action_param5`,`smart_scripts`.`action_param6` AS `action_param6`,(case when (`smart_scripts`.`target_type` = 0) then 'SMART_TARGET_NONE' when (`smart_scripts`.`target_type` = 1) then 'SMART_TARGET_SELF' when (`smart_scripts`.`target_type` = 2) then 'SMART_TARGET_VICTIM' when (`smart_scripts`.`target_type` = 3) then 'SMART_TARGET_HOSTILE_SECOND_AGGRO' when (`smart_scripts`.`target_type` = 4) then 'SMART_TARGET_HOSTILE_LAST_AGGRO' when (`smart_scripts`.`target_type` = 5) then 'SMART_TARGET_HOSTILE_RANDOM' when (`smart_scripts`.`target_type` = 6) then 'SMART_TARGET_HOSTILE_RANDOM_NOT_TOP' when (`smart_scripts`.`target_type` = 7) then 'SMART_TARGET_ACTION_INVOKER' when (`smart_scripts`.`target_type` = 8) then 'SMART_TARGET_POSITION' when (`smart_scripts`.`target_type` = 9) then 'SMART_TARGET_CREATURE_RANGE' when (`smart_scripts`.`target_type` = 10) then 'SMART_TARGET_CREATURE_GUID' when (`smart_scripts`.`target_type` = 11) then 'SMART_TARGET_CREATURE_DISTANCE' when (`smart_scripts`.`target_type` = 12) then 'SMART_TARGET_STORED' when (`smart_scripts`.`target_type` = 13) then 'SMART_TARGET_GAMEOBJECT_RANGE' when (`smart_scripts`.`target_type` = 14) then 'SMART_TARGET_GAMEOBJECT_GUID' when (`smart_scripts`.`target_type` = 15) then 'SMART_TARGET_GAMEOBJECT_DISTANCE' when (`smart_scripts`.`target_type` = 16) then 'SMART_TARGET_INVOKER_PARTY' when (`smart_scripts`.`target_type` = 17) then 'SMART_TARGET_PLAYER_RANGE' when (`smart_scripts`.`target_type` = 18) then 'SMART_TARGET_PLAYER_DISTANCE' when (`smart_scripts`.`target_type` = 19) then 'SMART_TARGET_CLOSEST_CREATURE' when (`smart_scripts`.`target_type` = 20) then 'SMART_TARGET_CLOSEST_GAMEOBJECT' when (`smart_scripts`.`target_type` = 21) then 'SMART_TARGET_CLOSEST_PLAYER' when (`smart_scripts`.`target_type` = 22) then 'SMART_TARGET_ACTION_INVOKER_VEHICLE' when (`smart_scripts`.`target_type` = 23) then 'SMART_TARGET_OWNER_OR_SUMMONER' when (`smart_scripts`.`target_type` = 24) then 'SMART_TARGET_THREAT_LIST' when (`smart_scripts`.`target_type` = 25) then 'SMART_TARGET_CLOSEST_ENEMY' when (`smart_scripts`.`target_type` = 26) then 'SMART_TARGET_CLOSEST_FRIENDLY' when (`smart_scripts`.`target_type` = 27) then 'SMART_TARGET_LOOT_RECIPIENTS' when (`smart_scripts`.`target_type` = 28) then 'SMART_TARGET_FARTHEST' when (`smart_scripts`.`target_type` = 29) then 'SMART_TARGET_VEHICLE_PASSENGER' when (`smart_scripts`.`target_type` = 30) then 'SMART_TARGET_CLOSEST_UNSPAWNED_GAMEOBJECT' else `smart_scripts`.`target_type` end) AS `target_type`,`smart_scripts`.`target_param1` AS `target_param1`,`smart_scripts`.`target_param2` AS `target_param2`,`smart_scripts`.`target_param3` AS `target_param3`,`smart_scripts`.`target_param4` AS `target_param4`,`smart_scripts`.`target_x` AS `target_x`,`smart_scripts`.`target_y` AS `target_y`,`smart_scripts`.`target_z` AS `target_z`,`smart_scripts`.`target_o` AS `target_o`,`smart_scripts`.`comment` AS `comment` from `smart_scripts` */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; @@ -4067,4 +4071,4 @@ CREATE TABLE `waypoints` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2024-08-17 22:26:15 +-- Dump completed on 2024-11-22 23:18:19 diff --git a/sql/updates/auth/3.3.5/2024_08_17_00_auth.sql b/sql/old/3.3.5a/auth/24081_2024_11_22/2024_08_17_00_auth.sql similarity index 100% rename from sql/updates/auth/3.3.5/2024_08_17_00_auth.sql rename to sql/old/3.3.5a/auth/24081_2024_11_22/2024_08_17_00_auth.sql diff --git a/sql/updates/auth/3.3.5/2024_08_28_01_auth.sql b/sql/old/3.3.5a/auth/24081_2024_11_22/2024_08_28_01_auth.sql similarity index 100% rename from sql/updates/auth/3.3.5/2024_08_28_01_auth.sql rename to sql/old/3.3.5a/auth/24081_2024_11_22/2024_08_28_01_auth.sql diff --git a/sql/updates/auth/3.3.5/2024_08_30_00_auth.sql b/sql/old/3.3.5a/auth/24081_2024_11_22/2024_08_30_00_auth.sql similarity index 100% rename from sql/updates/auth/3.3.5/2024_08_30_00_auth.sql rename to sql/old/3.3.5a/auth/24081_2024_11_22/2024_08_30_00_auth.sql diff --git a/sql/old/3.3.5a/auth/24081_2024_11_22/2024_09_26_00_auth.sql b/sql/old/3.3.5a/auth/24081_2024_11_22/2024_09_26_00_auth.sql new file mode 100644 index 00000000000..a5c75e51c38 --- /dev/null +++ b/sql/old/3.3.5a/auth/24081_2024_11_22/2024_09_26_00_auth.sql @@ -0,0 +1,20 @@ + +ALTER TABLE `realmlist` MODIFY `population` float NOT NULL DEFAULT '0'; + +SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; -- views do not have explicit charset/collation options but record whatever the connection settings were as their own (visible in mysqldump) + +DROP VIEW IF EXISTS `vw_log_history`; +DROP VIEW IF EXISTS `vw_rbac`; + +CREATE SQL SECURITY INVOKER VIEW `vw_log_history` AS (SELECT FROM_UNIXTIME(MIN(`logs`.`time`)) AS `First Logged` ,FROM_UNIXTIME(MAX(`logs`.`time`)) AS `Last Logged` ,COUNT(*) AS `Occurrences` ,`realmlist`.`name` AS `Realm` ,`logs`.`type` ,`logs`.`level` ,`logs`.`string` FROM `logs` LEFT JOIN realmlist ON `logs`.`realm` = `realmlist`.`id` GROUP BY `logs`.`string`, `logs`.`type`, `logs`.`realm`); + +CREATE SQL SECURITY INVOKER VIEW `vw_rbac` AS +( + SELECT `t1`.`linkedId` AS `Permission ID`, + `t1`.`id` AS `Permission Group`, + IFNULL(`t2`.`secId`, 'linked') AS `Security Level`, + `t3`.`name` AS `Permission` + FROM `rbac_linked_permissions` `t1` + LEFT JOIN `rbac_default_permissions` `t2` ON `t1`.`id` = `t2`.`permissionId` + LEFT JOIN `rbac_permissions` `t3` ON `t1`.`linkedId` = `t3`.`id` +); diff --git a/sql/updates/characters/3.3.5/2024_08_17_00_characters.sql b/sql/old/3.3.5a/characters/24081_2024_11_22/2024_08_17_00_characters.sql similarity index 100% rename from sql/updates/characters/3.3.5/2024_08_17_00_characters.sql rename to sql/old/3.3.5a/characters/24081_2024_11_22/2024_08_17_00_characters.sql diff --git a/sql/old/3.3.5a/characters/24081_2024_11_22/2024_10_03_00_characters.sql b/sql/old/3.3.5a/characters/24081_2024_11_22/2024_10_03_00_characters.sql new file mode 100644 index 00000000000..7b5a6fcf357 --- /dev/null +++ b/sql/old/3.3.5a/characters/24081_2024_11_22/2024_10_03_00_characters.sql @@ -0,0 +1,29 @@ +-- append guid as hex to characters who have duplicate names in database except the one with lowest guid (assumed to have been created first) +-- and flag them for rename +CREATE TEMPORARY TABLE `characters_to_rename` SELECT + c2.`guid` + FROM + ( + SELECT + c1.`name` AS `name`, + MIN(c1.`guid`) AS originalGuid + FROM + `characters` c1 + WHERE + LENGTH(c1.`name`) > 0 + GROUP BY + 1 + HAVING + COUNT(*) > 1 + ) c3 + INNER JOIN `characters` c2 ON c3.`name` = c2.`name` + WHERE + c2.guid <> c3.originalGuid; + +UPDATE `characters` SET `name` = CONCAT(SUBSTRING(`name` FROM 1 FOR 12 - LENGTH(CONV(`guid`, 10, 16))), CONV(`guid`, 10, 16)), `at_login` = `at_login` | 1 WHERE `guid` IN (SELECT `guid` FROM `characters_to_rename`); + +-- recreate name index with unique constraint +ALTER TABLE `characters` DROP INDEX `idx_name`; +ALTER TABLE `characters` MODIFY COLUMN `name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL AFTER `account`; +UPDATE `characters` SET `name` = NULL WHERE `name` = ''; +ALTER TABLE `characters` ADD UNIQUE INDEX `idx_name` (`name` ASC); diff --git a/sql/updates/world/3.3.5/2024_08_17_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_08_17_00_world.sql similarity index 100% rename from sql/updates/world/3.3.5/2024_08_17_00_world.sql rename to sql/old/3.3.5a/world/24081_2024_11_22/2024_08_17_00_world.sql diff --git a/sql/updates/world/3.3.5/2024_08_21_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_08_21_00_world.sql similarity index 100% rename from sql/updates/world/3.3.5/2024_08_21_00_world.sql rename to sql/old/3.3.5a/world/24081_2024_11_22/2024_08_21_00_world.sql diff --git a/sql/updates/world/3.3.5/2024_09_07_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_07_00_world.sql similarity index 100% rename from sql/updates/world/3.3.5/2024_09_07_00_world.sql rename to sql/old/3.3.5a/world/24081_2024_11_22/2024_09_07_00_world.sql diff --git a/sql/updates/world/3.3.5/2024_09_11_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_11_00_world.sql similarity index 100% rename from sql/updates/world/3.3.5/2024_09_11_00_world.sql rename to sql/old/3.3.5a/world/24081_2024_11_22/2024_09_11_00_world.sql diff --git a/sql/updates/world/3.3.5/2024_09_14_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_14_00_world.sql similarity index 100% rename from sql/updates/world/3.3.5/2024_09_14_00_world.sql rename to sql/old/3.3.5a/world/24081_2024_11_22/2024_09_14_00_world.sql diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_29_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_29_00_world.sql new file mode 100644 index 00000000000..b293fc29fea --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_29_00_world.sql @@ -0,0 +1,6 @@ +-- Deletes Ratchet as Ally GY when dying in Thunder Bluff +DELETE FROM `graveyard_zone` WHERE `ID`= 249 AND `GhostZone`= 1638; +-- Adds Bloodhoof Village as Ally GY when dying in Thunder Bluff +DELETE FROM `graveyard_zone` WHERE `ID`= 89 AND `GhostZone`= 1638; +INSERT INTO `graveyard_zone` (`ID`, `GhostZone`, `Faction`, `Comment`) VALUES +(89, 1638, 469, 'Mulgore, Bloodhoof Village GY - Mulgore'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_29_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_29_01_world.sql new file mode 100644 index 00000000000..5d5f71d232c --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_09_29_01_world.sql @@ -0,0 +1,2 @@ +-- The Aldor and Scryers flightmasters should remain unlocked in reputations higher than friendly +UPDATE `conditions` SET `ConditionValue2`=`ConditionValue2`|32|64|128 WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (8558,8560); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_02_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_02_00_world.sql new file mode 100644 index 00000000000..7c5cc2b4193 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_02_00_world.sql @@ -0,0 +1,10 @@ +-- +DELETE FROM `prospecting_loot_template` WHERE `Entry`=10620 AND `Reference`=13001; +DELETE FROM `prospecting_loot_template` WHERE `Entry`=10620 AND `Item` IN (21929,23077,23079,23107,23112,23117); +INSERT INTO `prospecting_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(10620,21929,0,0,0,1,1,1,2,NULL), +(10620,23077,0,0,0,1,1,1,2,NULL), +(10620,23079,0,0,0,1,1,1,2,NULL), +(10620,23107,0,0,0,1,1,1,2,NULL), +(10620,23112,0,0,0,1,1,1,2,NULL), +(10620,23117,0,0,0,1,1,1,2,NULL); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_05_00_world_2022_12_27_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_05_00_world_2022_12_27_01_world.sql new file mode 100644 index 00000000000..5e0f6fd45c8 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_05_00_world_2022_12_27_01_world.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `trinity_string` WHERE `entry`=5089; +INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES +(5089,'Template StringID: %.*s\Spawn StringID: %.*s\nScript StringID: %.*s'); + +ALTER TABLE `creature` ADD `StringId` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL AFTER ScriptName; + +ALTER TABLE `creature_template` ADD `StringId` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL AFTER ScriptName; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_05_01_world_2023_07_30_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_05_01_world_2023_07_30_00_world.sql new file mode 100644 index 00000000000..0b4686a7e7d --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_05_01_world_2023_07_30_00_world.sql @@ -0,0 +1,3 @@ +ALTER TABLE `gameobject` ADD `StringId` varchar(64) AFTER `ScriptName`; + +ALTER TABLE `gameobject_template` ADD `StringId` varchar(64) AFTER `ScriptName`; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_06_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_06_00_world.sql new file mode 100644 index 00000000000..1adcd3a6d59 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_06_00_world.sql @@ -0,0 +1,5 @@ +-- Spellscripts for "Toss your Luck!" +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_item_titanium_seal_of_dalaran_toss','spell_item_titanium_seal_of_dalaran_catch'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(60458, 'spell_item_titanium_seal_of_dalaran_toss'), +(60476, 'spell_item_titanium_seal_of_dalaran_catch'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_07_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_07_00_world.sql new file mode 100644 index 00000000000..5045176144d --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_07_00_world.sql @@ -0,0 +1,74 @@ +-- +SET @GREYREF := 1056; +SET @FOODREF := 1058; +DELETE FROM `reference_loot_template` WHERE `Entry` BETWEEN @GREYREF AND @GREYREF + 1; +DELETE FROM `reference_loot_template` WHERE `Entry` = @FOODREF; +SET @REFGREY0 := @GREYREF; +-- Correct ref loot for various grey level 1 to 5 Vanilla +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@REFGREY0, 1364, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Ragged Leather Vest'), +(@REFGREY0, 1366, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Ragged Leather Pants'), +(@REFGREY0, 1367, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Ragged Leather Boots'), +(@REFGREY0, 1368, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Ragged Leather Gloves'), +(@REFGREY0, 1369, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Ragged Leather Belt'), +(@REFGREY0, 1370, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Ragged Leather Bracers'), +(@REFGREY0, 1372, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Ragged Cloak'), +(@REFGREY0, 1374, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Frayed Shoes'), +(@REFGREY0, 1376, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Frayed Cloak'), +(@REFGREY0, 1377, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Frayed Gloves'), +(@REFGREY0, 1378, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Frayed Pants'), +(@REFGREY0, 1380, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Frayed Robe'), +(@REFGREY0, 3363, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Frayed Belt'), +(@REFGREY0, 3365, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Frayed Bracers'), +(@REFGREY0, 2649, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Flimsy Chain Belt'), +(@REFGREY0, 2650, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Flimsy Chain Boots'), +(@REFGREY0, 2651, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Flimsy Chain Bracers'), +(@REFGREY0, 2652, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Flimsy Chain Cloak'), +(@REFGREY0, 2653, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Flimsy Chain Gloves'), +(@REFGREY0, 2654, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Flimsy Chain Pants'), +(@REFGREY0, 2656, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Flimsy Chain Vest'), +(@REFGREY0, 2210, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Battered Buckler'), +(@REFGREY0, 2211, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 0 : Bent Large Shield'); + +SET @REFGREY1 := @GREYREF + 1; +-- Correct ref loot for various grey level 1 to 5 TBC +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@REFGREY1, 21002, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Unkempt Belt'), +(@REFGREY1, 21003, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Unkempt Bracers'), +(@REFGREY1, 21004, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Unkempt Cloak'), +(@REFGREY1, 21005, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Unkempt Gloves'), +(@REFGREY1, 21006, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Unkempt Pants'), +(@REFGREY1, 21007, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Unkempt Robe'), +(@REFGREY1, 21008, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Unkempt Shoes'), +(@REFGREY1, 21009, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Scraggy Leather Belt'), +(@REFGREY1, 21010, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Scraggy Leather Boots'), +(@REFGREY1, 21011, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Scraggy Leather Bracers'), +(@REFGREY1, 21012, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Scraggy Leather Gloves'), +(@REFGREY1, 21013, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Scraggy Leather Pants'), +(@REFGREY1, 21014, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Scraggy Leather Vest'), +(@REFGREY1, 21015, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Shoddy Chain Belt'), +(@REFGREY1, 21016, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Shoddy Chain Vest'), +(@REFGREY1, 21017, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Shoddy Chain Pants'), +(@REFGREY1, 21018, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Shoddy Chain Gloves'), +(@REFGREY1, 21019, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Shoddy Chain Bracers'), +(@REFGREY1, 21020, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Shoddy Chain Boots'), +(@REFGREY1, 21021, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Battered Shield'), +(@REFGREY1, 21022, 0, 0, 0, 1, 1, 1, 1, 'Grey 1-5 EXP 1 : Weather Beaten Buckler'); + +-- Food Reference loot for Entry 2843 : Battered Chest +SET @REFFOOD := @FOODREF; +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@REFFOOD,159,0,20,0,1,1,1,1, 'Battered Chest (2943) - Refreshing Spring Water'), +(@REFFOOD,4540,0,10,0,1,1,1,1, 'Battered Chest (2943) - Tough Hunk of Bread'), +(@REFFOOD,2070,0,10,0,1,1,1,1, 'Battered Chest (2943) - Darnassian Bleu'), +(@REFFOOD,117,0,10,0,1,1,1,1, 'Battered Chest (2943) - Tough Jerky'), +(@REFFOOD,4536,0,10,0,1,1,1,1, 'Battered Chest (2943) - Shiny Red Apple'); + +-- Update loot for Entry 2843 : Battered Chest +SET @OBJECT := 2265; +DELETE FROM `gameobject_loot_template` WHERE `Entry`=@OBJECT; +INSERT INTO `gameobject_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@OBJECT,@REFFOOD,@REFFOOD,100,0,1,0,1,2, 'Battered Chest - (Food Battered Chest (2943) ReferenceTable)'), +(@OBJECT,@REFGREY0,@REFGREY0,100,0,1,0,1,1, 'Battered Chest - (Grey 1-5 EXP 0 ReferenceTable)'); + +UPDATE `gameobject_template_addon` SET `mingold`=1, `maxgold`=20 WHERE `entry` = 2843; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_07_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_07_01_world.sql new file mode 100644 index 00000000000..695691fd7f0 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_07_01_world.sql @@ -0,0 +1,35 @@ +-- Pathing for Harb Foulmountain +SET @PATH=21564 * 10; +SET @NPC=14426; +UPDATE `creature` SET `position_x`=-4929.023,`position_y`=-2066.4766,`position_z`=85.52668,`wander_distance`=0,`MovementType`=2 WHERE `guid`=21564; +UPDATE `creature_template` SET `MovementType`= 2 WHERE `entry`=@NPC; +UPDATE `creature_template_addon` SET `PvPFlags` = 0 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=21564; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(21564, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH,1,-4929.023,-2066.4766,85.52668,NULL,0,0,0,100,0), +(@PATH,2,-4905.3555,-2069.9805,84.25914,NULL,0,0,0,100,0), +(@PATH,3,-4899.6943,-2061.0269,83.636856,NULL,0,0,0,100,0), +(@PATH,4,-4891.1626,-2039.651,83.30705,NULL,0,0,0,100,0), +(@PATH,5,-4881.945,-2017.6359,86.298546,NULL,0,0,0,100,0), +(@PATH,6,-4873.128,-1993.7965,91.65875,NULL,0,0,0,100,0), +(@PATH,7,-4878.21,-1974.4436,92.018616,NULL,0,0,0,100,0), +(@PATH,8,-4873.579,-1956.8225,90.450455,NULL,0,0,0,100,0), +(@PATH,9,-4862.9395,-1946.7357,86.90235,NULL,0,0,0,100,0), +(@PATH,10,-4834.9155,-1923.0642,84.13316,NULL,0,0,0,100,0), +(@PATH,11,-4801.48,-1895.6833,89.333145,NULL,0,0,0,100,0), +(@PATH,12,-4776.8984,-1881.0486,90.39604,NULL,0,0,0,100,0), +(@PATH,13,-4751.4434,-1865.2213,88.92392,NULL,0,0,0,100,0), +(@PATH,14,-4776.8984,-1881.0486,90.39604,NULL,0,0,0,100,0), +(@PATH,15,-4801.48,-1895.6833,89.333145,NULL,0,0,0,100,0), +(@PATH,16,-4834.9155,-1923.0642,84.13316,NULL,0,0,0,100,0), +(@PATH,17,-4862.9395,-1946.7357,86.90235,NULL,0,0,0,100,0), +(@PATH,18,-4873.579,-1956.8225,90.450455,NULL,0,0,0,100,0), +(@PATH,19,-4878.21,-1974.4436,92.018616,NULL,0,0,0,100,0), +(@PATH,20,-4873.128,-1993.7965,91.65875,NULL,0,0,0,100,0), +(@PATH,21,-4881.914,-2017.5612,86.331604,NULL,0,0,0,100,0), +(@PATH,22,-4891.1626,-2039.651,83.30705,NULL,0,0,0,100,0), +(@PATH,23,-4899.6943,-2061.0269,83.636856,NULL,0,0,0,100,0), +(@PATH,24,-4905.3555,-2069.9805,84.25914,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_00_world.sql new file mode 100644 index 00000000000..5f949e62eb5 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_00_world.sql @@ -0,0 +1,8 @@ +-- Add 4 missing gameobjects in Thunderbluff +SET @OGUID=9901; -- four consecutive free gob guids atm +DELETE FROM `gameobject` WHERE `guid` IN (@OGUID,@OGUID+1,@OGUID+2,@OGUID+3); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@OGUID, 152583, 1, 0, 0, 1, 1, -1257.8424072265625, 24.41799354553222656, 128.217498779296875, 2.888511419296264648, 0, 0, 0.99200439453125, 0.126203224062919616, 120, 100, 1, '', NULL, 0), +(@OGUID+1, 185004, 1, 0, 0, 1, 1, -1049.5347900390625, -290.34722900390625, 159.0303497314453125, 0.209439441561698913, 0, 0, 0.104528427124023437, 0.994521915912628173, 120, 100, 1, '', NULL, 0), +(@OGUID+2, 185004, 1, 0, 0, 1, 1, -1050.2257080078125, -290.552093505859375, 159.0303497314453125, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 120, 100, 1, '', NULL, 0), +(@OGUID+3, 182257, 1, 0, 0, 1, 1, -1049.82470703125, -286.196197509765625, 159.0303497314453125, 2.548179388046264648, 0, 0, 0.956304550170898437, 0.292372345924377441, 120, 100, 1, '', NULL, 0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_01_world.sql new file mode 100644 index 00000000000..44380e5b69b --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_01_world.sql @@ -0,0 +1,95 @@ +-- Pathing for Greater Firebird Entry: 8207 +SET @NPC=8207; +SET @GUID=51827; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=-7710.758,`position_y`=-3956.6245,`position_z`=9.728199,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH,1,-7710.758,-3956.6245,9.728199,NULL,0,0,0,100,0), +(@PATH,2,-7715.532,-3928.461,8.749683,NULL,0,0,0,100,0), +(@PATH,3,-7700.7812,-3906.8174,9.525318,NULL,0,0,0,100,0), +(@PATH,4,-7663.8013,-3875.1206,8.839839,NULL,0,0,0,100,0), +(@PATH,5,-7657.634,-3840.8525,10.83584,NULL,0,0,0,100,0), +(@PATH,6,-7671.237,-3821.5408,15.216432,NULL,0,0,0,100,0), +(@PATH,7,-7678.901,-3795.2083,21.681417,NULL,0,0,0,100,0), +(@PATH,8,-7681.229,-3756.9055,24.819561,NULL,0,0,0,100,0), +(@PATH,9,-7673.8613,-3716.5469,29.9973,NULL,0,0,0,100,0), +(@PATH,10,-7673.6987,-3687.2478,28.922815,NULL,0,0,0,100,0), +(@PATH,11,-7656.421,-3656.8772,26.623302,NULL,0,0,0,100,0), +(@PATH,12,-7662.468,-3629.3574,28.541769,NULL,0,0,0,100,0), +(@PATH,13,-7677.4897,-3582.9736,32.306168,NULL,0,0,0,100,0), +(@PATH,14,-7677.9395,-3540.1658,24.65451,NULL,0,0,0,100,0), +(@PATH,15,-7675.5747,-3503.2544,26.522423,NULL,0,0,0,100,0), +(@PATH,16,-7661.9976,-3472.317,26.822615,NULL,0,0,0,100,0), +(@PATH,17,-7631.3594,-3455.7761,29.158308,NULL,0,0,0,100,0), +(@PATH,18,-7600.8604,-3474.5388,23.820978,NULL,0,0,0,100,0), +(@PATH,19,-7556.848,-3491.1558,16.88118,NULL,0,0,0,100,0), +(@PATH,20,-7516.682,-3490.9087,15.407843,NULL,0,0,0,100,0), +(@PATH,21,-7482.791,-3478.7441,14.191426,NULL,0,0,0,100,0), +(@PATH,22,-7448.849,-3445.8245,11.7975445,NULL,0,0,0,100,0), +(@PATH,23,-7413.9087,-3422.8777,11.448396,NULL,0,0,0,100,0), +(@PATH,24,-7384.762,-3389.0525,12.521492,NULL,0,0,0,100,0), +(@PATH,25,-7390.377,-3364.397,9.953996,NULL,0,0,0,100,0), +(@PATH,26,-7417.989,-3343.9648,10.760514,NULL,0,0,0,100,0), +(@PATH,27,-7455.8647,-3346.955,13.619991,NULL,0,0,0,100,0), +(@PATH,28,-7488.782,-3342.5862,15.875005,NULL,0,0,0,100,0), +(@PATH,29,-7525.165,-3314.5938,23.809805,NULL,0,0,0,100,0), +(@PATH,30,-7545.5747,-3282.4626,28.957174,NULL,0,0,0,100,0), +(@PATH,31,-7538.598,-3249.0413,27.585447,NULL,0,0,0,100,0), +(@PATH,32,-7510.407,-3218.524,23.716492,NULL,0,0,0,100,0), +(@PATH,33,-7479.388,-3191.0247,14.460273,NULL,0,0,0,100,0), +(@PATH,34,-7465.8647,-3183.5723,13.781521,NULL,0,0,0,100,0), +(@PATH,35,-7455.6353,-3158.7048,12.994573,NULL,0,0,0,100,0), +(@PATH,36,-7456.4126,-3114.431,13.864947,NULL,0,0,0,100,0), +(@PATH,37,-7490.0244,-3081.6028,13.82893,NULL,0,0,0,100,0), +(@PATH,38,-7517.932,-3068.775,13.160608,NULL,0,0,0,100,0), +(@PATH,39,-7552.173,-3088.9275,16.074425,NULL,0,0,0,100,0), +(@PATH,40,-7580.729,-3117.3545,27.553055,NULL,0,0,0,100,0), +(@PATH,41,-7618.8794,-3141.1875,35.611378,NULL,0,0,0,100,0), +(@PATH,42,-7646.901,-3118.3042,37.350555,NULL,0,0,0,100,0), +(@PATH,43,-7678.538,-3115.4187,44.10227,NULL,0,0,0,100,0), +(@PATH,44,-7646.901,-3118.3042,37.350555,NULL,0,0,0,100,0), +(@PATH,45,-7618.8794,-3141.1875,35.611378,NULL,0,0,0,100,0), +(@PATH,46,-7580.729,-3117.3545,27.553055,NULL,0,0,0,100,0), +(@PATH,47,-7552.173,-3088.9275,16.074425,NULL,0,0,0,100,0), +(@PATH,48,-7517.932,-3068.775,13.160608,NULL,0,0,0,100,0), +(@PATH,49,-7490.0244,-3081.6028,13.82893,NULL,0,0,0,100,0), +(@PATH,50,-7456.4126,-3114.431,13.864947,NULL,0,0,0,100,0), +(@PATH,51,-7455.6353,-3158.7048,12.994573,NULL,0,0,0,100,0), +(@PATH,52,-7465.8647,-3183.5723,13.781521,NULL,0,0,0,100,0), +(@PATH,53,-7479.388,-3191.0247,14.460273,NULL,0,0,0,100,0), +(@PATH,54,-7510.407,-3218.524,23.716492,NULL,0,0,0,100,0), +(@PATH,55,-7538.598,-3249.0413,27.585447,NULL,0,0,0,100,0), +(@PATH,56,-7545.5747,-3282.4626,28.957174,NULL,0,0,0,100,0), +(@PATH,57,-7525.165,-3314.5938,23.809805,NULL,0,0,0,100,0), +(@PATH,58,-7488.782,-3342.5862,15.875005,NULL,0,0,0,100,0), +(@PATH,59,-7455.8647,-3346.955,13.619991,NULL,0,0,0,100,0), +(@PATH,60,-7417.989,-3343.9648,10.760514,NULL,0,0,0,100,0), +(@PATH,61,-7390.377,-3364.397,9.953996,NULL,0,0,0,100,0), +(@PATH,62,-7384.762,-3389.0525,12.521492,NULL,0,0,0,100,0), +(@PATH,63,-7413.9087,-3422.8777,11.448396,NULL,0,0,0,100,0), +(@PATH,64,-7448.849,-3445.8245,11.7975445,NULL,0,0,0,100,0), +(@PATH,65,-7482.721,-3478.6821,14.169454,NULL,0,0,0,100,0), +(@PATH,66,-7516.6113,-3490.8457,15.322148,NULL,0,0,0,100,0), +(@PATH,67,-7556.848,-3491.1558,16.88118,NULL,0,0,0,100,0), +(@PATH,68,-7600.8604,-3474.5388,23.820978,NULL,0,0,0,100,0), +(@PATH,69,-7631.3594,-3455.7761,29.158308,NULL,0,0,0,100,0), +(@PATH,70,-7661.9976,-3472.317,26.822615,NULL,0,0,0,100,0), +(@PATH,71,-7675.5747,-3503.2544,26.522423,NULL,0,0,0,100,0), +(@PATH,72,-7677.9395,-3540.1658,24.65451,NULL,0,0,0,100,0), +(@PATH,73,-7677.4897,-3582.9736,32.306168,NULL,0,0,0,100,0), +(@PATH,74,-7662.468,-3629.3574,28.541769,NULL,0,0,0,100,0), +(@PATH,75,-7656.421,-3656.8772,26.623302,NULL,0,0,0,100,0), +(@PATH,76,-7673.6987,-3687.2478,28.922815,NULL,0,0,0,100,0), +(@PATH,77,-7673.8438,-3716.3994,30.064438,NULL,0,0,0,100,0), +(@PATH,78,-7681.229,-3756.9055,24.819561,NULL,0,0,0,100,0), +(@PATH,79,-7678.901,-3795.2083,21.681417,NULL,0,0,0,100,0), +(@PATH,80,-7671.237,-3821.5408,15.216432,NULL,0,0,0,100,0), +(@PATH,81,-7657.634,-3840.8525,10.83584,NULL,0,0,0,100,0), +(@PATH,82,-7663.8013,-3875.1206,8.839839,NULL,0,0,0,100,0), +(@PATH,83,-7700.7812,-3906.8174,9.525318,NULL,0,0,0,100,0), +(@PATH,84,-7715.532,-3928.461,8.749683,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_02_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_02_world.sql new file mode 100644 index 00000000000..3568360f779 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_02_world.sql @@ -0,0 +1,77 @@ +-- Pathing for Murderous Blisterpaw Entry: 8208 +SET @NPC=8208; +SET @GUID=51825; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=-7025.515,`position_y`=-3491.132,`position_z`=9.274621,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH,1,-7025.515,-3491.132,9.274621,NULL,0,0,0,100,0), +(@PATH,2,-7057.585,-3499.684,10.376134,NULL,0,0,0,100,0), +(@PATH,3,-7083.3726,-3521.9758,11.747719,NULL,0,0,0,100,0), +(@PATH,4,-7116.227,-3516.6216,10.375974,NULL,0,0,0,100,0), +(@PATH,5,-7143.2266,-3517.4648,10.078375,NULL,0,0,0,100,0), +(@PATH,6,-7172.1216,-3513.6719,11.342711,NULL,0,0,0,100,0), +(@PATH,7,-7202.048,-3508.731,11.024831,NULL,0,0,0,100,0), +(@PATH,8,-7247.1226,-3513.0464,11.260182,NULL,0,0,0,100,0), +(@PATH,9,-7277.5615,-3524.6765,12.185095,NULL,0,0,0,100,0), +(@PATH,10,-7302.512,-3540.7358,8.5952,NULL,0,0,0,100,0), +(@PATH,11,-7328.6494,-3568.7114,10.502499,NULL,0,0,0,100,0), +(@PATH,12,-7341.257,-3601.2178,9.939367,NULL,0,0,0,100,0), +(@PATH,13,-7362.0376,-3633.9546,11.387863,NULL,0,0,0,100,0), +(@PATH,14,-7383.2837,-3658.7517,10.012263,NULL,0,0,0,100,0), +(@PATH,15,-7396.5024,-3698.1814,9.407527,NULL,0,0,0,100,0), +(@PATH,16,-7405.75,-3719.763,9.256791,NULL,0,0,0,100,0), +(@PATH,17,-7420.3613,-3750.827,12.278984,NULL,0,0,0,100,0), +(@PATH,18,-7414.9087,-3767.6528,12.649624,NULL,0,0,0,100,0), +(@PATH,19,-7396.8125,-3813.4487,10.233704,NULL,0,0,0,100,0), +(@PATH,20,-7385.053,-3851.4045,10.949272,NULL,0,0,0,100,0), +(@PATH,21,-7363.6816,-3878.0642,11.944022,NULL,0,0,0,100,0), +(@PATH,22,-7366.593,-3917.8196,14.590536,NULL,0,0,0,100,0), +(@PATH,23,-7368.6016,-3951.2683,11.180499,NULL,0,0,0,100,0), +(@PATH,24,-7388.428,-3989.5295,9.057527,NULL,0,0,0,100,0), +(@PATH,25,-7419.9297,-4017.759,10.126763,NULL,0,0,0,100,0), +(@PATH,26,-7455.046,-3985.4866,11.490533,NULL,0,0,0,100,0), +(@PATH,27,-7484.066,-3945.0916,10.125787,NULL,0,0,0,100,0), +(@PATH,28,-7518.1597,-3916.549,10.933404,NULL,0,0,0,100,0), +(@PATH,29,-7545.4316,-3950.7153,10.655572,NULL,0,0,0,100,0), +(@PATH,30,-7549.514,-3973.414,12.167756,NULL,0,0,0,100,0), +(@PATH,31,-7550.2954,-4013.2153,12.256833,NULL,0,0,0,100,0), +(@PATH,32,-7552.7324,-4045.1523,11.282222,NULL,0,0,0,100,0), +(@PATH,33,-7549.6675,-4078.2886,11.486598,NULL,0,0,0,100,0), +(@PATH,34,-7547.963,-4113.612,10.832579,NULL,0,0,0,100,0), +(@PATH,35,-7549.6675,-4078.2886,11.486598,NULL,0,0,0,100,0), +(@PATH,36,-7552.731,-4045.2805,11.270747,NULL,0,0,0,100,0), +(@PATH,37,-7550.2954,-4013.2153,12.256833,NULL,0,0,0,100,0), +(@PATH,38,-7549.514,-3973.414,12.167756,NULL,0,0,0,100,0), +(@PATH,39,-7545.4316,-3950.7153,10.655572,NULL,0,0,0,100,0), +(@PATH,40,-7518.1597,-3916.549,10.933404,NULL,0,0,0,100,0), +(@PATH,41,-7484.066,-3945.0916,10.125787,NULL,0,0,0,100,0), +(@PATH,42,-7455.046,-3985.4866,11.490533,NULL,0,0,0,100,0), +(@PATH,43,-7419.9297,-4017.759,10.126763,NULL,0,0,0,100,0), +(@PATH,44,-7388.428,-3989.5295,9.057527,NULL,0,0,0,100,0), +(@PATH,45,-7368.6074,-3951.3164,11.189776,NULL,0,0,0,100,0), +(@PATH,46,-7366.593,-3917.8196,14.590536,NULL,0,0,0,100,0), +(@PATH,47,-7363.6816,-3878.0642,11.944022,NULL,0,0,0,100,0), +(@PATH,48,-7385.053,-3851.4045,10.949272,NULL,0,0,0,100,0), +(@PATH,49,-7396.8125,-3813.4487,10.233704,NULL,0,0,0,100,0), +(@PATH,50,-7414.9087,-3767.6528,12.649624,NULL,0,0,0,100,0), +(@PATH,51,-7420.3613,-3750.827,12.278984,NULL,0,0,0,100,0), +(@PATH,52,-7405.75,-3719.763,9.256791,NULL,0,0,0,100,0), +(@PATH,53,-7396.5024,-3698.1814,9.407527,NULL,0,0,0,100,0), +(@PATH,54,-7383.2837,-3658.7517,10.012263,NULL,0,0,0,100,0), +(@PATH,55,-7362.0376,-3633.9546,11.387863,NULL,0,0,0,100,0), +(@PATH,56,-7341.257,-3601.2178,9.939367,NULL,0,0,0,100,0), +(@PATH,57,-7328.6494,-3568.7114,10.502499,NULL,0,0,0,100,0), +(@PATH,58,-7302.512,-3540.7358,8.5952,NULL,0,0,0,100,0), +(@PATH,59,-7277.5615,-3524.6765,12.185095,NULL,0,0,0,100,0), +(@PATH,60,-7247.1226,-3513.0464,11.260182,NULL,0,0,0,100,0), +(@PATH,61,-7202.048,-3508.731,11.024831,NULL,0,0,0,100,0), +(@PATH,62,-7172.1216,-3513.6719,11.342711,NULL,0,0,0,100,0), +(@PATH,63,-7143.2637,-3517.452,10.110113,NULL,0,0,0,100,0), +(@PATH,64,-7116.227,-3516.6216,10.375974,NULL,0,0,0,100,0), +(@PATH,65,-7083.3726,-3521.9758,11.747719,NULL,0,0,0,100,0), +(@PATH,66,-7057.585,-3499.684,10.376134,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_03_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_03_world.sql new file mode 100644 index 00000000000..d8d149c8ef5 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_03_world.sql @@ -0,0 +1,41 @@ +-- Pathing for Rex Ashil Entry: 14475 +SET @NPC=14475; +SET @GUID=51836; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=-6630.2847,`position_y`=945.4344,`position_z`=-52.96825,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH,1,-6630.2847,945.4344,-52.96825,NULL,0,0,0,100,0), +(@PATH,2,-6627.747,929.4205,-53.191467,NULL,0,0,0,100,0), +(@PATH,3,-6609.186,929.8785,-53.16585,NULL,0,0,0,100,0), +(@PATH,4,-6591.815,909.97754,-48.229885,NULL,0,0,0,100,0), +(@PATH,5,-6591.289,896.8762,-44.285564,NULL,0,0,0,100,0), +(@PATH,6,-6595.7266,884.783,-44.09041,NULL,0,0,0,100,0), +(@PATH,7,-6581.963,877.2528,-44.54215,NULL,0,0,0,100,0), +(@PATH,8,-6570.469,885.4149,-43.199642,NULL,0,0,0,100,0), +(@PATH,9,-6555.0957,885.0344,-39.406754,NULL,0,0,0,100,0), +(@PATH,10,-6545.19,871.5345,-32.738403,NULL,0,0,0,100,0), +(@PATH,11,-6535.754,862.1162,-29.028198,NULL,0,0,0,100,0), +(@PATH,12,-6518.3926,866.1533,-30.434242,NULL,0,0,0,100,0), +(@PATH,13,-6512.0576,887.03265,-39.736877,NULL,0,0,0,100,0), +(@PATH,14,-6497.0356,901.76587,-41.681843,NULL,0,0,0,100,0), +(@PATH,15,-6473.988,908.0661,-41.303955,NULL,0,0,0,100,0), +(@PATH,16,-6480.6694,921.8447,-41.822407,NULL,0,0,0,100,0), +(@PATH,17,-6473.988,908.0661,-41.303955,NULL,0,0,0,100,0), +(@PATH,18,-6497.0356,901.76587,-41.681843,NULL,0,0,0,100,0), +(@PATH,19,-6512.0576,887.03265,-39.736877,NULL,0,0,0,100,0), +(@PATH,20,-6518.3926,866.1533,-30.434242,NULL,0,0,0,100,0), +(@PATH,21,-6535.754,862.1162,-29.028198,NULL,0,0,0,100,0), +(@PATH,22,-6545.19,871.5345,-32.738403,NULL,0,0,0,100,0), +(@PATH,23,-6555.0957,885.0344,-39.406754,NULL,0,0,0,100,0), +(@PATH,24,-6570.469,885.4149,-43.199642,NULL,0,0,0,100,0), +(@PATH,25,-6581.963,877.2528,-44.54215,NULL,0,0,0,100,0), +(@PATH,26,-6595.7266,884.783,-44.09041,NULL,0,0,0,100,0), +(@PATH,27,-6591.289,896.8762,-44.285564,NULL,0,0,0,100,0), +(@PATH,28,-6591.8135,909.9452,-48.222664,NULL,0,0,0,100,0), +(@PATH,29,-6609.186,929.8785,-53.16585,NULL,0,0,0,100,0), +(@PATH,30,-6627.747,929.4205,-53.191467,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_04_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_04_world.sql new file mode 100644 index 00000000000..50105b3f504 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_04_world.sql @@ -0,0 +1,41 @@ +-- Pathing for Alshirr Banebreath Entry: 14340 +SET @NPC=14340; +SET @GUID=51894; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=4026.523,`position_y`=-555.293,`position_z`=342.505,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH,1,4026.523,-555.293,342.505,NULL,0,0,0,100,0), +(@PATH,2,3999.6077,-585.43585,338.0969,NULL,0,0,0,100,0), +(@PATH,3,3967.8643,-599.3677,338.82224,NULL,0,0,0,100,0), +(@PATH,4,3939.5344,-610.4964,340.5994,NULL,0,0,0,100,0), +(@PATH,5,3918.8508,-620.3714,339.56857,NULL,0,0,0,100,0), +(@PATH,6,3893.1277,-649.1434,334.0132,NULL,0,0,0,100,0), +(@PATH,7,3867.4185,-662.55194,330.74258,NULL,0,0,0,100,0), +(@PATH,8,3851.004,-677.2051,328.14557,NULL,0,0,0,100,0), +(@PATH,9,3841.1611,-713.5064,325.38644,NULL,0,0,0,100,0), +(@PATH,10,3836.204,-740.03125,319.4985,NULL,0,0,0,100,0), +(@PATH,11,3827.0447,-763.3758,314.87888,NULL,0,0,0,100,0), +(@PATH,12,3818.8672,-787.662,307.59967,NULL,0,0,0,100,0), +(@PATH,13,3792.5173,-812.1507,307.89844,NULL,0,0,0,100,0), +(@PATH,14,3768.1362,-831.72095,310.0974,NULL,0,0,0,100,0), +(@PATH,15,3771.9072,-848.68176,305.3522,NULL,0,0,0,100,0), +(@PATH,16,3757.2969,-866.6099,313.99258,NULL,0,0,0,100,0), +(@PATH,17,3771.9072,-848.68176,305.3522,NULL,0,0,0,100,0), +(@PATH,18,3768.1362,-831.72095,310.0974,NULL,0,0,0,100,0), +(@PATH,19,3792.5173,-812.1507,307.89844,NULL,0,0,0,100,0), +(@PATH,20,3818.8672,-787.662,307.59967,NULL,0,0,0,100,0), +(@PATH,21,3827.0447,-763.3758,314.87888,NULL,0,0,0,100,0), +(@PATH,22,3836.197,-740.15375,319.43015,NULL,0,0,0,100,0), +(@PATH,23,3841.1611,-713.5064,325.38644,NULL,0,0,0,100,0), +(@PATH,24,3850.8962,-677.3118,328.18048,NULL,0,0,0,100,0), +(@PATH,25,3867.4185,-662.55194,330.74258,NULL,0,0,0,100,0), +(@PATH,26,3893.1277,-649.1434,334.0132,NULL,0,0,0,100,0), +(@PATH,27,3918.8508,-620.3714,339.56857,NULL,0,0,0,100,0), +(@PATH,28,3939.5344,-610.4964,340.5994,NULL,0,0,0,100,0), +(@PATH,29,3967.8643,-599.3677,338.82224,NULL,0,0,0,100,0), +(@PATH,30,3999.6077,-585.43585,338.0969,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_05_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_05_world.sql new file mode 100644 index 00000000000..6bb796fa996 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_05_world.sql @@ -0,0 +1,25 @@ +-- Pathing for Foulmane Entry: 1847 +SET @NPC=1847; +SET @GUID=45454; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=1867.8231,`position_y`=-1582.6323,`position_z`=59.543274,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +UPDATE `creature_template_addon` SET `PvpFlags`=0 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH,1,1867.8231,-1582.6323,59.543274,NULL,0,0,0,100,0), +(@PATH,2,1862.686,-1575.6617,59.418274,NULL,0,0,0,100,0), +(@PATH,3,1865.2483,-1568.495,58.918274,NULL,0,0,0,100,0), +(@PATH,4,1862.7682,-1561.516,59.257603,NULL,0,0,0,100,0), +(@PATH,5,1866.2867,-1555.184,59.20914,NULL,0,0,0,100,0), +(@PATH,6,1874.4098,-1548.5449,59.26224,NULL,0,0,0,100,0), +(@PATH,7,1888.9252,-1546.674,58.882603,NULL,0,0,0,100,0), +(@PATH,8,1898.0934,-1554.2573,59.132603,NULL,0,0,0,100,0), +(@PATH,9,1900.8027,-1568.277,59.696507,NULL,0,0,0,100,0), +(@PATH,10,1899.4547,-1582.4746,59.418274,NULL,0,0,0,100,0), +(@PATH,11,1896.0823,-1588.0172,59.168274,NULL,0,0,0,100,0), +(@PATH,12,1885.111,-1591.6702,59.293274,NULL,0,0,0,100,0), +(@PATH,13,1874.7734,-1589.3805,59.629944,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_06_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_06_world.sql new file mode 100644 index 00000000000..63ab4e04fc9 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_06_world.sql @@ -0,0 +1,60 @@ +-- Pathing for Vile Sting Entry: 5937 +SET @NPC=5937; +SET @GUID=51823; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=-5832.868,`position_y`=-3577.47,`position_z`=-58.645027,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH,1,-5832.868,-3577.47,-58.645027,NULL,0,0,0,100,0), +(@PATH,2,-5847.7896,-3578.9922,-58.62624,NULL,0,0,0,100,0), +(@PATH,3,-5879.2153,-3563.779,-58.624992,NULL,0,0,0,100,0), +(@PATH,4,-5898.626,-3563.8586,-58.624992,NULL,0,0,0,100,0), +(@PATH,5,-5906.1606,-3590.3938,-58.624973,NULL,0,0,0,100,0), +(@PATH,6,-5906.0674,-3606.6235,-58.624973,NULL,0,0,0,100,0), +(@PATH,7,-5923.0366,-3626.2664,-58.624973,NULL,0,0,0,100,0), +(@PATH,8,-5945.6016,-3613.887,-58.624954,NULL,0,0,0,100,0), +(@PATH,9,-5954.7524,-3608.444,-58.624954,NULL,0,0,0,100,0), +(@PATH,10,-5984.0244,-3598.608,-58.624954,NULL,0,0,0,100,0), +(@PATH,11,-6006.2593,-3598.7825,-58.624954,NULL,0,0,0,100,0), +(@PATH,12,-6013.32,-3605.1987,-58.624954,NULL,0,0,0,100,0), +(@PATH,13,-6023.108,-3620.3386,-58.624954,NULL,0,0,0,100,0), +(@PATH,14,-6046.9595,-3639.2556,-58.624954,NULL,0,0,0,100,0), +(@PATH,15,-6055.033,-3642.866,-58.624954,NULL,0,0,0,100,0), +(@PATH,16,-6074.136,-3629.934,-58.624954,NULL,0,0,0,100,0), +(@PATH,17,-6083.2944,-3613.5764,-58.624954,NULL,0,0,0,100,0), +(@PATH,18,-6096.364,-3598.897,-58.624954,NULL,0,0,0,100,0), +(@PATH,19,-6112.0825,-3584.047,-58.624954,NULL,0,0,0,100,0), +(@PATH,20,-6129.6,-3575.8818,-58.624954,NULL,0,0,0,100,0), +(@PATH,21,-6152.832,-3570.761,-58.624954,NULL,0,0,0,100,0), +(@PATH,22,-6167.849,-3571.4946,-58.624954,NULL,0,0,0,100,0), +(@PATH,23,-6176.987,-3576.321,-58.624954,NULL,0,0,0,100,0), +(@PATH,24,-6187.7524,-3589.2395,-58.624954,NULL,0,0,0,100,0), +(@PATH,25,-6186.82,-3620.595,-58.624954,NULL,0,0,0,100,0), +(@PATH,26,-6186.299,-3634.014,-58.624954,NULL,0,0,0,100,0), +(@PATH,27,-6171.7256,-3641.8333,-58.624954,NULL,0,0,0,100,0), +(@PATH,28,-6154.3394,-3651.0803,-58.624954,NULL,0,0,0,100,0), +(@PATH,29,-6141.6694,-3650.3577,-58.624954,NULL,0,0,0,100,0), +(@PATH,30,-6123.28,-3640.9934,-58.624954,NULL,0,0,0,100,0), +(@PATH,31,-6108.6865,-3623.8994,-58.624954,NULL,0,0,0,100,0), +(@PATH,32,-6099.0645,-3600.8455,-58.624954,NULL,0,0,0,100,0), +(@PATH,33,-6093.388,-3581.6519,-58.624954,NULL,0,0,0,100,0), +(@PATH,34,-6096.3926,-3568.4915,-58.624954,NULL,0,0,0,100,0), +(@PATH,35,-6062.2173,-3546.6702,-58.624966,NULL,0,0,0,100,0), +(@PATH,36,-6048.2134,-3538.829,-58.624966,NULL,0,0,0,100,0), +(@PATH,37,-6022.5835,-3531.2087,-58.624973,NULL,0,0,0,100,0), +(@PATH,38,-6007.369,-3528.1714,-58.624973,NULL,0,0,0,100,0), +(@PATH,39,-5996.6787,-3533.4485,-58.624973,NULL,0,0,0,100,0), +(@PATH,40,-5978.62,-3529.2083,-58.624973,NULL,0,0,0,100,0), +(@PATH,41,-5963.492,-3514.8665,-58.374992,NULL,0,0,0,100,0), +(@PATH,42,-5950.205,-3508.0159,-58.624992,NULL,0,0,0,100,0), +(@PATH,43,-5927.1836,-3500.981,-58.374992,NULL,0,0,0,100,0), +(@PATH,44,-5911.841,-3499.235,-58.158527,NULL,0,0,0,100,0), +(@PATH,45,-5883.246,-3499.5684,-58.080044,NULL,0,0,0,100,0), +(@PATH,46,-5858.184,-3506.1418,-58.24999,NULL,0,0,0,100,0), +(@PATH,47,-5847.03,-3516.6768,-58.49999,NULL,0,0,0,100,0), +(@PATH,48,-5833.535,-3534.1719,-58.62499,NULL,0,0,0,100,0), +(@PATH,49,-5827.3213,-3554.03,-58.62499,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_07_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_07_world.sql new file mode 100644 index 00000000000..87b589a0f12 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_07_world.sql @@ -0,0 +1,18 @@ +-- Pathing for Treebole:22215 +SET @NPC=22215; +SET @GUID=77879; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=3609.03,`position_y`=6829.56,`position_z`=136.69,`orientation`=5.2105,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +UPDATE `creature_template_addon` SET `PvpFlags`=0 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH, 1, 3609.03, 6829.57, 136.69, 5.2105, 300000, 0, 0, 100, 0), +(@PATH, 2, 3598.63, 6845.62, 140.703, 2.54014, 0, 0, 0, 100, 0), +(@PATH, 3, 3587.26, 6853.75, 141.589, 2.52051, 0, 0, 0, 100, 0), +(@PATH, 4, 3568.35, 6864.28, 140.533, 4.41331, 300000, 0, 0, 100, 0), +(@PATH, 5, 3587.72, 6853.33, 141.546, 5.70922, 0, 0, 0, 100, 0), +(@PATH, 6, 3599.61, 6845.15, 140.649, 5.70922, 0, 0, 0, 100, 0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_08_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_08_world.sql new file mode 100644 index 00000000000..32dd1d83bb3 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_08_world.sql @@ -0,0 +1,17 @@ +-- Pathing for Zora:14474 +SET @NPC=14474; +SET @GUID=51835; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=-7378.239,`position_y`=1714.3088,`position_z`=-91.72752,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH,1,-7378.239,1714.3088,-91.72752,NULL,0,0,0,100,0), +(@PATH,2,-7393.453,1717.8257,-92.846466,NULL,0,0,0,100,0), +(@PATH,3,-7401.651,1709.8647,-92.29474,NULL,0,0,0,100,0), +(@PATH,4,-7396.23,1696.348,-92.5287,NULL,0,0,0,100,0), +(@PATH,5,-7377.1226,1687.7341,-91.2392,NULL,0,0,0,100,0), +(@PATH,6,-7368.2925,1700.2347,-86.44376,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_09_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_09_world.sql new file mode 100644 index 00000000000..7dc2a6a4def --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_09_world.sql @@ -0,0 +1,74 @@ +-- Pathing for Tideress: 12759 +SET @NPC=12759; +SET @GUID=34224; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=1958.41,`position_y`=-945.92,`position_z`=70.11,`orientation`=4.153880,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +UPDATE `creature_template_addon` SET `PvpFlags`=0 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH, 1, 1950.76, -957.199, 65.9789, NULL, 0, 0, 0, 100, 0), +(@PATH, 2, 1949.7, -971.117, 62.4051, NULL, 0, 0, 0, 100, 0), +(@PATH, 3, 1952.04, -984.871, 63.578, NULL, 0, 0, 0, 100, 0), +(@PATH, 4, 1958.59, -995.102, 69.6525, NULL, 0, 0, 0, 100, 0), +(@PATH, 5, 1958.25, -1010.11, 77.985, NULL, 0, 0, 0, 100, 0), +(@PATH, 6, 1965.77, -1023.12, 88.7347, NULL, 0, 0, 0, 100, 0), +(@PATH, 7, 1968.2, -1033.66, 93.133, NULL, 0, 0, 0, 100, 0), +(@PATH, 8, 1966.17, -1043.44, 94.9841, NULL, 0, 0, 0, 100, 0), +(@PATH, 9, 1973.94, -1049.95, 95.6832, NULL, 0, 0, 0, 100, 0), +(@PATH, 10, 1986.89, -1056.69, 96.4432, NULL, 0, 0, 0, 100, 0), +(@PATH, 11, 1995.48, -1071.04, 94.9886, NULL, 0, 0, 0, 100, 0), +(@PATH, 12, 1997.02, -1086.65, 94.846, NULL, 0, 0, 0, 100, 0), +(@PATH, 13, 2001.35, -1109.18, 95.674, NULL, 0, 0, 0, 100, 0), +(@PATH, 14, 1992.91, -1089.13, 94.9791, NULL, 0, 0, 0, 100, 0), +(@PATH, 15, 1977.37, -1091.98, 93.5929, NULL, 0, 0, 0, 100, 0), +(@PATH, 16, 1960.89, -1106.05, 81.5004, NULL, 0, 0, 0, 100, 0), +(@PATH, 17, 1950.73, -1121.58, 76.5911, NULL, 0, 0, 0, 100, 0), +(@PATH, 18, 1952.45, -1137.8, 74.7081, NULL, 0, 0, 0, 100, 0), +(@PATH, 19, 1951.68, -1152.21, 74.7775, NULL, 0, 0, 0, 100, 0), +(@PATH, 20, 1959.66, -1179.49, 63.8513, NULL, 0, 0, 0, 100, 0), +(@PATH, 21, 1967.89, -1196.3, 59.4363, NULL, 0, 0, 0, 100, 0), +(@PATH, 22, 1966.14, -1211.91, 57.2217, NULL, 0, 0, 0, 100, 0), +(@PATH, 23, 1941.16, -1212.98, 56.7257, NULL, 0, 0, 0, 100, 0), +(@PATH, 24, 1932.03, -1226.02, 59.3121, NULL, 0, 0, 0, 100, 0), +(@PATH, 25, 1940.4, -1246.86, 58.4144, NULL, 0, 0, 0, 100, 0), +(@PATH, 26, 1947.89, -1264.91, 60.367, NULL, 0, 0, 0, 100, 0), +(@PATH, 27, 1949.59, -1283.22, 65.9393, NULL, 0, 0, 0, 100, 0), +(@PATH, 28, 1941.54, -1297.67, 74.969, NULL, 0, 0, 0, 100, 0), +(@PATH, 29, 1936.7, -1307.34, 80.0226, NULL, 0, 0, 0, 100, 0), +(@PATH, 30, 1920.6, -1309.47, 82.8535, NULL, 0, 0, 0, 100, 0), +(@PATH, 31, 1902.6, -1303.77, 86.9758, NULL, 0, 0, 0, 100, 0), +(@PATH, 32, 1920.6, -1309.47, 82.8535, NULL, 0, 0, 0, 100, 0), +(@PATH, 33, 1936.7, -1307.34, 80.0226, NULL, 0, 0, 0, 100, 0), +(@PATH, 34, 1941.54, -1297.67, 74.969, NULL, 0, 0, 0, 100, 0), +(@PATH, 35, 1949.59, -1283.22, 65.9393, NULL, 0, 0, 0, 100, 0), +(@PATH, 36, 1947.89, -1264.91, 60.367, NULL, 0, 0, 0, 100, 0), +(@PATH, 37, 1940.4, -1246.86, 58.4144, NULL, 0, 0, 0, 100, 0), +(@PATH, 38, 1932.03, -1226.02, 59.3121, NULL, 0, 0, 0, 100, 0), +(@PATH, 39, 1941.14, -1212.98, 56.7217, NULL, 0, 0, 0, 100, 0), +(@PATH, 40, 1966.12, -1211.9, 57.2257, NULL, 0, 0, 0, 100, 0), +(@PATH, 41, 1967.89, -1196.3, 59.4363, NULL, 0, 0, 0, 100, 0), +(@PATH, 42, 1959.66, -1179.49, 63.8513, NULL, 0, 0, 0, 100, 0), +(@PATH, 43, 1951.68, -1152.21, 74.7775, NULL, 0, 0, 0, 100, 0), +(@PATH, 44, 1952.45, -1137.8, 74.7081, NULL, 0, 0, 0, 100, 0), +(@PATH, 45, 1950.73, -1121.58, 76.5911, NULL, 0, 0, 0, 100, 0), +(@PATH, 46, 1960.89, -1106.05, 81.5004, NULL, 0, 0, 0, 100, 0), +(@PATH, 47, 1977.37, -1091.98, 93.5929, NULL, 0, 0, 0, 100, 0), +(@PATH, 48, 1992.91, -1089.13, 94.9791, NULL, 0, 0, 0, 100, 0), +(@PATH, 49, 2001.35, -1109.18, 95.674, NULL, 0, 0, 0, 100, 0), +(@PATH, 50, 1997.02, -1086.65, 94.846, NULL, 0, 0, 0, 100, 0), +(@PATH, 51, 1995.48, -1071.04, 94.9886, NULL, 0, 0, 0, 100, 0), +(@PATH, 52, 1986.89, -1056.69, 96.4432, NULL, 0, 0, 0, 100, 0), +(@PATH, 53, 1973.94, -1049.95, 95.6832, NULL, 0, 0, 0, 100, 0), +(@PATH, 54, 1966.28, -1043.53, 94.9587, NULL, 0, 0, 0, 100, 0), +(@PATH, 55, 1968.19, -1033.7, 93.1832, NULL, 0, 0, 0, 100, 0), +(@PATH, 56, 1965.77, -1023.12, 88.7347, NULL, 0, 0, 0, 100, 0), +(@PATH, 57, 1958.25, -1010.11, 77.985, NULL, 0, 0, 0, 100, 0), +(@PATH, 58, 1958.59, -995.102, 69.6525, NULL, 0, 0, 0, 100, 0), +(@PATH, 59, 1952.04, -984.871, 63.578, NULL, 0, 0, 0, 100, 0), +(@PATH, 60, 1949.7, -971.117, 62.4051, NULL, 0, 0, 0, 100, 0), +(@PATH, 61, 1950.76, -957.199, 65.9789, NULL, 0, 0, 0, 100, 0), +(@PATH, 62, 1956.02, -946.128, 71.0499, NULL, 0, 0, 0, 100, 0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_10_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_10_world.sql new file mode 100644 index 00000000000..dbca4abeb4d --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_10_world.sql @@ -0,0 +1,38 @@ +-- Pathing for Archmage Xylem: 12759 +SET @NPC=8379; +SET @GUID=35886; +SET @PATH=@GUID * 10; +UPDATE `creature` SET `position_x`=3982.08,`position_y`=-4760.25,`position_z`=304.8,`orientation`=0.347593,`wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=@NPC; +UPDATE `creature_template_addon` SET `PvpFlags`=0 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH, 1, 3982.08, -4760.25, 304.803, 5.3781, 60000, 0, 0, 100, 0), +(@PATH, 2, 3975.94, -4767.85, 304.728, NULL, 0, 0, 0, 100, 0), +(@PATH, 3, 3972.76, -4771.82, 304.716, NULL, 0, 0, 0, 100, 0), +(@PATH, 4, 3970.95, -4777.04, 304.728, NULL, 0, 0, 0, 100, 0), +(@PATH, 5, 3970.78, -4780.04, 304.712, NULL, 0, 0, 0, 100, 0), +(@PATH, 6, 3971.65, -4784.84, 304.718, NULL, 0, 0, 0, 100, 0), +(@PATH, 7, 3976.24, -4788.04, 304.717, NULL, 0, 0, 0, 100, 0), +(@PATH, 8, 3977.89, -4786.99, 304.73, NULL, 0, 0, 0, 100, 0), +(@PATH, 9, 3977.45, -4783.41, 303.731, NULL, 0, 0, 0, 100, 0), +(@PATH, 10, 3979.76, -4780.78, 301.995, NULL, 0, 0, 0, 100, 0), +(@PATH, 11, 3983.23, -4782.2, 299.606, NULL, 0, 0, 0, 100, 0), +(@PATH, 12, 3982.05, -4785.25, 297.913, NULL, 0, 0, 0, 100, 0), +(@PATH, 13, 3974.91, -4782.9, 295.922, NULL, 0, 0, 0, 100, 0), +(@PATH, 14, 3969.92, -4784.16, 296.018, NULL, 10000, 0, 0, 100, 0), +(@PATH, 15, 3974.91, -4782.9, 295.922, NULL, 0, 0, 0, 100, 0), +(@PATH, 16, 3982.05, -4785.25, 297.913, NULL, 0, 0, 0, 100, 0), +(@PATH, 17, 3983.23, -4782.2, 299.606, NULL, 0, 0, 0, 100, 0), +(@PATH, 18, 3979.76, -4780.78, 301.995, NULL, 0, 0, 0, 100, 0), +(@PATH, 19, 3977.45, -4783.41, 303.731, NULL, 0, 0, 0, 100, 0), +(@PATH, 20, 3977.89, -4786.99, 304.73, NULL, 0, 0, 0, 100, 0), +(@PATH, 21, 3976.24, -4788.04, 304.717, NULL, 0, 0, 0, 100, 0), +(@PATH, 22, 3971.65, -4784.84, 304.718, NULL, 0, 0, 0, 100, 0), +(@PATH, 23, 3970.78, -4780.04, 304.712, NULL, 0, 0, 0, 100, 0), +(@PATH, 24, 3970.95, -4777.04, 304.728, NULL, 0, 0, 0, 100, 0), +(@PATH, 25, 3972.76, -4771.82, 304.716, NULL, 0, 0, 0, 100, 0), +(@PATH, 26, 3975.94, -4767.85, 304.728, NULL, 0, 0, 0, 100, 0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_11_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_11_world.sql new file mode 100644 index 00000000000..883d4f7fce6 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_11_world.sql @@ -0,0 +1,2 @@ +-- Replace wrong 100 and 255 fixed orientation value with default NULL +UPDATE `waypoint_data` SET `orientation`=NULL WHERE `orientation`>7; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_12_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_12_world.sql new file mode 100644 index 00000000000..93d6c69a14e --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_12_world.sql @@ -0,0 +1,81 @@ +-- Add missing Battered Chest ID: 2843 with pooling in Northshire Valley, Coldridge Valley, DeathKnell, and Shadowglen +SET @OGUID := 13545; -- 19 required +SET @POOLID := 577; -- 8 required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+18; +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 +(@OGUID+0, 2843, 0, 12, 34, 1, 1, -8564.622, -212.033, 85.301, 2.478, 0, 0, 0.94551849365234375, 0.325568377971649169, 360, 255, 1, 0), -- Northshire Valley, Echo Ridge Mine +(@OGUID+1, 2843, 0, 85, 154, 1, 1, 1788.795, 1345.5, 89.283, 5.341, 0, 0, -0.45398998260498046, 0.891006767749786376, 360, 255, 1, 0), -- DeathKnell +(@OGUID+2, 2843, 0, 85, 155, 1, 1, 2019.491, 1853.655, 102.669, 4.188, 0, 0, -0.86602497100830078, 0.50000077486038208, 360, 255, 1, 0), -- DeathKnell, Night Web's Hollow +(@OGUID+3, 2843, 0, 85, 155, 1, 1, 2041.629, 1935.115, 106.989, 4.677, 0, 0, -0.71933937072753906, 0.694658815860748291, 360, 255, 1, 0), -- DeathKnell, Night Web's Hollow +(@OGUID+4, 2843, 0, 1, 132, 1, 1, -6394.58447265625, 772.35076904296875, 386.2127685546875, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 360, 255, 1, 0), -- Coldridge Vally +(@OGUID+5, 2843, 0, 1, 132, 1, 1, -6550.423828125, 351.92535400390625, 392.339447021484375, 2.356194972991943359, 0, 0, 0.923879623413085937, 0.382683247327804565, 360, 255, 1, 0), -- Coldridge Vally, cave +(@OGUID+6, 2843, 1, 141, 188, 1, 1, 10485.255859375, 1059.9840087890625, 1325.470458984375, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 360, 255, 1, 41446), -- Shadowglen +(@OGUID+7, 2843, 1, 141, 257, 1, 1, 10908.3759765625, 977.76202392578125, 1338.316162109375, 2.827429771423339843, 0, 0, 0.987688064575195312, 0.156436234712600708, 360, 255, 1, 0), -- Shadowglen, Shadowthread Cave +-- From mangos db +(@OGUID+8, 2843, 0, 12, 9, 1, 1, -8955.38, -439.217, 64.7955, -2.86233, 0, 0, 0, 0, 360, 255, 1, 0), -- Northshire Valley +(@OGUID+9, 2843, 0, 85, 155, 1, 1, 2036.59, 1916.59, 102.783, 6.23153, 0, 0, 0.025824, -0.999667, 360, 255, 1, 0), -- DeathKnell, Night Web's Hollow +(@OGUID+10, 2843, 0, 1, 132, 1, 1, -6493.9, 502.314, 387.246, 0.977737, 0, 0, 0.469627, 0.882865, 360, 255, 1, 0), -- Coldridge Vally +(@OGUID+11, 2843, 0, 1, 132, 1, 1, -6520.52, 688.075, 387.612, 6.21242, 0, 0, 0.0353748, -0.999374, 360, 255, 1, 0), -- Coldridge Vally +(@OGUID+12, 2843, 0, 1, 132, 1, 1, -6396.81, 784.359, 386.216, 5.19288, 0, 0, 0.518547, -0.855049, 360, 255, 1, 0), -- Coldridge Vally +(@OGUID+13, 2843, 0, 1, 132, 1, 1, -6516.55, 288.024, 372.061, 0.760217, 0, 0, 0.371021, 0.928624, 360, 255, 1, 0), -- Coldridge Vally, cave +(@OGUID+14, 2843, 0, 1, 132, 1, 1, -6541.69, 362.199, 384.464, 1.23852, 0, 0, 0.580434, 0.814307, 360, 255, 1, 0), -- Coldridge Vally, cave +(@OGUID+15, 2843, 1, 141, 257, 1, 1, 10812.8, 897.368, 1336.4, 0.444496, 0, 0, 0.220423, 0.975404, 360, 255, 1, 0), -- Shadowglen, Shadowthread Cave +(@OGUID+16, 2843, 1, 141, 257, 1, 1, 10942.8, 942.153, 1340.68, 5.62352, 0, 0, 0.323884, -0.946097, 360, 255, 1, 0), -- Shadowglen, Shadowthread Cave +(@OGUID+17, 2843, 1, 141, 188, 1, 1, 10262.1, 961.428, 1340.93, 5.89251, 0, 0, 0.194099, -0.980982, 360, 255, 1, 41446), -- Shadowglen +(@OGUID+18, 2843, 1, 141, 188, 1, 1, 10504.8, 1064.71, 1325.83, -0.279252, 0, 0, 0, 0, 360, 255, 1, 41446); -- Shadowglen + +-- Update existing spawns to match new ones. +UPDATE `gameobject` SET `spawntimesecs`=360, `animprogress`=225, `state`=1 WHERE `guid` IN +(26749,34797,26756,34798,85653,1397,85816,1454,85817,45106,85818,85832,45110,49529,49528); + +-- Add coin +UPDATE `gameobject_template_addon` SET `mingold`=1, `maxgold`=20 WHERE `entry` = 2843; + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+7; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Battered Chest (2843), Northshire, Chest Pool Mine'), +(@POOLID+1,1,'Battered Chest (2843), Northshire, Chest Pool Vineyard'), +(@POOLID+2,1,'Battered Chest (2843), Coldridge Valley, Chest Pool Valley'), +(@POOLID+3,1,'Battered Chest (2843), Coldridge Valley, Chest Pool Cave'), +(@POOLID+4,1,'Battered Chest (2843), Deathknell, Chest Pool Deathknell'), +(@POOLID+5,1,'Battered Chest (2843), Deathknell, Chest Pool Night Web''s Hollow'), +(@POOLID+6,1,'Battered Chest (2843), Shadowglen, Chest Pool Shadowglen'), +(@POOLID+7,1,'Battered Chest (2843), Shadowglen, Chest Pool Shadowthread Cave'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+7; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(1,26749,@POOLID,0,'Battered Chest (2843), Northshire Mine'), +(1,34797,@POOLID,0,'Battered Chest (2843), Northshire Mine'), +(1,@OGUID,@POOLID,0,'Battered Chest (2843), Northshire Mine'), +(1,26756,@POOLID+1,0,'Battered Chest (2843), Northshire Vineyard'), +(1,34798,@POOLID+1,0,'Battered Chest (2843), Northshire Vineyard'), +(1,85653,@POOLID+1,0,'Battered Chest (2843), Northshire Vineyard'), +(1,@OGUID+8,@POOLID+1,0,'Battered Chest (2843), Northshire Vineyard'), +(1,1397,@POOLID+2,0,'Battered Chest (2843), Coldridge Valley'), +(1,85816,@POOLID+2,0,'Battered Chest (2843), Coldridge Valley'), +(1,@OGUID+4,@POOLID+2,0,'Battered Chest (2843), Coldridge Valley'), +(1,@OGUID+10,@POOLID+2,0,'Battered Chest (2843), Coldridge Valley'), +(1,@OGUID+11,@POOLID+2,0,'Battered Chest (2843), Coldridge Valley'), +(1,@OGUID+12,@POOLID+2,0,'Battered Chest (2843), Coldridge Valley'), +(1,1454,@POOLID+3,0,'Battered Chest (2843), Coldridge Valley Cave'), +(1,85817,@POOLID+3,0,'Battered Chest (2843), Coldridge Valley Cave'), +(1,@OGUID+5,@POOLID+3,0,'Battered Chest (2843), Coldridge Valley Cave'), +(1,@OGUID+13,@POOLID+3,0,'Battered Chest (2843), Coldridge Valley Cave'), +(1,@OGUID+14,@POOLID+3,0,'Battered Chest (2843), Coldridge Valley Cave'), +(1,45106,@POOLID+4,0,'Battered Chest (2843), Deathknell'), +(1,85818,@POOLID+4,0,'Battered Chest (2843), Deathknell'), +(1,85832,@POOLID+4,0,'Battered Chest (2843), Deathknell'), +(1,@OGUID+1,@POOLID+4,0,'Battered Chest (2843), Deathknell'), +(1,45110,@POOLID+5,0,'Battered Chest (2843), Night Web''s Hollow'), +(1,@OGUID+2,@POOLID+5,0,'Battered Chest (2843), Night Web''s Hollow'), +(1,@OGUID+3,@POOLID+5,0,'Battered Chest (2843), Night Web''s Hollow'), +(1,@OGUID+9,@POOLID+5,0,'Battered Chest (2843), Night Web''s Hollow'), +(1,49529,@POOLID+6,0,'Battered Chest (2843), Shadowglen'), +(1,@OGUID+6,@POOLID+6,0,'Battered Chest (2843), Shadowglen'), +(1,@OGUID+17,@POOLID+6,0,'Battered Chest (2843), Shadowglen'), +(1,@OGUID+18,@POOLID+6,0,'Battered Chest (2843), Shadowglen'), +(1,49528,@POOLID+7,0,'Battered Chest (2843), Shadowthread Cave'), +(1,@OGUID+7,@POOLID+7,0,'Battered Chest (2843), Shadowthread Cave'), +(1,@OGUID+15,@POOLID+7,0,'Battered Chest (2843), Shadowthread Cave'), +(1,@OGUID+16,@POOLID+7,0,'Battered Chest (2843), Shadowthread Cave'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_13_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_13_world.sql new file mode 100644 index 00000000000..cc3e174f5d3 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_13_world.sql @@ -0,0 +1,32 @@ +-- Add missing Battered Chest ID: 2849 with pooling in Ghostlands +SET @OGUID := 10633; -- 7 required +SET @POOLID := 585; -- 2 required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+6; +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 +(@OGUID, 2849, 530, 3433, 3516, 1, 1, 7473.455078125, -7896.78662109375, 160.006317138671875, 2.129300594329833984, 0, 0, 0.874619483947753906, 0.484810054302215576, 360, 255, 1, 42917), -- Zeb'Tela +(@OGUID+1, 2849, 530, 3433, 3516, 1, 1, 7351.85400390625, -7824.33251953125, 147.920196533203125, 1.082102894783020019, 0, 0, 0.51503753662109375, 0.857167601585388183, 360, 255, 1, 42917), -- Zeb'Tela +(@OGUID+2, 2849, 530, 3433, 3516, 1, 1, 7271.18701171875, -7755.77001953125, 150.018524169921875, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 360, 255, 1, 56713), -- Zeb'Tela +(@OGUID+3, 2849, 530, 3433, 3517, 1, 1, 6806.115234375, -7428.17529296875, 47.94741439819335937, 1.797688722610473632, 0, 0, 0.7826080322265625, 0.622514784336090087, 360, 255, 1, 42917), -- Zeb'Nowa +(@OGUID+4, 2849, 530, 3433, 3517, 1, 1, 6660.6044921875, -7406.60400390625, 57.55510330200195312, 2.024578809738159179, 0, 0, 0.848047256469726562, 0.529920578002929687, 360, 255, 1, 41446), -- Zeb'Nowa +(@OGUID+5, 2849, 530, 3433, 3517, 1, 1, 7153.0546875, -7575.98681640625, 49.18671798706054687, 2.042035102844238281, 0, 0, 0.852640151977539062, 0.522498607635498046, 360, 255, 1, 56713), -- Zeb'Nowa +(@OGUID+6, 2849, 530, 3433, 3517, 1, 1, 7007.033203125, -7526.05908203125, 48.84354400634765625, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 360, 255, 1, 56713); -- Zeb'Nowa + +-- Update existing spawns to match new ones. +UPDATE `gameobject` SET `spawntimesecs`=360, `animprogress`=225, `state`=1 WHERE `guid`=27287; + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+1; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Battered Chest (2849), Ghostlands, Chest Pool Zeb''Tela'), +(@POOLID+1,1,'Battered Chest (2849), Ghostlands, Chest Pool Zeb''Nowa'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+1; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(1,27287,@POOLID,0,'Battered Chest (2849), Zeb''Tela'), +(1,@OGUID,@POOLID,0,'Battered Chest (2849), Zeb''Tela'), +(1,@OGUID+1,@POOLID,0,'Battered Chest (2849), Zeb''Tela'), +(1,@OGUID+2,@POOLID,0,'Battered Chest (2849), Zeb''Tela'), +(1,@OGUID+3,@POOLID+1,0,'Battered Chest (2849), Zeb''Nowa'), +(1,@OGUID+4,@POOLID+1,0,'Battered Chest (2849), Zeb''Nowa'), +(1,@OGUID+5,@POOLID+1,0,'Battered Chest (2849), Zeb''Nowa'), +(1,@OGUID+6,@POOLID+1,0,'Battered Chest (2849), Zeb''Nowa'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_14_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_14_world.sql new file mode 100644 index 00000000000..7d2bbf64155 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_10_14_world.sql @@ -0,0 +1,2 @@ +-- Update Portals to Blasted Lands spell_target_position +UPDATE `spell_target_position` SET `PositionX`=-11708.3281, `PositionY`=-3167.8259, `PositionZ`=-5.052477, `Orientation`=3.328652 WHERE `id` IN (65728,65729); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_11_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_11_00_world.sql new file mode 100644 index 00000000000..04cb0a88b45 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_11_00_world.sql @@ -0,0 +1,124 @@ +-- *** Sunstrider Isle *** + +SET @REF := 1059; +DELETE FROM `reference_loot_template` WHERE `Entry` BETWEEN @REF AND @REF + 4; + +-- Food Reference loot for level 1 to 5 +SET @REFFOOD4 := @REF; +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@REFFOOD4,159,0,33,0,1,1,1,1, 'Food 1-5 - Refreshing Spring Water'), +(@REFFOOD4,4540,0,67,0,1,1,1,1, 'Food 1-5 - Tough Hunk of Bread'); + +-- Mana Wyrm Reference loot for level 1 to 5 +SET @REFWYRM := @REF + 1; +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@REFWYRM,20845,0,50,0,1,1,1,1, 'Wyrm 1-5 - Torn Wyrm Scale'), +(@REFWYRM,20846,0,50,0,1,1,1,1, 'Wyrm 1-5 - Faintly Glowing Eye'); + +-- Lynx Reference loot for level 1 to 5 +SET @REFLYNX := @REF + 2; +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@REFLYNX,20812,0,50,0,1,1,1,1, 'Lynx 1-5 - Tattered Pelt'), +(@REFLYNX,20813,0,50,0,1,1,1,1, 'Lynx 1-5 - Lynx Tooth'); + +-- Tender Reference loot for level 1 to 5 +SET @REFTENDER := @REF + 3; +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@REFTENDER,20842,0,50,0,1,1,1,1, 'Tender 1-5 - Frayed Tender Vine'), +(@REFTENDER,20843,0,50,0,1,1,1,1, 'Tender 1-5 - Smashed Petal'); + +-- Wraith Reference loot for level 1 to 5 +SET @REFWRAITH := @REF + 4; +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@REFWRAITH,20847,0,50,0,1,1,1,1, 'Wraith 1-5 - Wraith Fragment'), +(@REFWRAITH,20848,0,50,0,1,1,1,1, 'Wraith 1-5 - Sparkling Dust'); + +-- Update loot for Entry 15274 : Mana Wyrm +SET @NPC := 15274; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFWYRM,@REFWYRM,100,0,1,0,1,1, 'Mana Wyrm - (Wyrm 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Mana Wyrm - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Mana Wyrm - (Small Pouch ReferenceTable)'), +(@NPC,20482,0,80,1,1,0,1,1, 'Mana Wyrm - Arcane Sliver'); + +-- Update loot for Entry 15366 : Springpaw Cub +SET @NPC := 15366; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFLYNX,@REFLYNX,100,0,1,0,1,1, 'Springpaw Cub - (Lynx 1-5 EXP 1 ReferenceTable)'), +-- (@NPC,@REFLYNX,@REFLYNX,30,0,1,1,1,1, 'Springpaw Cub - (Lynx 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Springpaw Cub - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Springpaw Cub - (Small Pouch ReferenceTable)'), +(@NPC,20797,0,80,1,1,0,1,1, 'Springpaw Cub - Lynx Collar'); + +-- Update loot for Entry 15372 : Springpaw Lynx +SET @NPC := 15372; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFLYNX,@REFLYNX,100,0,1,0,1,1, 'Springpaw Lynx - (Lynx 1-5 EXP 1 ReferenceTable)'), +-- (@NPC,@REFLYNX,@REFLYNX,30,0,1,1,1,1, 'Springpaw Lynx - (Lynx 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Springpaw Lynx - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Springpaw Lynx - (Small Pouch ReferenceTable)'), +(@NPC,20797,0,80,1,1,0,1,1, 'Springpaw Lynx - Lynx Collar'); + +-- Update loot for Entry 15271 : Tender +SET @NPC := 15271; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFTENDER,@REFTENDER,90,0,1,0,1,1, 'Tender - (Tender 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Tender - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Tender - (Small Pouch ReferenceTable)'); + +-- Update loot for Entry 15294 : Feral Tender +SET @NPC := 15294; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFTENDER,@REFTENDER,100,0,1,0,1,1, 'Feral Tender - (Tender 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Feral Tender - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Feral Tender - (Small Pouch ReferenceTable)'), +(@NPC,20482,0,80,1,1,0,1,1, 'Feral Tender - Arcane Sliver'); + +-- Update loot for Entry 15273 : Arcane Wraith +SET @NPC := 15273; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFWRAITH,@REFWRAITH,100,0,1,0,1,1, 'Arcane Wraith - (Wraith 1-5 EXP 1 ReferenceTable)'), +-- (@NPC,@REFWRAITH,@REFWRAITH,30,0,1,1,1,1, 'Arcane Wraith - (Wraith 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Arcane Wraith - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Arcane Wraith - (Small Pouch ReferenceTable)'), +(@NPC,20934,0,80,1,1,0,1,1, 'Arcane Wraith - Wraith Essence'), +(@NPC,20482,0,80,1,1,0,1,1, 'Arcane Wraith - Arcane Sliver'); + +-- Update loot for Entry 15298 : Tainted Arcane Wraith +SET @NPC := 15298; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFWRAITH,@REFWRAITH,100,0,1,0,1,1, 'Tainted Arcane Wraith - (Wraith 1-5 EXP 1 ReferenceTable)'), +-- (@NPC,@REFWRAITH,@REFWRAITH,30,0,1,1,1,1, 'Tainted Arcane Wraith - (Wraith 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Tainted Arcane Wraith - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Tainted Arcane Wraith - (Small Pouch ReferenceTable)'), +(@NPC,20483,0,100,0,1,0,1,1, 'Tainted Arcane Wraith - Tainted Arcane Sliver'), +(@NPC,20934,0,80,1,1,0,1,1, 'Tainted Arcane Wraith - Wraith Essence'), +(@NPC,20482,0,80,1,1,0,1,1, 'Tainted Arcane Wraith - Arcane Sliver'); + +-- Update loot for Entry 15367 : Felendren the Banished +SET @NPC := 15367; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFFOOD4,@REFFOOD4,100,0,1,0,1,1, 'Felendren the Banished - (Food 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Felendren the Banished - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Felendren the Banished - (Small Pouch ReferenceTable)'), +(@NPC,20799,0,100,1,1,0,1,1, 'Felendren the Banished - Felendren''s Head'); + +-- Update loot for Entry 15644 : Wretched Urchin +SET @NPC := 15644; +DELETE FROM `creature_loot_template` WHERE `Entry`=@NPC; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(@NPC,@REFFOOD4,@REFFOOD4,100,0,1,0,1,1, 'Wretched Urchin - (Food 1-5 EXP 1 ReferenceTable)'), +(@NPC,1057,1057,30,0,1,0,1,1, 'Wretched Urchin - (Grey 1-5 EXP 1 ReferenceTable)'), +(@NPC,11111,11111,.2,0,1,0,1,1, 'Wretched Urchin - (Small Pouch ReferenceTable)'); + +-- *** Sunstrider Isle *** +UPDATE `creature_template` SET `mingold`=1, `maxgold`=7 WHERE `entry` IN (15367); +DELETE FROM `reference_loot_template` WHERE `Entry`=24072; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_11_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_11_01_world.sql new file mode 100644 index 00000000000..6254b8ab22e --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_11_01_world.sql @@ -0,0 +1,2 @@ +-- Noarm +UPDATE `creature` SET `wander_distance`=1, `MovementType`=1 WHERE `guid`=79781; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_17_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_17_00_world.sql new file mode 100644 index 00000000000..48a20b343c0 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_17_00_world.sql @@ -0,0 +1,33 @@ +-- The Behemoth:14474 +SET @NPC=8924; +SET @GUID=18658; +SET @PATH=@GUID * 10; +DELETE FROM `creature` WHERE `guid`=@GUID; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID, @NPC, 0, 0, 0, 1, 1, 0, 0, -7404.57, -894.073, 171.873, 2.89516, 108000, 0, 0, 3323, 0, 2, 0, 0, 0, '', NULL, 0); +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +-- Pathing +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH, 1, -7404.57, -894.073, 171.873,NULL,0,0,0,100,0), +(@PATH, 2, -7397.19, -934.067, 169.109,NULL,0,0,0,100,0), +(@PATH, 3, -7397.22, -957.259, 170.151,NULL,0,0,0,100,0), +(@PATH, 4, -7406.08, -992.606, 173.821,NULL,0,0,0,100,0), +(@PATH, 5, -7378.71, -995.416, 171.25,NULL,0,0,0,100,0), +(@PATH, 6, -7348, -986.191, 171.532,NULL,0,0,0,100,0), +(@PATH, 7, -7346.79, -1017.81, 177.942,NULL,0,0,0,100,0), +(@PATH, 8, -7371.64, -1036.28, 177.966,NULL,0,0,0,100,0), +(@PATH, 9, -7390.05, -1044.6, 176.843,NULL,0,0,0,100,0), +(@PATH, 10, -7406.18, -1044.51, 176.751,NULL,0,0,0,100,0), +(@PATH, 11, -7390.37, -1044.6, 176.823,NULL,0,0,0,100,0), +(@PATH, 12, -7371.64, -1036.28, 177.966,NULL,0,0,0,100,0), +(@PATH, 13, -7346.79, -1017.81, 177.942,NULL,0,0,0,100,0), +(@PATH, 14, -7348, -986.191, 171.532,NULL,0,0,0,100,0), +(@PATH, 15, -7378.71, -995.416, 171.25,NULL,0,0,0,100,0), +(@PATH, 16, -7406.08, -992.606, 173.821,NULL,0,0,0,100,0), +(@PATH, 17, -7397.25, -957.381, 170.135,NULL,0,0,0,100,0), +(@PATH, 18, -7397.19, -934.067, 169.109,NULL,0,0,0,100,0), +(@PATH, 19, -7404.57, -894.073, 171.873,NULL,0,0,0,100,0), +(@PATH, 20, -7438.96, -892.375, 171.973,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_00_world.sql new file mode 100644 index 00000000000..7d4f39de5b5 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_00_world.sql @@ -0,0 +1,60 @@ +-- Add missing spawns and pooling for Battered Chest ID: 2849 in Ghostlands +SET @POOLID := 587; -- 6 required +SET @OGUID := 12738; -- 16 required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+15; +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 +(@OGUID+0, 106319, 530, 3433, 3514, 1, 1, 7943.26904296875, -6716.94677734375, 35.34872817993164062, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 360, 255, 1, 40892), -- Dead scar +(@OGUID+1, 106319, 530, 3433, 3509, 1, 1, 7651.68212890625, -7144.56396484375, 153.5474395751953125, 5.340708732604980468, 0, 0, -0.45398998260498046, 0.891006767749786376, 360, 255, 1, 42917), -- Amani Catacombs +(@OGUID+2, 106319, 530, 3433, 3433, 1, 1, 7181.9384765625, -5858.966796875, 14.44211483001708984, 3.106652259826660156, 0, 0, 0.999847412109375, 0.017469281330704689, 360, 255, 1, 42917), -- Windrunner Village +(@OGUID+3, 106319, 530, 3433, 3433, 1, 1, 7050.58251953125, -5736.326171875, 84.08641815185546875, 0.383971005678176879, 0, 0, 0.190808296203613281, 0.981627285480499267, 360, 255, 1, 42917), -- Windrunner Spire +(@OGUID+4, 106319, 530, 3433, 3491, 1, 1, 7194.93896484375, -5962.3603515625, 21.32486915588378906, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 360, 255, 1, 41446), -- Windrunner Village +(@OGUID+5, 106319, 530, 3433, 3505, 1, 1, 7138.8984375, -6196.390625, 21.56857109069824218, 0.942476630210876464, 0, 0, 0.453989982604980468, 0.891006767749786376, 360, 255, 1, 41446), -- Underlight Mines +(@OGUID+6, 106319, 530, 3433, 3490, 1, 1, 7917.97314453125, -6254.814453125, 39.78503036499023437, 1.204277276992797851, 0, 0, 0.56640625, 0.824126183986663818, 360, 255, 1, 40892), -- Goldenmist Village +(@OGUID+7, 106319, 530, 3433, 3509, 1, 1, 7593.18603515625, -7280.60595703125, 155.0066375732421875, 3.473210096359252929, 0, 0, -0.98628520965576171, 0.165049895644187927, 360, 255, 1, 41446), -- Amani Catacombs +(@OGUID+8, 106319, 530, 3433, 3509, 1, 1, 7626.720703125, -7477.81494140625, 161.88909912109375, 6.14356088638305664, 0, 0, -0.06975555419921875, 0.997564136981964111, 360, 255, 1, 41446), -- Amani Catacombs +(@OGUID+9, 106319, 530, 3433, 3495, 1, 1, 7828.2880859375, -7910.99462890625, 294.16424560546875, 0.017452461645007133, 0, 0, 0.008726119995117187, 0.999961912631988525, 360, 255, 1, 40892), -- Dawnstar Spire +(@OGUID+10, 106319, 530, 3433, 3505, 1, 1, 7151.56103515625, -6244.48974609375, 21.80349540710449218, 0.785396754741668701, 0, 0, 0.38268280029296875, 0.923879802227020263, 360, 255, 1, 41446), -- Underlight Mines +(@OGUID+11, 106319, 530, 3433, 3490, 1, 1, 7988.2568359375, -6098.12744140625, 20.41779518127441406, 0.733038187026977539, 0, 0, 0.358367919921875, 0.933580458164215087, 360, 255, 1, 56713), -- Goldenmist Village +(@OGUID+12, 106319, 530, 3433, 3491, 1, 1, 7344.84814453125, -5957.92431640625, 15.93715286254882812, 6.03883981704711914, 0, 0, -0.12186908721923828, 0.9925462007522583, 360, 255, 1, 56713), -- Windrunner Village +(@OGUID+13, 106319, 530, 3433, 3492, 1, 1, 7009.5205078125, -5700.59375, 102.6014862060546875, 1.291541695594787597, 0, 0, 0.60181427001953125, 0.798636078834533691, 360, 255, 1, 56713), -- Windrunner Spire +(@OGUID+14, 106319, 530, 3433, 3433, 1, 1, 7019.9306640625, -5693.78759765625, 82.67047882080078125, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 360, 255, 1, 56713), -- Windrunner Spire +(@OGUID+15, 106319, 530, 3433, 3497, 1, 1, 7966.60693359375, -6557.32861328125, 57.7398681640625, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 360, 255, 1, 56713); -- An'daroth + +UPDATE `gameobject` SET `spawntimesecs`=360, `animprogress`=225, `state`=1 WHERE `guid` IN (27337,27378,27422,27446,27493,27515,33980,34000,34002); + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+5; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Battered Chest (2849), Ghostlands, Chest Pool Goldenmist Village'), +(@POOLID+1,1,'Battered Chest (2849), Ghostlands, Chest Pool Windrunner Village'), +(@POOLID+2,1,'Battered Chest (2849), Ghostlands, Chest Pool Underlight Mines'), +(@POOLID+3,1,'Battered Chest (2849), Ghostlands, Chest Pool Windrunner Spire'), +(@POOLID+4,1,'Battered Chest (2849), Ghostlands, Chest Pool Amani Catacombs'), +(@POOLID+5,1,'Battered Chest (2849), Ghostlands, Chest Pool Ghostlands'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+5; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) Values +(1,27422,@POOLID,0,'Battered Chest (2849), Goldenmist Village'), +(1,34002,@POOLID,0,'Battered Chest (2849), Goldenmist Village'), +(1,@OGUID+6,@POOLID,0,'Battered Chest (2849), Goldenmist Village'), +(1,@OGUID+11,@POOLID,0,'Battered Chest (2849), Goldenmist Village'), +(1,27446,@POOLID+1,0,'Battered Chest (2849), Windrunner Village'), +(1,@OGUID+2,@POOLID+1,0,'Battered Chest (2849), Windrunner Village'), +(1,@OGUID+4,@POOLID+1,0,'Battered Chest (2849), Windrunner Village'), +(1,@OGUID+12,@POOLID+1,0,'Battered Chest (2849), Windrunner Village'), +(1,27515,@POOLID+2,0,'Battered Chest (2849), Underlight Mines'), +(1,33980,@POOLID+2,0,'Battered Chest (2849), Underlight Mines'), +(1,@OGUID+5,@POOLID+2,0,'Battered Chest (2849), Underlight Mines'), +(1,@OGUID+10,@POOLID+2,0,'Battered Chest (2849), Underlight Mines'), +(1,27493,@POOLID+3,0,'Battered Chest (2849), Windrunner Spire'), +(1,@OGUID+3,@POOLID+3,0,'Battered Chest (2849), Windrunner Spire'), +(1,@OGUID+13,@POOLID+3,0,'Battered Chest (2849), Windrunner Spire'), +(1,@OGUID+14,@POOLID+3,0,'Battered Chest (2849), Windrunner Spire'), +(1,27337,@POOLID+4,0,'Battered Chest (2849), Amani Catacombs'), +(1,@OGUID+1,@POOLID+4,0,'Battered Chest (2849), Amani Catacombs'), +(1,@OGUID+7,@POOLID+4,0,'Battered Chest (2849), Amani Catacombs'), +(1,@OGUID+8,@POOLID+4,0,'Battered Chest (2849), Amani Catacombs'), +(1,34000,@POOLID+5,0,'Battered Chest (2849), Ghostlands'), +(1,27378,@POOLID+5,0,'Battered Chest (2849), Ghostlands'), +(1,@OGUID,@POOLID+5,0,'Battered Chest (2849), Ghostlands'), +(1,@OGUID+15,@POOLID+5,0,'Battered Chest (2849), Ghostlands'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_01_world.sql new file mode 100644 index 00000000000..84c1383979d --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_01_world.sql @@ -0,0 +1,23 @@ +-- Add spawns and pooling for Large Battered Chest ID: 75293 in Ghostlands +SET @POOLID := 368; -- One required +SET @OGUID := 10860; -- Three required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+2; +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 +(@OGUID, 75293, 530, 3433, 3500, 1, 1, 6443.123046875, -6660.0498046875, 106.3956069946289062, 1.727874636650085449, 0, 0, 0.760405540466308593, 0.649448513984680175, 360, 255, 1, 41446), -- Deatholme +(@OGUID+1, 75293, 530, 3433, 3500, 1, 1, 6645.44921875, -6329.88427734375, 9.133299827575683593, 2.949595451354980468, 0, 0, 0.995395660400390625, 0.095851235091686248, 360, 255, 1, 41446), -- Deatholme +-- From Mangos db +(@OGUID+2, 75293, 530, 3433, 3500, 1, 1, 6527.45, -6514.33, 43.762, 3.47321, 0, 0, -0.986285, 0.16505, 5200, 255, 1, 0); + +UPDATE `gameobject` SET `spawntimesecs`=360, `animprogress`=225, `state`=1 WHERE `guid` IN (27542); + +DELETE FROM `pool_template` WHERE `entry`=@POOLID; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Large Battered Chest (75293), Ghostlands, Chest Pool Deatholme'); + +DELETE FROM `pool_members` WHERE `poolSpawnId`=@POOLID; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(1,27542,@POOLID,0,'Large Battered Chest (75293), Deatholme'), +(1,@OGUID,@POOLID,0,'Large Battered Chest (75293), Deatholme'), +(1,@OGUID+1,@POOLID,0,'Large Battered Chest (75293), Deatholme'), +(1,@OGUID+2,@POOLID,0,'Large Battered Chest (75293), Deatholme'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_02_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_02_world.sql new file mode 100644 index 00000000000..d9199ad9513 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_02_world.sql @@ -0,0 +1,46 @@ +-- Add missing spawns and pooling for Tattered Chest ID: 2844 in Azuremyst Isle +SET @POOLID := 782; -- 6 required +SET @OGUID := 12722; -- 8 required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+7; +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 +(@OGUID, 2844, 530, 3524, 3567, 1, 1, -4434.80810546875, -11967.896484375, 32.12919235229492187, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 360, 255, 1, 45942), -- Pod Cluster +(@OGUID+1, 2844, 530, 3524, 3569, 1, 1, -4826.92822265625, -11486.4384765625, -37.0933952331542968, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 360, 255, 1, 40892), -- Tide's Hollow +(@OGUID+2, 2844, 530, 3524, 3571, 1, 1, -4481.47900390625, -11624.3408203125, 11.0514068603515625, 5.35816192626953125, 0, 0, -0.446197509765625, 0.894934535026550292, 360, 255, 1, 45942), -- Bristlelimb Village +(@OGUID+3, 2844, 530, 3524, 3572, 1, 1, -3099.85595703125, -12480.6591796875, 0.465005010366439819, 1.012289404869079589, 0, 0, 0.484808921813964843, 0.87462007999420166, 360, 255, 1, 40892), -- Stillpine Hold +(@OGUID+4, 2844, 530, 3524, 3572, 1, 1, -3222.1826171875, -12490.9609375, 15.47136592864990234, 1.117009282112121582, 0, 0, 0.529918670654296875, 0.84804844856262207, 360, 255, 1, 45942), -- Stillpine Hold +(@OGUID+5, 2844, 530, 3524, 3577, 1, 1, -4600.736328125, -12871.3798828125, 6.40148019790649414, 2.303830623626708984, 0, 0, 0.913544654846191406, 0.406738430261611938, 360, 255, 1, 45942), -- Greezie's Camp +(@OGUID+6, 2844, 530, 3524, 3578, 1, 1, -3371.1328125, -12716.5361328125, 19.57845115661621093, 6.056293010711669921, 0, 0, -0.11320304870605468, 0.993571877479553222, 360, 255, 1, 45942), -- Menagerie Wreckage +(@OGUID+7, 2844, 530, 3524, 3639, 1, 1, -5200.96875, -11046.71875, 26.86562156677246093, 0.575957298278808593, 0, 0, 0.284014701843261718, 0.958819925785064697, 360, 255, 1, 40892); -- Silvermyst Lsle + +UPDATE `gameobject` SET `spawntimesecs`=360, `animprogress`=225, `state`=1 WHERE `guid` IN (12098,29908,12097,30474,85814,12095,12096,30513,12093,12094); + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+5; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Tattered Chest (2844), Azuremyst Isle, Chest Pool Stillpine Hold'), +(@POOLID+1,1,'Tattered Chest (2844), Azuremyst Isle, Chest Pool Pods and Greezie''s Camp'), +(@POOLID+2,1,'Tattered Chest (2844), Azuremyst Isle, Chest Pool Menagerie Wreckage'), +(@POOLID+3,1,'Tattered Chest (2844), Azuremyst Isle, Chest Pool Bristlelimb Village'), +(@POOLID+4,1,'Tattered Chest (2844), Azuremyst Isle, Chest Pool Tides Hollow'), +(@POOLID+5,1,'Tattered Chest (2844), Azuremyst Isle, Chest Pool Silvermyst Isle'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+5; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(1,12093,@POOLID,0,'Tattered Chest (2844), Stillpine Hold'), +(1,@OGUID+3,@POOLID,0,'Tattered Chest (2844), Stillpine Hold'), +(1,@OGUID+4,@POOLID,0,'Tattered Chest (2844), Stillpine Hold'), +(1,30474,@POOLID+1,0,'Tattered Chest (2844), Pod Wreckage'), +(1,@OGUID,@POOLID+1,0,'Tattered Chest (2844), Pod Cluster'), +(1,@OGUID+5,@POOLID+1,0,'Tattered Chest (2844), Greezie''s Camp'), +(1,12094,@POOLID+2,0,'Tattered Chest (2844), Menagerie Wreckage'), +(1,@OGUID+6,@POOLID+2,0,'Tattered Chest (2844), Menagerie Wreckage'), +(1,29908,@POOLID+2,0,'Tattered Chest (2844), Azuremyst Isle'), +(1,12096,@POOLID+3,0,'Tattered Chest (2844), Bristlelimb Village'), +(1,30513,@POOLID+3,0,'Tattered Chest (2844), Bristlelimb Village'), +(1,@OGUID+2,@POOLID+3,0,'Tattered Chest (2844), Bristlelimb Village'), +(1,85814,@POOLID+4,0,'Tattered Chest (2844), Tides Hollow'), +(1,12095,@POOLID+4,0,'Tattered Chest (2844), Tides Hollow'), +(1,@OGUID+1,@POOLID+4,0,'Tattered Chest (2844), Tides Hollow'), +(1,12098,@POOLID+5,0,'Tattered Chest (2844), Silvermyst Isle'), +(1,@OGUID+7,@POOLID+5,0,'Tattered Chest (2844), Silvermyst Isle'), +(1,12097,@POOLID+5,0,'Tattered Chest (2844), Moonwing Den'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_03_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_03_world.sql new file mode 100644 index 00000000000..309a5d3c4b6 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_03_world.sql @@ -0,0 +1,91 @@ +-- Add 24 missing Battered Chest ID: 106318 with pooling in Mulgore +SET @OGUID := 21965; -- 24 required +SET @POOLID := 788; -- 9 required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+24; +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 +(@OGUID, 106318, 1, 215, 215, 1, 1, -631.74151611328125, 111.4527664184570312, 17.11371040344238281, 1.082102894783020019, 0, 0, 0.51503753662109375, 0.857167601585388183, 360, 255, 1, 46902), -- Mulgore North +(@OGUID+1, 106318, 1, 215, 215, 1, 1, -546.70684814453125, 72.729278564453125, 52.28420257568359375, 0.802850961685180664, 0, 0, 0.390730857849121093, 0.920504987239837646, 360, 255, 1, 44171), -- Mulgore North +(@OGUID+2, 106318, 1, 215, 215, 1, 1, -657.78033447265625, 193.8148956298828125, 46.80418014526367187, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 360, 255, 1, 44171), -- Mulgore North +(@OGUID+3, 106318, 1, 215, 820, 1, 1, -824.10137939453125, -780.58660888671875, -2.71320295333862304, 4.276057243347167968, 0, 0, -0.84339141845703125, 0.537299633026123046, 360, 255, 1, 44171), -- The Golden Plains +(@OGUID+4, 106318, 1, 215, 819, 1, 1, -591.3314208984375, -681.55999755859375, 27.44317245483398437, 5.427974700927734375, 0, 0, -0.41469287872314453, 0.909961462020874023, 360, 255, 1, 46368), -- Windfiry Ridge "Near The Golden Plains" +(@OGUID+5, 106318, 1, 215, 819, 1, 1, -665.03692626953125, -787.12469482421875, 43.61326980590820312, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 360, 255, 1, 44171), -- Windfiry Ridge "Near The Golden Plains" +(@OGUID+6, 106318, 1, 215, 0, 1, 1, -1075.2293701171875, 542.53753662109375, 49.8483428955078125, 4.031712055206298828, 0, 0, -0.90258502960205078, 0.430511653423309326, 360, 255, 1, 44171), -- Mulgore West +(@OGUID+7, 106318, 1, 215, 215, 1, 1, -998.08270263671875, 589.4744873046875, 81.93946075439453125, 2.530723094940185546, 0, 0, 0.953716278076171875, 0.300707906484603881, 360, 255, 1, 44171), -- Mulgore West +(@OGUID+8, 106318, 1, 215, 404, 1, 1, -1893.6497802734375, 353.875457763671875, 107.3605728149414062, 5.672322273254394531, 0, 0, -0.3007049560546875, 0.953717231750488281, 360, 255, 1, 44171), -- Bael'dun Digsite +(@OGUID+9, 106318, 1, 215, 360, 1, 1, -1681.0875244140625, -1218.5963134765625, 127.4188613891601562, 0.453785061836242675, 0, 0, 0.224950790405273437, 0.974370121955871582, 360, 255, 1, 46368), -- Venture Company Mine +(@OGUID+10, 106318, 1, 215, 360, 1, 1, -1585.0709228515625, -1151.2315673828125, 104.118377685546875, 0.122172988951206207, 0, 0, 0.061048507690429687, 0.998134791851043701, 360, 255, 1, 44171), -- Venture Company Mine +(@OGUID+11, 106318, 1, 215, 360, 1, 1, -1672.001708984375, -1324.0699462890625, 132.7880859375, 1.343901276588439941, 0, 0, 0.622513771057128906, 0.78260880708694458, 360, 255, 1, 44171), -- Venture Company Mine +(@OGUID+12, 106318, 1, 215, 360, 1, 1, -1921.726806640625, -1027.15087890625, 43.96306610107421875, 1.204277276992797851, 0, 0, 0.56640625, 0.824126183986663818, 360, 255, 1, 46902), -- Venture Company Mine "Outside" +(@OGUID+13, 106318, 1, 215, 360, 1, 1, -1889.326416015625, -1096.98095703125, 90.32932281494140625, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 360, 255, 1, 44171), -- Venture Company Mine "Outside" +(@OGUID+14, 106318, 1, 215, 818, 1, 1, -2388.364990234375, 444.8865966796875, 75.9410400390625, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 360, 255, 1, 44171), -- Palemane Rock +(@OGUID+15, 106318, 1, 215, 818, 1, 1, -2402.0634765625, 233.6727142333984375, 49.24333953857421875, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 360, 255, 1, 44171), -- Palemane Rock +(@OGUID+16, 106318, 1, 215, 818, 1, 1, -2445.70751953125, 438.708526611328125, 61.7602691650390625, 0.541050612926483154, 0, 0, 0.267237663269042968, 0.96363067626953125, 360, 255, 1, 44171), -- Palemane Rock +(@OGUID+17, 106318, 1, 215, 818, 1, 1, -2358.603271484375, 379.66888427734375, 64.85495758056640625, 3.43830275535583496, 0, 0, -0.98901557922363281, 0.147811368107795715, 360, 255, 1, 44171), -- Palemane Rock +(@OGUID+18, 106318, 1, 215, 215, 1, 1, -2782.115478515625, -707.653564453125, 6.424570083618164062, 2.687806606292724609, 0, 0, 0.974370002746582031, 0.224951311945915222, 360, 255, 1, 46902), -- Palemane Camp +(@OGUID+19, 106318, 1, 215, 821, 1, 1, -2716.833740234375, -1188.42822265625, 16.78433990478515625, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 360, 255, 1, 46902), -- The Rolling Plains +(@OGUID+20, 106318, 1, 215, 821, 1, 1, -2643.494873046875, -1320.986328125, 12.12032413482666015, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 360, 255, 1, 44171), -- The Rolling Plains +(@OGUID+21, 106318, 1, 215, 821, 1, 1, -2625.284423828125, -1390.2613525390625, 24.50350379943847656, 5.724681377410888671, 0, 0, -0.27563667297363281, 0.961261868476867675, 360, 255, 1, 44171), -- The Rolling Plains +(@OGUID+22, 106318, 1, 215, 224, 1, 1, -1931.8563232421875, -715.7557373046875, 3.48775792121887207, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 360, 255, 1, 44171), -- Ravaged Caravan +(@OGUID+23, 106318, 1, 215, 224, 1, 1, -1912.48876953125, -712.5831298828125, 3.573940992355346679, 0.174532130360603332, 0, 0, 0.087155342102050781, 0.996194720268249511, 360, 255, 1, 44171); -- Ravaged Caravan + +-- Update existing spawns to match new ones. +UPDATE `gameobject` SET `spawntimesecs`=360, `animprogress`=225, `state`=1 WHERE `guid` IN +(18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,85767,85772,85882,85883); + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+8; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Battered Chest (106318), Mulgore, Chest Pool Mulgore North'), +(@POOLID+1,1,'Battered Chest (106318), Mulgore, Chest Pool Golden Plains'), +(@POOLID+2,1,'Battered Chest (106318), Mulgore, Chest Pool Mulgore West'), +(@POOLID+3,1,'Battered Chest (106318), Mulgore, Chest Pool Bael''dun Digsite'), +(@POOLID+4,1,'Battered Chest (106318), Mulgore, Chest Pool Venture Company Mine'), +(@POOLID+5,1,'Battered Chest (106318), Mulgore, Chest Pool Palemane Rock'), +(@POOLID+6,1,'Battered Chest (106318), Mulgore, Chest Pool Palemane Camp'), +(@POOLID+7,1,'Battered Chest (106318), Mulgore, Chest Pool The Rolling Plains'), +(@POOLID+8,1,'Battered Chest (106318), Mulgore, Chest Pool Venture North and Ravaged Caravan'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+8; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(1,18442,@POOLID,0,'Battered Chest (106318), Mulgore North'), +(1,@OGUID,@POOLID,0,'Battered Chest (106318), Mulgore North'), +(1,@OGUID+1,@POOLID,0,'Battered Chest (106318), Mulgore North'), +(1,@OGUID+2,@POOLID,0,'Battered Chest (106318), Mulgore North'), +(1,18443,@POOLID+1,0,'Battered Chest (106318), Golden Plains'), +(1,@OGUID+3,@POOLID+1,0,'Battered Chest (106318), Golden Plains'), +(1,@OGUID+4,@POOLID+1,0,'Battered Chest (106318), Windfiry Ridge'), +(1,@OGUID+5,@POOLID+1,0,'Battered Chest (106318), Windfiry Ridge'), +(1,18451,@POOLID+2,0,'Battered Chest (106318), Mulgore West'), +(1,85772,@POOLID+2,0,'Battered Chest (106318), Mulgore West'), +(1,@OGUID+6,@POOLID+2,0,'Battered Chest (106318), Mulgore West'), +(1,@OGUID+7,@POOLID+2,0,'Battered Chest (106318), Mulgore West'), +(1,18446,@POOLID+3,0,'Battered Chest (106318), Bael''dun Digsite'), +(1,@OGUID+8,@POOLID+3,0,'Battered Chest (106318), Bael''dun Digsite'), +(1,18454,@POOLID+3,0,'Battered Chest (106318), Mulgore'), +(1,85883,@POOLID+3,0,'Battered Chest (106318), Mulgore'), +(1,18445,@POOLID+4,0,'Battered Chest (106318), Venture Company Mine'), +(1,18453,@POOLID+4,0,'Battered Chest (106318), Venture Company Mine'), +(1,@OGUID+9,@POOLID+4,0,'Battered Chest (106318), Venture Company Mine'), +(1,@OGUID+10,@POOLID+4,0,'Battered Chest (106318), Venture Company Mine'), +(1,@OGUID+11,@POOLID+4,0,'Battered Chest (106318), Venture Company Mine'), +(1,@OGUID+12,@POOLID+4,0,'Battered Chest (106318), Venture Company Mine'), +(1,@OGUID+13,@POOLID+4,0,'Battered Chest (106318), Venture Company Mine'), +(1,18447,@POOLID+5,0,'Battered Chest (106318), Palemane Rock'), +(1,18448,@POOLID+5,0,'Battered Chest (106318), Palemane Rock'), +(1,@OGUID+14,@POOLID+5,0,'Battered Chest (106318), Palemane Rock'), +(1,@OGUID+15,@POOLID+5,0,'Battered Chest (106318), Palemane Rock'), +(1,@OGUID+16,@POOLID+5,0,'Battered Chest (106318), Palemane Rock'), +(1,@OGUID+17,@POOLID+5,0,'Battered Chest (106318), Palemane Rock'), +(1,18444,@POOLID+6,0,'Battered Chest (106318), Palemane Camp'), +(1,18449,@POOLID+6,0,'Battered Chest (106318), Palemane Camp'), +(1,85767,@POOLID+6,0,'Battered Chest (106318), Palemane Camp'), +(1,@OGUID+18,@POOLID+6,0,'Battered Chest (106318), Palemane Camp'), +(1,18455,@POOLID+7,0,'Battered Chest (106318), The Rolling Plains'), +(1,@OGUID+19,@POOLID+7,0,'Battered Chest (106318), The Rolling Plains'), +(1,@OGUID+20,@POOLID+7,0,'Battered Chest (106318), The Rolling Plains'), +(1,@OGUID+21,@POOLID+7,0,'Battered Chest (106318), The Rolling Plains'), +(1,18450,@POOLID+8,0,'Battered Chest (106318), Mulgore Venture North'), +(1,85882,@POOLID+8,0,'Battered Chest (106318), Mulgore Venture North'), +(1,18452,@POOLID+8,0,'Battered Chest (106318), Ravaged Caravan'), +(1,@OGUID+22,@POOLID+8,0,'Battered Chest (106318), Ravaged Caravan'), +(1,@OGUID+23,@POOLID+8,0,'Battered Chest (106318), Ravaged Caravan'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_04_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_04_world.sql new file mode 100644 index 00000000000..929326302d0 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_04_world.sql @@ -0,0 +1,77 @@ +-- Add 23 missing Battered Chest ID: 106318 with pooling in Teldrassil +SET @OGUID := 20592; -- 23 required +SET @POOLID := 844; -- 6 required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+22; +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 +(@OGUID, 106318, 1, 141, 258, 1, 1, 10134.7548828125, 1183.4837646484375, 1323.5435791015625, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 360, 255, 1, 41510), -- Fel Rock +(@OGUID+1, 106318, 1, 141, 258, 1, 1, 10128.7626953125, 1114.3878173828125, 1323.858154296875, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 360, 255, 1, 41510), -- Fel Rock +(@OGUID+2, 106318, 1, 141, 258, 1, 1, 10182.3330078125, 1174.6905517578125, 1326.032958984375, 5.829400539398193359, 0, 0, -0.22495079040527343, 0.974370121955871582, 360, 255, 1, 41510), -- Fel Rock +(@OGUID+3, 106318, 1, 141, 262, 1, 1, 9749.2099609375, 1586.384765625, 1299.9820556640625, 1.919861555099487304, 0, 0, 0.819151878356933593, 0.573576688766479492, 360, 255, 1, 41510), -- Ban'ethil Barrow Den +(@OGUID+4, 106318, 1, 141, 262, 1, 1, 9703.41015625, 1543.0289306640625, 1254.1004638671875, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 360, 255, 1, 41510), -- Ban'ethil Barrow Den +(@OGUID+5, 106318, 1, 141, 262, 1, 1, 9800.5625, 1581.1583251953125, 1291.1978759765625, 5.654868602752685546, 0, 0, -0.30901622772216796, 0.95105677843093872, 360, 255, 1, 41510), -- Ban'ethil Barrow Den +(@OGUID+6, 106318, 1, 141, 262, 1, 1, 9776.05078125, 1547.3790283203125, 1299.4854736328125, 0.715584874153137207, 0, 0, 0.350207328796386718, 0.936672210693359375, 360, 255, 1, 41510), -- Ban'ethil Barrow Den +(@OGUID+7, 106318, 1, 141, 264, 1, 1, 10511.2021484375, 2002.39306640625, 1327.3753662109375, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 360, 255, 1, 41510), -- The Oracle Glade South +(@OGUID+8, 106318, 1, 141, 264, 1, 1, 10863.521484375, 2125.578857421875, 1327.0626220703125, 2.635444164276123046, 0, 0, 0.96814727783203125, 0.250381410121917724, 360, 255, 1, 41510), -- The Oracle Glade North +(@OGUID+9, 106318, 1, 141, 264, 1, 1, 10620.2724609375, 2089.35205078125, 1336.537841796875, 4.782202720642089843, 0, 0, -0.68199825286865234, 0.731353819370269775, 360, 255, 1, 41510), -- The Oracle Glade South +(@OGUID+10, 106318, 1, 141, 141, 1, 1, 9673.74609375, 454.109161376953125, 1309.8837890625, 1.640606880187988281, 0, 0, 0.731352806091308593, 0.6819993257522583, 360, 255, 1, 41446), -- South of Starbreeze Village +(@OGUID+11, 106318, 1, 141, 141, 1, 1, 9631.6015625, 463.320098876953125, 1312.8011474609375, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 360, 255, 1, 41446), -- South of Starbreeze Village +(@OGUID+12, 106318, 1, 141, 141, 1, 1, 10027.5283203125, 273.2647705078125, 1323.5810546875, 2.478367090225219726, 0, 0, 0.94551849365234375, 0.325568377971649169, 360, 255, 1, 41446), -- North of Starbreeze Village +(@OGUID+13, 106318, 1, 141, 141, 1, 1, 9183.7001953125, 1372.7894287109375, 1315.068359375, 3.595378875732421875, 0, 0, -0.97437000274658203, 0.224951311945915222, 360, 255, 1, 41446), -- South +(@OGUID+14, 106318, 1, 141, 141, 1, 1, 9264.998046875, 949.08831787109375, 1312.4244384765625, 5.95157480239868164, 0, 0, -0.16504669189453125, 0.986285746097564697, 360, 255, 1, 41510), -- South +(@OGUID+15, 106318, 1, 141, 141, 1, 1, 10419.6533203125, 1908.990234375, 1321.2657470703125, 2.617989301681518554, 0, 0, 0.965925216674804687, 0.258821308612823486, 360, 255, 1, 41510), -- Below The Oracle Glade +(@OGUID+16, 106318, 1, 141, 141, 1, 1, 10371.857421875, 1923.328125, 1319.966552734375, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 360, 255, 1, 41510), -- Below The Oracle Glade +-- 6 from Mangos DB +(@OGUID+17, 106318, 1, 141, 262, 1, 1, 9730.49, 1576.73, 1269.44, 3.07177, 0, 0, 0.999391, 0.0349061, 360, 255, 1, 0), -- Ban'ethil Barrow Den +(@OGUID+18, 106318, 1, 141, 262, 1, 1, 9831.43, 1533.49, 1257.51, 1.36136, 0, 0, 0.62932, 0.777146, 360, 255, 1, 0), -- Ban'ethil Barrow Den +(@OGUID+19, 106318, 1, 141, 262, 1, 1, 9800.56, 1581.16, 1291.2, 5.65487, 0, 0, -0.309016, 0.951057, 360, 255, 1, 0), -- Ban'ethil Barrow Den +(@OGUID+20, 106318, 1, 141, 262, 1, 1, 9730.49, 1576.73, 1269.44, 3.07177, 0, 0, 0.999391, 0.0349061, 360, 255, 1, 0), -- Ban'ethil Barrow Den +(@OGUID+21, 106318, 1, 141, 264, 1, 1, 10751.3, 2214.47, 1331.51, 4.69494, 0, 0, -0.71325, 0.70091, 360, 255, 1, 0), -- The Oracle Glade +(@OGUID+22, 106318, 1, 141, 264, 1, 1, 10890.4, 1968.21, 1321.79, 4.95674, 0, 0, -0.615661, 0.788011, 360, 255, 1, 0); -- The Oracle Glade + +-- Update existing spawns to match new ones. +UPDATE `gameobject` SET `spawntimesecs`=360, `animprogress`=225, `state`=1 WHERE `guid` IN +(49622,49624,49626,49628,49627,49621,49623,49625); + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+5; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Battered Chest (106318), Teldassil, Chest Pool Fel Rock'), +(@POOLID+1,1,'Battered Chest (106318), Teldassil, Chest Pool Ban''ethil Barrow Den'), +(@POOLID+2,1,'Battered Chest (106318), Teldassil, Chest Pool The Oracle Glade North'), +(@POOLID+3,1,'Battered Chest (106318), Teldassil, Chest Pool The Oracle Glade South'), +(@POOLID+4,1,'Battered Chest (106318), Teldassil, Chest Pool Starbreeze Village'), +(@POOLID+5,1,'Battered Chest (106318), Teldassil, Chest Pool Southern Teldrassil'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+5; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(1,49628,@POOLID,0,'Battered Chest (106318), Fel Rock'), +(1,@OGUID,@POOLID,0,'Battered Chest (106318), Fel Rock'), +(1,@OGUID+1,@POOLID,0,'Battered Chest (106318), Fel Rock'), +(1,@OGUID+2,@POOLID,0,'Battered Chest (106318), Fel Rock'), +(1,49627,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,@OGUID+3,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,@OGUID+4,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,@OGUID+5,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,@OGUID+6,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,@OGUID+17,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,@OGUID+18,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,@OGUID+19,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,@OGUID+20,@POOLID+1,0,'Battered Chest (106318), Ban''ethil Barrow Den'), +(1,49621,@POOLID+2,0,'Battered Chest (106318), The Oracle Glade North'), +(1,@OGUID+8,@POOLID+2,0,'Battered Chest (106318), The Oracle Glade North'), +(1,@OGUID+21,@POOLID+2,0,'Battered Chest (106318), The Oracle Glade North'), +(1,@OGUID+22,@POOLID+2,0,'Battered Chest (106318), The Oracle Glade North'), +(1,49623,@POOLID+3,0,'Battered Chest (106318), The Oracle Glade South'), +(1,49625,@POOLID+3,0,'Battered Chest (106318), The Oracle Glade South'), +(1,@OGUID+7,@POOLID+3,0,'Battered Chest (106318), The Oracle Glade South'), +(1,@OGUID+9,@POOLID+3,0,'Battered Chest (106318), The Oracle Glade South'), +(1,@OGUID+15,@POOLID+3,0,'Battered Chest (106318), The Oracle Glade South'), +(1,@OGUID+16,@POOLID+3,0,'Battered Chest (106318), The Oracle Glade South'), +(1,49622,@POOLID+4,0,'Battered Chest (106318), Starbreeze Village'), +(1,@OGUID+10,@POOLID+4,0,'Battered Chest (106318), Starbreeze Village'), +(1,@OGUID+11,@POOLID+4,0,'Battered Chest (106318), Starbreeze Village'), +(1,@OGUID+12,@POOLID+4,0,'Battered Chest (106318), Starbreeze Village'), +(1,49624,@POOLID+5,0,'Battered Chest (106318), Southern Teldrassil'), +(1,49626,@POOLID+5,0,'Battered Chest (106318), Southern Teldrassil'), +(1,@OGUID+13,@POOLID+5,0,'Battered Chest (106318), Southern Teldrassil'), +(1,@OGUID+14,@POOLID+5,0,'Battered Chest (106318), Southern Teldrassil'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_05_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_05_world.sql new file mode 100644 index 00000000000..bb7b359c868 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_05_world.sql @@ -0,0 +1,74 @@ +-- Add missing spawns and pooling for Tattered Chest ID: 2846 in Bloodmyst Isle +SET @POOLID := 850; -- 6 required +SET @OGUID := 23273; -- 28 required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+27; +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 +(@OGUID+0, 2846, 530, 3525, 3585, 1, 1, -1806.03857421875, -11684.298828125, 33.98169326782226562, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 360, 255, 1, 46158), -- Bladewood +(@OGUID+1, 2846, 530, 3525, 3585, 1, 1, -1713.0931396484375, -11621.1533203125, 34.2453765869140625, 4.363324165344238281, 0, 0, -0.81915187835693359, 0.573576688766479492, 360, 255, 1, 46158), -- Bladewood +(@OGUID+2, 2846, 530, 3525, 3585, 1, 1, -1814.4840087890625, -11553.1123046875, 34.16876983642578125, 4.1538848876953125, 0, 0, -0.8746194839477539, 0.484810054302215576, 360, 255, 1, 46368), -- Bladewood +(@OGUID+3, 2846, 530, 3525, 3687, 1, 1, -1136.5537109375, -11840.462890625, -1.63031005859375, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 360, 255, 1, 46158), -- The Warp Piston +(@OGUID+4, 2846, 530, 3525, 3590, 1, 1, -2257.208251953125, -12322.2861328125, 57.29496383666992187, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 360, 255, 1, 46368), -- Wrathscale Lair +(@OGUID+5, 2846, 530, 3525, 3590, 1, 1, -2187.5908203125, -12299.380859375, 56.221343994140625, 3.45575571060180664, 0, 0, -0.98768806457519531, 0.156436234712600708, 360, 255, 1, 46158), -- Wrathscale Lair +(@OGUID+6, 2846, 530, 3525, 3591, 1, 1, -1796.316162109375, -12065.8564453125, 31.659881591796875, 1.972219824790954589, 0, 0, 0.83388519287109375, 0.55193793773651123, 360, 255, 1, 46368), -- Ruins of Loreth'Anan +(@OGUID+7, 2846, 530, 3525, 3591, 1, 1, -1845.208984375, -12093.4248046875, 33.01601409912109375, 1.012289404869079589, 0, 0, 0.484808921813964843, 0.87462007999420166, 360, 255, 1, 46368), -- Ruins of Loreth'Anan +(@OGUID+8, 2846, 530, 3525, 3592, 1, 1, -2422.167236328125, -11318.396484375, 29.50377082824707031, 5.84685373306274414, 0, 0, -0.21643924713134765, 0.976296067237854003, 360, 255, 1, 46158), -- Nazzivian +(@OGUID+9, 2846, 530, 3525, 3592, 1, 1, -2514.785888671875, -11127.396484375, 16.80916213989257812, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 360, 255, 1, 46158), -- Nazzivian +(@OGUID+10, 2846, 530, 3525, 3592, 1, 1, -2508.1875, -11249.017578125, 36.19548416137695312, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 360, 255, 1, 46158), -- Nazzivian +(@OGUID+11, 2846, 530, 3525, 3592, 1, 1, -2415.964111328125, -11222.4111328125, 24.28668212890625, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 360, 255, 1, 46368), -- Nazzivian +(@OGUID+12, 2846, 530, 3525, 3592, 1, 1, -2315.081787109375, -11191.0302734375, 13.94209861755371093, 1.902408957481384277, 0, 0, 0.814115524291992187, 0.580702960491180419, 360, 255, 1, 46368), -- Nazzivian +(@OGUID+13, 2846, 530, 3525, 3594, 1, 1, -2816.5537109375, -11721.001953125, 0.128297999501228332, 0.698131442070007324, 0, 0, 0.342020034790039062, 0.939692676067352294, 360, 255, 1, 46158), -- Blackslit Shore +(@OGUID+14, 2846, 530, 3525, 3594, 1, 1, -2816.791748046875, -11521.4580078125, 3.551013946533203125, 6.09120035171508789, 0, 0, -0.09584522247314453, 0.995396256446838378, 360, 255, 1, 46368), -- Blackslit Shore +(@OGUID+15, 2846, 530, 3525, 3594, 1, 1, -2816.641845703125, -11219.6904296875, 2.085382938385009765, 1.32644820213317871, 0, 0, 0.615660667419433593, 0.788011372089385986, 360, 255, 1, 46158), -- Blackslit Shore +(@OGUID+16, 2846, 530, 3525, 3594, 1, 1, -2820.947509765625, -11420.7392578125, 5.266423225402832031, 3.892086982727050781, 0, 0, -0.93041706085205078, 0.366502493619918823, 360, 255, 1, 46368), -- Blackslit Shore +(@OGUID+17, 2846, 530, 3525, 3600, 1, 1, -2395.802001953125, -12166.826171875, 32.98817825317382812, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 360, 255, 1, 46158), -- Bristlelimb Enclave +(@OGUID+18, 2846, 530, 3525, 3600, 1, 1, -2513.0068359375, -12197.3330078125, 27.98298072814941406, 1.762782454490661621, 0, 0, 0.771624565124511718, 0.636078238487243652, 360, 255, 1, 46158), -- Bristlelimb Enclave +(@OGUID+19, 2846, 530, 3525, 3600, 1, 1, -2537.432373046875, -12280.47265625, 14.01218223571777343, 3.647741317749023437, 0, 0, -0.96814727783203125, 0.250381410121917724, 360, 255, 1, 46158), -- Bristlelimb Enclave +(@OGUID+20, 2846, 530, 3525, 3601, 1, 1, -1453.5301513671875, -11844.0322265625, 19.05023574829101562, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 360, 255, 1, 46158), -- Ragefeather Ridge +(@OGUID+21, 2846, 530, 3525, 3601, 1, 1, -1517.6060791015625, -12025.7939453125, 10.71734142303466796, 4.276057243347167968, 0, 0, -0.84339141845703125, 0.537299633026123046, 360, 255, 1, 46158), -- Ragefeather Ridge +(@OGUID+22, 2846, 530, 3525, 3601, 1, 1, -1523.1407470703125, -11818.052734375, 23.21690177917480468, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 360, 255, 1, 46368), -- Ragefeather Ridge +(@OGUID+23, 2846, 530, 3525, 3601, 1, 1, -1485.6785888671875, -11930.548828125, 19.05023574829101562, 3.211419343948364257, 0, 0, -0.9993906021118164, 0.034906134009361267, 360, 255, 1, 46368), -- Ragefeather Ridge +(@OGUID+24, 2846, 530, 3525, 3601, 1, 1, -1681.670166015625, -11801.6201171875, 22.05923652648925781, 4.712389945983886718, 0, 0, -0.70710659027099609, 0.707106947898864746, 360, 255, 1, 46158), -- Ragefeather Ridge +(@OGUID+25, 2846, 530, 3525, 3601, 1, 1, -1622.558349609375, -11917.3193359375, 9.328012466430664062, 4.45059061050415039, 0, 0, -0.79335308074951171, 0.608761727809906005, 360, 255, 1, 46368), -- Ragefeather Ridge +(@OGUID+26, 2846, 530, 3525, 3909, 1, 1, -2532.938232421875, -11961.8232421875, 20.45257759094238281, 0, 0, 0, 0, 1, 360, 255, 1, 46158), -- The Lost Fold +(@OGUID+27, 2846, 530, 3525, 3910, 1, 1, -2441.07373046875, -11773.0068359375, 14.12316417694091796, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 360, 255, 1, 46368); -- Middenvale + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+5; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Tattered Chest (2846), Bloodmyst Isle, Chest Pool Bladewood'), +(@POOLID+1,1,'Tattered Chest (2846), Bloodmyst Isle, Chest Pool Wrathscale'), +(@POOLID+2,1,'Tattered Chest (2846), Bloodmyst Isle, Chest Pool Nazzivian'), +(@POOLID+3,1,'Tattered Chest (2846), Bloodmyst Isle, Chest Pool Blackslit'), +(@POOLID+4,1,'Tattered Chest (2846), Bloodmyst Isle, Chest Pool Bristlelimb'), +(@POOLID+5,1,'Tattered Chest (2846), Bloodmyst Isle, Chest Pool Ragefeather'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+5; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(1,@OGUID,@POOLID,0,'Tattered Chest (2846), Bladewood'), +(1,@OGUID+1,@POOLID,0,'Tattered Chest (2846), Bladewood'), +(1,@OGUID+2,@POOLID,0,'Tattered Chest (2846), Bladewood'), +(1,@OGUID+3,@POOLID,0,'Tattered Chest (2846), The Warp Piston'), +(1,@OGUID+27,@POOLID,0,'Tattered Chest (2846), Middenvale'), +(1,@OGUID+4,@POOLID+1,0,'Tattered Chest (2846), Wrathscale Lair'), +(1,@OGUID+5,@POOLID+1,0,'Tattered Chest (2846), Wrathscale Lair'), +(1,@OGUID+6,@POOLID+1,0,'Tattered Chest (2846), Ruins of Loreth''Anan'), +(1,@OGUID+7,@POOLID+1,0,'Tattered Chest (2846), Ruins of Loreth''Anan'), +(1,@OGUID+8,@POOLID+2,0,'Tattered Chest (2846), Nazzivian'), +(1,@OGUID+9,@POOLID+2,0,'Tattered Chest (2846), Nazzivian'), +(1,@OGUID+10,@POOLID+2,0,'Tattered Chest (2846), Nazzivian'), +(1,@OGUID+11,@POOLID+2,0,'Tattered Chest (2846), Nazzivian'), +(1,@OGUID+12,@POOLID+2,0,'Tattered Chest (2846), Nazzivian'), +(1,@OGUID+13,@POOLID+3,0,'Tattered Chest (2846), Blackslit Shore'), +(1,@OGUID+14,@POOLID+3,0,'Tattered Chest (2846), Blackslit Shore'), +(1,@OGUID+15,@POOLID+3,0,'Tattered Chest (2846), Blackslit Shore'), +(1,@OGUID+16,@POOLID+3,0,'Tattered Chest (2846), Blackslit Shore'), +(1,@OGUID+17,@POOLID+4,0,'Tattered Chest (2846), Bristlelimb Enclave'), +(1,@OGUID+18,@POOLID+4,0,'Tattered Chest (2846), Bristlelimb Enclave'), +(1,@OGUID+19,@POOLID+4,0,'Tattered Chest (2846), Bristlelimb Enclave'), +(1,@OGUID+26,@POOLID+4,0,'Tattered Chest (2846), The Lost Fold'), +(1,@OGUID+20,@POOLID+5,0,'Tattered Chest (2846), Ragefeather Ridge'), +(1,@OGUID+21,@POOLID+5,0,'Tattered Chest (2846), Ragefeather Ridge'), +(1,@OGUID+22,@POOLID+5,0,'Tattered Chest (2846), Ragefeather Ridge'), +(1,@OGUID+23,@POOLID+5,0,'Tattered Chest (2846), Ragefeather Ridge'), +(1,@OGUID+24,@POOLID+5,0,'Tattered Chest (2846), Ragefeather Ridge'), +(1,@OGUID+25,@POOLID+5,0,'Tattered Chest (2846), Ragefeather Ridge'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_06_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_06_world.sql new file mode 100644 index 00000000000..53d4fecce2b --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_20_06_world.sql @@ -0,0 +1,92 @@ +-- Add missing spawns and pooling for Tattered Chest ID: 2845 in Eversong Woods +SET @POOLID := 856; -- 9 required +SET @OGUID := 24967; -- 28 required + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+27; +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 +(@OGUID+0, 2845, 530, 3430, 3460, 1, 1, 8846.802734375, -5709.845703125, 0.462978005409240722, 1.239183306694030761, 0, 0, 0.580702781677246093, 0.814115643501281738, 360, 255, 1, 40892), -- Golden Strand +(@OGUID+1, 2845, 530, 3430, 3460, 1, 1, 8782.2021484375, -5750.22265625, 0.406792014837265014, 2.059488296508789062, 0, 0, 0.857167243957519531, 0.515038192272186279, 360, 255, 1, 40892), -- Golden Strand +(@OGUID+2, 2845, 530, 3430, 3460, 1, 1, 8878.2138671875, -5732.53857421875, 0.232910007238388061, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 360, 255, 1, 45854), -- Golden Strand +(@OGUID+3, 2845, 530, 3430, 3460, 1, 1, 8676.185546875, -5694.66162109375, 0.725703001022338867, 4.572763919830322265, 0, 0, -0.75470924377441406, 0.656059443950653076, 360, 255, 1, 45854), -- Golden Strand +(@OGUID+4, 2845, 530, 3430, 3460, 1, 1, 8771.9091796875, -5683.58349609375, 0.120685003697872161, 3.124123096466064453, 0, 0, 0.99996185302734375, 0.008734640665352344, 360, 255, 1, 45854), -- Golden Strand +(@OGUID+5, 2845, 530, 3430, 3911, 1, 1, 9090.8916015625, -5863.84619140625, 0.349002987146377563, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 360, 255, 1, 40892), -- Tranquil Shore +(@OGUID+6, 2845, 530, 3430, 3911, 1, 1, 9034.2119140625, -5864.50634765625, 0.089702002704143524, 0.698131442070007324, 0, 0, 0.342020034790039062, 0.939692676067352294, 360, 255, 1, 40892), -- Tranquil Shore +(@OGUID+7, 2845, 530, 3430, 3911, 1, 1, 8977.1787109375, -5736.40478515625, 0.367024004459381103, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 360, 255, 1, 40892), -- Tranquil Shore +(@OGUID+8, 2845, 530, 3430, 3911, 1, 1, 8940.3037109375, -5747.05224609375, 0.162974998354911804, 5.410521507263183593, 0, 0, -0.42261791229248046, 0.906307935714721679, 360, 255, 1, 42328), -- Tranquil Shore +(@OGUID+9, 2845, 530, 3430, 3911, 1, 1, 9110.3271484375, -5790.36962890625, 0.029617000371217727, 1.413715124130249023, 0, 0, 0.649447441101074218, 0.760406434535980224, 360, 255, 1, 42328), -- Tranquil Shore +(@OGUID+10, 2845, 530, 3430, 3911, 1, 1, 9161.2958984375, -5813.65478515625, 0.225214004516601562, 1.064649581909179687, 0, 0, 0.507537841796875, 0.861629426479339599, 360, 255, 1, 45854), -- Tranquil Shore +(@OGUID+11, 2845, 530, 3430, 3482, 1, 1, 8405.232421875, -7001.72998046875, 93.72124481201171875, 4.468043327331542968, 0, 0, -0.7880105972290039, 0.615661680698394775, 360, 255, 1, 40892), -- The Dead Scar +(@OGUID+12, 2845, 530, 3430, 3482, 1, 1, 8545.6357421875, -7025.015625, 83.48480987548828125, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 360, 255, 1, 40892), -- The Dead Scar +(@OGUID+13, 2845, 530, 3430, 3482, 1, 1, 8815.2236328125, -6988.04248046875, 33.64208602905273437, 3.52557229995727539, 0, 0, -0.98162651062011718, 0.190812408924102783, 360, 255, 1, 45942), -- The Dead Scar +(@OGUID+14, 2845, 530, 3430, 3482, 1, 1, 9167.796875, -6961.861328125, 6.301101207733154296, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 360, 255, 1, 45942), -- The Dead Scar +(@OGUID+15, 2845, 530, 3430, 3461, 1, 1, 8805.4208984375, -5899.8759765625, 11.03487968444824218, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 360, 255, 1, 42328), -- Sunsail Anchorage +(@OGUID+16, 2845, 530, 3430, 3461, 1, 1, 8709.9775390625, -6027.74853515625, 7.889542102813720703, 4.48549652099609375, 0, 0, -0.7826080322265625, 0.622514784336090087, 360, 255, 1, 45942), -- Sunsail Anchorage +(@OGUID+17, 2845, 530, 3430, 3461, 1, 1, 8805.6533203125, -6096.244140625, 20.43907546997070312, 4.310965538024902343, 0, 0, -0.83388519287109375, 0.55193793773651123, 360, 255, 1, 56713), -- Sunsail Anchorage +(@OGUID+18, 2845, 530, 3430, 3476, 1, 1, 8342.580078125, -7951.3046875, 183.5680999755859375, 0.680676698684692382, 0, 0, 0.333806037902832031, 0.942641794681549072, 360, 255, 1, 40892), -- Tor'Watha +(@OGUID+19, 2845, 530, 3430, 3476, 1, 1, 8486.5302734375, -7989.3125, 156.599639892578125, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 360, 255, 1, 45942), -- Tor'Watha +(@OGUID+20, 2845, 530, 3430, 3475, 1, 1, 8433.9404296875, -7555.21875, 161.53948974609375, 2.932138919830322265, 0, 0, 0.994521141052246093, 0.104535527527332305, 360, 255, 1, 40892), -- Zeb'Watha +(@OGUID+21, 2845, 530, 3430, 3914, 1, 1, 8287.14453125, -7262.19970703125, 139.7483673095703125, 1.815141916275024414, 0, 0, 0.788010597229003906, 0.615661680698394775, 360, 255, 1, 40892), -- Runestone Shan'dor +(@OGUID+22, 2845, 530, 3430, 3913, 1, 1, 8253.8916015625, -6693.859375, 86.01686859130859375, 2.356194972991943359, 0, 0, 0.923879623413085937, 0.382683247327804565, 360, 255, 1, 42328), -- Runestone Falithas +(@OGUID+23, 2845, 530, 3430, 3472, 1, 1, 9292.0048828125, -7974.42529296875, -37.7078971862792968, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 360, 255, 1, 45942), -- Azurebreeze Coast +(@OGUID+24, 2845, 530, 3430, 3467, 1, 1, 8733.6015625, -7111.90625, 37.34553909301757812, 1.239183306694030761, 0, 0, 0.580702781677246093, 0.814115643501281738, 360, 255, 1, 45942), -- East Sanctum +(@OGUID+25, 2845, 530, 3430, 3480, 1, 1, 9342.2568359375, -7898.17724609375, 142.246368408203125, 1.762782454490661621, 0, 0, 0.771624565124511718, 0.636078238487243652, 360, 255, 1, 45942), -- Duskwither Spire +(@OGUID+26, 2845, 530, 3430, 3480, 1, 1, 9348.390625, -7887.3994140625, 158.4431610107421875, 3.45575571060180664, 0, 0, -0.98768806457519531, 0.156436234712600708, 360, 255, 1, 56713), -- Duskwither Spire +(@OGUID+27, 2845, 530, 3430, 3466, 1, 1, 9099.138671875, -6236.265625, 28.45432281494140625, 2.024578809738159179, 0, 0, 0.848047256469726562, 0.529920578002929687, 360, 255, 1, 56713); -- West Sanctum + +UPDATE `gameobject` SET `spawntimesecs`=360, `animprogress`=225, `state`=1 WHERE `guid` IN (33932,12101,12102,12099,12100,12105,12103,12106,12107,33899,12104,12108,33953); + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+8; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Tattered Chest (2845), Eversong Woods, Chest Pool Golden Strand'), +(@POOLID+1,1,'Tattered Chest (2845), Eversong Woods, Chest Pool Tranquil Shore'), +(@POOLID+2,1,'Tattered Chest (2845), Eversong Woods, Chest Pool The Dead Scar North'), +(@POOLID+3,1,'Tattered Chest (2845), Eversong Woods, Chest Pool The Dead Scar South'), +(@POOLID+4,1,'Tattered Chest (2845), Eversong Woods, Chest Pool Sunsail Anchorage'), +(@POOLID+5,1,'Tattered Chest (2845), Eversong Woods, Chest Pool Tor''Watha and Zeb''Watha'), +(@POOLID+6,1,'Tattered Chest (2845), Eversong Woods, Chest Pool East and west Sactums'), +(@POOLID+7,1,'Tattered Chest (2845), Eversong Woods, Chest Pool Duskweather Spire'), +(@POOLID+8,1,'Tattered Chest (2845), Eversong Woods, Chest Pool Scorched Grove and Runestones'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+8; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(1,12105,@POOLID,0,'Tattered Chest (2845), Golden Strand'), +(1,@OGUID,@POOLID,0,'Tattered Chest (2845), Golden Strand'), +(1,@OGUID+1,@POOLID,0,'Tattered Chest (2845), Golden Strand'), +(1,@OGUID+2,@POOLID,0,'Tattered Chest (2845), Golden Strand'), +(1,@OGUID+3,@POOLID,0,'Tattered Chest (2845), Golden Strand'), +(1,@OGUID+4,@POOLID,0,'Tattered Chest (2845), Golden Strand'), +(1,12099,@POOLID+1,0,'Tattered Chest (2845), Tranquil Shore'), +(1,12100,@POOLID+1,0,'Tattered Chest (2845), Tranquil Shore'), +(1,@OGUID+5,@POOLID+1,0,'Tattered Chest (2845), Tranquil Shore'), +(1,@OGUID+6,@POOLID+1,0,'Tattered Chest (2845), Tranquil Shore'), +(1,@OGUID+7,@POOLID+1,0,'Tattered Chest (2845), Tranquil Shore'), +(1,@OGUID+8,@POOLID+1,0,'Tattered Chest (2845), Tranquil Shore'), +(1,@OGUID+9,@POOLID+1,0,'Tattered Chest (2845), Tranquil Shore'), +(1,@OGUID+10,@POOLID+1,0,'Tattered Chest (2845), Tranquil Shore'), +(1,12104,@POOLID+2,0,'Tattered Chest (2845), The Dead Scar North'), +(1,33953,@POOLID+2,0,'Tattered Chest (2845), The Dead Scar North'), +(1,@OGUID+13,@POOLID+2,0,'Tattered Chest (2845), The Dead Scar North'), +(1,@OGUID+14,@POOLID+2,0,'Tattered Chest (2845), The Dead Scar North'), +(1,12108,@POOLID+3,0,'Tattered Chest (2845), The Dead Scar South'), +(1,33899,@POOLID+3,0,'Tattered Chest (2845), The Dead Scar South'), +(1,@OGUID+11,@POOLID+3,0,'Tattered Chest (2845), The Dead Scar South'), +(1,@OGUID+12,@POOLID+3,0,'Tattered Chest (2845), The Dead Scar South'), +(1,12106,@POOLID+4,0,'Tattered Chest (2845), Sunsail Anchorage'), +(1,@OGUID+15,@POOLID+4,0,'Tattered Chest (2845), Sunsail Anchorage'), +(1,@OGUID+16,@POOLID+4,0,'Tattered Chest (2845), Sunsail Anchorage'), +(1,@OGUID+17,@POOLID+4,0,'Tattered Chest (2845), Sunsail Anchorage'), +(1,12103,@POOLID+5,0,'Tattered Chest (2845), Tor''Watha'), +(1,@OGUID+18,@POOLID+5,0,'Tattered Chest (2845), Tor''Watha'), +(1,@OGUID+19,@POOLID+5,0,'Tattered Chest (2845), Tor''Watha'), +(1,@OGUID+20,@POOLID+5,0,'Tattered Chest (2845), Zeb''Watha'), +(1,33932,@POOLID+6,0,'Tattered Chest (2845), West Sactums'), +(1,12101,@POOLID+6,0,'Tattered Chest (2845), West Sactums'), +(1,@OGUID+27,@POOLID+6,0,'Tattered Chest (2845), West Sactums'), +(1,@OGUID+24,@POOLID+6,0,'Tattered Chest (2845), East Sactums'), +(1,12102,@POOLID+7,0,'Tattered Chest (2845), Duskwither Spire'), +(1,@OGUID+25,@POOLID+7,0,'Tattered Chest (2845), Duskwither Spire'), +(1,@OGUID+26,@POOLID+7,0,'Tattered Chest (2845), Duskwither Spire'), +(1,@OGUID+23,@POOLID+7,0,'Tattered Chest (2845), Azurebreeze Coast'), +(1,12107,@POOLID+8,0,'Tattered Chest (2845), Scorched Grove'), +(1,@OGUID+21,@POOLID+8,0,'Tattered Chest (2845), Runestone Shan''dor'), +(1,@OGUID+22,@POOLID+8,0,'Tattered Chest (2845), Runestone Falithas'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_00_world.sql new file mode 100644 index 00000000000..99814cda8ef --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_00_world.sql @@ -0,0 +1,2 @@ +-- The World Tree and the Emerald Dream book update +UPDATE `gameobject` SET `position_x` = -8729.36328125, `position_y` = 1107.6275634765625, `position_z` = 94.32956695556640625, `orientation` = 5.532694816589355468, `rotation2` = -0.3665008544921875, `rotation3` = 0.93041771650314331, `state` = 1 WHERE `guid` = 42903; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_01_world.sql new file mode 100644 index 00000000000..3e7eea16afd --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_01_world.sql @@ -0,0 +1,446 @@ +-- Felpaw Village, Felwood Replace existing Deadwood spawns with sniffed CreateObject2 and pooling +SET @CGUID := 143153; +SET @POOLID := 865; + +-- Remove existing spawns +DELETE FROM `creature` WHERE `guid` IN (39690,40305,40308,40386,40403,40409,40424,40464,40610,40615,40621,40623,40304,40307,40314,40388,40391,40393,40408,40413,40414,40415,40421,40472,40604,40611,40612,40629,40631,39691,40303,40306,40389,40390,40394,40397,40398,40401,40417,40430,40605,40608,40613,40625,40627); +DELETE FROM `creature_addon` WHERE `guid`=40394; +DELETE FROM `spawn_group` WHERE `spawnType`=0 AND `spawnId` IN (39690,40305,40308,40386,40403,40409,40424,40464,40610,40615,40621,40623,40304,40307,40314,40388,40391,40393,40408,40413,40414,40415,40421,40472,40604,40611,40612,40629,40631,39691,40303,40306,40389,40390,40394,40397,40398,40401,40417,40430,40605,40608,40613,40625,40627); +DELETE FROM `waypoint_data` WHERE `id`=403940; + +-- Add new spawns and pooling +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID AND @CGUID+127; +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID AND @CGUID+127; +INSERT INTO `creature` (`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`wander_distance`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`,`ScriptName`,`VerifiedBuild`) VALUES +(@CGUID, 7156, 1, 0, 0, 1, 1, 0, 1, 6752.151, -1961.7408, 551.0034, 2.897246599197387695, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', 0), +(@CGUID+1, 7156, 1, 0, 0, 1, 1, 0, 1, 6826.352, -1967.1415, 551.7001, 0.087266460061073303, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+2, 7157, 1, 0, 0, 1, 1, 0, 1, 6836.794, -1954.4425, 550.3044, 4.97418832778930664, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+3, 7157, 1, 0, 0, 1, 1, 0, 1, 6747.612, -1965.1079, 551.0034, 1.466076612472534179, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', 0), +(@CGUID+4, 7158, 1, 0, 0, 1, 1, 0, 1, 6860.563, -1964.6693, 556.07733, 1.868465900421142578, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+5, 7156, 1, 0, 0, 1, 1, 0, 1, 6906.3325, -1812.831, 571.74634, 3.124139308929443359, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+6, 7157, 1, 0, 0, 1, 1, 0, 1, 6906.3325, -1812.831, 571.74634, 3.124139308929443359, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+7, 7156, 1, 0, 0, 1, 1, 0, 1, 6907.568, -1824.5265, 569.79987, 2.652148962020874023, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+8, 7157, 1, 0, 0, 1, 1, 0, 1, 6907.568, -1824.5265, 569.79987, 2.652148962020874023, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+9, 7156, 1, 0, 0, 1, 1, 0, 1, 6732.4287, -1885.0846, 549.65784, 2.639858484268188476, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+10, 7157, 1, 0, 0, 1, 1, 0, 1, 6732.4287, -1885.0846, 549.65784, 2.639858484268188476, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+11, 7156, 1, 0, 0, 1, 1, 0, 1, 6836.325, -1875.1724, 550.6761, 5.632167816162109375, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+12, 7157, 1, 0, 0, 1, 1, 0, 1, 6836.325, -1875.1724, 550.6761, 5.632167816162109375, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+13, 7157, 1, 0, 0, 1, 1, 0, 1, 6911.731, -1813.9487, 571.83374, 3.90445256233215332, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', 0), +(@CGUID+14, 7158, 1, 0, 0, 1, 1, 0, 1, 6911.731, -1813.9487, 571.83374, 3.90445256233215332, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', 0), +(@CGUID+15, 7157, 1, 0, 0, 1, 1, 0, 1, 6920.1743, -1834.089, 571.92725, 1.535889744758605957, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+16, 7158, 1, 0, 0, 1, 1, 0, 1, 6920.1743, -1834.089, 571.92725, 1.535889744758605957, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+17, 7156, 1, 0, 0, 1, 1, 0, 1, 6717.204, -1983.8384, 559.4351, 4.812276840209960937, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+18, 7157, 1, 0, 0, 1, 1, 0, 1, 6717.204, -1983.8384, 559.4351, 4.812276840209960937, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+19, 7158, 1, 0, 0, 1, 1, 0, 1, 6717.204, -1983.8384, 559.4351, 4.812276840209960937, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+20, 7156, 1, 0, 0, 1, 1, 0, 1, 6873.1665, -2038.6376, 581.6539, 3.997686624526977539, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+21, 7157, 1, 0, 0, 1, 1, 0, 1, 6873.1665, -2038.6376, 581.6539, 3.997686624526977539, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+22, 7158, 1, 0, 0, 1, 1, 0, 1, 6873.1665, -2038.6376, 581.6539, 3.997686624526977539, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+23, 7156, 1, 0, 0, 1, 1, 0, 1, 6707.918, -1899.5065, 549.25116, 2.629336118698120117, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+24, 7157, 1, 0, 0, 1, 1, 0, 1, 6707.918, -1899.5065, 549.25116, 2.629336118698120117, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+25, 7158, 1, 0, 0, 1, 1, 0, 1, 6707.918, -1899.5065, 549.25116, 2.629336118698120117, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+26, 7156, 1, 0, 0, 1, 1, 0, 1, 6650.4067, -1949.7196, 549.8623, 1.452553272247314453, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+27, 7157, 1, 0, 0, 1, 1, 0, 1, 6650.4067, -1949.7196, 549.8623, 1.452553272247314453, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+28, 7158, 1, 0, 0, 1, 1, 0, 1, 6650.4067, -1949.7196, 549.8623, 1.452553272247314453, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+29, 7156, 1, 0, 0, 1, 1, 0, 1, 6733.7173, -1955.1018, 549.71326, 3.353776931762695312, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+30, 7157, 1, 0, 0, 1, 1, 0, 1, 6733.7173, -1955.1018, 549.71326, 3.353776931762695312, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+31, 7158, 1, 0, 0, 1, 1, 0, 1, 6733.7173, -1955.1018, 549.71326, 3.353776931762695312, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+32, 7156, 1, 0, 0, 1, 1, 0, 1, 6702.9175, -1961.2802, 553.9784, 0.38945859670639038, 300, 3, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+33, 7157, 1, 0, 0, 1, 1, 0, 1, 6702.9175, -1961.2802, 553.9784, 0.38945859670639038, 300, 3, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+34, 7158, 1, 0, 0, 1, 1, 0, 1, 6702.9175, -1961.2802, 553.9784, 0.38945859670639038, 300, 3, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+35, 7156, 1, 0, 0, 1, 1, 0, 1, 6689.4556, -2008.2662, 560.1293, 6.061192035675048828, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+36, 7157, 1, 0, 0, 1, 1, 0, 1, 6689.4556, -2008.2662, 560.1293, 6.061192035675048828, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+37, 7158, 1, 0, 0, 1, 1, 0, 1, 6689.4556, -2008.2662, 560.1293, 6.061192035675048828, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+38, 7156, 1, 0, 0, 1, 1, 0, 1, 6852.629, -1939.76, 551.0034, 3.651977300643920898, 300, 10, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+39, 7157, 1, 0, 0, 1, 1, 0, 1, 6852.629, -1939.76, 551.0034, 3.651977300643920898, 300, 10, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+40, 7158, 1, 0, 0, 1, 1, 0, 1, 6852.629, -1939.76, 551.0034, 3.651977300643920898, 300, 10, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+41, 7156, 1, 0, 0, 1, 1, 0, 1, 6816.777, -2014.8325, 568.51807, 5.54440164566040039, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+42, 7157, 1, 0, 0, 1, 1, 0, 1, 6816.777, -2014.8325, 568.51807, 5.54440164566040039, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+43, 7158, 1, 0, 0, 1, 1, 0, 1, 6816.777, -2014.8325, 568.51807, 5.54440164566040039, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+44, 7156, 1, 0, 0, 1, 1, 0, 1, 6852.9307, -1980.0747, 551.7032, 0.850379586219787597, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+45, 7157, 1, 0, 0, 1, 1, 0, 1, 6852.9307, -1980.0747, 551.7032, 0.850379586219787597, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+46, 7158, 1, 0, 0, 1, 1, 0, 1, 6852.9307, -1980.0747, 551.7032, 0.850379586219787597, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+47, 7156, 1, 0, 0, 1, 1, 0, 1, 6912.4556, -1800.7333, 573.76605, 3.690003395080566406, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+48, 7157, 1, 0, 0, 1, 1, 0, 1, 6912.4556, -1800.7333, 573.76605, 3.690003395080566406, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+49, 7158, 1, 0, 0, 1, 1, 0, 1, 6912.4556, -1800.7333, 573.76605, 3.690003395080566406, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+50, 7156, 1, 0, 0, 1, 1, 0, 1, 6884.3813, -1815.441, 569.1466, 1.413716673851013183, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+51, 7157, 1, 0, 0, 1, 1, 0, 1, 6884.3813, -1815.441, 569.1466, 1.413716673851013183, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+52, 7158, 1, 0, 0, 1, 1, 0, 1, 6884.3813, -1815.441, 569.1466, 1.413716673851013183, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+53, 7156, 1, 0, 0, 1, 1, 0, 1, 6671.831, -1937.1498, 549.9153, 5.767045497894287109, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+54, 7157, 1, 0, 0, 1, 1, 0, 1, 6671.831, -1937.1498, 549.9153, 5.767045497894287109, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+55, 7158, 1, 0, 0, 1, 1, 0, 1, 6671.831, -1937.1498, 549.9153, 5.767045497894287109, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+56, 7156, 1, 0, 0, 1, 1, 0, 1, 6783.9683, -2017.4205, 567.54736, 4.150726318359375, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+57, 7157, 1, 0, 0, 1, 1, 0, 1, 6783.9683, -2017.4205, 567.54736, 4.150726318359375, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+58, 7158, 1, 0, 0, 1, 1, 0, 1, 6783.9683, -2017.4205, 567.54736, 4.150726318359375, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+59, 7156, 1, 0, 0, 1, 1, 0, 1, 6854.4717, -1891.2478, 551.0034, 0.333302795886993408, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+60, 7157, 1, 0, 0, 1, 1, 0, 1, 6854.4717, -1891.2478, 551.0034, 0.333302795886993408, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+61, 7158, 1, 0, 0, 1, 1, 0, 1, 6854.4717, -1891.2478, 551.0034, 0.333302795886993408, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+62, 7156, 1, 0, 0, 1, 1, 0, 1, 6848.996, -1814.8412, 564.1588, 2.317746877670288085, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+63, 7157, 1, 0, 0, 1, 1, 0, 1, 6848.996, -1814.8412, 564.1588, 2.317746877670288085, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+64, 7158, 1, 0, 0, 1, 1, 0, 1, 6848.996, -1814.8412, 564.1588, 2.317746877670288085, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+65, 7156, 1, 0, 0, 1, 1, 0, 1, 6889.5596, -1947.1342, 572.1914, 5.422736167907714843, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+66, 7157, 1, 0, 0, 1, 1, 0, 1, 6889.5596, -1947.1342, 572.1914, 5.422736167907714843, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+67, 7158, 1, 0, 0, 1, 1, 0, 1, 6889.5596, -1947.1342, 572.1914, 5.422736167907714843, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+68, 7156, 1, 0, 0, 1, 1, 0, 1, 6901.011, -2020.2257, 583.0537, 4.345870018005371093, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+69, 7157, 1, 0, 0, 1, 1, 0, 1, 6901.011, -2020.2257, 583.0537, 4.345870018005371093, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+70, 7158, 1, 0, 0, 1, 1, 0, 1, 6901.011, -2020.2257, 583.0537, 4.345870018005371093, 300, 6, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+71, 7156, 1, 0, 0, 1, 1, 0, 1, 6840.962, -2011.3381, 572.1896, 2.666453838348388671, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+72, 7157, 1, 0, 0, 1, 1, 0, 1, 6840.962, -2011.3381, 572.1896, 2.666453838348388671, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+73, 7158, 1, 0, 0, 1, 1, 0, 1, 6840.962, -2011.3381, 572.1896, 2.666453838348388671, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+74, 7156, 1, 0, 0, 1, 1, 0, 1, 6850.334, -1898.8638, 550.99396, 0.419144600629806518, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+75, 7157, 1, 0, 0, 1, 1, 0, 1, 6850.334, -1898.8638, 550.99396, 0.419144600629806518, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+76, 7158, 1, 0, 0, 1, 1, 0, 1, 6850.334, -1898.8638, 550.99396, 0.419144600629806518, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+77, 7156, 1, 0, 0, 1, 1, 0, 1, 6748.8423, -1888.2213, 549.94415, 5.060978889465332031, 300, 5, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+78, 7157, 1, 0, 0, 1, 1, 0, 1, 6748.8423, -1888.2213, 549.94415, 5.060978889465332031, 300, 5, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+79, 7158, 1, 0, 0, 1, 1, 0, 1, 6748.8423, -1888.2213, 549.94415, 5.060978889465332031, 300, 5, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+80, 7156, 1, 0, 0, 1, 1, 0, 1, 6908.5566, -1872.0408, 568.9377, 1.676499843597412109, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+81, 7157, 1, 0, 0, 1, 1, 0, 1, 6908.5566, -1872.0408, 568.9377, 1.676499843597412109, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+82, 7158, 1, 0, 0, 1, 1, 0, 1, 6908.5566, -1872.0408, 568.9377, 1.676499843597412109, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+83, 7156, 1, 0, 0, 1, 1, 0, 1, 6756.5103, -1986.3594, 551.00354, 1.836662650108337402, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+84, 7157, 1, 0, 0, 1, 1, 0, 1, 6756.5103, -1986.3594, 551.00354, 1.836662650108337402, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+85, 7158, 1, 0, 0, 1, 1, 0, 1, 6756.5103, -1986.3594, 551.00354, 1.836662650108337402, 300, 4, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+86, 7156, 1, 0, 0, 1, 1, 0, 1, 6811.798, -1862.0892, 551.0034, 3.028398513793945312, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+87, 7157, 1, 0, 0, 1, 1, 0, 1, 6811.798, -1862.0892, 551.0034, 3.028398513793945312, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+88, 7158, 1, 0, 0, 1, 1, 0, 1, 6811.798, -1862.0892, 551.0034, 3.028398513793945312, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+89, 7156, 1, 0, 0, 1, 1, 0, 1, 6785.5903, -1867.4802, 551.0258, 5.412777900695800781, 300, 5, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+90, 7157, 1, 0, 0, 1, 1, 0, 1, 6785.5903, -1867.4802, 551.0258, 5.412777900695800781, 300, 5, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+91, 7158, 1, 0, 0, 1, 1, 0, 1, 6785.5903, -1867.4802, 551.0258, 5.412777900695800781, 300, 5, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+92, 7156, 1, 0, 0, 1, 1, 0, 1, 6816.9775, -1818.9469, 562.42096, 5.254460334777832031, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+93, 7157, 1, 0, 0, 1, 1, 0, 1, 6816.9775, -1818.9469, 562.42096, 5.254460334777832031, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+94, 7158, 1, 0, 0, 1, 1, 0, 1, 6816.9775, -1818.9469, 562.42096, 5.254460334777832031, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+95, 7156, 1, 0, 0, 1, 1, 0, 1, 6799.929, -1833.5918, 558.3517, 0.822560429573059082, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+96, 7157, 1, 0, 0, 1, 1, 0, 1, 6799.929, -1833.5918, 558.3517, 0.822560429573059082, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+97, 7158, 1, 0, 0, 1, 1, 0, 1, 6799.929, -1833.5918, 558.3517, 0.822560429573059082, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+98, 7156, 1, 0, 0, 1, 1, 0, 1, 6683.4727, -1983.9648, 553.7465, 5.527495384216308593, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+99, 7157, 1, 0, 0, 1, 1, 0, 1, 6683.4727, -1983.9648, 553.7465, 5.527495384216308593, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+100, 7158, 1, 0, 0, 1, 1, 0, 1, 6683.4727, -1983.9648, 553.7465, 5.527495384216308593, 300, 7, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+101, 7156, 1, 0, 0, 1, 1, 0, 1, 6633.604, -1994.87, 551.8855, 1.831908464431762695, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+102, 7157, 1, 0, 0, 1, 1, 0, 1, 6633.604, -1994.87, 551.8855, 1.831908464431762695, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+103, 7158, 1, 0, 0, 1, 1, 0, 1, 6633.604, -1994.87, 551.8855, 1.831908464431762695, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+104, 7156, 1, 0, 0, 1, 1, 0, 1, 6659.386, -2017.5638, 552.1679, 5.303110122680664062, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+105, 7157, 1, 0, 0, 1, 1, 0, 1, 6659.386, -2017.5638, 552.1679, 5.303110122680664062, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+106, 7158, 1, 0, 0, 1, 1, 0, 1, 6659.386, -2017.5638, 552.1679, 5.303110122680664062, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+107, 7156, 1, 0, 0, 1, 1, 0, 1, 6893.018, -1907.9801, 568.61505, 3.519721269607543945, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+108, 7157, 1, 0, 0, 1, 1, 0, 1, 6893.018, -1907.9801, 568.61505, 3.519721269607543945, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+109, 7158, 1, 0, 0, 1, 1, 0, 1, 6893.018, -1907.9801, 568.61505, 3.519721269607543945, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+110, 7156, 1, 0, 0, 1, 1, 0, 1, 6789.6323, -1987.0955, 563.5386, 3.399090290069580078, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+111, 7157, 1, 0, 0, 1, 1, 0, 1, 6789.6323, -1987.0955, 563.5386, 3.399090290069580078, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+112, 7158, 1, 0, 0, 1, 1, 0, 1, 6789.6323, -1987.0955, 563.5386, 3.399090290069580078, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+113, 7156, 1, 0, 0, 1, 1, 0, 1, 6813.097, -1962.2092, 551.4164, 1.928655982017517089, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+114, 7157, 1, 0, 0, 1, 1, 0, 1, 6813.097, -1962.2092, 551.4164, 1.928655982017517089, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+115, 7158, 1, 0, 0, 1, 1, 0, 1, 6813.097, -1962.2092, 551.4164, 1.928655982017517089, 300, 9, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+116, 7156, 1, 0, 0, 1, 1, 0, 1, 6849.124, -1881.0748, 551.00366, 3.333578824996948242, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+117, 7157, 1, 0, 0, 1, 1, 0, 1, 6849.124, -1881.0748, 551.00366, 3.333578824996948242, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+118, 7158, 1, 0, 0, 1, 1, 0, 1, 6849.124, -1881.0748, 551.00366, 3.333578824996948242, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+119, 7156, 1, 0, 0, 1, 1, 0, 1, 6679.4087, -1953.9244, 551.26965, 3.954087495803833007, 300, 3, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+120, 7157, 1, 0, 0, 1, 1, 0, 1, 6679.4087, -1953.9244, 551.26965, 3.954087495803833007, 300, 3, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+121, 7158, 1, 0, 0, 1, 1, 0, 1, 6679.4087, -1953.9244, 551.26965, 3.954087495803833007, 300, 3, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+122, 7156, 1, 0, 0, 1, 1, 0, 1, 6782.4507, -1952.2059, 551.1027, 0.982004404067993164, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+123, 7157, 1, 0, 0, 1, 1, 0, 1, 6782.4507, -1952.2059, 551.1027, 0.982004404067993164, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+124, 7158, 1, 0, 0, 1, 1, 0, 1, 6782.4507, -1952.2059, 551.1027, 0.982004404067993164, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+125, 7156, 1, 0, 0, 1, 1, 0, 1, 6854.5806, -1923.5446, 551.0034, 2.179383754730224609, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+126, 7157, 1, 0, 0, 1, 1, 0, 1, 6854.5806, -1923.5446, 551.0034, 2.179383754730224609, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+127, 7158, 1, 0, 0, 1, 1, 0, 1, 6854.5806, -1923.5446, 551.0034, 2.179383754730224609, 300, 8, 0, 1, 0, 1, 0, 0, 0, '', 0); + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+42; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Felpaw Village, Felwood, Group 1'), +(@POOLID+1,1,'Felpaw Village, Felwood, Group 2'), +(@POOLID+2,1,'Felpaw Village, Felwood, Group 3'), +(@POOLID+3,1,'Felpaw Village, Felwood, Group 4'), +(@POOLID+4,1,'Felpaw Village, Felwood, Group 5'), +(@POOLID+5,1,'Felpaw Village, Felwood, Group 6'), +(@POOLID+6,1,'Felpaw Village, Felwood, Group 7'), +(@POOLID+7,1,'Felpaw Village, Felwood, Group 8'), +(@POOLID+8,1,'Felpaw Village, Felwood, Group 9'), +(@POOLID+9,1,'Felpaw Village, Felwood, Group 10'), +(@POOLID+10,1,'Felpaw Village, Felwood, Group 11'), +(@POOLID+11,1,'Felpaw Village, Felwood, Group 12'), +(@POOLID+12,1,'Felpaw Village, Felwood, Group 13'), +(@POOLID+13,1,'Felpaw Village, Felwood, Group 14'), +(@POOLID+14,1,'Felpaw Village, Felwood, Group 15'), +(@POOLID+15,1,'Felpaw Village, Felwood, Group 16'), +(@POOLID+16,1,'Felpaw Village, Felwood, Group 17'), +(@POOLID+17,1,'Felpaw Village, Felwood, Group 18'), +(@POOLID+18,1,'Felpaw Village, Felwood, Group 19'), +(@POOLID+19,1,'Felpaw Village, Felwood, Group 20'), +(@POOLID+20,1,'Felpaw Village, Felwood, Group 21'), +(@POOLID+21,1,'Felpaw Village, Felwood, Group 22'), +(@POOLID+22,1,'Felpaw Village, Felwood, Group 23'), +(@POOLID+23,1,'Felpaw Village, Felwood, Group 24'), +(@POOLID+24,1,'Felpaw Village, Felwood, Group 25'), +(@POOLID+25,1,'Felpaw Village, Felwood, Group 26'), +(@POOLID+26,1,'Felpaw Village, Felwood, Group 27'), +(@POOLID+27,1,'Felpaw Village, Felwood, Group 28'), +(@POOLID+28,1,'Felpaw Village, Felwood, Group 29'), +(@POOLID+29,1,'Felpaw Village, Felwood, Group 30'), +(@POOLID+30,1,'Felpaw Village, Felwood, Group 31'), +(@POOLID+31,1,'Felpaw Village, Felwood, Group 32'), +(@POOLID+32,1,'Felpaw Village, Felwood, Group 33'), +(@POOLID+33,1,'Felpaw Village, Felwood, Group 34'), +(@POOLID+34,1,'Felpaw Village, Felwood, Group 35'), +(@POOLID+35,1,'Felpaw Village, Felwood, Group 36'), +(@POOLID+36,1,'Felpaw Village, Felwood, Group 37'), +(@POOLID+37,1,'Felpaw Village, Felwood, Group 38'), +(@POOLID+38,1,'Felpaw Village, Felwood, Group 39'), +(@POOLID+39,1,'Felpaw Village, Felwood, Group 40'), +(@POOLID+40,1,'Felpaw Village, Felwood, Group 41'), +(@POOLID+41,1,'Felpaw Village, Felwood, Group 42'), +(@POOLID+42,1,'Felpaw Village, Felwood, Group 43'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+42; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(0,@CGUID+5,@POOLID,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+6,@POOLID,0,'Deadwood Avenger (7157)'), +(0,@CGUID+7,@POOLID+1,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+8,@POOLID+1,0,'Deadwood Avenger (7157)'), +(0,@CGUID+9,@POOLID+2,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+10,@POOLID+2,0,'Deadwood Avenger (7157)'), +(0,@CGUID+11,@POOLID+3,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+12,@POOLID+3,0,'Deadwood Avenger (7157)'), +(0,@CGUID+13,@POOLID+4,0,'Deadwood Avenger (7157)'), +(0,@CGUID+14,@POOLID+4,0,'Deadwood Shaman (7158)'), +(0,@CGUID+15,@POOLID+5,0,'Deadwood Avenger (7157)'), +(0,@CGUID+16,@POOLID+5,0,'Deadwood Shaman (7158)'), +(0,@CGUID+17,@POOLID+6,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+18,@POOLID+6,0,'Deadwood Avenger (7157)'), +(0,@CGUID+19,@POOLID+6,0,'Deadwood Shaman (7158)'), +(0,@CGUID+20,@POOLID+7,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+21,@POOLID+7,0,'Deadwood Avenger (7157)'), +(0,@CGUID+22,@POOLID+7,0,'Deadwood Shaman (7158)'), +(0,@CGUID+23,@POOLID+8,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+24,@POOLID+8,0,'Deadwood Avenger (7157)'), +(0,@CGUID+25,@POOLID+8,0,'Deadwood Shaman (7158)'), +(0,@CGUID+26,@POOLID+9,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+27,@POOLID+9,0,'Deadwood Avenger (7157)'), +(0,@CGUID+28,@POOLID+9,0,'Deadwood Shaman (7158)'), +(0,@CGUID+29,@POOLID+10,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+30,@POOLID+10,0,'Deadwood Avenger (7157)'), +(0,@CGUID+31,@POOLID+10,0,'Deadwood Shaman (7158)'), +(0,@CGUID+32,@POOLID+11,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+33,@POOLID+11,0,'Deadwood Avenger (7157)'), +(0,@CGUID+34,@POOLID+11,0,'Deadwood Shaman (7158)'), +(0,@CGUID+35,@POOLID+12,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+36,@POOLID+12,0,'Deadwood Avenger (7157)'), +(0,@CGUID+37,@POOLID+12,0,'Deadwood Shaman (7158)'), +(0,@CGUID+38,@POOLID+13,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+39,@POOLID+13,0,'Deadwood Avenger (7157)'), +(0,@CGUID+40,@POOLID+13,0,'Deadwood Shaman (7158)'), +(0,@CGUID+41,@POOLID+14,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+42,@POOLID+14,0,'Deadwood Avenger (7157)'), +(0,@CGUID+43,@POOLID+14,0,'Deadwood Shaman (7158)'), +(0,@CGUID+44,@POOLID+15,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+45,@POOLID+15,0,'Deadwood Avenger (7157)'), +(0,@CGUID+46,@POOLID+15,0,'Deadwood Shaman (7158)'), +(0,@CGUID+47,@POOLID+16,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+48,@POOLID+16,0,'Deadwood Avenger (7157)'), +(0,@CGUID+49,@POOLID+16,0,'Deadwood Shaman (7158)'), +(0,@CGUID+50,@POOLID+17,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+51,@POOLID+17,0,'Deadwood Avenger (7157)'), +(0,@CGUID+52,@POOLID+17,0,'Deadwood Shaman (7158)'), +(0,@CGUID+53,@POOLID+18,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+54,@POOLID+18,0,'Deadwood Avenger (7157)'), +(0,@CGUID+55,@POOLID+18,0,'Deadwood Shaman (7158)'), +(0,@CGUID+56,@POOLID+19,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+57,@POOLID+19,0,'Deadwood Avenger (7157)'), +(0,@CGUID+58,@POOLID+19,0,'Deadwood Shaman (7158)'), +(0,@CGUID+59,@POOLID+20,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+60,@POOLID+20,0,'Deadwood Avenger (7157)'), +(0,@CGUID+61,@POOLID+20,0,'Deadwood Shaman (7158)'), +(0,@CGUID+62,@POOLID+21,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+63,@POOLID+21,0,'Deadwood Avenger (7157)'), +(0,@CGUID+64,@POOLID+21,0,'Deadwood Shaman (7158)'), +(0,@CGUID+65,@POOLID+22,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+66,@POOLID+22,0,'Deadwood Avenger (7157)'), +(0,@CGUID+67,@POOLID+22,0,'Deadwood Shaman (7158)'), +(0,@CGUID+68,@POOLID+23,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+69,@POOLID+23,0,'Deadwood Avenger (7157)'), +(0,@CGUID+70,@POOLID+23,0,'Deadwood Shaman (7158)'), +(0,@CGUID+71,@POOLID+24,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+72,@POOLID+24,0,'Deadwood Avenger (7157)'), +(0,@CGUID+73,@POOLID+24,0,'Deadwood Shaman (7158)'), +(0,@CGUID+74,@POOLID+25,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+75,@POOLID+25,0,'Deadwood Avenger (7157)'), +(0,@CGUID+76,@POOLID+25,0,'Deadwood Shaman (7158)'), +(0,@CGUID+77,@POOLID+26,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+78,@POOLID+26,0,'Deadwood Avenger (7157)'), +(0,@CGUID+79,@POOLID+26,0,'Deadwood Shaman (7158)'), +(0,@CGUID+80,@POOLID+27,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+81,@POOLID+27,0,'Deadwood Avenger (7157)'), +(0,@CGUID+82,@POOLID+27,0,'Deadwood Shaman (7158)'), +(0,@CGUID+83,@POOLID+28,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+84,@POOLID+28,0,'Deadwood Avenger (7157)'), +(0,@CGUID+85,@POOLID+28,0,'Deadwood Shaman (7158)'), +(0,@CGUID+86,@POOLID+29,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+87,@POOLID+29,0,'Deadwood Avenger (7157)'), +(0,@CGUID+88,@POOLID+29,0,'Deadwood Shaman (7158)'), +(0,@CGUID+89,@POOLID+30,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+90,@POOLID+30,0,'Deadwood Avenger (7157)'), +(0,@CGUID+91,@POOLID+30,0,'Deadwood Shaman (7158)'), +(0,@CGUID+92,@POOLID+31,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+93,@POOLID+31,0,'Deadwood Avenger (7157)'), +(0,@CGUID+94,@POOLID+31,0,'Deadwood Shaman (7158)'), +(0,@CGUID+95,@POOLID+32,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+96,@POOLID+32,0,'Deadwood Avenger (7157)'), +(0,@CGUID+97,@POOLID+32,0,'Deadwood Shaman (7158)'), +(0,@CGUID+98,@POOLID+33,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+99,@POOLID+33,0,'Deadwood Avenger (7157)'), +(0,@CGUID+100,@POOLID+33,0,'Deadwood Shaman (7158)'), +(0,@CGUID+101,@POOLID+34,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+102,@POOLID+34,0,'Deadwood Avenger (7157)'), +(0,@CGUID+103,@POOLID+34,0,'Deadwood Shaman (7158)'), +(0,@CGUID+104,@POOLID+35,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+105,@POOLID+35,0,'Deadwood Avenger (7157)'), +(0,@CGUID+106,@POOLID+35,0,'Deadwood Shaman (7158)'), +(0,@CGUID+107,@POOLID+36,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+108,@POOLID+36,0,'Deadwood Avenger (7157)'), +(0,@CGUID+109,@POOLID+36,0,'Deadwood Shaman (7158)'), +(0,@CGUID+110,@POOLID+37,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+111,@POOLID+37,0,'Deadwood Avenger (7157)'), +(0,@CGUID+112,@POOLID+37,0,'Deadwood Shaman (7158)'), +(0,@CGUID+113,@POOLID+38,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+114,@POOLID+38,0,'Deadwood Avenger (7157)'), +(0,@CGUID+115,@POOLID+38,0,'Deadwood Shaman (7158)'), +(0,@CGUID+116,@POOLID+39,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+117,@POOLID+39,0,'Deadwood Avenger (7157)'), +(0,@CGUID+118,@POOLID+39,0,'Deadwood Shaman (7158)'), +(0,@CGUID+119,@POOLID+40,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+120,@POOLID+40,0,'Deadwood Avenger (7157)'), +(0,@CGUID+121,@POOLID+40,0,'Deadwood Shaman (7158)'), +(0,@CGUID+122,@POOLID+41,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+123,@POOLID+41,0,'Deadwood Avenger (7157)'), +(0,@CGUID+124,@POOLID+41,0,'Deadwood Shaman (7158)'), +(0,@CGUID+125,@POOLID+42,0,'Deadwood Den Watcher (7156)'), +(0,@CGUID+126,@POOLID+42,0,'Deadwood Avenger (7157)'), +(0,@CGUID+127,@POOLID+42,0,'Deadwood Shaman (7158)'); + +-- Pathing for Deadwood Avenger Entry: 7157 +SET @NPC := @CGUID+2; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`StandState`,`SheathState`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6836.2563,-1958.3312,551.14636,NULL,50000,0,0,100,0), +(@PATH,2,6832.138,-1946.8033,548.6861,NULL,40000,0,0,100,0); + +-- Pathing for Deadwood Den Watcher Entry: 7156, Deadwood Avenger Entry: 7157 +SET @NPC := @CGUID+9; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid` IN (@NPC,@NPC+1); +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`StandState`,`SheathState`,`emote`,`visibilityDistanceType`,`auras`) VALUES +(@NPC,@PATH,0,0,1,0,0, ''),(@NPC+1,@PATH,0,0,1,0,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6742.783,-1884.2014,550.0086,NULL,0,0,0,100,0), +(@PATH,2,6755.027,-1882.4729,550.80035,NULL,0,0,0,100,0), +(@PATH,3,6762.4033,-1880.247,550.92535,NULL,0,0,0,100,0), +(@PATH,4,6772.671,-1875.1853,550.8313,NULL,0,0,0,100,0), +(@PATH,5,6785.2915,-1858.1077,552.3018,NULL,0,0,0,100,0), +(@PATH,6,6799.3403,-1845.1311,554.64874,NULL,0,0,0,100,0), +(@PATH,7,6813.109,-1824.484,560.7498,NULL,0,0,0,100,0), +(@PATH,8,6828.3228,-1820.8368,561.93854,NULL,0,0,0,100,0), +(@PATH,9,6845.292,-1826.416,561.6869,NULL,0,0,0,100,0), +(@PATH,10,6867.53,-1825.0946,563.73517,NULL,0,0,0,100,0), +(@PATH,11,6884.5103,-1824.497,566.3377,NULL,0,0,0,100,0), +(@PATH,12,6898.2207,-1826.3928,568.0859,NULL,0,0,0,100,0), +(@PATH,13,6880.141,-1823.8627,565.93854,NULL,0,0,0,100,0), +(@PATH,14,6862.512,-1819.7505,564.43787,NULL,0,0,0,100,0), +(@PATH,15,6853.1475,-1807.4088,565.7855,NULL,0,0,0,100,0), +(@PATH,16,6829.3037,-1811.7084,564.3947,NULL,0,0,0,100,0), +(@PATH,17,6809.335,-1826.6364,560.1082,NULL,0,0,0,100,0), +(@PATH,18,6803.229,-1842.7974,554.82904,NULL,0,0,0,100,0), +(@PATH,19,6802.725,-1864.1155,551.0451,NULL,0,0,0,100,0), +(@PATH,20,6793.358,-1871.483,550.9563,NULL,0,0,0,100,0), +(@PATH,21,6780.5254,-1878.0662,550.2063,NULL,0,0,0,100,0), +(@PATH,22,6761.8857,-1883.431,550.92535,NULL,0,0,0,100,0), +(@PATH,23,6750.664,-1881.2048,550.42535,NULL,0,0,0,100,0), +(@PATH,24,6722.1313,-1889.0719,549.3373,NULL,0,0,0,100,0), +(@PATH,25,6713.2954,-1894.2188,549.21985,NULL,0,0,0,100,0), +(@PATH,26,6708.041,-1900.7806,549.07025,NULL,0,0,0,100,0), +(@PATH,27,6710.7495,-1892.5039,549.4479,NULL,0,0,0,100,0), +(@PATH,28,6709.9814,-1882.2263,550.2838,NULL,0,0,0,100,0), +(@PATH,29,6734.5825,-1882.2701,549.99054,NULL,0,0,0,100,0), +(@PATH,30,6750.664,-1881.2048,550.42535,NULL,0,0,0,100,0), +(@PATH,31,6761.8857,-1883.431,550.92535,NULL,0,0,0,100,0), +(@PATH,32,6780.5254,-1878.0662,550.2063,NULL,0,0,0,100,0), +(@PATH,33,6793.358,-1871.483,550.9563,NULL,0,0,0,100,0), +(@PATH,34,6802.725,-1864.1155,551.0451,NULL,0,0,0,100,0), +(@PATH,35,6803.229,-1842.7974,554.82904,NULL,0,0,0,100,0), +(@PATH,36,6809.335,-1826.6364,560.1082,NULL,0,0,0,100,0), +(@PATH,37,6829.3037,-1811.7084,564.3947,NULL,0,0,0,100,0), +(@PATH,38,6853.1475,-1807.4088,565.7855,NULL,0,0,0,100,0), +(@PATH,39,6862.512,-1819.7505,564.43787,NULL,0,0,0,100,0), +(@PATH,40,6880.141,-1823.8627,565.93854,NULL,0,0,0,100,0), +(@PATH,41,6898.2207,-1826.3928,568.0859,NULL,0,0,0,100,0), +(@PATH,42,6884.5103,-1824.497,566.3377,NULL,0,0,0,100,0), +(@PATH,43,6867.53,-1825.0946,563.73517,NULL,0,0,0,100,0), +(@PATH,44,6845.292,-1826.416,561.6869,NULL,0,0,0,100,0), +(@PATH,45,6828.3228,-1820.8368,561.93854,NULL,0,0,0,100,0), +(@PATH,46,6813.109,-1824.484,560.7498,NULL,0,0,0,100,0), +(@PATH,47,6799.3403,-1845.1311,554.64874,NULL,0,0,0,100,0), +(@PATH,48,6785.2915,-1858.1077,552.3018,NULL,0,0,0,100,0), +(@PATH,49,6772.671,-1875.1853,550.8313,NULL,0,0,0,100,0), +(@PATH,50,6762.4033,-1880.247,550.92535,NULL,0,0,0,100,0), +(@PATH,51,6755.027,-1882.4729,550.80035,NULL,0,0,0,100,0); + +-- Pathing for Deadwood Den Watcher Entry: 7156, Deadwood Avenger Entry: 7157, Deadwood Shaman Entry: 7158 +SET @NPC := @CGUID+53; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid` IN (@NPC,@NPC+1,@NPC+2); +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`StandState`,`SheathState`,`emote`,`visibilityDistanceType`,`auras`) VALUES +(@NPC,@PATH,0,0,1,0,0, ''),(@NPC+1,@PATH,0,0,1,0,0, ''),(@NPC+2,@PATH,0,0,1,0,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6674.144,-1938.4623,550.1063,NULL,0,0,0,100,0), +(@PATH,2,6680.9253,-1945.6392,550.8187,NULL,0,0,0,100,0), +(@PATH,3,6693.1694,-1952.7042,551.0707,NULL,0,0,0,100,0), +(@PATH,4,6705.156,-1953.2203,552.2102,NULL,0,0,0,100,0), +(@PATH,5,6720.814,-1957.4888,552.2864,NULL,0,0,0,100,0), +(@PATH,6,6725.9185,-1964.8463,552.3895,NULL,0,0,0,100,0), +(@PATH,7,6725.5947,-1978.221,559.3325,NULL,0,0,0,100,0), +(@PATH,8,6722.6387,-1987.695,560.3678,NULL,0,0,0,100,0), +(@PATH,9,6716.1553,-1990.7474,560.49414,NULL,0,0,0,100,0), +(@PATH,10,6707.6743,-1986.0039,559.0332,NULL,0,0,0,100,0), +(@PATH,11,6697.0845,-1982.1294,556.9809,NULL,0,0,0,100,0), +(@PATH,12,6689.924,-1972.5391,552.7983,NULL,0,0,0,100,0), +(@PATH,13,6681.2456,-1970.9508,551.23065,NULL,0,0,0,100,0), +(@PATH,14,6661.076,-1962.1512,550.74835,NULL,0,0,0,100,0), +(@PATH,15,6648.992,-1958.2153,550.6717,NULL,0,0,0,100,0), +(@PATH,16,6643.303,-1953.4427,550.5903,NULL,0,0,0,100,0), +(@PATH,17,6641.8594,-1941.9397,549.2579,NULL,0,0,0,100,0), +(@PATH,18,6649.981,-1935.5818,547.8481,NULL,0,0,0,100,0), +(@PATH,19,6663.953,-1934.707,549.12335,NULL,0,0,0,100,0); + +-- Pathing for Deadwood Den Watcher Entry: 7156, Deadwood Avenger Entry: 7157, Deadwood Shaman Entry: 7158 +SET @NPC := @CGUID+71; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid` IN (@NPC,@NPC+1,@NPC+2); +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`StandState`,`SheathState`,`emote`,`visibilityDistanceType`,`auras`) VALUES +(@NPC,@PATH,0,0,1,0,0, ''),(@NPC+1,@PATH,0,0,1,0,0, ''),(@NPC+2,@PATH,0,0,1,0,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6839.8213,-2010.7513,571.88824,NULL,0,0,0,100,0), +(@PATH,2,6825.454,-2003.0621,567.79156,NULL,0,0,0,100,0), +(@PATH,3,6808.6484,-1998.2537,565.77673,NULL,0,0,0,100,0), +(@PATH,4,6797.5586,-1997.8064,565.4205,NULL,0,0,0,100,0), +(@PATH,5,6785.587,-2006.0873,566.36304,NULL,0,0,0,100,0), +(@PATH,6,6779.187,-2018.8337,567.20764,NULL,0,0,0,100,0), +(@PATH,7,6787.61,-2023.3473,569.01,NULL,0,0,0,100,0), +(@PATH,8,6810.3037,-2020.6549,569.0567,NULL,0,0,0,100,0), +(@PATH,9,6826.6704,-2013.8262,569.9943,NULL,0,0,0,100,0), +(@PATH,10,6844.8022,-2016.8806,574.1186,NULL,0,0,0,100,0), +(@PATH,11,6849.61,-2027.3008,577.63873,NULL,0,0,0,100,0), +(@PATH,12,6860.901,-2037.0543,581.5809,NULL,0,0,0,100,0), +(@PATH,13,6872.202,-2040.5083,582.4156,NULL,0,0,0,100,0), +(@PATH,14,6885.85,-2040.0408,581.4642,NULL,0,0,0,100,0), +(@PATH,15,6893.2324,-2036.9629,582.4974,NULL,0,0,0,100,0), +(@PATH,16,6906.8237,-2029.5887,585.2558,NULL,0,0,0,100,0), +(@PATH,17,6912.1626,-2023.863,586.6153,NULL,0,0,0,100,0), +(@PATH,18,6908.6235,-2015.8668,585.2845,NULL,0,0,0,100,0), +(@PATH,19,6901.057,-2009.9861,583.15265,NULL,0,0,0,100,0), +(@PATH,20,6891.577,-2012.1641,579.04706,NULL,0,0,0,100,0), +(@PATH,21,6884.7573,-2017.9587,578.0085,NULL,0,0,0,100,0), +(@PATH,22,6875.134,-2024.5499,577.02216,NULL,0,0,0,100,0), +(@PATH,23,6870.844,-2026.7975,577.436,NULL,0,0,0,100,0), +(@PATH,24,6859.9976,-2023.9427,577.399,NULL,0,0,0,100,0), +(@PATH,25,6851.0894,-2018.5762,575.4251,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_02_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_02_world.sql new file mode 100644 index 00000000000..ff65af9c8e7 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_02_world.sql @@ -0,0 +1,111 @@ +-- +SET @CGUID := 147290; +SET @POOLID := 593; + +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID AND @CGUID+50; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@CGUID, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2978.1, 6172.02, 60.9706, 5.32325, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+1, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2945.24, 6246.11, 60.975, 6.16101, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+2, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2957.58, 6227.22, 60.7323, 3.94444, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+3, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2926.58, 6281.96, 62.1978, 0.802851, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+4, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2887.59, 6237.46, 77.7758, 3.85718, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+5, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2867.71, 6267.31, 61.747, 4.99164, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+6, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2854.76, 6246.98, 77.7758, 3.35103, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+7, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2905.47, 6216.61, 61.5561, 5.3058, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+8, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2928.38, 6185.37, 62.5468, 1.91986, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+9, 25284, 571, 3537, 4129, 1, 1, 0, 0, 2894.52, 6226.45, 77.7758, 3.64774, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+10, 25284, 571, 3537, 4129, 1, 1, 0, 0, 2902.44, 6158.43, 78.5022, 2.96706, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+11, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2895.37, 6293.76, 61.6635, 4.24115, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+12, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2934.04, 6166.06, 62.0291, 2.00713, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+13, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2819.93, 6311.56, 62.5366, 4.69494, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+14, 25284, 571, 3537, 4129, 1, 1, 0, 0, 2921.87, 6135.71, 78.5082, 5.16617, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+15, 25284, 571, 3537, 4129, 1, 1, 0, 0, 2754.33, 6240.9, 77.7758, 3.1765, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+16, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2704.21, 6040.9, 30.7446, 5.77704, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+17, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2722.75, 6031.68, 30.6742, 2.18166, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+18, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2685.12, 6131.61, 40.0764, 2.53073, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+19, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2689.42, 6110.31, 40.1811, 2.19912, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+20, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2680.27, 6147.35, 40.3715, 5.60251, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+21, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2721.42, 6008.34, 32.7563, 3.80482, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+22, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2650.33, 6111.8, 38.2883, 3.00197, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+23, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2689.25, 6194.8, 54.0332, 3.49066, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+24, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2669.27, 6179.79, 39.3598, 5.65487, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+25, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2656.43, 6220.2, 38.5179, 1.76278, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+26, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2567.77, 6109.05, 54.6977, 3.76991, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+27, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2641.34, 6031.71, 54.2912, 3.26377, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+28, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2625.26, 6095.54, 54.0161, 5.23599, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+29, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2585.7, 6190.79, 39.1659, 3.90954, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+30, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2615.04, 6115.13, 45.4237, 2.49582, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+31, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2634.75, 6034.53, 54.0479, 3.07178, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+32, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2700.17, 6236.87, 39.5734, 6.12611, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+33, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2660.3, 6237.82, 38.3345, 3.90954, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+34, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2671.28, 6169.58, 39.5054, 5.51524, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+35, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2717.3, 6294.58, 61.7433, 1.3439, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+36, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2673.98, 6268.22, 39.8142, 2.63545, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+37, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2629.93, 6118.81, 38.2883, 2.42601, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+38, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2627.62, 6052.65, 54.0331, 6.21337, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+39, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2590.95, 6064.32, 53.932, 0.994838, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+40, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2637.65, 6217.15, 40.1605, 2.19912, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+41, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2677.92, 6199.64, 39.8142, 2.51327, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+42, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2708.72, 6270.94, 47.0079, 3.22886, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+43, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2990.11, 6142.67, 61.5929, 1.27409, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+44, 25284, 571, 3537, 4020, 1, 1, 0, 0, 2979.68, 6128.44, 62.3862, 2.84489, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+45, 35644, 650, 4723, 4723, 3, 1, 0, 0, 702.967, 587.649, 412.475, 0.610865, 7200, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+46, 35644, 650, 4723, 4723, 3, 1, 0, 0, 774.898, 573.736, 412.475, 2.14675, 7200, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+47, 35644, 650, 4723, 4723, 3, 1, 0, 0, 787.439, 584.969, 412.476, 2.47837, 7200, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+48, 35644, 650, 4723, 4723, 3, 1, 0, 0, 712.594, 576.26, 412.476, 0.890118, 7200, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+49, 35644, 650, 4723, 4723, 3, 1, 0, 0, 720.57, 571.285, 412.475, 1.06465, 7200, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0), +(@CGUID+50, 36558, 650, 4723, 4723, 3, 1, 0, 0, 790.177, 589.059, 412.475, 2.56563, 7200, 0, 0, 1, 0, 0, 0, 0, 0, '', NULL, 0); + +-- pool_template +DELETE FROM `pool_template` WHERE `entry`= @POOLID; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(@POOLID, 15, 'MASTER Minerals Wintergrasp zone 4197'); + +-- pool_members +DELETE FROM `pool_members` WHERE `type`=2 AND `poolSpawnId`=@POOLID; +INSERT INTO `pool_members` (`type`, `spawnId`, `poolSpawnId`, `chance`, `description`) VALUES +(2, 5617, @POOLID, 0, 'Wintergrasp mineral, node 1'), +(2, 5618, @POOLID, 0, 'Wintergrasp mineral, node 2'), +(2, 5619, @POOLID, 0, 'Wintergrasp mineral, node 3'), +(2, 5620, @POOLID, 0, 'Wintergrasp mineral, node 4'), +(2, 5621, @POOLID, 0, 'Wintergrasp mineral, node 5'), +(2, 5622, @POOLID, 0, 'Wintergrasp mineral, node 6'), +(2, 5623, @POOLID, 0, 'Wintergrasp mineral, node 7'), +(2, 5624, @POOLID, 0, 'Wintergrasp mineral, node 8'), +(2, 5625, @POOLID, 0, 'Wintergrasp mineral, node 9'), +(2, 5626, @POOLID, 0, 'Wintergrasp mineral, node 10'), +(2, 5627, @POOLID, 0, 'Wintergrasp mineral, node 11'), +(2, 5628, @POOLID, 0, 'Wintergrasp mineral, node 12'), +(2, 5629, @POOLID, 0, 'Wintergrasp mineral, node 13'), +(2, 5630, @POOLID, 0, 'Wintergrasp mineral, node 14'), +(2, 5631, @POOLID, 0, 'Wintergrasp mineral, node 15'), +(2, 5632, @POOLID, 0, 'Wintergrasp mineral, node 16'), +(2, 5633, @POOLID, 0, 'Wintergrasp mineral, node 17'), +(2, 5634, @POOLID, 0, 'Wintergrasp mineral, node 18'), +(2, 5635, @POOLID, 0, 'Wintergrasp mineral, node 19'), +(2, 5636, @POOLID, 0, 'Wintergrasp mineral, node 20'), +(2, 5637, @POOLID, 0, 'Wintergrasp mineral, node 21'), +(2, 5638, @POOLID, 0, 'Wintergrasp mineral, node 22'), +(2, 5639, @POOLID, 0, 'Wintergrasp mineral, node 23'), +(2, 5640, @POOLID, 0, 'Wintergrasp mineral, node 24'), +(2, 5641, @POOLID, 0, 'Wintergrasp mineral, node 25'), +(2, 5642, @POOLID, 0, 'Wintergrasp mineral, node 26'), +(2, 5643, @POOLID, 0, 'Wintergrasp mineral, node 27'), +(2, 5644, @POOLID, 0, 'Wintergrasp mineral, node 28'), +(2, 5645, @POOLID, 0, 'Wintergrasp mineral, node 29'), +(2, 5646, @POOLID, 0, 'Wintergrasp mineral, node 30'), +(2, 5647, @POOLID, 0, 'Wintergrasp mineral, node 31'), +(2, 5648, @POOLID, 0, 'Wintergrasp mineral, node 32'), +(2, 5649, @POOLID, 0, 'Wintergrasp mineral, node 33'), +(2, 5650, @POOLID, 0, 'Wintergrasp mineral, node 34'), +(2, 5651, @POOLID, 0, 'Wintergrasp mineral, node 35'), +(2, 5652, @POOLID, 0, 'Wintergrasp mineral, node 36'), +(2, 5653, @POOLID, 0, 'Wintergrasp mineral, node 37'), +(2, 5654, @POOLID, 0, 'Wintergrasp mineral, node 38'), +(2, 5655, @POOLID, 0, 'Wintergrasp mineral, node 39'), +(2, 5656, @POOLID, 0, 'Wintergrasp mineral, node 40'), +(2, 5657, @POOLID, 0, 'Wintergrasp mineral, node 41'), +(2, 5658, @POOLID, 0, 'Wintergrasp mineral, node 42'), +(2, 5659, @POOLID, 0, 'Wintergrasp mineral, node 43'), +(2, 5660, @POOLID, 0, 'Wintergrasp mineral, node 44'), +(2, 5661, @POOLID, 0, 'Wintergrasp mineral, node 45'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_03_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_03_world.sql new file mode 100644 index 00000000000..01f482bae4f --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_24_03_world.sql @@ -0,0 +1,192 @@ +-- Jadefire Run, Felwood Replace existing Jadefire spawns with sniffed CreateObject2 and pooling +SET @CGUID := 147341; +SET @POOLID := 908; +-- Remove existing spawns +DELETE FROM `creature` WHERE `guid` IN (40193,40194,40195,40240,40241,40242,40284,40288,40289,40291,40296,40365,40677,40678,40713,40714,40196,40290,40301,40302,40671,40680,40712,40715,40718,40230,40283,40286,40287,40297,40298,40299,40300,40338,40668,40674,40706,40708); +DELETE FROM `creature_addon` WHERE `guid` IN (40193,40194,40195,40240,40241,40242,40284,40288,40289,40291,40296,40365,40677,40678,40713,40714,40196,40290,40301,40302,40671,40680,40712,40715,40718,40230,40283,40286,40287,40297,40298,40299,40300,40338,40668,40674,40706,40708); +DELETE FROM `spawn_group` WHERE `spawnType`=0 AND `spawnId` IN (40193,40194,40195,40240,40241,40242,40284,40288,40289,40291,40296,40365,40677,40678,40713,40714,40196,40290,40301,40302,40671,40680,40712,40715,40718,40230,40283,40286,40287,40297,40298,40299,40300,40338,40668,40674,40706,40708); +DELETE FROM `waypoint_data` WHERE `id` IN (407060); +-- Add new spawns and pooling +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID AND @CGUID+65; +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID AND @CGUID+65; +INSERT INTO `creature` (`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`wander_distance`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`,`ScriptName`,`VerifiedBuild`) VALUES +(@CGUID, 7107, 1, 0, 0, 1, 1, 0, 0, 6597.9893, -937.82446, 473.77335, 0.209439516067504882, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+1, 7108, 1, 0, 0, 1, 1, 0, 0, 6597.9893, -937.82446, 473.77335, 0.209439516067504882, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+2, 7107, 1, 0, 0, 1, 1, 0, 0, 6581.721, -1013.5572, 463.79858, 1.172463178634643554, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+3, 7108, 1, 0, 0, 1, 1, 0, 0, 6581.721, -1013.5572, 463.79858, 1.172463178634643554, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+4, 7107, 1, 0, 0, 1, 1, 0, 0, 6595.478, -964.7803, 472.8459, 3.744056224822998046, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+5, 7108, 1, 0, 0, 1, 1, 0, 0, 6595.478, -964.7803, 472.8459, 3.744056224822998046, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+6, 7107, 1, 0, 0, 1, 1, 0, 0, 6606.426, -912.1112, 473.53186, 2.259292364120483398, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+7, 7108, 1, 0, 0, 1, 1, 0, 0, 6606.426, -912.1112, 473.53186, 2.259292364120483398, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+8, 7107, 1, 0, 0, 1, 1, 0, 0, 6500.4424, -850.4374, 472.95465, 4.504848957061767578, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+9, 7108, 1, 0, 0, 1, 1, 0, 0, 6500.4424, -850.4374, 472.95465, 4.504848957061767578, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+10, 7107, 1, 0, 0, 1, 1, 0, 0, 6489.674, -784.32434, 473.6464, 0.226892799139022827, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+11, 7108, 1, 0, 0, 1, 1, 0, 0, 6489.674, -784.32434, 473.6464, 0.226892799139022827, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+12, 7107, 1, 0, 0, 1, 1, 0, 0, 6553.232, -841.71313, 473.59003, 0.154711350798606872, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+13, 7108, 1, 0, 0, 1, 1, 0, 0, 6553.232, -841.71313, 473.59003, 0.154711350798606872, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+14, 7107, 1, 0, 0, 1, 1, 0, 0, 6535.845, -834.43854, 474.60547, 4.304278373718261718, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+15, 7108, 1, 0, 0, 1, 1, 0, 0, 6535.845, -834.43854, 474.60547, 4.304278373718261718, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+16, 7107, 1, 0, 0, 1, 1, 0, 0, 6569.074, -806.16907, 475.7942, 0.657858967781066894, 300, 5, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+17, 7108, 1, 0, 0, 1, 1, 0, 0, 6569.074, -806.16907, 475.7942, 0.657858967781066894, 300, 5, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+18, 7107, 1, 0, 0, 1, 1, 0, 0, 6479.3735, -793.56195, 473.90875, 4.374718189239501953, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+19, 7108, 1, 0, 0, 1, 1, 0, 0, 6479.3735, -793.56195, 473.90875, 4.374718189239501953, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+20, 7107, 1, 0, 0, 1, 1, 0, 0, 6581.0884, -804.00696, 474.8405, 3.724053382873535156, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+21, 7108, 1, 0, 0, 1, 1, 0, 0, 6581.0884, -804.00696, 474.8405, 3.724053382873535156, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+22, 7107, 1, 0, 0, 1, 1, 0, 0, 6483.8745, -817.1497, 473.94272, 1.133222579956054687, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+23, 7108, 1, 0, 0, 1, 1, 0, 0, 6483.8745, -817.1497, 473.94272, 1.133222579956054687, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+24, 7107, 1, 0, 0, 1, 1, 0, 0, 6516.1167, -814.5349, 474.74985, 2.449142217636108398, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+25, 7108, 1, 0, 0, 1, 1, 0, 0, 6516.1167, -814.5349, 474.74985, 2.449142217636108398, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+26, 7107, 1, 0, 0, 1, 1, 0, 0, 6448.5664, -800.8992, 474.3046, 5.257455348968505859, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+27, 7108, 1, 0, 0, 1, 1, 0, 0, 6448.5664, -800.8992, 474.3046, 5.257455348968505859, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+28, 7107, 1, 0, 0, 1, 1, 0, 0, 6432.1587, -759.84686, 473.15967, 3.224145412445068359, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+29, 7108, 1, 0, 0, 1, 1, 0, 0, 6432.1587, -759.84686, 473.15967, 3.224145412445068359, 300, 0, 0, 1, 0, 2, 0, 0, 0, '', 0), +(@CGUID+30, 7107, 1, 0, 0, 1, 1, 0, 0, 6414.7876, -782.52045, 471.68338, 4.049969673156738281, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+31, 7108, 1, 0, 0, 1, 1, 0, 0, 6414.7876, -782.52045, 471.68338, 4.049969673156738281, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+32, 7107, 1, 0, 0, 1, 1, 0, 0, 6417.261, -818.1496, 470.33954, 3.518303632736206054, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+33, 7108, 1, 0, 0, 1, 1, 0, 0, 6417.261, -818.1496, 470.33954, 3.518303632736206054, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+34, 7107, 1, 0, 0, 1, 1, 0, 0, 6383.858, -749.6224, 469.33542, 4.047421932220458984, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+35, 7108, 1, 0, 0, 1, 1, 0, 0, 6383.858, -749.6224, 469.33542, 4.047421932220458984, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+36, 7107, 1, 0, 0, 1, 1, 0, 0, 6400.7476, -712.16486, 474.86307, 1.413716673851013183, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+37, 7108, 1, 0, 0, 1, 1, 0, 0, 6400.7476, -712.16486, 474.86307, 1.413716673851013183, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+38, 7107, 1, 0, 0, 1, 1, 0, 0, 6373.806, -699.54706, 476.85983, 2.024573326110839843, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+39, 7108, 1, 0, 0, 1, 1, 0, 0, 6373.806, -699.54706, 476.85983, 2.024573326110839843, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+40, 7107, 1, 0, 0, 1, 1, 0, 0, 6377.0596, -797.05804, 457.78555, 3.528153657913208007, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+41, 7108, 1, 0, 0, 1, 1, 0, 0, 6377.0596, -797.05804, 457.78555, 3.528153657913208007, 300, 15, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+42, 7107, 1, 0, 0, 1, 1, 0, 0, 6410.2524, -725.2984, 473.8544, 4.321902275085449218, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+43, 7108, 1, 0, 0, 1, 1, 0, 0, 6410.2524, -725.2984, 473.8544, 4.321902275085449218, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+44, 7107, 1, 0, 0, 1, 1, 0, 0, 6350.9453, -734.53973, 471.33276, 5.67474365234375, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+45, 7108, 1, 0, 0, 1, 1, 0, 0, 6350.9453, -734.53973, 471.33276, 5.67474365234375, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+46, 7107, 1, 0, 0, 1, 1, 0, 0, 6351.046, -717.2646, 472.2365, 5.79449319839477539, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+47, 7108, 1, 0, 0, 1, 1, 0, 0, 6351.046, -717.2646, 472.2365, 5.79449319839477539, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+48, 7107, 1, 0, 0, 1, 1, 0, 0, 6287.962, -598.7009, 466.59583, 2.396016359329223632, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+49, 7108, 1, 0, 0, 1, 1, 0, 0, 6287.962, -598.7009, 466.59583, 2.396016359329223632, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+50, 7107, 1, 0, 0, 1, 1, 0, 0, 6279.444, -614.3792, 472.5725, 2.256314516067504882, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+51, 7108, 1, 0, 0, 1, 1, 0, 0, 6279.444, -614.3792, 472.5725, 2.256314516067504882, 300, 1, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+52, 7111, 1, 0, 0, 1, 1, 0, 0, 6580.9106, -846.0111, 474.0431, 2.908204555511474609, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+53, 7111, 1, 0, 0, 1, 1, 0, 0, 6546.847, -842.53314, 473.8505, 3.269372463226318359, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+54, 7111, 1, 0, 0, 1, 1, 0, 0, 6479.9087, -786.9245, 474.54443, 3.862565040588378906, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+55, 7111, 1, 0, 0, 1, 1, 0, 0, 6577.2773, -798.1775, 475.03653, 1.438873529434204101, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+56, 7111, 1, 0, 0, 1, 1, 0, 0, 6589.328, -856.6679, 474.59833, 3.874630928039550781, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+57, 7111, 1, 0, 0, 1, 1, 0, 0, 6558.4224, -823.91797, 475.64575, 5.380662918090820312, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+58, 7111, 1, 0, 0, 1, 1, 0, 0, 6409.626, -718.0106, 475.00592, 3.664785385131835937, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+59, 7111, 1, 0, 0, 1, 1, 0, 0, 6342.289, -727.19995, 470.21567, 6.003914833068847656, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+60, 7111, 1, 0, 0, 1, 1, 0, 0, 6302.0747, -757.5039, 468.49915, 5.619960308074951171, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+61, 7111, 1, 0, 0, 1, 1, 0, 0, 6327.2744, -623.5396, 476.49002, 1.379523515701293945, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+62, 7111, 1, 0, 0, 1, 1, 0, 0, 6297.897, -617.827, 471.6025, 2.321287870407104492, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+63, 7111, 1, 0, 0, 1, 1, 0, 0, 6290.3145, -635.4162, 483.368, 5.811946392059326171, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+64, 7111, 1, 0, 0, 1, 1, 0, 0, 6281.056, -651.52264, 489.869, 4.186584949493408203, 300, 2, 0, 1, 0, 1, 0, 0, 0, '', 0), +(@CGUID+65, 10648, 1, 0, 0, 1, 1, 0, 0, 6279.093, -603.6922, 467.83997, 1.442377448081970214, 300, 0, 0, 1, 0, 0, 0, 0, 0, '', 0); + +DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOLID AND @POOLID+25; +INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES +(@POOLID,1,'Jadefire Run, Felwood, Group 1'), +(@POOLID+1,1,'Jadefire Run, Felwood, Group 2'), +(@POOLID+2,1,'Jadefire Run, Felwood, Group 3'), +(@POOLID+3,1,'Jadefire Run, Felwood, Group 4'), +(@POOLID+4,1,'Jadefire Run, Felwood, Group 5'), +(@POOLID+5,1,'Jadefire Run, Felwood, Group 6'), +(@POOLID+6,1,'Jadefire Run, Felwood, Group 7'), +(@POOLID+7,1,'Jadefire Run, Felwood, Group 8'), +(@POOLID+8,1,'Jadefire Run, Felwood, Group 9'), +(@POOLID+9,1,'Jadefire Run, Felwood, Group 10'), +(@POOLID+10,1,'Jadefire Run, Felwood, Group 11'), +(@POOLID+11,1,'Jadefire Run, Felwood, Group 12'), +(@POOLID+12,1,'Jadefire Run, Felwood, Group 13'), +(@POOLID+13,1,'Jadefire Run, Felwood, Group 14'), +(@POOLID+14,1,'Jadefire Run, Felwood, Group 15'), +(@POOLID+15,1,'Jadefire Run, Felwood, Group 16'), +(@POOLID+16,1,'Jadefire Run, Felwood, Group 17'), +(@POOLID+17,1,'Jadefire Run, Felwood, Group 18'), +(@POOLID+18,1,'Jadefire Run, Felwood, Group 19'), +(@POOLID+19,1,'Jadefire Run, Felwood, Group 20'), +(@POOLID+20,1,'Jadefire Run, Felwood, Group 21'), +(@POOLID+21,1,'Jadefire Run, Felwood, Group 22'), +(@POOLID+22,1,'Jadefire Run, Felwood, Group 23'), +(@POOLID+23,1,'Jadefire Run, Felwood, Group 24'), +(@POOLID+24,1,'Jadefire Run, Felwood, Group 25'), +(@POOLID+25,1,'Jadefire Run, Felwood, Group 26'); + +DELETE FROM `pool_members` WHERE `poolSpawnId` BETWEEN @POOLID AND @POOLID+25; +INSERT INTO `pool_members` (`type`,`spawnId`,`poolSpawnId`,`chance`,`description`) VALUES +(0,@CGUID,@POOLID,0,'Jadefire Trickster (7107)'), +(0,@CGUID+1,@POOLID,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+2,@POOLID+1,0,'Jadefire Trickster (7107)'), +(0,@CGUID+3,@POOLID+1,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+4,@POOLID+2,0,'Jadefire Trickster (7107)'), +(0,@CGUID+5,@POOLID+2,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+6,@POOLID+3,0,'Jadefire Trickster (7107)'), +(0,@CGUID+7,@POOLID+3,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+8,@POOLID+4,0,'Jadefire Trickster (7107)'), +(0,@CGUID+9,@POOLID+4,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+10,@POOLID+5,0,'Jadefire Trickster (7107)'), +(0,@CGUID+11,@POOLID+5,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+12,@POOLID+6,0,'Jadefire Trickster (7107)'), +(0,@CGUID+13,@POOLID+6,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+14,@POOLID+7,0,'Jadefire Trickster (7107)'), +(0,@CGUID+15,@POOLID+7,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+16,@POOLID+8,0,'Jadefire Trickster (7107)'), +(0,@CGUID+17,@POOLID+8,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+18,@POOLID+9,0,'Jadefire Trickster (7107)'), +(0,@CGUID+19,@POOLID+9,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+20,@POOLID+10,0,'Jadefire Trickster (7107)'), +(0,@CGUID+21,@POOLID+10,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+22,@POOLID+11,0,'Jadefire Trickster (7107)'), +(0,@CGUID+23,@POOLID+11,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+24,@POOLID+12,0,'Jadefire Trickster (7107)'), +(0,@CGUID+25,@POOLID+12,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+26,@POOLID+13,0,'Jadefire Trickster (7107)'), +(0,@CGUID+27,@POOLID+13,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+28,@POOLID+14,0,'Jadefire Trickster (7107)'), +(0,@CGUID+29,@POOLID+14,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+30,@POOLID+15,0,'Jadefire Trickster (7107)'), +(0,@CGUID+31,@POOLID+15,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+32,@POOLID+16,0,'Jadefire Trickster (7107)'), +(0,@CGUID+33,@POOLID+16,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+34,@POOLID+17,0,'Jadefire Trickster (7107)'), +(0,@CGUID+35,@POOLID+17,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+36,@POOLID+18,0,'Jadefire Trickster (7107)'), +(0,@CGUID+37,@POOLID+18,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+38,@POOLID+19,0,'Jadefire Trickster (7107)'), +(0,@CGUID+39,@POOLID+19,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+40,@POOLID+20,0,'Jadefire Trickster (7107)'), +(0,@CGUID+41,@POOLID+20,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+42,@POOLID+21,0,'Jadefire Trickster (7107)'), +(0,@CGUID+43,@POOLID+21,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+44,@POOLID+22,0,'Jadefire Trickster (7107)'), +(0,@CGUID+45,@POOLID+22,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+46,@POOLID+23,0,'Jadefire Trickster (7107)'), +(0,@CGUID+47,@POOLID+23,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+48,@POOLID+24,0,'Jadefire Trickster (7107)'), +(0,@CGUID+49,@POOLID+24,0,'Jadefire Betrayer (7108)'), +(0,@CGUID+50,@POOLID+25,0,'Jadefire Trickster (7107)'), +(0,@CGUID+51,@POOLID+25,0,'Jadefire Betrayer (7108)'); + +-- Pathing for Jadefire Trickster Entry: 7107, Jadefire Betrayer Entry: 7108 +SET @NPC := @CGUID+28; +SET @PATH := @NPC * 10; +DELETE FROM `creature_addon` WHERE `guid` IN (@NPC,@NPC+1); +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`StandState`,`SheathState`,`emote`,`visibilityDistanceType`,`auras`) VALUES +(@NPC,@PATH,0,0,1,0,0, ''),(@NPC+1,@PATH,0,0,1,0,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,6431.575,-759.89514,473.14578,NULL,0,0,0,100,0), +(@PATH,2,6415.6743,-757.93774,473.14578,NULL,0,0,0,100,0), +(@PATH,3,6399.2617,-760.9202,470.7167,NULL,0,0,0,100,0), +(@PATH,4,6406.117,-791.04846,468.84244,NULL,0,0,0,100,0), +(@PATH,5,6424.424,-803.3945,471.96426,NULL,0,0,0,100,0), +(@PATH,6,6436.6743,-790.0301,473.39835,NULL,0,0,0,100,0), +(@PATH,7,6466.341,-799.6447,474.1249,NULL,0,0,0,100,0), +(@PATH,8,6478.2183,-818.8252,474.33282,NULL,0,0,0,100,0), +(@PATH,9,6496.9536,-828.95374,473.3863,NULL,0,0,0,100,0), +(@PATH,10,6520.4375,-828.62994,473.9445,NULL,0,0,0,100,0), +(@PATH,11,6543.6343,-830.434,474.0695,NULL,0,0,0,100,0), +(@PATH,12,6552.5806,-842.2002,473.697,NULL,0,0,0,100,0), +(@PATH,13,6571.129,-847.305,473.45517,NULL,0,0,0,100,0), +(@PATH,14,6583.8125,-830.9744,474.79904,NULL,0,0,0,100,0), +(@PATH,15,6573.4272,-806.39954,475.57468,NULL,0,0,0,100,0), +(@PATH,16,6558.5117,-795.7527,475.39703,NULL,0,0,0,100,0), +(@PATH,17,6529.44,-795.3073,473.6696,NULL,0,0,0,100,0), +(@PATH,18,6513.4146,-788.9368,474.66885,NULL,0,0,0,100,0), +(@PATH,19,6490.856,-802.297,474.06464,NULL,0,0,0,100,0), +(@PATH,20,6469.944,-795.0282,474.02267,NULL,0,0,0,100,0), +(@PATH,21,6451.1313,-779.17725,474.14835,NULL,0,0,0,100,0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_26_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_26_00_world.sql new file mode 100644 index 00000000000..31d5d1c2af7 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_26_00_world.sql @@ -0,0 +1,7 @@ +-- Stormwind Guard movement update +SET @GUID=79875; +SET @PATH=@GUID * 10; + +UPDATE `creature` SET `MovementType`=0 WHERE `guid`=@GUID; +UPDATE `creature_addon` SET `path_id`=0 WHERE `guid`=@GUID AND `path_id`=@PATH; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_29_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_29_00_world.sql new file mode 100644 index 00000000000..e9368bc3154 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_29_00_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gossip_menu_option` SET `OptionBroadcastTextID` = 2924 WHERE `OptionBroadcastTextID` = 50546 AND `OptionID` = 1; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_29_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_29_01_world.sql new file mode 100644 index 00000000000..38a5a630f4a --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_10_29_01_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gossip_menu_option` SET `OptionBroadcastTextID` = 2924 WHERE `OptionBroadcastTextID` = 50546; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_01_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_01_00_world.sql new file mode 100644 index 00000000000..f1939e470ef --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_01_00_world.sql @@ -0,0 +1,2 @@ +-- Cast Summon Khadgar's Servant even on mounted player +UPDATE `smart_scripts` SET `action_param2`=2 WHERE `entryorguid`=1816600 AND `source_type`=9 AND `id`=1; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_01_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_01_01_world.sql new file mode 100644 index 00000000000..2cef1e008a1 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_01_01_world.sql @@ -0,0 +1,1687 @@ +UPDATE `quest_template_locale` SET `ObjectiveText1`='Niños rescatados' WHERE `locale`='esES' AND `ID`=10852; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Draco Ala Abisal esclavizado liberado' WHERE `locale`='esES' AND `ID`=10854; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Atracador vil inactivo destruido' WHERE `locale`='esES' AND `ID`=10855; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Teletransportador oeste destruido' WHERE `locale`='esES' AND `ID`=10857; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Teletransportador central destruido' WHERE `locale`='esES' AND `ID`=10857; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Teletransportador este destruido' WHERE `locale`='esES' AND `ID`=10857; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbe de luz Razaani recogido' WHERE `locale`='esES' AND `ID`=10859; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prole redimida' WHERE `locale`='esES' AND `ID`=10861; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Almas Mano Destrozada obtenidas' WHERE `locale`='esES' AND `ID`=10864; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Karynaku liberado' WHERE `locale`='esES' AND `ID`=10866; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Karynaku liberado' WHERE `locale`='esES' AND `ID`=10872; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guerrero de Sha\'tar liberado' WHERE `locale`='esES' AND `ID`=10873; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuego zafiro extinguido' WHERE `locale`='esES' AND `ID`=10874; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Fuego esmeralda extinguido' WHERE `locale`='esES' AND `ID`=10874; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Fuego violeta extinguido' WHERE `locale`='esES' AND `ID`=10874; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Fuego de sangrita extinguido' WHERE `locale`='esES' AND `ID`=10874; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Torre norte marcada' WHERE `locale`='esES' AND `ID`=10895; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Torre sur marcada' WHERE `locale`='esES' AND `ID`=10895; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Torre de la Forja marcada' WHERE `locale`='esES' AND `ID`=10895; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Torre de la ladera marcada' WHERE `locale`='esES' AND `ID`=10895; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Portal de distorsión sur destruido' WHERE `locale`='esES' AND `ID`=10911; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Portal de distorsión norte destruido' WHERE `locale`='esES' AND `ID`=10911; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de vindicador Sha\'tar asesinado quemado' WHERE `locale`='esES' AND `ID`=10913; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cadáver de guerrero Auchenai asesinado quemado' WHERE `locale`='esES' AND `ID`=10913; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Contenido del ataúd de Auchenai destruido' WHERE `locale`='esES' AND `ID`=10915; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Coronel Jules salvado' WHERE `locale`='esES' AND `ID`=10935; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ayuda a Clintar a reunir las reliquias' WHERE `locale`='esES' AND `ID`=10965; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aprender sobre el Libro del Cuervo' WHERE `locale`='esES' AND `ID`=10980; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevo de kaliri monstruoso destruido' WHERE `locale`='esES' AND `ID`=11008; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Montones de balas de cañón vil destruidos' WHERE `locale`='esES' AND `ID`=11010; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campamento de peones Faucedraco envenenado' WHERE `locale`='esES' AND `ID`=11020; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Montones de balas de cañón vil destruidos' WHERE `locale`='esES' AND `ID`=11023; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Demonios desterrados' WHERE `locale`='esES' AND `ID`=11026; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Demonios desterrados' WHERE `locale`='esES' AND `ID`=11051; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Peones Faucedraco disciplinados' WHERE `locale`='esES' AND `ID`=11055; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rayas de éter conseguidas' WHERE `locale`='esES' AND `ID`=11065; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rayas de éter conseguidas' WHERE `locale`='esES' AND `ID`=11066; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Comida de raya abisal' WHERE `locale`='esES' AND `ID`=11093; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ogro Gordunni' WHERE `locale`='esES' AND `ID`=11096; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Montones de balas de cañón vil destruidos' WHERE `locale`='esES' AND `ID`=11102; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barriles entregados' WHERE `locale`='esES' AND `ID`=11122; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Agitador desertor desenmascarado' WHERE `locale`='esES' AND `ID`=11126; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Panfletos distribuídos' WHERE `locale`='esES' AND `ID`=11133; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gavis Rodelagris capturado' WHERE `locale`='esES' AND `ID`=11134; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisioneros de Theramore liberados' WHERE `locale`='esES' AND `ID`=11145; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Raptores capturados' WHERE `locale`='esES' AND `ID`=11146; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Raptores liberados' WHERE `locale`='esES' AND `ID`=11147; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tienda del norte quemada' WHERE `locale`='esES' AND `ID`=11150; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Tienda del noreste quemada' WHERE `locale`='esES' AND `ID`=11150; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Tienda del este quemada' WHERE `locale`='esES' AND `ID`=11150; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Corona colocada en el monumento de los Hyal' WHERE `locale`='esES' AND `ID`=11152; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cañones del bloqueo destruidos' WHERE `locale`='esES' AND `ID`=11153; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tótem Siniestro de Cuernoatroz eliminados' WHERE `locale`='esES' AND `ID`=11156; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritus Quebrantarrocas que descansan en paz' WHERE `locale`='esES' AND `ID`=11159; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Clan Quebrantarrocas vengado' WHERE `locale`='esES' AND `ID`=11162; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Examinar la cámara de Halazzi' WHERE `locale`='esES' AND `ID`=11166; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Examinar la plataforma de Jan\'alai' WHERE `locale`='esES' AND `ID`=11166; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Examinar la plataforma de Akil\'zon' WHERE `locale`='esES' AND `ID`=11166; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pruebas de tótems llevadas a cabo' WHERE `locale`='esES' AND `ID`=11169; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mocos disueltos' WHERE `locale`='esES' AND `ID`=11174; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información conseguida' WHERE `locale`='esES' AND `ID`=11180; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Colina de las brujas limpia' WHERE `locale`='esES' AND `ID`=11183; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tienda norte quemada' WHERE `locale`='esES' AND `ID`=11205; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Tienda noreste quemada' WHERE `locale`='esES' AND `ID`=11205; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Tienda este quemada' WHERE `locale`='esES' AND `ID`=11205; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pasta de pescado probada' WHERE `locale`='esES' AND `ID`=11209; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grita fuera del banco' WHERE `locale`='esES' AND `ID`=11293; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Grita en la Sala Militar' WHERE `locale`='esES' AND `ID`=11293; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grita en la Sala de Exploradores' WHERE `locale`='esES' AND `ID`=11293; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Grita en la Sala Mística' WHERE `locale`='esES' AND `ID`=11293; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grita fuera del banco' WHERE `locale`='esES' AND `ID`=11294; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Grita en la Sala Militar' WHERE `locale`='esES' AND `ID`=11294; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grita en la Sala de Exploradores' WHERE `locale`='esES' AND `ID`=11294; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Grita en la Sala Mística' WHERE `locale`='esES' AND `ID`=11294; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mantén el trote durante 8 segundos' WHERE `locale`='esES' AND `ID`=11318; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Mantén el medio galope durante 8 segundos' WHERE `locale`='esES' AND `ID`=11318; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Mantén el galope durante 8 segundos' WHERE `locale`='esES' AND `ID`=11318; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esES' AND `ID`=11360; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esES' AND `ID`=11361; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grita fuera de la casa de subastas' WHERE `locale`='esES' AND `ID`=11407; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Grita en el Valle del Honor' WHERE `locale`='esES' AND `ID`=11407; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grita en el Valle de la Sabiduría' WHERE `locale`='esES' AND `ID`=11407; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Grita en el Valle de los Espíritus' WHERE `locale`='esES' AND `ID`=11407; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grita fuera de la casa de subastas' WHERE `locale`='esES' AND `ID`=11408; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Grita en el Valle del Honor' WHERE `locale`='esES' AND `ID`=11408; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grita en el Valle de la Sabiduría' WHERE `locale`='esES' AND `ID`=11408; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Grita en el Valle de los Espíritus' WHERE `locale`='esES' AND `ID`=11408; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mantén el trote durante 8 segundos' WHERE `locale`='esES' AND `ID`=11409; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Mantén el medio galope durante 8 segundos' WHERE `locale`='esES' AND `ID`=11409; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Mantén el galope durante 8 segundos' WHERE `locale`='esES' AND `ID`=11409; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barriles entregados' WHERE `locale`='esES' AND `ID`=11412; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Casa comunal Desuelladragones destruida' WHERE `locale`='esES' AND `ID`=11421; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Caseta del muelle Desuelladragones destruida' WHERE `locale`='esES' AND `ID`=11421; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Almacén Desuelladragones destruido' WHERE `locale`='esES' AND `ID`=11421; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esES' AND `ID`=11439; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esES' AND `ID`=11440; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esES' AND `ID`=11449; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esES' AND `ID`=11450; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbe de visión activado' WHERE `locale`='esES' AND `ID`=11490; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Avizor transformado desplegado' WHERE `locale`='esES' AND `ID`=11524; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Avizor transformado desplegado' WHERE `locale`='esES' AND `ID`=11525; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Emisario del Odio empalado' WHERE `locale`='esES' AND `ID`=11537; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Emisario del Odio empalado' WHERE `locale`='esES' AND `ID`=11538; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavo Branquia Verde liberado' WHERE `locale`='esES' AND `ID`=11541; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Velas Sin\'loren quemadas' WHERE `locale`='esES' AND `ID`=11542; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Velas Juramento de Sangre quemadas' WHERE `locale`='esES' AND `ID`=11542; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Velas Cazador del Albor quemadas' WHERE `locale`='esES' AND `ID`=11542; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Velas Sin\'loren quemadas' WHERE `locale`='esES' AND `ID`=11543; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Velas Juramento de Sangre quemadas' WHERE `locale`='esES' AND `ID`=11543; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Velas Cazador del Albor quemadas' WHERE `locale`='esES' AND `ID`=11543; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura de portal tomada' WHERE `locale`='esES' AND `ID`=11547; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lectura del sagrario tomada' WHERE `locale`='esES' AND `ID`=11547; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Lectura del cristal de sangre tomada' WHERE `locale`='esES' AND `ID`=11547; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Renacuajo Aleta Invernal rescatado' WHERE `locale`='esES' AND `ID`=11560; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Múrlocs Aleta Invernal muertos' WHERE `locale`='esES' AND `ID`=11561; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura de la Anomalía del Acantilado Agrietado conseguida' WHERE `locale`='esES' AND `ID`=11576; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura de la Sima Quebrada conseguida' WHERE `locale`='esES' AND `ID`=11582; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisioneros Arcanos rescatados' WHERE `locale`='esES' AND `ID`=11587; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hechicero de Berilo capturado' WHERE `locale`='esES' AND `ID`=11590; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guardias y trabajadores de caravana muertos quemados' WHERE `locale`='esES' AND `ID`=11593; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritus taunka en paz' WHERE `locale`='esES' AND `ID`=11594; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nerub\'ar muertos' WHERE `locale`='esES' AND `ID`=11598; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sacos de huevos Nerub\'ar destruidos' WHERE `locale`='esES' AND `ID`=11602; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ancestro Kesuk identificado' WHERE `locale`='esES' AND `ID`=11605; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ancestro Sagani identificado' WHERE `locale`='esES' AND `ID`=11605; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Ancestro Takret identificado' WHERE `locale`='esES' AND `ID`=11605; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Artesanos de Kashala liberados' WHERE `locale`='esES' AND `ID`=11607; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Chamanes de Kashala liberados' WHERE `locale`='esES' AND `ID`=11607; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sumidero sur de Nerub\'ar destruido' WHERE `locale`='esES' AND `ID`=11608; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Sumidero este de Nerub\'ar destruido' WHERE `locale`='esES' AND `ID`=11608; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Sumidero oeste de Nerub\'ar destruido' WHERE `locale`='esES' AND `ID`=11608; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sumidero norte de Nerub\'ar destruido' WHERE `locale`='esES' AND `ID`=11608; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ceremonia del ancestro Kesuk completada' WHERE `locale`='esES' AND `ID`=11610; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ceremonia del ancestro Sagani completada' WHERE `locale`='esES' AND `ID`=11610; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Ceremonia del ancestro Takret completada' WHERE `locale`='esES' AND `ID`=11610; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Peón Grito de Guerra liberado' WHERE `locale`='esES' AND `ID`=11611; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Plataforma este destruida' WHERE `locale`='esES' AND `ID`=11617; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Plataforma norte destruida' WHERE `locale`='esES' AND `ID`=11617; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Plataforma oeste destruida' WHERE `locale`='esES' AND `ID`=11617; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cocer se ha rendido' WHERE `locale`='esES' AND `ID`=11627; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Xurn se ha rendido' WHERE `locale`='esES' AND `ID`=11627; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Destino del clarividente Caminante Siniestro vaticinado' WHERE `locale`='esES' AND `ID`=11631; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aguja de Putrefacción inspeccionada' WHERE `locale`='esES' AND `ID`=11633; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aguja de Sangre inspeccionada' WHERE `locale`='esES' AND `ID`=11633; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Aguja de Dolor inspeccionada' WHERE `locale`='esES' AND `ID`=11633; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Clarividente Caminante Siniestro liberado' WHERE `locale`='esES' AND `ID`=11637; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera este neutralizada' WHERE `locale`='esES' AND `ID`=11647; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Caldera central neutralizada' WHERE `locale`='esES' AND `ID`=11647; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Caldera oeste neutralizada' WHERE `locale`='esES' AND `ID`=11647; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisionero interrogado' WHERE `locale`='esES' AND `ID`=11648; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Unidad de la Plaga destruida' WHERE `locale`='esES' AND `ID`=11652; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Soldado Grito de Guerra herido rescatado' WHERE `locale`='esES' AND `ID`=11652; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rayo de Ingeniosa puesto a prueba' WHERE `locale`='esES' AND `ID`=11653; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Las Fauces de la Sierpe destruido' WHERE `locale`='esES' AND `ID`=11656; +UPDATE `quest_template_locale` SET `ObjectiveText2`='El Kur Drakkar destruido' WHERE `locale`='esES' AND `ID`=11656; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Martillo de Bor destruido' WHERE `locale`='esES' AND `ID`=11656; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Yunque de Bor destruido' WHERE `locale`='esES' AND `ID`=11656; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Globos de sangre destruidos' WHERE `locale`='esES' AND `ID`=11659; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Estandarte Grito de Guerra clavado sobre Magmothregar' WHERE `locale`='esES' AND `ID`=11670; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisionero de la Plaga liberado' WHERE `locale`='esES' AND `ID`=11676; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esES' AND `ID`=11677; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga de Talramas muerto' WHERE `locale`='esES' AND `ID`=11683; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Marcar situación del sumidero sur' WHERE `locale`='esES' AND `ID`=11684; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Marcar situación del sumidero noreste' WHERE `locale`='esES' AND `ID`=11684; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Marcar situación del sumidero noroeste' WHERE `locale`='esES' AND `ID`=11684; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Observar Granero Grito de Guerra' WHERE `locale`='esES' AND `ID`=11686; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Observar Granja de Torp' WHERE `locale`='esES' AND `ID`=11686; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Observar Matadero Grito de Guerra' WHERE `locale`='esES' AND `ID`=11686; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kodos rescatados' WHERE `locale`='esES' AND `ID`=11690; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esES' AND `ID`=11694; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga de Talramas muerto' WHERE `locale`='esES' AND `ID`=11698; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Túneles nerubianos derrumbados' WHERE `locale`='esES' AND `ID`=11706; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gnomo de Palanqueta maldito y rescatado' WHERE `locale`='esES' AND `ID`=11712; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Marcar situación del sumidero sur' WHERE `locale`='esES' AND `ID`=11713; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Marcar situación del sumidero noreste' WHERE `locale`='esES' AND `ID`=11713; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Marcar situación del sumidero noroeste' WHERE `locale`='esES' AND `ID`=11713; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barriles de aceite recogidos' WHERE `locale`='esES' AND `ID`=11715; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza el Vibro-Motor 5000' WHERE `locale`='esES' AND `ID`=11723; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Robots reprogramados' WHERE `locale`='esES' AND `ID`=11730; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Blandones golpeados' WHERE `locale`='esES' AND `ID`=11731; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cultor en muelles derrotado' WHERE `locale`='esES' AND `ID`=11794; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cultor en la cárcel derrotado' WHERE `locale`='esES' AND `ID`=11794; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Cultor en la cocina derrotado' WHERE `locale`='esES' AND `ID`=11794; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hunde los restos del este' WHERE `locale`='esES' AND `ID`=11796; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Hunde los restos del sur' WHERE `locale`='esES' AND `ID`=11796; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Hunde los restos del noroeste' WHERE `locale`='esES' AND `ID`=11796; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Busca el manual del maestro de palancas' WHERE `locale`='esES' AND `ID`=11798; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trampero de Nesingwary atrapado' WHERE `locale`='esES' AND `ID`=11865; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cría de mamut liberada' WHERE `locale`='esES' AND `ID`=11876; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lecturas multifase obtenidas' WHERE `locale`='esES' AND `ID`=11880; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trae a Jenny a salvo sin perder el cargamento' WHERE `locale`='esES' AND `ID`=11881; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Energía reunida' WHERE `locale`='esES' AND `ID`=11893; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tormenta dominada' WHERE `locale`='esES' AND `ID`=11895; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Robots debilitados y destruidos' WHERE `locale`='esES' AND `ID`=11896; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Explosivos colocados en el sumidero sur' WHERE `locale`='esES' AND `ID`=11897; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Explosivos colocados en el sumidero norte' WHERE `locale`='esES' AND `ID`=11897; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alma de gnomo capturada' WHERE `locale`='esES' AND `ID`=11899; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura geológica de El Nexo' WHERE `locale`='esES' AND `ID`=11900; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lectura del sur de Gelidar' WHERE `locale`='esES' AND `ID`=11900; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Lectura del norte de Gelidar' WHERE `locale`='esES' AND `ID`=11900; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Lectura del oeste de Gelidar' WHERE `locale`='esES' AND `ID`=11900; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagoneta de mena liberada' WHERE `locale`='esES' AND `ID`=11904; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Falla interdimensional ralentizada' WHERE `locale`='esES' AND `ID`=11905; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Busca el manual del maestro de palancas' WHERE `locale`='esES' AND `ID`=11909; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grano de Lindeallá quemado' WHERE `locale`='esES' AND `ID`=11913; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Draco de El Nexo capturado' WHERE `locale`='esES' AND `ID`=11919; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Blandones golpeados' WHERE `locale`='esES' AND `ID`=11921; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Blandones golpeados' WHERE `locale`='esES' AND `ID`=11922; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Blandones golpeados' WHERE `locale`='esES' AND `ID`=11926; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevos de draco destruidos' WHERE `locale`='esES' AND `ID`=11936; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Baja en En\'kilah' WHERE `locale`='esES' AND `ID`=11938; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Draco de El Nexo capturado' WHERE `locale`='esES' AND `ID`=11940; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Embadúrnate con la sangre de Loguhn' WHERE `locale`='esES' AND `ID`=11959; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Toca la campana de Lindeallá' WHERE `locale`='esES' AND `ID`=11965; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Malygos atraído' WHERE `locale`='esES' AND `ID`=11969; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Keristrasza en paz' WHERE `locale`='esES' AND `ID`=11973; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Taunka admitidos en la Horda' WHERE `locale`='esES' AND `ID`=11983; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Vuelo Azul en Jardines Reposo Lunar muertos' WHERE `locale`='esES' AND `ID`=12006; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Los últimos ritos' WHERE `locale`='esES' AND `ID`=12019; +UPDATE `quest_template_locale` SET `ObjectiveText1`='G.U.A.O. golpeada' WHERE `locale`='esES' AND `ID`=12022; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritus Indu\'le en paz' WHERE `locale`='esES' AND `ID`=12031; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Recolector de cosecha alterado' WHERE `locale`='esES' AND `ID`=12035; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Arpías Viento Helado' WHERE `locale`='esES' AND `ID`=12051; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Arpías Viento Helado' WHERE `locale`='esES' AND `ID`=12052; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Primera Profecía descifrada' WHERE `locale`='esES' AND `ID`=12058; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Segunda Profecía descifrada' WHERE `locale`='esES' AND `ID`=12058; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Tercera Profecía descifrada' WHERE `locale`='esES' AND `ID`=12058; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Objeto de la Aguja de Flujo observado' WHERE `locale`='esES' AND `ID`=12060; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Objeto de la Aguja de Flujo observado' WHERE `locale`='esES' AND `ID`=12061; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley conseguida' WHERE `locale`='esES' AND `ID`=12065; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley conseguida' WHERE `locale`='esES' AND `ID`=12066; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Defensores enanos férreos muertos' WHERE `locale`='esES' AND `ID`=12073; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley obtenida' WHERE `locale`='esES' AND `ID`=12083; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley obtenida' WHERE `locale`='esES' AND `ID`=12084; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuerza devuelta a ancestro Lothalor' WHERE `locale`='esES' AND `ID`=12092; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuerza devuelta a ancestro Lothalor' WHERE `locale`='esES' AND `ID`=12096; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley obtenida' WHERE `locale`='esES' AND `ID`=12107; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Observación en Santuario de Dragones Azur' WHERE `locale`='esES' AND `ID`=12107; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley obtenida' WHERE `locale`='esES' AND `ID`=12110; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Observación en Santuario de Dragones Azur' WHERE `locale`='esES' AND `ID`=12110; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alce de avalancha inoculado' WHERE `locale`='esES' AND `ID`=12111; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Pardo ártico inoculado' WHERE `locale`='esES' AND `ID`=12111; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Roanauk Bruma de Hielo iniciado' WHERE `locale`='esES' AND `ID`=12140; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Snóbolds Llano Nevado' WHERE `locale`='esES' AND `ID`=12142; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Magnatauro del Cementerio de Dragones' WHERE `locale`='esES' AND `ID`=12142; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Discípulos Llano Nevado' WHERE `locale`='esES' AND `ID`=12144; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Magnatauros alfa' WHERE `locale`='esES' AND `ID`=12144; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nombre del magnatauro Señor de la Guerra' WHERE `locale`='esES' AND `ID`=12150; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sombra de Arugal derrotada' WHERE `locale`='esES' AND `ID`=12164; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de alce contagiado limpio' WHERE `locale`='esES' AND `ID`=12166; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cadáver de pardo rabioso limpio' WHERE `locale`='esES' AND `ID`=12166; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alianzas en Río Negro eliminados' WHERE `locale`='esES' AND `ID`=12170; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Armonización con las líneas Ley de Rasganorte' WHERE `locale`='esES' AND `ID`=12172; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Armonización con las líneas Ley de Rasganorte' WHERE `locale`='esES' AND `ID`=12173; +UPDATE `quest_template_locale` SET `ObjectiveText1`='G.U.A.O. golpeada' WHERE `locale`='esES' AND `ID`=12191; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nivel de carga' WHERE `locale`='esES' AND `ID`=12198; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Imágenes de enanos férreos tomadas' WHERE `locale`='esES' AND `ID`=12202; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mensaje de Loken recibido' WHERE `locale`='esES' AND `ID`=12203; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hugh Copa interrogado' WHERE `locale`='esES' AND `ID`=12204; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gavrock interrogado' WHERE `locale`='esES' AND `ID`=12204; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de El Embate Escarlata asesinados' WHERE `locale`='esES' AND `ID`=12205; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Frasco de añublo probado' WHERE `locale`='esES' AND `ID`=12206; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáveres de El Embate Escarlata limpiados' WHERE `locale`='esES' AND `ID`=12211; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbe utilizado bajo el Corazón de Vordrassil' WHERE `locale`='esES' AND `ID`=12213; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Orbe utilizado bajo la Extremidad de Vordrassil' WHERE `locale`='esES' AND `ID`=12213; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Orbe utilizado bajo las Lágrimas de Vordrassil' WHERE `locale`='esES' AND `ID`=12213; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Riendas de caballo de guerra de El Embate Escarlata entregadas' WHERE `locale`='esES' AND `ID`=12214; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Historia de Orsonn' WHERE `locale`='esES' AND `ID`=12231; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Historia de Kodian' WHERE `locale`='esES' AND `ID`=12231; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Balista de Nueva Vega del Amparo bombardeada' WHERE `locale`='esES' AND `ID`=12232; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ursoc purificado' WHERE `locale`='esES' AND `ID`=12236; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habitante indefenso rescatado' WHERE `locale`='esES' AND `ID`=12237; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Velas del Locura del Pecador en llamas' WHERE `locale`='esES' AND `ID`=12243; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Torturador LeCraft completamente interrogado' WHERE `locale`='esES' AND `ID`=12252; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habitante de Hibergarde atrapado rescatado' WHERE `locale`='esES' AND `ID`=12253; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Imagen de sacerdote cuervo del Embate robada' WHERE `locale`='esES' AND `ID`=12260; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Resguardo destructivo completamente cargado' WHERE `locale`='esES' AND `ID`=12261; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Runa nigromántica destruida' WHERE `locale`='esES' AND `ID`=12265; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Limpiar cámara de invocación' WHERE `locale`='esES' AND `ID`=12267; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trituradora entregada' WHERE `locale`='esES' AND `ID`=12270; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Acusación y muerte del comandante Jordan' WHERE `locale`='esES' AND `ID`=12273; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Acusación y muerte del cañonero mayor Zierhut' WHERE `locale`='esES' AND `ID`=12273; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Acusación y muerte del herrero Buenhombre' WHERE `locale`='esES' AND `ID`=12273; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Acusación y muerte del maestro de establos Mercer' WHERE `locale`='esES' AND `ID`=12273; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tocar campana de la abadía' WHERE `locale`='esES' AND `ID`=12274; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Hablar con el sumo abad' WHERE `locale`='esES' AND `ID`=12274; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Eje de Mina Hibergarde alta destruido' WHERE `locale`='esES' AND `ID`=12277; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Eje de Mina Hibergarde baja destruido' WHERE `locale`='esES' AND `ID`=12277; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Unidades de la Alianza eliminadas' WHERE `locale`='esES' AND `ID`=12284; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hostigadores heridos sanados' WHERE `locale`='esES' AND `ID`=12288; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preguntas a un campesino olvidado' WHERE `locale`='esES' AND `ID`=12291; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Preguntas a un fusilero olvidado' WHERE `locale`='esES' AND `ID`=12291; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Preguntas a un caballero olvidado' WHERE `locale`='esES' AND `ID`=12291; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Preguntas a un lacayo olvidado' WHERE `locale`='esES' AND `ID`=12291; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fantasmas olvidados asesinados' WHERE `locale`='esES' AND `ID`=12304; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alianza eliminada en Bahía Ventura' WHERE `locale`='esES' AND `ID`=12317; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rezagados de Ventura y Cía. ahuyentados' WHERE `locale`='esES' AND `ID`=12324; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón de peste saboteado' WHERE `locale`='esES' AND `ID`=12326; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Élite de la Séptima Legión bajado a salvo' WHERE `locale`='esES' AND `ID`=12326; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Desestabiliza el Santuario de Dragones Azur' WHERE `locale`='esES' AND `ID`=12372; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caballos mesteños de las Tierras Altas espantados' WHERE `locale`='esES' AND `ID`=12415; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vigilante rubí devuelto a la tierra' WHERE `locale`='esES' AND `ID`=12417; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Erradicar corrupción rubí' WHERE `locale`='esES' AND `ID`=12418; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Envío de madera de la Alianza destruido' WHERE `locale`='esES' AND `ID`=12432; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vigilante rubí devuelto a la tierra' WHERE `locale`='esES' AND `ID`=12449; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Erradicar corrupción rubí' WHERE `locale`='esES' AND `ID`=12450; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vista de águila imperial unida' WHERE `locale`='esES' AND `ID`=12453; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldado de la Séptima Legión herido salvado' WHERE `locale`='esES' AND `ID`=12457; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Miembro de la Plaga de Naxxramas matado' WHERE `locale`='esES' AND `ID`=12462; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de El Embate Escarlata muerto' WHERE `locale`='esES' AND `ID`=12476; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Secretos del pasado revelados' WHERE `locale`='esES' AND `ID`=12478; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Misión del capitán Brandon' WHERE `locale`='esES' AND `ID`=12501; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Misión del capitán Rupert' WHERE `locale`='esES' AND `ID`=12501; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Misión del capitán Grondel' WHERE `locale`='esES' AND `ID`=12501; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Misión del alquimista Finklestein' WHERE `locale`='esES' AND `ID`=12501; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Estandarte de la Cruzada Argenta sur' WHERE `locale`='esES' AND `ID`=12502; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Estandarte de la Cruzada Argenta norte' WHERE `locale`='esES' AND `ID`=12502; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Estandarte de la Cruzada Argenta este' WHERE `locale`='esES' AND `ID`=12502; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Plaga en El Confín Argenta destruida' WHERE `locale`='esES' AND `ID`=12503; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldados Argenta enviados a ver al sargento' WHERE `locale`='esES' AND `ID`=12504; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Seguidores de Sseratus muertos' WHERE `locale`='esES' AND `ID`=12508; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Valor de los reclutas recuperado' WHERE `locale`='esES' AND `ID`=12509; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado Jonathan salvado' WHERE `locale`='esES' AND `ID`=12512; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cruzado Lamoof salvado' WHERE `locale`='esES' AND `ID`=12512; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Cruzada Josephine salvada' WHERE `locale`='esES' AND `ID`=12512; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de Ventura y Cía. asesinados' WHERE `locale`='esES' AND `ID`=12524; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Górloc Susurraneblina' WHERE `locale`='esES' AND `ID`=12538; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Oráculo Hablalluvia herido encontrado' WHERE `locale`='esES' AND `ID`=12540; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Suero de la verdad creado' WHERE `locale`='esES' AND `ID`=12541; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ubicación de Farunn descubierta' WHERE `locale`='esES' AND `ID`=12544; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga en Jintha\'kalar matado' WHERE `locale`='esES' AND `ID`=12545; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esbirros de la Plaga destruidos' WHERE `locale`='esES' AND `ID`=12546; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huella de Shango identificada' WHERE `locale`='esES' AND `ID`=12550; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pulverizadores de peste atrapados con red y destruidos' WHERE `locale`='esES' AND `ID`=12555; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gusano de fango encontrado' WHERE `locale`='esES' AND `ID`=12557; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ala de murciélago mustia encontrada' WHERE `locale`='esES' AND `ID`=12557; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grano ámbar encontrado' WHERE `locale`='esES' AND `ID`=12557; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Moco de serpiente frío encontrado' WHERE `locale`='esES' AND `ID`=12557; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Interruptor de activación Gamma' WHERE `locale`='esES' AND `ID`=12559; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Misión del capitán Brandon' WHERE `locale`='esES' AND `ID`=12563; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Misión del capitán Rupert' WHERE `locale`='esES' AND `ID`=12563; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Misión del capitán Grondel' WHERE `locale`='esES' AND `ID`=12563; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Misión del alquimista Finklestein' WHERE `locale`='esES' AND `ID`=12563; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de lacayo Argenta incinerado' WHERE `locale`='esES' AND `ID`=12568; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Víctimas Caminamoho rescatadas' WHERE `locale`='esES' AND `ID`=12580; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Misión del capitán Brandon' WHERE `locale`='esES' AND `ID`=12587; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Misión del capitán Rupert' WHERE `locale`='esES' AND `ID`=12587; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Misión del capitán Grondel' WHERE `locale`='esES' AND `ID`=12587; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Misión del alquimista Finklestein' WHERE `locale`='esES' AND `ID`=12587; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Túmulos antiguos investigados' WHERE `locale`='esES' AND `ID`=12588; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alcanzada la manzana en la cabeza de Suertudo Wilhelm' WHERE `locale`='esES' AND `ID`=12589; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Túneles nerubianos hundidos' WHERE `locale`='esES' AND `ID`=12591; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Animales de caza muertos' WHERE `locale`='esES' AND `ID`=12592; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Arrasadores musgosos muertos' WHERE `locale`='esES' AND `ID`=12594; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Misión del capitán Brandon' WHERE `locale`='esES' AND `ID`=12596; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Misión del capitán Rupert' WHERE `locale`='esES' AND `ID`=12596; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Misión del capitán Grondel' WHERE `locale`='esES' AND `ID`=12596; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Misión del alquimista Finklestein' WHERE `locale`='esES' AND `ID`=12596; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Túneles nerubianos hundidos' WHERE `locale`='esES' AND `ID`=12598; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Suero de la verdad creado' WHERE `locale`='esES' AND `ID`=12601; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Suero de la verdad creado' WHERE `locale`='esES' AND `ID`=12602; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lacayos cautivos liberados' WHERE `locale`='esES' AND `ID`=12606; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mamut Partecolmillos entregado' WHERE `locale`='esES' AND `ID`=12607; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Interruptor de activación Theta activado' WHERE `locale`='esES' AND `ID`=12613; +UPDATE `quest_template_locale` SET `ObjectiveText1`='La cólera de la guardiana de vida' WHERE `locale`='esES' AND `ID`=12620; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El pacto de Freya' WHERE `locale`='esES' AND `ID`=12621; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera azul estropeada' WHERE `locale`='esES' AND `ID`=12627; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Caldera verde estropeada' WHERE `locale`='esES' AND `ID`=12627; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Caldera púrpura estropeada' WHERE `locale`='esES' AND `ID`=12627; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Caldera roja estropeada' WHERE `locale`='esES' AND `ID`=12627; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras de pelo recogidas' WHERE `locale`='esES' AND `ID`=12630; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Descendiente de Har\'koa maldito resucitado' WHERE `locale`='esES' AND `ID`=12632; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El propósito de la gargantilla al descubierto' WHERE `locale`='esES' AND `ID`=12637; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El propósito de la gargantilla al descubierto' WHERE `locale`='esES' AND `ID`=12638; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fallas elementales selladas' WHERE `locale`='esES' AND `ID`=12640; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cata de Hemet' WHERE `locale`='esES' AND `ID`=12645; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cata de Hadrius' WHERE `locale`='esES' AND `ID`=12645; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Cata de Tamara' WHERE `locale`='esES' AND `ID`=12645; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos putrefactos alimentados' WHERE `locale`='esES' AND `ID`=12652; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cabellera de trols de Heb\'Drakkar cortada' WHERE `locale`='esES' AND `ID`=12659; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Explosivos inestables destruidos' WHERE `locale`='esES' AND `ID`=12660; +UPDATE `quest_template_locale` SET `ObjectiveText1`='La tarea del Señor Supremo Drakuru completada' WHERE `locale`='esES' AND `ID`=12661; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vuelta por Zul\'Drak completada' WHERE `locale`='esES' AND `ID`=12663; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vuelta por Zul\'Drak completada' WHERE `locale`='esES' AND `ID`=12664; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trols asesinados cerca de la fuente de almas' WHERE `locale`='esES' AND `ID`=12668; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tarea de Drakuru completada' WHERE `locale`='esES' AND `ID`=12669; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aditivo diluido en calderas de añublo' WHERE `locale`='esES' AND `ID`=12669; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cristales de añublo recogidos' WHERE `locale`='esES' AND `ID`=12673; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Maleficio mortal echado al sumo sacerdote Mu\'funu' WHERE `locale`='esES' AND `ID`=12674; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Maleficio mortal echado a la suma sacerdotisa Tua-Tua' WHERE `locale`='esES' AND `ID`=12674; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Maleficio mortal echado al sumo sacerdote Hawinni' WHERE `locale`='esES' AND `ID`=12674; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carros de la Plaga destruidos' WHERE `locale`='esES' AND `ID`=12676; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Tarea de Drakuru completada' WHERE `locale`='esES' AND `ID`=12676; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Desvelar el secreto de Drakuru' WHERE `locale`='esES' AND `ID`=12676; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tarea de Drakuru completada' WHERE `locale`='esES' AND `ID`=12677; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras de esputo recogidas' WHERE `locale`='esES' AND `ID`=12683; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Darmuk muerto' WHERE `locale`='esES' AND `ID`=12686; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trituracráneos Drakkari asesinados' WHERE `locale`='esES' AND `ID`=12690; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cabecilla Drakkari capturado' WHERE `locale`='esES' AND `ID`=12690; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Górlocs Pavesa muertos' WHERE `locale`='esES' AND `ID`=12703; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacantes Corazón Frenético muertos' WHERE `locale`='esES' AND `ID`=12705; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Discípulos de Mam\'toth muertos aplastados' WHERE `locale`='esES' AND `ID`=12707; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guerreros Tiki encantados exterminados' WHERE `locale`='esES' AND `ID`=12708; +UPDATE `quest_template_locale` SET `ObjectiveText1`='La cámara superior de Drakuru explorada' WHERE `locale`='esES' AND `ID`=12710; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Señor Supremo Drakuru derrotado' WHERE `locale`='esES' AND `ID`=12713; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu acuoso devorado' WHERE `locale`='esES' AND `ID`=12726; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aparecido tormentoso devorado' WHERE `locale`='esES' AND `ID`=12726; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura de las Cavernas Aletas Invernal tomada' WHERE `locale`='esES' AND `ID`=12728; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hoja manchada de sangre con una avispa del Enjambre Zafiro' WHERE `locale`='esES' AND `ID`=12734; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Hoja manchada de sangre con un destrero Callonudillo' WHERE `locale`='esES' AND `ID`=12734; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Hoja manchada de sangre con miembros Susurraneblina' WHERE `locale`='esES' AND `ID`=12734; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Meditación en El Pilar Iluminado' WHERE `locale`='esES' AND `ID`=12736; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Meditación en El Pilar Musgoluz' WHERE `locale`='esES' AND `ID`=12736; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Meditación en El Pilar del Trecho Celestial' WHERE `locale`='esES' AND `ID`=12736; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Meditación en El Pilar Toquesol' WHERE `locale`='esES' AND `ID`=12736; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Canción de la fecundidad tocada' WHERE `locale`='esES' AND `ID`=12737; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuerzas Argenta equipadas con un paracaídas' WHERE `locale`='esES' AND `ID`=12740; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Górloc Pavesa' WHERE `locale`='esES' AND `ID`=12759; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Górloc Pavesa' WHERE `locale`='esES' AND `ID`=12760; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacante Corazón Frenético' WHERE `locale`='esES' AND `ID`=12761; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacante Corazón Frenético' WHERE `locale`='esES' AND `ID`=12762; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Energía de sangrevida recuperada' WHERE `locale`='esES' AND `ID`=12805; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sangre recogida de fauces voraces' WHERE `locale`='esES' AND `ID`=12810; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de El Embate Escarlata transformado' WHERE `locale`='esES' AND `ID`=12813; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grifo del Embate entregado a Uzo Clamamuerte' WHERE `locale`='esES' AND `ID`=12814; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Agresores de Garm muertos' WHERE `locale`='esES' AND `ID`=12820; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Colocar fardo explosivo' WHERE `locale`='esES' AND `ID`=12823; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Arañas Red de Cristal muertas' WHERE `locale`='esES' AND `ID`=12829; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Invasor de Garm muerto' WHERE `locale`='esES' AND `ID`=12833; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Capitán Welsington interrogado a golpes y muerto' WHERE `locale`='esES' AND `ID`=12840; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Capitana Hartford interrogada a golpes y muerta' WHERE `locale`='esES' AND `ID`=12840; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisionero goblin liberado' WHERE `locale`='esES' AND `ID`=12843; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Puerta de Arete invocada' WHERE `locale`='esES' AND `ID`=12847; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huargos de escarcha quemados' WHERE `locale`='esES' AND `ID`=12851; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gigantes de escarcha quemados' WHERE `locale`='esES' AND `ID`=12851; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gran almirante Viento Oeste derrotado' WHERE `locale`='esES' AND `ID`=12852; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rastrear al ladrón' WHERE `locale`='esES' AND `ID`=12855; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisioneras Brunnhildar rescatadas' WHERE `locale`='esES' AND `ID`=12856; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Protodracos liberados' WHERE `locale`='esES' AND `ID`=12856; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuego de cabaña apagado' WHERE `locale`='esES' AND `ID`=12859; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Datos ocultos reunidos' WHERE `locale`='esES' AND `ID`=12860; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Garrafuria capturado liberado' WHERE `locale`='esES' AND `ID`=12861; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Águilas de Crestormenta alimentadas' WHERE `locale`='esES' AND `ID`=12865; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Invasores Tronaforjado muertos' WHERE `locale`='esES' AND `ID`=12876; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Jinete de dracos de El Encuentro Hyldnir derrotada' WHERE `locale`='esES' AND `ID`=12886; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El Ocular ha sido destruido' WHERE `locale`='esES' AND `ID`=12887; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El Ocular ha sido destruido' WHERE `locale`='esES' AND `ID`=12892; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vil transformado' WHERE `locale`='esES' AND `ID`=12893; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lady Bosqueténebro transformada' WHERE `locale`='esES' AND `ID`=12893; +UPDATE `quest_template_locale` SET `ObjectiveText3`='El Saltador transformado' WHERE `locale`='esES' AND `ID`=12893; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado Dargath encontrado' WHERE `locale`='esES' AND `ID`=12903; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gerk encontrado' WHERE `locale`='esES' AND `ID`=12903; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Burr encontrado' WHERE `locale`='esES' AND `ID`=12903; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vargul muerto' WHERE `locale`='esES' AND `ID`=12904; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykul exhausto disciplinado' WHERE `locale`='esES' AND `ID`=12906; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sigue el olor hasta su fuente' WHERE `locale`='esES' AND `ID`=12910; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Funciona' WHERE `locale`='esES' AND `ID`=12911; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fjorn asesinado' WHERE `locale`='esES' AND `ID`=12915; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gigantes de hierro Tronaforjado asesinados' WHERE `locale`='esES' AND `ID`=12915; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Recinto de la Plaga reventado' WHERE `locale`='esES' AND `ID`=12916; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ser de la Plaga muerto' WHERE `locale`='esES' AND `ID`=12919; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con Brann' WHERE `locale`='esES' AND `ID`=12920; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Yunque de Fjorn llevado a Dun Niffelem' WHERE `locale`='esES' AND `ID`=12924; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Datos ocultos reunidos' WHERE `locale`='esES' AND `ID`=12927; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacante Tronaforjado eliminado' WHERE `locale`='esES' AND `ID`=12931; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Defensores terráneos caídos sanados' WHERE `locale`='esES' AND `ID`=12937; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Combatientes Mjordin desafiados y derrotados' WHERE `locale`='esES' AND `ID`=12939; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuegos iniciados' WHERE `locale`='esES' AND `ID`=12953; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sigrid Hielonato derrotada' WHERE `locale`='esES' AND `ID`=12955; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Efrem el Leal derrotado' WHERE `locale`='esES' AND `ID`=12955; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Onu\'zun derrotado' WHERE `locale`='esES' AND `ID`=12955; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Mañosa Silbatin derrotada' WHERE `locale`='esES' AND `ID`=12955; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Intento de liberar a mecagnomo cautivo' WHERE `locale`='esES' AND `ID`=12957; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Furia de Loken destruida' WHERE `locale`='esES' AND `ID`=12965; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Poder de Loken destruido' WHERE `locale`='esES' AND `ID`=12965; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Favor de Loken destruido' WHERE `locale`='esES' AND `ID`=12965; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aparecidos hirvientes eliminados' WHERE `locale`='esES' AND `ID`=12967; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Escucha la propuesta de Lok\'lira' WHERE `locale`='esES' AND `ID`=12970; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Antepasado de Niffelem liberado' WHERE `locale`='esES' AND `ID`=12977; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Natoescarcha inquieto liberado' WHERE `locale`='esES' AND `ID`=12977; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nidavelir Tronaforjado eliminado' WHERE `locale`='esES' AND `ID`=12978; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Placa de armadura investigada' WHERE `locale`='esES' AND `ID`=12980; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisioneros de la Espada de Ébano liberados' WHERE `locale`='esES' AND `ID`=12982; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Matriarca faucehielo rescatada' WHERE `locale`='esES' AND `ID`=12983; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Templo de la Invención examinado' WHERE `locale`='esES' AND `ID`=12986; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Templo del Invierno examinado' WHERE `locale`='esES' AND `ID`=12986; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Templo de la vida examinado' WHERE `locale`='esES' AND `ID`=12986; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Templo del Orden examinado' WHERE `locale`='esES' AND `ID`=12986; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Yelmo de Hodir montado' WHERE `locale`='esES' AND `ID`=12987; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Forja de relámpagos norte dañada' WHERE `locale`='esES' AND `ID`=12988; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Forja de relámpagos central dañada' WHERE `locale`='esES' AND `ID`=12988; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Forja de relámpagos sur dañada' WHERE `locale`='esES' AND `ID`=12988; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykul de Jotunheim eliminado' WHERE `locale`='esES' AND `ID`=12992; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Infiltrados Tronaforjado eliminados' WHERE `locale`='esES' AND `ID`=12994; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Estandarte de la Espada de Ébano situado cerca de cadáver vrykul' WHERE `locale`='esES' AND `ID`=12995; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kirgaraak derrotado' WHERE `locale`='esES' AND `ID`=12996; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Intenta proteger el Corazón de la Tormenta' WHERE `locale`='esES' AND `ID`=12998; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vermis salvaje muerta' WHERE `locale`='esES' AND `ID`=13003; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Centinela férreo asesinado' WHERE `locale`='esES' AND `ID`=13005; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Atacante enano férreo asesinado' WHERE `locale`='esES' AND `ID`=13005; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado enredado liberado' WHERE `locale`='esES' AND `ID`=13008; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Destino de Krolmir descubierto' WHERE `locale`='esES' AND `ID`=13010; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lee el primer pergamino de Historia' WHERE `locale`='esES' AND `ID`=13034; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lee el segundo pergamino de Historia' WHERE `locale`='esES' AND `ID`=13034; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lee el tercer pergamino de historia' WHERE `locale`='esES' AND `ID`=13034; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pregúntale al cabecilla Lanza Presta sobre sus recuerdos' WHERE `locale`='esES' AND `ID`=13037; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fallas de Témpano Gélido cerradas' WHERE `locale`='esES' AND `ID`=13038; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nerubianos de las Profundidades Olvidadas destruidos' WHERE `locale`='esES' AND `ID`=13039; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información sacada a golpes del aprendiz Osterkilgr' WHERE `locale`='esES' AND `ID`=13042; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado capturado rescatado' WHERE `locale`='esES' AND `ID`=13045; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu de Arngrim alimentado' WHERE `locale`='esES' AND `ID`=13046; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Martillo de conocimiento armonizado a la era de Pezuña Tomentosa' WHERE `locale`='esES' AND `ID`=13048; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Veranus atraída' WHERE `locale`='esES' AND `ID`=13051; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Línea temporal verdadera restaurada' WHERE `locale`='esES' AND `ID`=13058; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Desafío solicitado usando la espada de Bethod' WHERE `locale`='esES' AND `ID`=13059; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Escuchada la historia de Thorim' WHERE `locale`='esES' AND `ID`=13064; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Protodracos de Jotunheim y jinetes derribados' WHERE `locale`='esES' AND `ID`=13069; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Edificios vrykul incendiados' WHERE `locale`='esES' AND `ID`=13071; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Estandartes vrykul quemados' WHERE `locale`='esES' AND `ID`=13084; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacantes de la Plaga eliminados' WHERE `locale`='esES' AND `ID`=13086; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykuls Jotunheim eliminados mientras posees a un terror de agua' WHERE `locale`='esES' AND `ID`=13091; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gal\'darah asesinado' WHERE `locale`='esES' AND `ID`=13096; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Volkhan derrotado' WHERE `locale`='esES' AND `ID`=13109; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritus inquietos liberados' WHERE `locale`='esES' AND `ID`=13110; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Altar de Invocación investigado' WHERE `locale`='esES' AND `ID`=13117; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Primer altar de Invocación destruido' WHERE `locale`='esES' AND `ID`=13119; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Segundo altar de Invocación destruido' WHERE `locale`='esES' AND `ID`=13119; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Tercer altar de Invocación destruido' WHERE `locale`='esES' AND `ID`=13119; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Cuarto altar de Invocación destruido' WHERE `locale`='esES' AND `ID`=13119; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbe colocado en el laboratorio de abominaciones' WHERE `locale`='esES' AND `ID`=13120; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Orbe colocado en el laboratorio de gigantes de carne' WHERE `locale`='esES' AND `ID`=13120; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Orbe colocado en la zona de la caldera' WHERE `locale`='esES' AND `ID`=13120; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información para la Bruja Osaria conseguida' WHERE `locale`='esES' AND `ID`=13121; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ensamblajes de centrifugadoras destruidos' WHERE `locale`='esES' AND `ID`=13126; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Varos Zancanubes derrotado' WHERE `locale`='esES' AND `ID`=13126; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Señor de la Magia Urom derrotado' WHERE `locale`='esES' AND `ID`=13127; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guardián-Ley Eregos derrotado' WHERE `locale`='esES' AND `ID`=13128; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rey Ymiron asesinado' WHERE `locale`='esES' AND `ID`=13132; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Iskalder llevado a la Bruja Osaria' WHERE `locale`='esES' AND `ID`=13133; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbes de sangre rotos' WHERE `locale`='esES' AND `ID`=13134; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Tanques de líquido de embalsamar destruidos' WHERE `locale`='esES' AND `ID`=13134; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Iskalder derrotado en combate' WHERE `locale`='esES' AND `ID`=13137; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Acechador ágil subyugado devuelto' WHERE `locale`='esES' AND `ID`=13143; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Abominaciones encadenadas quemadas' WHERE `locale`='esES' AND `ID`=13144; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Altar de sacrificio inspeccionado' WHERE `locale`='esES' AND `ID`=13145; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Forja de sangre inspeccionada' WHERE `locale`='esES' AND `ID`=13145; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Oteador de hielo inspeccionado' WHERE `locale`='esES' AND `ID`=13145; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Runas inspeccionadas' WHERE `locale`='esES' AND `ID`=13145; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Bombas de la Plaga entregadas' WHERE `locale`='esES' AND `ID`=13146; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pelea entre obreros iniciada' WHERE `locale`='esES' AND `ID`=13147; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cajas de grano apestado disipadas' WHERE `locale`='esES' AND `ID`=13149; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mal\'Ganis derrotado' WHERE `locale`='esES' AND `ID`=13151; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Parches liberado' WHERE `locale`='esES' AND `ID`=13152; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ayudar a Parches a matar al doctor Sabnok' WHERE `locale`='esES' AND `ID`=13152; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cianigosa asesinada' WHERE `locale`='esES' AND `ID`=13159; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Centinelas Piel de Hielo aniquilados' WHERE `locale`='esES' AND `ID`=13160; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Miembro de la Plaga asesinado' WHERE `locale`='esES' AND `ID`=13166; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Canes de peste hambrientos alimentados' WHERE `locale`='esES' AND `ID`=13169; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Oteadores inquietos asesinados' WHERE `locale`='esES' AND `ID`=13170; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cristales de la Plaga desterrados' WHERE `locale`='esES' AND `ID`=13171; +UPDATE `quest_template_locale` SET `ObjectiveText1`='No-muerto de la Cantera Llorosa masacrado' WHERE `locale`='esES' AND `ID`=13172; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de la Horda asesinados' WHERE `locale`='esES' AND `ID`=13177; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de la Alianza asesinados' WHERE `locale`='esES' AND `ID`=13178; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de la Horda asesinados' WHERE `locale`='esES' AND `ID`=13179; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de la Alianza asesinados' WHERE `locale`='esES' AND `ID`=13180; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevos de la Plaga nerubianos destruidos' WHERE `locale`='esES' AND `ID`=13182; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aparatos de asedio de la Alianza destruidos' WHERE `locale`='esES' AND `ID`=13185; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aparatos de asedio de la Horda destruidos' WHERE `locale`='esES' AND `ID`=13186; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Los Olvidados aniquilados' WHERE `locale`='esES' AND `ID`=13187; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Heraldo Volazj derrotado' WHERE `locale`='esES' AND `ID`=13187; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de vigía Ahn\'kahar quemado' WHERE `locale`='esES' AND `ID`=13190; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Exploración de Brann completada' WHERE `locale`='esES' AND `ID`=13207; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver purulento quemado' WHERE `locale`='esES' AND `ID`=13211; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado Olakini Sainrith resucitado' WHERE `locale`='esES' AND `ID`=13220; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vehículo de asedio defendido' WHERE `locale`='esES' AND `ID`=13222; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vehículo de asedio de la Horda defendido' WHERE `locale`='esES' AND `ID`=13223; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rabioso moribundo interrogado' WHERE `locale`='esES' AND `ID`=13228; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldado de la Alianza moribundo asesinado' WHERE `locale`='esES' AND `ID`=13230; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldado moribundo interrogado' WHERE `locale`='esES' AND `ID`=13231; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldados moribundos asesinados' WHERE `locale`='esES' AND `ID`=13232; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esbirro necrófago alzado' WHERE `locale`='esES' AND `ID`=13236; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Abominaciones descomunales asesinadas' WHERE `locale`='esES' AND `ID`=13237; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Nigromantes malévolos asesinados' WHERE `locale`='esES' AND `ID`=13237; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Adepto de sombra asesinado' WHERE `locale`='esES' AND `ID`=13237; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prueba del campo completada' WHERE `locale`='esES' AND `ID`=13239; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ensayo de campo realizado' WHERE `locale`='esES' AND `ID`=13261; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos de Hielo explotados' WHERE `locale`='esES' AND `ID`=13264; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Geists sañosos explotados' WHERE `locale`='esES' AND `ID`=13264; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Soldados de la Alianza resucitados explotados' WHERE `locale`='esES' AND `ID`=13264; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos de Hielo explotados' WHERE `locale`='esES' AND `ID`=13276; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Geists sañosos explotados' WHERE `locale`='esES' AND `ID`=13276; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Soldados de la Alianza resucitados explotados' WHERE `locale`='esES' AND `ID`=13276; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Coprous el Profanado derrotado' WHERE `locale`='esES' AND `ID`=13278; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esES' AND `ID`=13279; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Confalón de batalla de la Alianza plantado' WHERE `locale`='esES' AND `ID`=13280; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esES' AND `ID`=13281; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Confalón de batalla de la Horda plantado' WHERE `locale`='esES' AND `ID`=13283; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tropas de la Alianza escoltadas hasta Ymirheim' WHERE `locale`='esES' AND `ID`=13284; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ayuda a Brann a crear la piedra angular' WHERE `locale`='esES' AND `ID`=13285; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Abominaciones descomunales asesinadas' WHERE `locale`='esES' AND `ID`=13287; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Nigromantes malévolos asesinados' WHERE `locale`='esES' AND `ID`=13287; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Adepto de sombra asesinado' WHERE `locale`='esES' AND `ID`=13287; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos de Hielo explotados' WHERE `locale`='esES' AND `ID`=13288; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Geists sañosos explotados' WHERE `locale`='esES' AND `ID`=13288; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Soldados de la Alianza resucitados explotados' WHERE `locale`='esES' AND `ID`=13288; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos de Hielo explotados' WHERE `locale`='esES' AND `ID`=13289; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Geists sañosos explotados' WHERE `locale`='esES' AND `ID`=13289; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Soldados de la Alianza resucitados explotados' WHERE `locale`='esES' AND `ID`=13289; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pruebas de campo realizadas' WHERE `locale`='esES' AND `ID`=13291; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Garfacielo Razaescarcha matado' WHERE `locale`='esES' AND `ID`=13292; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pila de peste neutralizada' WHERE `locale`='esES' AND `ID`=13295; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esES' AND `ID`=13297; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Coprous el Profanado derrotado' WHERE `locale`='esES' AND `ID`=13298; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Completar logro: Maestro cultural de Rasganorte' WHERE `locale`='esES' AND `ID`=13299; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavo de las minas de saronita rescatado' WHERE `locale`='esES' AND `ID`=13300; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tropas de la Horda escoltadas hasta Ymirheim' WHERE `locale`='esES' AND `ID`=13301; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavo de las minas de saronita rescatado' WHERE `locale`='esES' AND `ID`=13302; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Completar logro: Maestro cultural de Rasganorte' WHERE `locale`='esES' AND `ID`=13303; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barricadas construidas' WHERE `locale`='esES' AND `ID`=13306; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Infiltrados de El Rompecielos ayudados' WHERE `locale`='esES' AND `ID`=13309; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Infiltrados Kor\'kron ayudados' WHERE `locale`='esES' AND `ID`=13310; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aviones de caza de El Rompecielos derribados' WHERE `locale`='esES' AND `ID`=13313; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aldur\'thar sur visitado' WHERE `locale`='esES' AND `ID`=13315; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aldur\'thar central visitado' WHERE `locale`='esES' AND `ID`=13315; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Aldur\'thar norte visitado' WHERE `locale`='esES' AND `ID`=13315; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Aldur\'thar noroeste visitado' WHERE `locale`='esES' AND `ID`=13315; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Subyugador oscuro arrastrado y soltado' WHERE `locale`='esES' AND `ID`=13318; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sobrestante Faedris asesinado' WHERE `locale`='esES' AND `ID`=13319; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Sobrestante Jhaeqon asesinado' WHERE `locale`='esES' AND `ID`=13319; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Sobrestante Veraj asesinado' WHERE `locale`='esES' AND `ID`=13319; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sobrestante Savryn asesinado' WHERE `locale`='esES' AND `ID`=13319; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestra azul recogida' WHERE `locale`='esES' AND `ID`=13320; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Muestra verde recogida' WHERE `locale`='esES' AND `ID`=13320; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Muestra negra recogida' WHERE `locale`='esES' AND `ID`=13320; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Masa aviesa expulsada' WHERE `locale`='esES' AND `ID`=13321; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Masa aviesa expulsada' WHERE `locale`='esES' AND `ID`=13322; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Subyugador oscuro arrastrado y soltado' WHERE `locale`='esES' AND `ID`=13323; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huesos de atracadores esqueléticos disueltos' WHERE `locale`='esES' AND `ID`=13329; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykul de Ymirheim asesinados' WHERE `locale`='esES' AND `ID`=13330; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aviones de caza de El Rompecielos derribados' WHERE `locale`='esES' AND `ID`=13331; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barricadas construidas' WHERE `locale`='esES' AND `ID`=13332; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huesos de atracadores esqueléticos disueltos' WHERE `locale`='esES' AND `ID`=13335; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykul de Ymirheim asesinados ' WHERE `locale`='esES' AND `ID`=13336; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alumeth el Ascendido derrotado' WHERE `locale`='esES' AND `ID`=13346; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alumeth el Ascendido asesinado' WHERE `locale`='esES' AND `ID`=13350; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aldur\'thar sur visitado' WHERE `locale`='esES' AND `ID`=13351; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aldur\'thar central visitado' WHERE `locale`='esES' AND `ID`=13351; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Aldur\'thar norte visitado' WHERE `locale`='esES' AND `ID`=13351; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Aldur\'thar noroeste visitado' WHERE `locale`='esES' AND `ID`=13351; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Subyugador oscuro arrastrado y soltado' WHERE `locale`='esES' AND `ID`=13352; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Subyugador oscuro arrastrado y soltado' WHERE `locale`='esES' AND `ID`=13353; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sobrestante Faedris asesinado' WHERE `locale`='esES' AND `ID`=13354; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Sobrestante Jhaeqon asesinado' WHERE `locale`='esES' AND `ID`=13354; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Sobrestante Veraj asesinado' WHERE `locale`='esES' AND `ID`=13354; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sobrestante Savryn asesinado' WHERE `locale`='esES' AND `ID`=13354; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestra azul recogida' WHERE `locale`='esES' AND `ID`=13355; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Muestra verde recogida' WHERE `locale`='esES' AND `ID`=13355; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Muestra negra recogida' WHERE `locale`='esES' AND `ID`=13355; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Masa aviesa expulsada' WHERE `locale`='esES' AND `ID`=13356; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Masa aviesa expulsada' WHERE `locale`='esES' AND `ID`=13357; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El destino del príncipe' WHERE `locale`='esES' AND `ID`=13361; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gambito de Tirion' WHERE `locale`='esES' AND `ID`=13364; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alumeth el Ascendido derrotado' WHERE `locale`='esES' AND `ID`=13367; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alumeth el Ascendido derrotado' WHERE `locale`='esES' AND `ID`=13368; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esbirro necrófago alzado' WHERE `locale`='esES' AND `ID`=13395; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El destino del príncipe' WHERE `locale`='esES' AND `ID`=13400; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gambito de Tirion' WHERE `locale`='esES' AND `ID`=13403; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Élites Juraescama asesinados' WHERE `locale`='esES' AND `ID`=13414; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykuls exhaustos disciplinados' WHERE `locale`='esES' AND `ID`=13422; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huye de Arroyoplata' WHERE `locale`='esES' AND `ID`=13524; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Destruye una de las tres torres sur' WHERE `locale`='esES' AND `ID`=13538; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Destruye una torre sur en Conquista del Invierno' WHERE `locale`='esES' AND `ID`=13539; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Leopardos de escarcha hembra recuperadas' WHERE `locale`='esES' AND `ID`=13549; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Osas Patahielo recuperadas' WHERE `locale`='esES' AND `ID`=13549; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Usar Estocada sobre objetivos cuerpo a cuerpo' WHERE `locale`='esES' AND `ID`=13625; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Usar Romper escudo sobre objetivos a distancia vulnerables' WHERE `locale`='esES' AND `ID`=13625; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Usar Cargar sobre objetivos de carga vulnerables' WHERE `locale`='esES' AND `ID`=13625; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muerte de Sir Wendell Balfour investigada' WHERE `locale`='esES' AND `ID`=13643; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Muerte de Lorien Resplandor investigada' WHERE `locale`='esES' AND `ID`=13643; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Muerte de Conall Empuñadura de Hierro investigada' WHERE `locale`='esES' AND `ID`=13643; +UPDATE `quest_template_locale` SET `ObjectiveText1`='G.U.A.O. golpeada' WHERE `locale`='esES' AND `ID`=13649; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grifo del Caballero Negro controlado' WHERE `locale`='esES' AND `ID`=13663; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga de Corona de Hielo muerto' WHERE `locale`='esES' AND `ID`=13671; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga de Corona de Hielo muerto' WHERE `locale`='esES' AND `ID`=13676; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Usar Estocada sobre objetivos cuerpo a cuerpo' WHERE `locale`='esES' AND `ID`=13677; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Usar Romper escudo sobre objetivos a distancia vulnerables' WHERE `locale`='esES' AND `ID`=13677; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Usar Cargar sobre objetivos de carga vulnerables' WHERE `locale`='esES' AND `ID`=13677; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Valeroso Argenta derrotado' WHERE `locale`='esES' AND `ID`=13679; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Valeroso Argenta derrotado' WHERE `locale`='esES' AND `ID`=13680; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13699; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Decidió convertirse en Escudero de Ventormenta.' WHERE `locale`='esES' AND `ID`=13710; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13713; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13723; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13724; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13725; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13726; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13727; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13728; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13729; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esES' AND `ID`=13731; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Culto de los Malditos eliminados' WHERE `locale`='esES' AND `ID`=13789; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Culto de los Malditos eliminados' WHERE `locale`='esES' AND `ID`=13791; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Culto de los Malditos eliminados' WHERE `locale`='esES' AND `ID`=13810; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Culto de los Malditos eliminados' WHERE `locale`='esES' AND `ID`=13813; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Jeran Cierramadera' WHERE `locale`='esES' AND `ID`=13828; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza Estocada contra el objetivo cuerpo a cuerpo' WHERE `locale`='esES' AND `ID`=13828; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Jeran Cierramadera' WHERE `locale`='esES' AND `ID`=13829; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza Estocada contra el objetivo cuerpo a cuerpo' WHERE `locale`='esES' AND `ID`=13829; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Valis Cazavientos' WHERE `locale`='esES' AND `ID`=13835; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza Romper escudo contra un objetivo a distancia vulnerable' WHERE `locale`='esES' AND `ID`=13835; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Rugan Tripacero' WHERE `locale`='esES' AND `ID`=13837; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Carga contra un objetivo de carga vulnerable' WHERE `locale`='esES' AND `ID`=13837; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Valis Cazavientos' WHERE `locale`='esES' AND `ID`=13838; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza Romper escudo contra un objetivo a distancia vulnerable' WHERE `locale`='esES' AND `ID`=13838; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Rugan Tripacero' WHERE `locale`='esES' AND `ID`=13839; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Carga contra un objetivo de carga vulnerable' WHERE `locale`='esES' AND `ID`=13839; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Salpicaduras de pellejo venenoso sobre ti' WHERE `locale`='esES' AND `ID`=13850; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carne de dinosaurio fresca entregada a prole de pellejo venenoso' WHERE `locale`='esES' AND `ID`=13889; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carne de silítido dada de comer a prole de pellejo venenoso' WHERE `locale`='esES' AND `ID`=13903; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevos de silítido entregados a prole de pellejo venenoso' WHERE `locale`='esES' AND `ID`=13904; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carne de dinosaurio fresca entregada a prole de pellejo venenoso' WHERE `locale`='esES' AND `ID`=13915; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevos de silítido entregados a prole de pellejo venenoso' WHERE `locale`='esES' AND `ID`=13916; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carne de silítido dada de comer a prole de pellejo venenoso' WHERE `locale`='esES' AND `ID`=13917; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con la supervisora de huérfanos Aria' WHERE `locale`='esES' AND `ID`=13926; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con la supervisora de huérfanos Aria' WHERE `locale`='esES' AND `ID`=13927; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tira un zepelín de papel pequeño a Roo' WHERE `locale`='esES' AND `ID`=13937; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tira un zepelín de papel pequeño a Kekek' WHERE `locale`='esES' AND `ID`=13938; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar relleno de pan de especias' WHERE `locale`='esES' AND `ID`=14023; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar tarta de calabaza' WHERE `locale`='esES' AND `ID`=14024; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prepara chatni de arándanos' WHERE `locale`='esES' AND `ID`=14028; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prepara batata confitada' WHERE `locale`='esES' AND `ID`=14033; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar pavo a fuego lento' WHERE `locale`='esES' AND `ID`=14035; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar relleno de pan de especias' WHERE `locale`='esES' AND `ID`=14037; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar tarta de calabaza' WHERE `locale`='esES' AND `ID`=14040; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prepara chatni de arándanos' WHERE `locale`='esES' AND `ID`=14041; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prepara batata confitada' WHERE `locale`='esES' AND `ID`=14043; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar pavo a fuego lento' WHERE `locale`='esES' AND `ID`=14047; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu de compartir' WHERE `locale`='esES' AND `ID`=14064; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu de compartir' WHERE `locale`='esES' AND `ID`=14065; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Extremaunción administrada' WHERE `locale`='esES' AND `ID`=14077; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kvaldir asesinados' WHERE `locale`='esES' AND `ID`=14080; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Seguidor Veloneve capturado' WHERE `locale`='esES' AND `ID`=14090; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kul el Temerario rescatado' WHERE `locale`='esES' AND `ID`=14096; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aspirantes cautivos rescatados' WHERE `locale`='esES' AND `ID`=14096; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu de héroe caído bendecido' WHERE `locale`='esES' AND `ID`=14107; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lanzar lanzas al kraken de El Mar del Norte' WHERE `locale`='esES' AND `ID`=14108; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kvaldir asesinados' WHERE `locale`='esES' AND `ID`=14140; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Seguidor Veloneve capturado' WHERE `locale`='esES' AND `ID`=14141; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kul el Temerario rescatado' WHERE `locale`='esES' AND `ID`=14142; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aspirantes cautivos rescatados' WHERE `locale`='esES' AND `ID`=14142; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Extremaunción administrada' WHERE `locale`='esES' AND `ID`=14144; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Transmutaciones de gema épica' WHERE `locale`='esES' AND `ID`=14151; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preguntar a Krasus sobre el origen de la empuñadura' WHERE `locale`='esES' AND `ID`=14444; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Llevar la Quel\'Delar a las Cámaras de Reflexión' WHERE `locale`='esES' AND `ID`=24480; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavos de la Alianza liberados' WHERE `locale`='esES' AND `ID`=24498; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Encontrar a Jaina Valiente' WHERE `locale`='esES' AND `ID`=24500; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Escapar del Rey Exánime' WHERE `locale`='esES' AND `ID`=24500; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavos de la Horda liberados' WHERE `locale`='esES' AND `ID`=24507; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Bendición de Thalorien obtenida' WHERE `locale`='esES' AND `ID`=24535; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guardias perfumados analizados' WHERE `locale`='esES' AND `ID`=24536; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preguntar a Krasus sobre el origen de la empuñadura' WHERE `locale`='esES' AND `ID`=24555; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Llevar la Quel\'Delar a las Cámaras de Reflexión' WHERE `locale`='esES' AND `ID`=24561; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Bendición de Thalorien obtenida' WHERE `locale`='esES' AND `ID`=24563; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras dadas' WHERE `locale`='esES' AND `ID`=24629; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras dadas' WHERE `locale`='esES' AND `ID`=24635; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras dadas' WHERE `locale`='esES' AND `ID`=24636; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24638; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24645; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24647; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24648; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24649; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24650; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24651; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24652; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guardias perfumados analizados' WHERE `locale`='esES' AND `ID`=24655; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24658; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24659; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24660; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24662; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24663; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24664; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24665; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esES' AND `ID`=24666; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habitantes del pueblo perfumados analizados' WHERE `locale`='esES' AND `ID`=24746; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rey Exánime derrotado' WHERE `locale`='esES' AND `ID`=24748; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Encontrar a Sylvanas Brisaveloz' WHERE `locale`='esES' AND `ID`=24802; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Escapar del Rey Exánime' WHERE `locale`='esES' AND `ID`=24802; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Contaduría de Ventormenta revisada' WHERE `locale`='esES' AND `ID`=24849; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Casa de subastas de Ventormenta revisada' WHERE `locale`='esES' AND `ID`=24849; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Peluquería de Ventormenta revisada' WHERE `locale`='esES' AND `ID`=24849; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Banco de Orgrimmar revisado' WHERE `locale`='esES' AND `ID`=24851; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Casa de subastas de Orgrimmar revisada' WHERE `locale`='esES' AND `ID`=24851; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Peluquería de Orgrimmar revisada' WHERE `locale`='esES' AND `ID`=24851; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rescata a Darnavan' WHERE `locale`='esES' AND `ID`=24869; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Minchar rescatado' WHERE `locale`='esES' AND `ID`=24874; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rescata a Darnavan' WHERE `locale`='esES' AND `ID`=24875; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Minchar rescatado' WHERE `locale`='esES' AND `ID`=24879; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Saluda al sargento de maniobras' WHERE `locale`='esES' AND `ID`=25199; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ruge con el sargento de maniobras' WHERE `locale`='esES' AND `ID`=25199; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Brinda con el sargento de maniobras' WHERE `locale`='esES' AND `ID`=25199; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Baila con el sargento de maniobras' WHERE `locale`='esES' AND `ID`=25199; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lanzar Radiageigatrones a los conductos de ventilación de Gnomeregan' WHERE `locale`='esES' AND `ID`=25212; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Escucha el discurso de los presagistas de la Fatalidad' WHERE `locale`='esES' AND `ID`=25228; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gnomos motivados' WHERE `locale`='esES' AND `ID`=25229; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gnomos motivados traidos al Capitán Chispaboquilla' WHERE `locale`='esES' AND `ID`=25229; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Escucha el discurso de los presagistas de la Fatalidad' WHERE `locale`='esES' AND `ID`=25253; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carteles colocados' WHERE `locale`='esES' AND `ID`=25254; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carteles colocados' WHERE `locale`='esES' AND `ID`=25282; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Dar un discurso a Ozzie Voltiflop' WHERE `locale`='esES' AND `ID`=25283; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Dar un discurso a Milli Plumasilba' WHERE `locale`='esES' AND `ID`=25283; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Dar un discurso a Tog Oxidentado' WHERE `locale`='esES' AND `ID`=25283; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sistema de eyección probado' WHERE `locale`='esES' AND `ID`=25285; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Únete al Culto del Juicio Final' WHERE `locale`='esES' AND `ID`=25288; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Servo de la pata izquierda probada' WHERE `locale`='esES' AND `ID`=25289; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Servo de la pata derecha probada' WHERE `locale`='esES' AND `ID`=25289; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Sistema de maniobras evasivas probada' WHERE `locale`='esES' AND `ID`=25289; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Únete al Culto del Juicio Final' WHERE `locale`='esES' AND `ID`=25290; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con el cultor Kagarn' WHERE `locale`='esES' AND `ID`=25293; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Habla con el cultor Agtar' WHERE `locale`='esES' AND `ID`=25293; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Habla con la cultora Tokka' WHERE `locale`='esES' AND `ID`=25293; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Habla con la cultora Rokaga' WHERE `locale`='esES' AND `ID`=25293; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sistemas armamentísticos probados' WHERE `locale`='esES' AND `ID`=25295; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sistema de eyección probado' WHERE `locale`='esES' AND `ID`=25306; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Revelación de Cho\'Gall' WHERE `locale`='esES' AND `ID`=25343; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Difundir el mensaje en la torre de zepelín este' WHERE `locale`='esES' AND `ID`=25380; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Difundir el mensaje en la torre de zepelín oeste' WHERE `locale`='esES' AND `ID`=25380; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Difundir el mensaje en Cerrotajo' WHERE `locale`='esES' AND `ID`=25380; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Recuperar la superficie de Gnomeregan' WHERE `locale`='esES' AND `ID`=25393; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con la cultora Lethelyn' WHERE `locale`='esES' AND `ID`=25414; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Habla con la cultora Kaima' WHERE `locale`='esES' AND `ID`=25414; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Habla con el cultor Wyman' WHERE `locale`='esES' AND `ID`=25414; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Habla con el cultor Orlunn' WHERE `locale`='esES' AND `ID`=25414; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Difundir el mensaje en el Cuartel de Arroyoeste' WHERE `locale`='esES' AND `ID`=25415; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Difundir el mensaje en el Valle de los Héroes' WHERE `locale`='esES' AND `ID`=25415; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Difundir el mensaje en Villadorada' WHERE `locale`='esES' AND `ID`=25415; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Revelación de Cho\'Gall' WHERE `locale`='esES' AND `ID`=25416; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ranas de Sen\'jin armonizadas' WHERE `locale`='esES' AND `ID`=25444; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Zalazane matado' WHERE `locale`='esES' AND `ID`=25445; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ranas sintonizadas colocadas' WHERE `locale`='esES' AND `ID`=25446; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Voluntarios trol reclutados' WHERE `locale`='esES' AND `ID`=25461; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Voluntarios trol entregados al Campeón Uru\'zin' WHERE `locale`='esES' AND `ID`=25461; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Reta a la matriarca tigresa' WHERE `locale`='esES' AND `ID`=25470; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Danza de los espíritus' WHERE `locale`='esES' AND `ID`=25480; + +UPDATE `quest_template_locale` SET `ObjectiveText1`='Niños rescatados' WHERE `locale`='esMX' AND `ID`=10852; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Draco Ala Abisal esclavizado liberado' WHERE `locale`='esMX' AND `ID`=10854; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Atracador vil inactivo destruido' WHERE `locale`='esMX' AND `ID`=10855; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Teletransportador oeste destruido' WHERE `locale`='esMX' AND `ID`=10857; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Teletransportador central destruido' WHERE `locale`='esMX' AND `ID`=10857; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Teletransportador este destruido' WHERE `locale`='esMX' AND `ID`=10857; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbe de luz Razaani recogido' WHERE `locale`='esMX' AND `ID`=10859; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prole redimida' WHERE `locale`='esMX' AND `ID`=10861; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Almas Mano Destrozada obtenidas' WHERE `locale`='esMX' AND `ID`=10864; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Karynaku liberado' WHERE `locale`='esMX' AND `ID`=10866; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Karynaku liberado' WHERE `locale`='esMX' AND `ID`=10872; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guerrero de Sha\'tar liberado' WHERE `locale`='esMX' AND `ID`=10873; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuego zafiro extinguido' WHERE `locale`='esMX' AND `ID`=10874; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Fuego esmeralda extinguido' WHERE `locale`='esMX' AND `ID`=10874; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Fuego violeta extinguido' WHERE `locale`='esMX' AND `ID`=10874; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Fuego de sangrita extinguido' WHERE `locale`='esMX' AND `ID`=10874; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Torre norte marcada' WHERE `locale`='esMX' AND `ID`=10895; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Torre sur marcada' WHERE `locale`='esMX' AND `ID`=10895; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Torre de la Forja marcada' WHERE `locale`='esMX' AND `ID`=10895; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Torre de la ladera marcada' WHERE `locale`='esMX' AND `ID`=10895; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Portal de distorsión sur destruido' WHERE `locale`='esMX' AND `ID`=10911; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Portal de distorsión norte destruido' WHERE `locale`='esMX' AND `ID`=10911; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de vindicador Sha\'tar asesinado quemado' WHERE `locale`='esMX' AND `ID`=10913; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cadáver de guerrero Auchenai asesinado quemado' WHERE `locale`='esMX' AND `ID`=10913; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Contenido del ataúd de Auchenai destruido' WHERE `locale`='esMX' AND `ID`=10915; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Coronel Jules salvado' WHERE `locale`='esMX' AND `ID`=10935; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ayuda a Clintar a reunir las reliquias' WHERE `locale`='esMX' AND `ID`=10965; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aprender sobre el Libro del Cuervo' WHERE `locale`='esMX' AND `ID`=10980; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevo de kaliri monstruoso destruido' WHERE `locale`='esMX' AND `ID`=11008; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Montones de balas de cañón vil destruidos' WHERE `locale`='esMX' AND `ID`=11010; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campamento de peones Faucedraco envenenado' WHERE `locale`='esMX' AND `ID`=11020; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Montones de balas de cañón vil destruidos' WHERE `locale`='esMX' AND `ID`=11023; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Demonios desterrados' WHERE `locale`='esMX' AND `ID`=11026; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Demonios desterrados' WHERE `locale`='esMX' AND `ID`=11051; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Peones Faucedraco disciplinados' WHERE `locale`='esMX' AND `ID`=11055; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rayas de éter conseguidas' WHERE `locale`='esMX' AND `ID`=11065; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rayas de éter conseguidas' WHERE `locale`='esMX' AND `ID`=11066; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Comida de raya abisal' WHERE `locale`='esMX' AND `ID`=11093; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ogro Gordunni' WHERE `locale`='esMX' AND `ID`=11096; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Montones de balas de cañón vil destruidos' WHERE `locale`='esMX' AND `ID`=11102; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barriles entregados' WHERE `locale`='esMX' AND `ID`=11122; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Agitador desertor desenmascarado' WHERE `locale`='esMX' AND `ID`=11126; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Panfletos distribuídos' WHERE `locale`='esMX' AND `ID`=11133; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gavis Rodelagris capturado' WHERE `locale`='esMX' AND `ID`=11134; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisioneros de Theramore liberados' WHERE `locale`='esMX' AND `ID`=11145; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Raptores capturados' WHERE `locale`='esMX' AND `ID`=11146; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Raptores liberados' WHERE `locale`='esMX' AND `ID`=11147; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tienda del norte quemada' WHERE `locale`='esMX' AND `ID`=11150; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Tienda del noreste quemada' WHERE `locale`='esMX' AND `ID`=11150; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Tienda del este quemada' WHERE `locale`='esMX' AND `ID`=11150; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Corona colocada en el monumento de los Hyal' WHERE `locale`='esMX' AND `ID`=11152; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cañones del bloqueo destruidos' WHERE `locale`='esMX' AND `ID`=11153; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tótem Siniestro de Cuernoatroz eliminados' WHERE `locale`='esMX' AND `ID`=11156; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritus Quebrantarrocas que descansan en paz' WHERE `locale`='esMX' AND `ID`=11159; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Clan Quebrantarrocas vengado' WHERE `locale`='esMX' AND `ID`=11162; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Examinar la cámara de Halazzi' WHERE `locale`='esMX' AND `ID`=11166; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Examinar la plataforma de Jan\'alai' WHERE `locale`='esMX' AND `ID`=11166; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Examinar la plataforma de Akil\'zon' WHERE `locale`='esMX' AND `ID`=11166; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pruebas de tótems llevadas a cabo' WHERE `locale`='esMX' AND `ID`=11169; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mocos disueltos' WHERE `locale`='esMX' AND `ID`=11174; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información conseguida' WHERE `locale`='esMX' AND `ID`=11180; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Colina de las brujas limpia' WHERE `locale`='esMX' AND `ID`=11183; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tienda norte quemada' WHERE `locale`='esMX' AND `ID`=11205; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Tienda noreste quemada' WHERE `locale`='esMX' AND `ID`=11205; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Tienda este quemada' WHERE `locale`='esMX' AND `ID`=11205; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pasta de pescado probada' WHERE `locale`='esMX' AND `ID`=11209; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grita fuera del banco' WHERE `locale`='esMX' AND `ID`=11293; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Grita en la Sala Militar' WHERE `locale`='esMX' AND `ID`=11293; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grita en la Sala de Exploradores' WHERE `locale`='esMX' AND `ID`=11293; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Grita en la Sala Mística' WHERE `locale`='esMX' AND `ID`=11293; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grita fuera del banco' WHERE `locale`='esMX' AND `ID`=11294; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Grita en la Sala Militar' WHERE `locale`='esMX' AND `ID`=11294; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grita en la Sala de Exploradores' WHERE `locale`='esMX' AND `ID`=11294; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Grita en la Sala Mística' WHERE `locale`='esMX' AND `ID`=11294; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mantén el trote durante 8 segundos' WHERE `locale`='esMX' AND `ID`=11318; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Mantén el medio galope durante 8 segundos' WHERE `locale`='esMX' AND `ID`=11318; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Mantén el galope durante 8 segundos' WHERE `locale`='esMX' AND `ID`=11318; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esMX' AND `ID`=11360; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esMX' AND `ID`=11361; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grita fuera de la casa de subastas' WHERE `locale`='esMX' AND `ID`=11407; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Grita en el Valle del Honor' WHERE `locale`='esMX' AND `ID`=11407; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grita en el Valle de la Sabiduría' WHERE `locale`='esMX' AND `ID`=11407; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Grita en el Valle de los Espíritus' WHERE `locale`='esMX' AND `ID`=11407; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grita fuera de la casa de subastas' WHERE `locale`='esMX' AND `ID`=11408; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Grita en el Valle del Honor' WHERE `locale`='esMX' AND `ID`=11408; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grita en el Valle de la Sabiduría' WHERE `locale`='esMX' AND `ID`=11408; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Grita en el Valle de los Espíritus' WHERE `locale`='esMX' AND `ID`=11408; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mantén el trote durante 8 segundos' WHERE `locale`='esMX' AND `ID`=11409; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Mantén el medio galope durante 8 segundos' WHERE `locale`='esMX' AND `ID`=11409; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Mantén el galope durante 8 segundos' WHERE `locale`='esMX' AND `ID`=11409; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barriles entregados' WHERE `locale`='esMX' AND `ID`=11412; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Casa comunal Desuelladragones destruida' WHERE `locale`='esMX' AND `ID`=11421; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Caseta del muelle Desuelladragones destruida' WHERE `locale`='esMX' AND `ID`=11421; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Almacén Desuelladragones destruido' WHERE `locale`='esMX' AND `ID`=11421; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esMX' AND `ID`=11439; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esMX' AND `ID`=11440; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esMX' AND `ID`=11449; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Apaga fuegos' WHERE `locale`='esMX' AND `ID`=11450; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbe de visión activado' WHERE `locale`='esMX' AND `ID`=11490; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Avizor transformado desplegado' WHERE `locale`='esMX' AND `ID`=11524; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Avizor transformado desplegado' WHERE `locale`='esMX' AND `ID`=11525; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Emisario del Odio empalado' WHERE `locale`='esMX' AND `ID`=11537; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Emisario del Odio empalado' WHERE `locale`='esMX' AND `ID`=11538; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavo Branquia Verde liberado' WHERE `locale`='esMX' AND `ID`=11541; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Velas Sin\'loren quemadas' WHERE `locale`='esMX' AND `ID`=11542; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Velas Juramento de Sangre quemadas' WHERE `locale`='esMX' AND `ID`=11542; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Velas Cazador del Albor quemadas' WHERE `locale`='esMX' AND `ID`=11542; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Velas Sin\'loren quemadas' WHERE `locale`='esMX' AND `ID`=11543; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Velas Juramento de Sangre quemadas' WHERE `locale`='esMX' AND `ID`=11543; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Velas Cazador del Albor quemadas' WHERE `locale`='esMX' AND `ID`=11543; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura de portal tomada' WHERE `locale`='esMX' AND `ID`=11547; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lectura del sagrario tomada' WHERE `locale`='esMX' AND `ID`=11547; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Lectura del cristal de sangre tomada' WHERE `locale`='esMX' AND `ID`=11547; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Renacuajo Aleta Invernal rescatado' WHERE `locale`='esMX' AND `ID`=11560; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Múrlocs Aleta Invernal muertos' WHERE `locale`='esMX' AND `ID`=11561; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura de la Anomalía del Acantilado Agrietado conseguida' WHERE `locale`='esMX' AND `ID`=11576; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura de la Sima Quebrada conseguida' WHERE `locale`='esMX' AND `ID`=11582; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisioneros Arcanos rescatados' WHERE `locale`='esMX' AND `ID`=11587; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hechicero de Berilo capturado' WHERE `locale`='esMX' AND `ID`=11590; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guardias y trabajadores de caravana muertos quemados' WHERE `locale`='esMX' AND `ID`=11593; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritus taunka en paz' WHERE `locale`='esMX' AND `ID`=11594; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nerub\'ar muertos' WHERE `locale`='esMX' AND `ID`=11598; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sacos de huevos Nerub\'ar destruidos' WHERE `locale`='esMX' AND `ID`=11602; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ancestro Kesuk identificado' WHERE `locale`='esMX' AND `ID`=11605; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ancestro Sagani identificado' WHERE `locale`='esMX' AND `ID`=11605; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Ancestro Takret identificado' WHERE `locale`='esMX' AND `ID`=11605; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Artesanos de Kashala liberados' WHERE `locale`='esMX' AND `ID`=11607; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Chamanes de Kashala liberados' WHERE `locale`='esMX' AND `ID`=11607; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sumidero sur de Nerub\'ar destruido' WHERE `locale`='esMX' AND `ID`=11608; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Sumidero este de Nerub\'ar destruido' WHERE `locale`='esMX' AND `ID`=11608; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Sumidero oeste de Nerub\'ar destruido' WHERE `locale`='esMX' AND `ID`=11608; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sumidero norte de Nerub\'ar destruido' WHERE `locale`='esMX' AND `ID`=11608; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ceremonia del ancestro Kesuk completada' WHERE `locale`='esMX' AND `ID`=11610; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ceremonia del ancestro Sagani completada' WHERE `locale`='esMX' AND `ID`=11610; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Ceremonia del ancestro Takret completada' WHERE `locale`='esMX' AND `ID`=11610; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Peón Grito de Guerra liberado' WHERE `locale`='esMX' AND `ID`=11611; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Plataforma este destruida' WHERE `locale`='esMX' AND `ID`=11617; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Plataforma norte destruida' WHERE `locale`='esMX' AND `ID`=11617; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Plataforma oeste destruida' WHERE `locale`='esMX' AND `ID`=11617; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cocer se ha rendido' WHERE `locale`='esMX' AND `ID`=11627; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Xurn se ha rendido' WHERE `locale`='esMX' AND `ID`=11627; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Destino del clarividente Caminante Siniestro vaticinado' WHERE `locale`='esMX' AND `ID`=11631; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aguja de Putrefacción inspeccionada' WHERE `locale`='esMX' AND `ID`=11633; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aguja de Sangre inspeccionada' WHERE `locale`='esMX' AND `ID`=11633; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Aguja de Dolor inspeccionada' WHERE `locale`='esMX' AND `ID`=11633; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Clarividente Caminante Siniestro liberado' WHERE `locale`='esMX' AND `ID`=11637; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera este neutralizada' WHERE `locale`='esMX' AND `ID`=11647; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Caldera central neutralizada' WHERE `locale`='esMX' AND `ID`=11647; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Caldera oeste neutralizada' WHERE `locale`='esMX' AND `ID`=11647; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisionero interrogado' WHERE `locale`='esMX' AND `ID`=11648; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Unidad de la Plaga destruida' WHERE `locale`='esMX' AND `ID`=11652; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Soldado Grito de Guerra herido rescatado' WHERE `locale`='esMX' AND `ID`=11652; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rayo de Ingeniosa puesto a prueba' WHERE `locale`='esMX' AND `ID`=11653; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Las Fauces de la Sierpe destruido' WHERE `locale`='esMX' AND `ID`=11656; +UPDATE `quest_template_locale` SET `ObjectiveText2`='El Kur Drakkar destruido' WHERE `locale`='esMX' AND `ID`=11656; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Martillo de Bor destruido' WHERE `locale`='esMX' AND `ID`=11656; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Yunque de Bor destruido' WHERE `locale`='esMX' AND `ID`=11656; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Globos de sangre destruidos' WHERE `locale`='esMX' AND `ID`=11659; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Estandarte Grito de Guerra clavado sobre Magmothregar' WHERE `locale`='esMX' AND `ID`=11670; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisionero de la Plaga liberado' WHERE `locale`='esMX' AND `ID`=11676; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esMX' AND `ID`=11677; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga de Talramas muerto' WHERE `locale`='esMX' AND `ID`=11683; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Marcar situación del sumidero sur' WHERE `locale`='esMX' AND `ID`=11684; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Marcar situación del sumidero noreste' WHERE `locale`='esMX' AND `ID`=11684; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Marcar situación del sumidero noroeste' WHERE `locale`='esMX' AND `ID`=11684; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Observar Granero Grito de Guerra' WHERE `locale`='esMX' AND `ID`=11686; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Observar Granja de Torp' WHERE `locale`='esMX' AND `ID`=11686; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Observar Matadero Grito de Guerra' WHERE `locale`='esMX' AND `ID`=11686; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kodos rescatados' WHERE `locale`='esMX' AND `ID`=11690; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esMX' AND `ID`=11694; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga de Talramas muerto' WHERE `locale`='esMX' AND `ID`=11698; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Túneles nerubianos derrumbados' WHERE `locale`='esMX' AND `ID`=11706; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gnomo de Palanqueta maldito y rescatado' WHERE `locale`='esMX' AND `ID`=11712; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Marcar situación del sumidero sur' WHERE `locale`='esMX' AND `ID`=11713; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Marcar situación del sumidero noreste' WHERE `locale`='esMX' AND `ID`=11713; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Marcar situación del sumidero noroeste' WHERE `locale`='esMX' AND `ID`=11713; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barriles de aceite recogidos' WHERE `locale`='esMX' AND `ID`=11715; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza el Vibro-Motor 5000' WHERE `locale`='esMX' AND `ID`=11723; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Robots reprogramados' WHERE `locale`='esMX' AND `ID`=11730; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Blandones golpeados' WHERE `locale`='esMX' AND `ID`=11731; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cultor en muelles derrotado' WHERE `locale`='esMX' AND `ID`=11794; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cultor en la cárcel derrotado' WHERE `locale`='esMX' AND `ID`=11794; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Cultor en la cocina derrotado' WHERE `locale`='esMX' AND `ID`=11794; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hunde los restos del este' WHERE `locale`='esMX' AND `ID`=11796; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Hunde los restos del sur' WHERE `locale`='esMX' AND `ID`=11796; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Hunde los restos del noroeste' WHERE `locale`='esMX' AND `ID`=11796; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Busca el manual del maestro de palancas' WHERE `locale`='esMX' AND `ID`=11798; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trampero de Nesingwary atrapado' WHERE `locale`='esMX' AND `ID`=11865; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cría de mamut liberada' WHERE `locale`='esMX' AND `ID`=11876; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lecturas multifase obtenidas' WHERE `locale`='esMX' AND `ID`=11880; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trae a Jenny a salvo sin perder el cargamento' WHERE `locale`='esMX' AND `ID`=11881; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Energía reunida' WHERE `locale`='esMX' AND `ID`=11893; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tormenta dominada' WHERE `locale`='esMX' AND `ID`=11895; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Robots debilitados y destruidos' WHERE `locale`='esMX' AND `ID`=11896; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Explosivos colocados en el sumidero sur' WHERE `locale`='esMX' AND `ID`=11897; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Explosivos colocados en el sumidero norte' WHERE `locale`='esMX' AND `ID`=11897; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alma de gnomo capturada' WHERE `locale`='esMX' AND `ID`=11899; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura geológica de El Nexo' WHERE `locale`='esMX' AND `ID`=11900; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lectura del sur de Gelidar' WHERE `locale`='esMX' AND `ID`=11900; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Lectura del norte de Gelidar' WHERE `locale`='esMX' AND `ID`=11900; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Lectura del oeste de Gelidar' WHERE `locale`='esMX' AND `ID`=11900; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagoneta de mena liberada' WHERE `locale`='esMX' AND `ID`=11904; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Falla interdimensional ralentizada' WHERE `locale`='esMX' AND `ID`=11905; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Busca el manual del maestro de palancas' WHERE `locale`='esMX' AND `ID`=11909; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grano de Lindeallá quemado' WHERE `locale`='esMX' AND `ID`=11913; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Draco de El Nexo capturado' WHERE `locale`='esMX' AND `ID`=11919; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Blandones golpeados' WHERE `locale`='esMX' AND `ID`=11921; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Blandones golpeados' WHERE `locale`='esMX' AND `ID`=11922; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Blandones golpeados' WHERE `locale`='esMX' AND `ID`=11926; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevos de draco destruidos' WHERE `locale`='esMX' AND `ID`=11936; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Baja en En\'kilah' WHERE `locale`='esMX' AND `ID`=11938; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Draco de El Nexo capturado' WHERE `locale`='esMX' AND `ID`=11940; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Embadúrnate con la sangre de Loguhn' WHERE `locale`='esMX' AND `ID`=11959; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Toca la campana de Lindeallá' WHERE `locale`='esMX' AND `ID`=11965; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Malygos atraído' WHERE `locale`='esMX' AND `ID`=11969; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Keristrasza en paz' WHERE `locale`='esMX' AND `ID`=11973; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Taunka admitidos en la Horda' WHERE `locale`='esMX' AND `ID`=11983; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Vuelo Azul en Jardines Reposo Lunar muertos' WHERE `locale`='esMX' AND `ID`=12006; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Los últimos ritos' WHERE `locale`='esMX' AND `ID`=12019; +UPDATE `quest_template_locale` SET `ObjectiveText1`='G.U.A.O. golpeada' WHERE `locale`='esMX' AND `ID`=12022; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritus Indu\'le en paz' WHERE `locale`='esMX' AND `ID`=12031; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Recolector de cosecha alterado' WHERE `locale`='esMX' AND `ID`=12035; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Arpías Viento Helado' WHERE `locale`='esMX' AND `ID`=12051; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Arpías Viento Helado' WHERE `locale`='esMX' AND `ID`=12052; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Primera Profecía descifrada' WHERE `locale`='esMX' AND `ID`=12058; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Segunda Profecía descifrada' WHERE `locale`='esMX' AND `ID`=12058; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Tercera Profecía descifrada' WHERE `locale`='esMX' AND `ID`=12058; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Objeto de la Aguja de Flujo observado' WHERE `locale`='esMX' AND `ID`=12060; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Objeto de la Aguja de Flujo observado' WHERE `locale`='esMX' AND `ID`=12061; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley conseguida' WHERE `locale`='esMX' AND `ID`=12065; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley conseguida' WHERE `locale`='esMX' AND `ID`=12066; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Defensores enanos férreos muertos' WHERE `locale`='esMX' AND `ID`=12073; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley obtenida' WHERE `locale`='esMX' AND `ID`=12083; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley obtenida' WHERE `locale`='esMX' AND `ID`=12084; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuerza devuelta a ancestro Lothalor' WHERE `locale`='esMX' AND `ID`=12092; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuerza devuelta a ancestro Lothalor' WHERE `locale`='esMX' AND `ID`=12096; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley obtenida' WHERE `locale`='esMX' AND `ID`=12107; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Observación en Santuario de Dragones Azur' WHERE `locale`='esMX' AND `ID`=12107; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información de foco de línea de Ley obtenida' WHERE `locale`='esMX' AND `ID`=12110; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Observación en Santuario de Dragones Azur' WHERE `locale`='esMX' AND `ID`=12110; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alce de avalancha inoculado' WHERE `locale`='esMX' AND `ID`=12111; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Pardo ártico inoculado' WHERE `locale`='esMX' AND `ID`=12111; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Roanauk Bruma de Hielo iniciado' WHERE `locale`='esMX' AND `ID`=12140; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Snóbolds Llano Nevado' WHERE `locale`='esMX' AND `ID`=12142; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Magnatauro del Cementerio de Dragones' WHERE `locale`='esMX' AND `ID`=12142; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Discípulos Llano Nevado' WHERE `locale`='esMX' AND `ID`=12144; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Magnatauros alfa' WHERE `locale`='esMX' AND `ID`=12144; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nombre del magnatauro Señor de la Guerra' WHERE `locale`='esMX' AND `ID`=12150; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sombra de Arugal derrotada' WHERE `locale`='esMX' AND `ID`=12164; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de alce contagiado limpio' WHERE `locale`='esMX' AND `ID`=12166; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cadáver de pardo rabioso limpio' WHERE `locale`='esMX' AND `ID`=12166; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alianzas en Río Negro eliminados' WHERE `locale`='esMX' AND `ID`=12170; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Armonización con las líneas Ley de Rasganorte' WHERE `locale`='esMX' AND `ID`=12172; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Armonización con las líneas Ley de Rasganorte' WHERE `locale`='esMX' AND `ID`=12173; +UPDATE `quest_template_locale` SET `ObjectiveText1`='G.U.A.O. golpeada' WHERE `locale`='esMX' AND `ID`=12191; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nivel de carga' WHERE `locale`='esMX' AND `ID`=12198; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Imágenes de enanos férreos tomadas' WHERE `locale`='esMX' AND `ID`=12202; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mensaje de Loken recibido' WHERE `locale`='esMX' AND `ID`=12203; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hugh Copa interrogado' WHERE `locale`='esMX' AND `ID`=12204; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gavrock interrogado' WHERE `locale`='esMX' AND `ID`=12204; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de El Embate Escarlata asesinados' WHERE `locale`='esMX' AND `ID`=12205; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Frasco de añublo probado' WHERE `locale`='esMX' AND `ID`=12206; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáveres de El Embate Escarlata limpiados' WHERE `locale`='esMX' AND `ID`=12211; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbe utilizado bajo el Corazón de Vordrassil' WHERE `locale`='esMX' AND `ID`=12213; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Orbe utilizado bajo la Extremidad de Vordrassil' WHERE `locale`='esMX' AND `ID`=12213; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Orbe utilizado bajo las Lágrimas de Vordrassil' WHERE `locale`='esMX' AND `ID`=12213; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Riendas de caballo de guerra de El Embate Escarlata entregadas' WHERE `locale`='esMX' AND `ID`=12214; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Historia de Orsonn' WHERE `locale`='esMX' AND `ID`=12231; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Historia de Kodian' WHERE `locale`='esMX' AND `ID`=12231; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Balista de Nueva Vega del Amparo bombardeada' WHERE `locale`='esMX' AND `ID`=12232; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ursoc purificado' WHERE `locale`='esMX' AND `ID`=12236; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habitante indefenso rescatado' WHERE `locale`='esMX' AND `ID`=12237; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Velas del Locura del Pecador en llamas' WHERE `locale`='esMX' AND `ID`=12243; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Torturador LeCraft completamente interrogado' WHERE `locale`='esMX' AND `ID`=12252; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habitante de Hibergarde atrapado rescatado' WHERE `locale`='esMX' AND `ID`=12253; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Imagen de sacerdote cuervo del Embate robada' WHERE `locale`='esMX' AND `ID`=12260; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Resguardo destructivo completamente cargado' WHERE `locale`='esMX' AND `ID`=12261; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Runa nigromántica destruida' WHERE `locale`='esMX' AND `ID`=12265; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Limpiar cámara de invocación' WHERE `locale`='esMX' AND `ID`=12267; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trituradora entregada' WHERE `locale`='esMX' AND `ID`=12270; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Acusación y muerte del comandante Jordan' WHERE `locale`='esMX' AND `ID`=12273; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Acusación y muerte del cañonero mayor Zierhut' WHERE `locale`='esMX' AND `ID`=12273; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Acusación y muerte del herrero Buenhombre' WHERE `locale`='esMX' AND `ID`=12273; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Acusación y muerte del maestro de establos Mercer' WHERE `locale`='esMX' AND `ID`=12273; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tocar campana de la abadía' WHERE `locale`='esMX' AND `ID`=12274; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Hablar con el sumo abad' WHERE `locale`='esMX' AND `ID`=12274; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Eje de Mina Hibergarde alta destruido' WHERE `locale`='esMX' AND `ID`=12277; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Eje de Mina Hibergarde baja destruido' WHERE `locale`='esMX' AND `ID`=12277; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Unidades de la Alianza eliminadas' WHERE `locale`='esMX' AND `ID`=12284; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hostigadores heridos sanados' WHERE `locale`='esMX' AND `ID`=12288; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preguntas a un campesino olvidado' WHERE `locale`='esMX' AND `ID`=12291; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Preguntas a un fusilero olvidado' WHERE `locale`='esMX' AND `ID`=12291; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Preguntas a un caballero olvidado' WHERE `locale`='esMX' AND `ID`=12291; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Preguntas a un lacayo olvidado' WHERE `locale`='esMX' AND `ID`=12291; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fantasmas olvidados asesinados' WHERE `locale`='esMX' AND `ID`=12304; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alianza eliminada en Bahía Ventura' WHERE `locale`='esMX' AND `ID`=12317; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rezagados de Ventura y Cía. ahuyentados' WHERE `locale`='esMX' AND `ID`=12324; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón de peste saboteado' WHERE `locale`='esMX' AND `ID`=12326; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Élite de la Séptima Legión bajado a salvo' WHERE `locale`='esMX' AND `ID`=12326; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Desestabiliza el Santuario de Dragones Azur' WHERE `locale`='esMX' AND `ID`=12372; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caballos mesteños de las Tierras Altas espantados' WHERE `locale`='esMX' AND `ID`=12415; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vigilante rubí devuelto a la tierra' WHERE `locale`='esMX' AND `ID`=12417; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Erradicar corrupción rubí' WHERE `locale`='esMX' AND `ID`=12418; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Envío de madera de la Alianza destruido' WHERE `locale`='esMX' AND `ID`=12432; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vigilante rubí devuelto a la tierra' WHERE `locale`='esMX' AND `ID`=12449; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Erradicar corrupción rubí' WHERE `locale`='esMX' AND `ID`=12450; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vista de águila imperial unida' WHERE `locale`='esMX' AND `ID`=12453; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldado de la Séptima Legión herido salvado' WHERE `locale`='esMX' AND `ID`=12457; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Miembro de la Plaga de Naxxramas matado' WHERE `locale`='esMX' AND `ID`=12462; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de El Embate Escarlata muerto' WHERE `locale`='esMX' AND `ID`=12476; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Secretos del pasado revelados' WHERE `locale`='esMX' AND `ID`=12478; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Misión del capitán Brandon' WHERE `locale`='esMX' AND `ID`=12501; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Misión del capitán Rupert' WHERE `locale`='esMX' AND `ID`=12501; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Misión del capitán Grondel' WHERE `locale`='esMX' AND `ID`=12501; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Misión del alquimista Finklestein' WHERE `locale`='esMX' AND `ID`=12501; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Estandarte de la Cruzada Argenta sur' WHERE `locale`='esMX' AND `ID`=12502; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Estandarte de la Cruzada Argenta norte' WHERE `locale`='esMX' AND `ID`=12502; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Estandarte de la Cruzada Argenta este' WHERE `locale`='esMX' AND `ID`=12502; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Plaga en El Confín Argenta destruida' WHERE `locale`='esMX' AND `ID`=12503; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldados Argenta enviados a ver al sargento' WHERE `locale`='esMX' AND `ID`=12504; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Seguidores de Sseratus muertos' WHERE `locale`='esMX' AND `ID`=12508; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Valor de los reclutas recuperado' WHERE `locale`='esMX' AND `ID`=12509; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado Jonathan salvado' WHERE `locale`='esMX' AND `ID`=12512; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cruzado Lamoof salvado' WHERE `locale`='esMX' AND `ID`=12512; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Cruzada Josephine salvada' WHERE `locale`='esMX' AND `ID`=12512; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de Ventura y Cía. asesinados' WHERE `locale`='esMX' AND `ID`=12524; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Górloc Susurraneblina' WHERE `locale`='esMX' AND `ID`=12538; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Oráculo Hablalluvia herido encontrado' WHERE `locale`='esMX' AND `ID`=12540; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Suero de la verdad creado' WHERE `locale`='esMX' AND `ID`=12541; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ubicación de Farunn descubierta' WHERE `locale`='esMX' AND `ID`=12544; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga en Jintha\'kalar matado' WHERE `locale`='esMX' AND `ID`=12545; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esbirros de la Plaga destruidos' WHERE `locale`='esMX' AND `ID`=12546; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huella de Shango identificada' WHERE `locale`='esMX' AND `ID`=12550; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pulverizadores de peste atrapados con red y destruidos' WHERE `locale`='esMX' AND `ID`=12555; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gusano de fango encontrado' WHERE `locale`='esMX' AND `ID`=12557; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ala de murciélago mustia encontrada' WHERE `locale`='esMX' AND `ID`=12557; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Grano ámbar encontrado' WHERE `locale`='esMX' AND `ID`=12557; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Moco de serpiente frío encontrado' WHERE `locale`='esMX' AND `ID`=12557; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Interruptor de activación Gamma' WHERE `locale`='esMX' AND `ID`=12559; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Misión del capitán Brandon' WHERE `locale`='esMX' AND `ID`=12563; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Misión del capitán Rupert' WHERE `locale`='esMX' AND `ID`=12563; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Misión del capitán Grondel' WHERE `locale`='esMX' AND `ID`=12563; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Misión del alquimista Finklestein' WHERE `locale`='esMX' AND `ID`=12563; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de lacayo Argenta incinerado' WHERE `locale`='esMX' AND `ID`=12568; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Víctimas Caminamoho rescatadas' WHERE `locale`='esMX' AND `ID`=12580; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Misión del capitán Brandon' WHERE `locale`='esMX' AND `ID`=12587; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Misión del capitán Rupert' WHERE `locale`='esMX' AND `ID`=12587; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Misión del capitán Grondel' WHERE `locale`='esMX' AND `ID`=12587; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Misión del alquimista Finklestein' WHERE `locale`='esMX' AND `ID`=12587; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Túmulos antiguos investigados' WHERE `locale`='esMX' AND `ID`=12588; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alcanzada la manzana en la cabeza de Suertudo Wilhelm' WHERE `locale`='esMX' AND `ID`=12589; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Túneles nerubianos hundidos' WHERE `locale`='esMX' AND `ID`=12591; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Animales de caza muertos' WHERE `locale`='esMX' AND `ID`=12592; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Arrasadores musgosos muertos' WHERE `locale`='esMX' AND `ID`=12594; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Misión del capitán Brandon' WHERE `locale`='esMX' AND `ID`=12596; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Misión del capitán Rupert' WHERE `locale`='esMX' AND `ID`=12596; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Misión del capitán Grondel' WHERE `locale`='esMX' AND `ID`=12596; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Misión del alquimista Finklestein' WHERE `locale`='esMX' AND `ID`=12596; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Túneles nerubianos hundidos' WHERE `locale`='esMX' AND `ID`=12598; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Suero de la verdad creado' WHERE `locale`='esMX' AND `ID`=12601; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Suero de la verdad creado' WHERE `locale`='esMX' AND `ID`=12602; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lacayos cautivos liberados' WHERE `locale`='esMX' AND `ID`=12606; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mamut Partecolmillos entregado' WHERE `locale`='esMX' AND `ID`=12607; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Interruptor de activación Theta activado' WHERE `locale`='esMX' AND `ID`=12613; +UPDATE `quest_template_locale` SET `ObjectiveText1`='La cólera de la guardiana de vida' WHERE `locale`='esMX' AND `ID`=12620; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El pacto de Freya' WHERE `locale`='esMX' AND `ID`=12621; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera azul estropeada' WHERE `locale`='esMX' AND `ID`=12627; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Caldera verde estropeada' WHERE `locale`='esMX' AND `ID`=12627; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Caldera púrpura estropeada' WHERE `locale`='esMX' AND `ID`=12627; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Caldera roja estropeada' WHERE `locale`='esMX' AND `ID`=12627; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras de pelo recogidas' WHERE `locale`='esMX' AND `ID`=12630; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Descendiente de Har\'koa maldito resucitado' WHERE `locale`='esMX' AND `ID`=12632; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El propósito de la gargantilla al descubierto' WHERE `locale`='esMX' AND `ID`=12637; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El propósito de la gargantilla al descubierto' WHERE `locale`='esMX' AND `ID`=12638; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fallas elementales selladas' WHERE `locale`='esMX' AND `ID`=12640; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cata de Hemet' WHERE `locale`='esMX' AND `ID`=12645; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cata de Hadrius' WHERE `locale`='esMX' AND `ID`=12645; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Cata de Tamara' WHERE `locale`='esMX' AND `ID`=12645; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos putrefactos alimentados' WHERE `locale`='esMX' AND `ID`=12652; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cabellera de trols de Heb\'Drakkar cortada' WHERE `locale`='esMX' AND `ID`=12659; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Explosivos inestables destruidos' WHERE `locale`='esMX' AND `ID`=12660; +UPDATE `quest_template_locale` SET `ObjectiveText1`='La tarea del Señor Supremo Drakuru completada' WHERE `locale`='esMX' AND `ID`=12661; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vuelta por Zul\'Drak completada' WHERE `locale`='esMX' AND `ID`=12663; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vuelta por Zul\'Drak completada' WHERE `locale`='esMX' AND `ID`=12664; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trols asesinados cerca de la fuente de almas' WHERE `locale`='esMX' AND `ID`=12668; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tarea de Drakuru completada' WHERE `locale`='esMX' AND `ID`=12669; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aditivo diluido en calderas de añublo' WHERE `locale`='esMX' AND `ID`=12669; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cristales de añublo recogidos' WHERE `locale`='esMX' AND `ID`=12673; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Maleficio mortal echado al sumo sacerdote Mu\'funu' WHERE `locale`='esMX' AND `ID`=12674; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Maleficio mortal echado a la suma sacerdotisa Tua-Tua' WHERE `locale`='esMX' AND `ID`=12674; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Maleficio mortal echado al sumo sacerdote Hawinni' WHERE `locale`='esMX' AND `ID`=12674; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carros de la Plaga destruidos' WHERE `locale`='esMX' AND `ID`=12676; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Tarea de Drakuru completada' WHERE `locale`='esMX' AND `ID`=12676; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Desvelar el secreto de Drakuru' WHERE `locale`='esMX' AND `ID`=12676; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tarea de Drakuru completada' WHERE `locale`='esMX' AND `ID`=12677; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras de esputo recogidas' WHERE `locale`='esMX' AND `ID`=12683; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Darmuk muerto' WHERE `locale`='esMX' AND `ID`=12686; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Trituracráneos Drakkari asesinados' WHERE `locale`='esMX' AND `ID`=12690; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Cabecilla Drakkari capturado' WHERE `locale`='esMX' AND `ID`=12690; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Górlocs Pavesa muertos' WHERE `locale`='esMX' AND `ID`=12703; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacantes Corazón Frenético muertos' WHERE `locale`='esMX' AND `ID`=12705; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Discípulos de Mam\'toth muertos aplastados' WHERE `locale`='esMX' AND `ID`=12707; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guerreros Tiki encantados exterminados' WHERE `locale`='esMX' AND `ID`=12708; +UPDATE `quest_template_locale` SET `ObjectiveText1`='La cámara superior de Drakuru explorada' WHERE `locale`='esMX' AND `ID`=12710; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Señor Supremo Drakuru derrotado' WHERE `locale`='esMX' AND `ID`=12713; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu acuoso devorado' WHERE `locale`='esMX' AND `ID`=12726; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aparecido tormentoso devorado' WHERE `locale`='esMX' AND `ID`=12726; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lectura de las Cavernas Aletas Invernal tomada' WHERE `locale`='esMX' AND `ID`=12728; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Hoja manchada de sangre con una avispa del Enjambre Zafiro' WHERE `locale`='esMX' AND `ID`=12734; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Hoja manchada de sangre con un destrero Callonudillo' WHERE `locale`='esMX' AND `ID`=12734; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Hoja manchada de sangre con miembros Susurraneblina' WHERE `locale`='esMX' AND `ID`=12734; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Meditación en El Pilar Iluminado' WHERE `locale`='esMX' AND `ID`=12736; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Meditación en El Pilar Musgoluz' WHERE `locale`='esMX' AND `ID`=12736; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Meditación en El Pilar del Trecho Celestial' WHERE `locale`='esMX' AND `ID`=12736; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Meditación en El Pilar Toquesol' WHERE `locale`='esMX' AND `ID`=12736; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Canción de la fecundidad tocada' WHERE `locale`='esMX' AND `ID`=12737; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuerzas Argenta equipadas con un paracaídas' WHERE `locale`='esMX' AND `ID`=12740; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Górloc Pavesa' WHERE `locale`='esMX' AND `ID`=12759; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Górloc Pavesa' WHERE `locale`='esMX' AND `ID`=12760; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacante Corazón Frenético' WHERE `locale`='esMX' AND `ID`=12761; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacante Corazón Frenético' WHERE `locale`='esMX' AND `ID`=12762; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Energía de sangrevida recuperada' WHERE `locale`='esMX' AND `ID`=12805; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sangre recogida de fauces voraces' WHERE `locale`='esMX' AND `ID`=12810; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de El Embate Escarlata transformado' WHERE `locale`='esMX' AND `ID`=12813; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grifo del Embate entregado a Uzo Clamamuerte' WHERE `locale`='esMX' AND `ID`=12814; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Agresores de Garm muertos' WHERE `locale`='esMX' AND `ID`=12820; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Colocar fardo explosivo' WHERE `locale`='esMX' AND `ID`=12823; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Arañas Red de Cristal muertas' WHERE `locale`='esMX' AND `ID`=12829; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Invasor de Garm muerto' WHERE `locale`='esMX' AND `ID`=12833; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Capitán Welsington interrogado a golpes y muerto' WHERE `locale`='esMX' AND `ID`=12840; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Capitana Hartford interrogada a golpes y muerta' WHERE `locale`='esMX' AND `ID`=12840; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisionero goblin liberado' WHERE `locale`='esMX' AND `ID`=12843; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Puerta de Arete invocada' WHERE `locale`='esMX' AND `ID`=12847; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huargos de escarcha quemados' WHERE `locale`='esMX' AND `ID`=12851; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gigantes de escarcha quemados' WHERE `locale`='esMX' AND `ID`=12851; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gran almirante Viento Oeste derrotado' WHERE `locale`='esMX' AND `ID`=12852; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rastrear al ladrón' WHERE `locale`='esMX' AND `ID`=12855; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisioneras Brunnhildar rescatadas' WHERE `locale`='esMX' AND `ID`=12856; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Protodracos liberados' WHERE `locale`='esMX' AND `ID`=12856; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuego de cabaña apagado' WHERE `locale`='esMX' AND `ID`=12859; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Datos ocultos reunidos' WHERE `locale`='esMX' AND `ID`=12860; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Garrafuria capturado liberado' WHERE `locale`='esMX' AND `ID`=12861; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Águilas de Crestormenta alimentadas' WHERE `locale`='esMX' AND `ID`=12865; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Invasores Tronaforjado muertos' WHERE `locale`='esMX' AND `ID`=12876; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Jinete de dracos de El Encuentro Hyldnir derrotada' WHERE `locale`='esMX' AND `ID`=12886; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El Ocular ha sido destruido' WHERE `locale`='esMX' AND `ID`=12887; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El Ocular ha sido destruido' WHERE `locale`='esMX' AND `ID`=12892; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vil transformado' WHERE `locale`='esMX' AND `ID`=12893; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lady Bosqueténebro transformada' WHERE `locale`='esMX' AND `ID`=12893; +UPDATE `quest_template_locale` SET `ObjectiveText3`='El Saltador transformado' WHERE `locale`='esMX' AND `ID`=12893; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado Dargath encontrado' WHERE `locale`='esMX' AND `ID`=12903; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gerk encontrado' WHERE `locale`='esMX' AND `ID`=12903; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Burr encontrado' WHERE `locale`='esMX' AND `ID`=12903; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vargul muerto' WHERE `locale`='esMX' AND `ID`=12904; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykul exhausto disciplinado' WHERE `locale`='esMX' AND `ID`=12906; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sigue el olor hasta su fuente' WHERE `locale`='esMX' AND `ID`=12910; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Funciona' WHERE `locale`='esMX' AND `ID`=12911; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fjorn asesinado' WHERE `locale`='esMX' AND `ID`=12915; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gigantes de hierro Tronaforjado asesinados' WHERE `locale`='esMX' AND `ID`=12915; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Recinto de la Plaga reventado' WHERE `locale`='esMX' AND `ID`=12916; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ser de la Plaga muerto' WHERE `locale`='esMX' AND `ID`=12919; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con Brann' WHERE `locale`='esMX' AND `ID`=12920; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Yunque de Fjorn llevado a Dun Niffelem' WHERE `locale`='esMX' AND `ID`=12924; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Datos ocultos reunidos' WHERE `locale`='esMX' AND `ID`=12927; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacante Tronaforjado eliminado' WHERE `locale`='esMX' AND `ID`=12931; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Defensores terráneos caídos sanados' WHERE `locale`='esMX' AND `ID`=12937; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Combatientes Mjordin desafiados y derrotados' WHERE `locale`='esMX' AND `ID`=12939; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fuegos iniciados' WHERE `locale`='esMX' AND `ID`=12953; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sigrid Hielonato derrotada' WHERE `locale`='esMX' AND `ID`=12955; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Efrem el Leal derrotado' WHERE `locale`='esMX' AND `ID`=12955; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Onu\'zun derrotado' WHERE `locale`='esMX' AND `ID`=12955; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Mañosa Silbatin derrotada' WHERE `locale`='esMX' AND `ID`=12955; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Intento de liberar a mecagnomo cautivo' WHERE `locale`='esMX' AND `ID`=12957; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Furia de Loken destruida' WHERE `locale`='esMX' AND `ID`=12965; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Poder de Loken destruido' WHERE `locale`='esMX' AND `ID`=12965; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Favor de Loken destruido' WHERE `locale`='esMX' AND `ID`=12965; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aparecidos hirvientes eliminados' WHERE `locale`='esMX' AND `ID`=12967; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Escucha la propuesta de Lok\'lira' WHERE `locale`='esMX' AND `ID`=12970; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Antepasado de Niffelem liberado' WHERE `locale`='esMX' AND `ID`=12977; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Natoescarcha inquieto liberado' WHERE `locale`='esMX' AND `ID`=12977; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nidavelir Tronaforjado eliminado' WHERE `locale`='esMX' AND `ID`=12978; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Placa de armadura investigada' WHERE `locale`='esMX' AND `ID`=12980; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prisioneros de la Espada de Ébano liberados' WHERE `locale`='esMX' AND `ID`=12982; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Matriarca faucehielo rescatada' WHERE `locale`='esMX' AND `ID`=12983; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Templo de la Invención examinado' WHERE `locale`='esMX' AND `ID`=12986; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Templo del Invierno examinado' WHERE `locale`='esMX' AND `ID`=12986; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Templo de la vida examinado' WHERE `locale`='esMX' AND `ID`=12986; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Templo del Orden examinado' WHERE `locale`='esMX' AND `ID`=12986; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Yelmo de Hodir montado' WHERE `locale`='esMX' AND `ID`=12987; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Forja de relámpagos norte dañada' WHERE `locale`='esMX' AND `ID`=12988; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Forja de relámpagos central dañada' WHERE `locale`='esMX' AND `ID`=12988; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Forja de relámpagos sur dañada' WHERE `locale`='esMX' AND `ID`=12988; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykul de Jotunheim eliminado' WHERE `locale`='esMX' AND `ID`=12992; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Infiltrados Tronaforjado eliminados' WHERE `locale`='esMX' AND `ID`=12994; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Estandarte de la Espada de Ébano situado cerca de cadáver vrykul' WHERE `locale`='esMX' AND `ID`=12995; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kirgaraak derrotado' WHERE `locale`='esMX' AND `ID`=12996; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Intenta proteger el Corazón de la Tormenta' WHERE `locale`='esMX' AND `ID`=12998; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vermis salvaje muerta' WHERE `locale`='esMX' AND `ID`=13003; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Centinela férreo asesinado' WHERE `locale`='esMX' AND `ID`=13005; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Atacante enano férreo asesinado' WHERE `locale`='esMX' AND `ID`=13005; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado enredado liberado' WHERE `locale`='esMX' AND `ID`=13008; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Destino de Krolmir descubierto' WHERE `locale`='esMX' AND `ID`=13010; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lee el primer pergamino de Historia' WHERE `locale`='esMX' AND `ID`=13034; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lee el segundo pergamino de Historia' WHERE `locale`='esMX' AND `ID`=13034; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Lee el tercer pergamino de historia' WHERE `locale`='esMX' AND `ID`=13034; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pregúntale al cabecilla Lanza Presta sobre sus recuerdos' WHERE `locale`='esMX' AND `ID`=13037; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Fallas de Témpano Gélido cerradas' WHERE `locale`='esMX' AND `ID`=13038; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Nerubianos de las Profundidades Olvidadas destruidos' WHERE `locale`='esMX' AND `ID`=13039; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información sacada a golpes del aprendiz Osterkilgr' WHERE `locale`='esMX' AND `ID`=13042; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado capturado rescatado' WHERE `locale`='esMX' AND `ID`=13045; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu de Arngrim alimentado' WHERE `locale`='esMX' AND `ID`=13046; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Martillo de conocimiento armonizado a la era de Pezuña Tomentosa' WHERE `locale`='esMX' AND `ID`=13048; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Veranus atraída' WHERE `locale`='esMX' AND `ID`=13051; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Línea temporal verdadera restaurada' WHERE `locale`='esMX' AND `ID`=13058; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Desafío solicitado usando la espada de Bethod' WHERE `locale`='esMX' AND `ID`=13059; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Escuchada la historia de Thorim' WHERE `locale`='esMX' AND `ID`=13064; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Protodracos de Jotunheim y jinetes derribados' WHERE `locale`='esMX' AND `ID`=13069; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Edificios vrykul incendiados' WHERE `locale`='esMX' AND `ID`=13071; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Estandartes vrykul quemados' WHERE `locale`='esMX' AND `ID`=13084; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Atacantes de la Plaga eliminados' WHERE `locale`='esMX' AND `ID`=13086; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykuls Jotunheim eliminados mientras posees a un terror de agua' WHERE `locale`='esMX' AND `ID`=13091; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gal\'darah asesinado' WHERE `locale`='esMX' AND `ID`=13096; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Volkhan derrotado' WHERE `locale`='esMX' AND `ID`=13109; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritus inquietos liberados' WHERE `locale`='esMX' AND `ID`=13110; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Altar de Invocación investigado' WHERE `locale`='esMX' AND `ID`=13117; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Primer altar de Invocación destruido' WHERE `locale`='esMX' AND `ID`=13119; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Segundo altar de Invocación destruido' WHERE `locale`='esMX' AND `ID`=13119; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Tercer altar de Invocación destruido' WHERE `locale`='esMX' AND `ID`=13119; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Cuarto altar de Invocación destruido' WHERE `locale`='esMX' AND `ID`=13119; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbe colocado en el laboratorio de abominaciones' WHERE `locale`='esMX' AND `ID`=13120; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Orbe colocado en el laboratorio de gigantes de carne' WHERE `locale`='esMX' AND `ID`=13120; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Orbe colocado en la zona de la caldera' WHERE `locale`='esMX' AND `ID`=13120; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Información para la Bruja Osaria conseguida' WHERE `locale`='esMX' AND `ID`=13121; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ensamblajes de centrifugadoras destruidos' WHERE `locale`='esMX' AND `ID`=13126; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Varos Zancanubes derrotado' WHERE `locale`='esMX' AND `ID`=13126; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Señor de la Magia Urom derrotado' WHERE `locale`='esMX' AND `ID`=13127; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guardián-Ley Eregos derrotado' WHERE `locale`='esMX' AND `ID`=13128; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rey Ymiron asesinado' WHERE `locale`='esMX' AND `ID`=13132; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Iskalder llevado a la Bruja Osaria' WHERE `locale`='esMX' AND `ID`=13133; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Orbes de sangre rotos' WHERE `locale`='esMX' AND `ID`=13134; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Tanques de líquido de embalsamar destruidos' WHERE `locale`='esMX' AND `ID`=13134; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Iskalder derrotado en combate' WHERE `locale`='esMX' AND `ID`=13137; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Acechador ágil subyugado devuelto' WHERE `locale`='esMX' AND `ID`=13143; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Abominaciones encadenadas quemadas' WHERE `locale`='esMX' AND `ID`=13144; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Altar de sacrificio inspeccionado' WHERE `locale`='esMX' AND `ID`=13145; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Forja de sangre inspeccionada' WHERE `locale`='esMX' AND `ID`=13145; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Oteador de hielo inspeccionado' WHERE `locale`='esMX' AND `ID`=13145; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Runas inspeccionadas' WHERE `locale`='esMX' AND `ID`=13145; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Bombas de la Plaga entregadas' WHERE `locale`='esMX' AND `ID`=13146; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pelea entre obreros iniciada' WHERE `locale`='esMX' AND `ID`=13147; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cajas de grano apestado disipadas' WHERE `locale`='esMX' AND `ID`=13149; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Mal\'Ganis derrotado' WHERE `locale`='esMX' AND `ID`=13151; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Parches liberado' WHERE `locale`='esMX' AND `ID`=13152; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ayudar a Parches a matar al doctor Sabnok' WHERE `locale`='esMX' AND `ID`=13152; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cianigosa asesinada' WHERE `locale`='esMX' AND `ID`=13159; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Centinelas Piel de Hielo aniquilados' WHERE `locale`='esMX' AND `ID`=13160; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Miembro de la Plaga asesinado' WHERE `locale`='esMX' AND `ID`=13166; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Canes de peste hambrientos alimentados' WHERE `locale`='esMX' AND `ID`=13169; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Oteadores inquietos asesinados' WHERE `locale`='esMX' AND `ID`=13170; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cristales de la Plaga desterrados' WHERE `locale`='esMX' AND `ID`=13171; +UPDATE `quest_template_locale` SET `ObjectiveText1`='No-muerto de la Cantera Llorosa masacrado' WHERE `locale`='esMX' AND `ID`=13172; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de la Horda asesinados' WHERE `locale`='esMX' AND `ID`=13177; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de la Alianza asesinados' WHERE `locale`='esMX' AND `ID`=13178; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de la Horda asesinados' WHERE `locale`='esMX' AND `ID`=13179; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros de la Alianza asesinados' WHERE `locale`='esMX' AND `ID`=13180; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevos de la Plaga nerubianos destruidos' WHERE `locale`='esMX' AND `ID`=13182; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aparatos de asedio de la Alianza destruidos' WHERE `locale`='esMX' AND `ID`=13185; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aparatos de asedio de la Horda destruidos' WHERE `locale`='esMX' AND `ID`=13186; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Los Olvidados aniquilados' WHERE `locale`='esMX' AND `ID`=13187; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Heraldo Volazj derrotado' WHERE `locale`='esMX' AND `ID`=13187; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver de vigía Ahn\'kahar quemado' WHERE `locale`='esMX' AND `ID`=13190; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Exploración de Brann completada' WHERE `locale`='esMX' AND `ID`=13207; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cadáver purulento quemado' WHERE `locale`='esMX' AND `ID`=13211; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Cruzado Olakini Sainrith resucitado' WHERE `locale`='esMX' AND `ID`=13220; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vehículo de asedio defendido' WHERE `locale`='esMX' AND `ID`=13222; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vehículo de asedio de la Horda defendido' WHERE `locale`='esMX' AND `ID`=13223; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rabioso moribundo interrogado' WHERE `locale`='esMX' AND `ID`=13228; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldado de la Alianza moribundo asesinado' WHERE `locale`='esMX' AND `ID`=13230; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldado moribundo interrogado' WHERE `locale`='esMX' AND `ID`=13231; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Soldados moribundos asesinados' WHERE `locale`='esMX' AND `ID`=13232; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esbirro necrófago alzado' WHERE `locale`='esMX' AND `ID`=13236; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Abominaciones descomunales asesinadas' WHERE `locale`='esMX' AND `ID`=13237; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Nigromantes malévolos asesinados' WHERE `locale`='esMX' AND `ID`=13237; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Adepto de sombra asesinado' WHERE `locale`='esMX' AND `ID`=13237; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prueba del campo completada' WHERE `locale`='esMX' AND `ID`=13239; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ensayo de campo realizado' WHERE `locale`='esMX' AND `ID`=13261; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos de Hielo explotados' WHERE `locale`='esMX' AND `ID`=13264; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Geists sañosos explotados' WHERE `locale`='esMX' AND `ID`=13264; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Soldados de la Alianza resucitados explotados' WHERE `locale`='esMX' AND `ID`=13264; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos de Hielo explotados' WHERE `locale`='esMX' AND `ID`=13276; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Geists sañosos explotados' WHERE `locale`='esMX' AND `ID`=13276; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Soldados de la Alianza resucitados explotados' WHERE `locale`='esMX' AND `ID`=13276; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Coprous el Profanado derrotado' WHERE `locale`='esMX' AND `ID`=13278; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esMX' AND `ID`=13279; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Confalón de batalla de la Alianza plantado' WHERE `locale`='esMX' AND `ID`=13280; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esMX' AND `ID`=13281; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Confalón de batalla de la Horda plantado' WHERE `locale`='esMX' AND `ID`=13283; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tropas de la Alianza escoltadas hasta Ymirheim' WHERE `locale`='esMX' AND `ID`=13284; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ayuda a Brann a crear la piedra angular' WHERE `locale`='esMX' AND `ID`=13285; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Abominaciones descomunales asesinadas' WHERE `locale`='esMX' AND `ID`=13287; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Nigromantes malévolos asesinados' WHERE `locale`='esMX' AND `ID`=13287; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Adepto de sombra asesinado' WHERE `locale`='esMX' AND `ID`=13287; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos de Hielo explotados' WHERE `locale`='esMX' AND `ID`=13288; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Geists sañosos explotados' WHERE `locale`='esMX' AND `ID`=13288; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Soldados de la Alianza resucitados explotados' WHERE `locale`='esMX' AND `ID`=13288; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Necrófagos de Hielo explotados' WHERE `locale`='esMX' AND `ID`=13289; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Geists sañosos explotados' WHERE `locale`='esMX' AND `ID`=13289; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Soldados de la Alianza resucitados explotados' WHERE `locale`='esMX' AND `ID`=13289; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pruebas de campo realizadas' WHERE `locale`='esMX' AND `ID`=13291; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Garfacielo Razaescarcha matado' WHERE `locale`='esMX' AND `ID`=13292; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Pila de peste neutralizada' WHERE `locale`='esMX' AND `ID`=13295; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Caldera de peste neutralizada' WHERE `locale`='esMX' AND `ID`=13297; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Coprous el Profanado derrotado' WHERE `locale`='esMX' AND `ID`=13298; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Completar logro: Maestro cultural de Rasganorte' WHERE `locale`='esMX' AND `ID`=13299; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavo de las minas de saronita rescatado' WHERE `locale`='esMX' AND `ID`=13300; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tropas de la Horda escoltadas hasta Ymirheim' WHERE `locale`='esMX' AND `ID`=13301; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavo de las minas de saronita rescatado' WHERE `locale`='esMX' AND `ID`=13302; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Completar logro: Maestro cultural de Rasganorte' WHERE `locale`='esMX' AND `ID`=13303; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barricadas construidas' WHERE `locale`='esMX' AND `ID`=13306; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Infiltrados de El Rompecielos ayudados' WHERE `locale`='esMX' AND `ID`=13309; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Infiltrados Kor\'kron ayudados' WHERE `locale`='esMX' AND `ID`=13310; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aviones de caza de El Rompecielos derribados' WHERE `locale`='esMX' AND `ID`=13313; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aldur\'thar sur visitado' WHERE `locale`='esMX' AND `ID`=13315; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aldur\'thar central visitado' WHERE `locale`='esMX' AND `ID`=13315; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Aldur\'thar norte visitado' WHERE `locale`='esMX' AND `ID`=13315; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Aldur\'thar noroeste visitado' WHERE `locale`='esMX' AND `ID`=13315; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Subyugador oscuro arrastrado y soltado' WHERE `locale`='esMX' AND `ID`=13318; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sobrestante Faedris asesinado' WHERE `locale`='esMX' AND `ID`=13319; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Sobrestante Jhaeqon asesinado' WHERE `locale`='esMX' AND `ID`=13319; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Sobrestante Veraj asesinado' WHERE `locale`='esMX' AND `ID`=13319; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sobrestante Savryn asesinado' WHERE `locale`='esMX' AND `ID`=13319; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestra azul recogida' WHERE `locale`='esMX' AND `ID`=13320; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Muestra verde recogida' WHERE `locale`='esMX' AND `ID`=13320; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Muestra negra recogida' WHERE `locale`='esMX' AND `ID`=13320; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Masa aviesa expulsada' WHERE `locale`='esMX' AND `ID`=13321; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Masa aviesa expulsada' WHERE `locale`='esMX' AND `ID`=13322; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Subyugador oscuro arrastrado y soltado' WHERE `locale`='esMX' AND `ID`=13323; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huesos de atracadores esqueléticos disueltos' WHERE `locale`='esMX' AND `ID`=13329; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykul de Ymirheim asesinados' WHERE `locale`='esMX' AND `ID`=13330; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aviones de caza de El Rompecielos derribados' WHERE `locale`='esMX' AND `ID`=13331; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Barricadas construidas' WHERE `locale`='esMX' AND `ID`=13332; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huesos de atracadores esqueléticos disueltos' WHERE `locale`='esMX' AND `ID`=13335; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykul de Ymirheim asesinados ' WHERE `locale`='esMX' AND `ID`=13336; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alumeth el Ascendido derrotado' WHERE `locale`='esMX' AND `ID`=13346; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alumeth el Ascendido asesinado' WHERE `locale`='esMX' AND `ID`=13350; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Aldur\'thar sur visitado' WHERE `locale`='esMX' AND `ID`=13351; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aldur\'thar central visitado' WHERE `locale`='esMX' AND `ID`=13351; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Aldur\'thar norte visitado' WHERE `locale`='esMX' AND `ID`=13351; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Aldur\'thar noroeste visitado' WHERE `locale`='esMX' AND `ID`=13351; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Subyugador oscuro arrastrado y soltado' WHERE `locale`='esMX' AND `ID`=13352; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Subyugador oscuro arrastrado y soltado' WHERE `locale`='esMX' AND `ID`=13353; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sobrestante Faedris asesinado' WHERE `locale`='esMX' AND `ID`=13354; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Sobrestante Jhaeqon asesinado' WHERE `locale`='esMX' AND `ID`=13354; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Sobrestante Veraj asesinado' WHERE `locale`='esMX' AND `ID`=13354; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Sobrestante Savryn asesinado' WHERE `locale`='esMX' AND `ID`=13354; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestra azul recogida' WHERE `locale`='esMX' AND `ID`=13355; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Muestra verde recogida' WHERE `locale`='esMX' AND `ID`=13355; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Muestra negra recogida' WHERE `locale`='esMX' AND `ID`=13355; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Masa aviesa expulsada' WHERE `locale`='esMX' AND `ID`=13356; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Masa aviesa expulsada' WHERE `locale`='esMX' AND `ID`=13357; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El destino del príncipe' WHERE `locale`='esMX' AND `ID`=13361; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gambito de Tirion' WHERE `locale`='esMX' AND `ID`=13364; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alumeth el Ascendido derrotado' WHERE `locale`='esMX' AND `ID`=13367; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Alumeth el Ascendido derrotado' WHERE `locale`='esMX' AND `ID`=13368; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esbirro necrófago alzado' WHERE `locale`='esMX' AND `ID`=13395; +UPDATE `quest_template_locale` SET `ObjectiveText1`='El destino del príncipe' WHERE `locale`='esMX' AND `ID`=13400; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gambito de Tirion' WHERE `locale`='esMX' AND `ID`=13403; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Élites Juraescama asesinados' WHERE `locale`='esMX' AND `ID`=13414; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vrykuls exhaustos disciplinados' WHERE `locale`='esMX' AND `ID`=13422; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huye de Arroyoplata' WHERE `locale`='esMX' AND `ID`=13524; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Destruye una de las tres torres sur' WHERE `locale`='esMX' AND `ID`=13538; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Destruye una torre sur en Conquista del Invierno' WHERE `locale`='esMX' AND `ID`=13539; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Leopardos de escarcha hembra recuperadas' WHERE `locale`='esMX' AND `ID`=13549; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Osas Patahielo recuperadas' WHERE `locale`='esMX' AND `ID`=13549; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Usar Estocada sobre objetivos cuerpo a cuerpo' WHERE `locale`='esMX' AND `ID`=13625; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Usar Romper escudo sobre objetivos a distancia vulnerables' WHERE `locale`='esMX' AND `ID`=13625; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Usar Cargar sobre objetivos de carga vulnerables' WHERE `locale`='esMX' AND `ID`=13625; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muerte de Sir Wendell Balfour investigada' WHERE `locale`='esMX' AND `ID`=13643; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Muerte de Lorien Resplandor investigada' WHERE `locale`='esMX' AND `ID`=13643; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Muerte de Conall Empuñadura de Hierro investigada' WHERE `locale`='esMX' AND `ID`=13643; +UPDATE `quest_template_locale` SET `ObjectiveText1`='G.U.A.O. golpeada' WHERE `locale`='esMX' AND `ID`=13649; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Grifo del Caballero Negro controlado' WHERE `locale`='esMX' AND `ID`=13663; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga de Corona de Hielo muerto' WHERE `locale`='esMX' AND `ID`=13671; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembro de la Plaga de Corona de Hielo muerto' WHERE `locale`='esMX' AND `ID`=13676; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Usar Estocada sobre objetivos cuerpo a cuerpo' WHERE `locale`='esMX' AND `ID`=13677; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Usar Romper escudo sobre objetivos a distancia vulnerables' WHERE `locale`='esMX' AND `ID`=13677; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Usar Cargar sobre objetivos de carga vulnerables' WHERE `locale`='esMX' AND `ID`=13677; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Valeroso Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13679; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Valeroso Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13680; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13699; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Decidió convertirse en Escudero de Ventormenta.' WHERE `locale`='esMX' AND `ID`=13710; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13713; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13723; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13724; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13725; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13726; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13727; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13728; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13729; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Campeón Argenta derrotado' WHERE `locale`='esMX' AND `ID`=13731; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Culto de los Malditos eliminados' WHERE `locale`='esMX' AND `ID`=13789; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Culto de los Malditos eliminados' WHERE `locale`='esMX' AND `ID`=13791; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Culto de los Malditos eliminados' WHERE `locale`='esMX' AND `ID`=13810; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Miembros del Culto de los Malditos eliminados' WHERE `locale`='esMX' AND `ID`=13813; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Jeran Cierramadera' WHERE `locale`='esMX' AND `ID`=13828; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza Estocada contra el objetivo cuerpo a cuerpo' WHERE `locale`='esMX' AND `ID`=13828; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Jeran Cierramadera' WHERE `locale`='esMX' AND `ID`=13829; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza Estocada contra el objetivo cuerpo a cuerpo' WHERE `locale`='esMX' AND `ID`=13829; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Valis Cazavientos' WHERE `locale`='esMX' AND `ID`=13835; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza Romper escudo contra un objetivo a distancia vulnerable' WHERE `locale`='esMX' AND `ID`=13835; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Rugan Tripacero' WHERE `locale`='esMX' AND `ID`=13837; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Carga contra un objetivo de carga vulnerable' WHERE `locale`='esMX' AND `ID`=13837; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Valis Cazavientos' WHERE `locale`='esMX' AND `ID`=13838; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Utiliza Romper escudo contra un objetivo a distancia vulnerable' WHERE `locale`='esMX' AND `ID`=13838; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Consejo de Rugan Tripacero' WHERE `locale`='esMX' AND `ID`=13839; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Carga contra un objetivo de carga vulnerable' WHERE `locale`='esMX' AND `ID`=13839; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Salpicaduras de pellejo venenoso sobre ti' WHERE `locale`='esMX' AND `ID`=13850; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carne de dinosaurio fresca entregada a prole de pellejo venenoso' WHERE `locale`='esMX' AND `ID`=13889; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carne de silítido dada de comer a prole de pellejo venenoso' WHERE `locale`='esMX' AND `ID`=13903; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevos de silítido entregados a prole de pellejo venenoso' WHERE `locale`='esMX' AND `ID`=13904; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carne de dinosaurio fresca entregada a prole de pellejo venenoso' WHERE `locale`='esMX' AND `ID`=13915; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Huevos de silítido entregados a prole de pellejo venenoso' WHERE `locale`='esMX' AND `ID`=13916; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carne de silítido dada de comer a prole de pellejo venenoso' WHERE `locale`='esMX' AND `ID`=13917; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con la supervisora de huérfanos Aria' WHERE `locale`='esMX' AND `ID`=13926; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con la supervisora de huérfanos Aria' WHERE `locale`='esMX' AND `ID`=13927; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tira un zepelín de papel pequeño a Roo' WHERE `locale`='esMX' AND `ID`=13937; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Tira un zepelín de papel pequeño a Kekek' WHERE `locale`='esMX' AND `ID`=13938; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar relleno de pan de especias' WHERE `locale`='esMX' AND `ID`=14023; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar tarta de calabaza' WHERE `locale`='esMX' AND `ID`=14024; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prepara chatni de arándanos' WHERE `locale`='esMX' AND `ID`=14028; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prepara batata confitada' WHERE `locale`='esMX' AND `ID`=14033; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar pavo a fuego lento' WHERE `locale`='esMX' AND `ID`=14035; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar relleno de pan de especias' WHERE `locale`='esMX' AND `ID`=14037; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar tarta de calabaza' WHERE `locale`='esMX' AND `ID`=14040; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prepara chatni de arándanos' WHERE `locale`='esMX' AND `ID`=14041; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Prepara batata confitada' WHERE `locale`='esMX' AND `ID`=14043; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preparar pavo a fuego lento' WHERE `locale`='esMX' AND `ID`=14047; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu de compartir' WHERE `locale`='esMX' AND `ID`=14064; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu de compartir' WHERE `locale`='esMX' AND `ID`=14065; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Extremaunción administrada' WHERE `locale`='esMX' AND `ID`=14077; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kvaldir asesinados' WHERE `locale`='esMX' AND `ID`=14080; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Seguidor Veloneve capturado' WHERE `locale`='esMX' AND `ID`=14090; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kul el Temerario rescatado' WHERE `locale`='esMX' AND `ID`=14096; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aspirantes cautivos rescatados' WHERE `locale`='esMX' AND `ID`=14096; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Espíritu de héroe caído bendecido' WHERE `locale`='esMX' AND `ID`=14107; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lanzar lanzas al kraken de El Mar del Norte' WHERE `locale`='esMX' AND `ID`=14108; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kvaldir asesinados' WHERE `locale`='esMX' AND `ID`=14140; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Seguidor Veloneve capturado' WHERE `locale`='esMX' AND `ID`=14141; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Kul el Temerario rescatado' WHERE `locale`='esMX' AND `ID`=14142; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Aspirantes cautivos rescatados' WHERE `locale`='esMX' AND `ID`=14142; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Extremaunción administrada' WHERE `locale`='esMX' AND `ID`=14144; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Transmutaciones de gema épica' WHERE `locale`='esMX' AND `ID`=14151; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preguntar a Krasus sobre el origen de la empuñadura' WHERE `locale`='esMX' AND `ID`=14444; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Llevar la Quel\'Delar a las Cámaras de Reflexión' WHERE `locale`='esMX' AND `ID`=24480; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavos de la Alianza liberados' WHERE `locale`='esMX' AND `ID`=24498; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Encontrar a Jaina Valiente' WHERE `locale`='esMX' AND `ID`=24500; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Escapar del Rey Exánime' WHERE `locale`='esMX' AND `ID`=24500; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Esclavos de la Horda liberados' WHERE `locale`='esMX' AND `ID`=24507; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Bendición de Thalorien obtenida' WHERE `locale`='esMX' AND `ID`=24535; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guardias perfumados analizados' WHERE `locale`='esMX' AND `ID`=24536; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Preguntar a Krasus sobre el origen de la empuñadura' WHERE `locale`='esMX' AND `ID`=24555; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Llevar la Quel\'Delar a las Cámaras de Reflexión' WHERE `locale`='esMX' AND `ID`=24561; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Bendición de Thalorien obtenida' WHERE `locale`='esMX' AND `ID`=24563; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras dadas' WHERE `locale`='esMX' AND `ID`=24629; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras dadas' WHERE `locale`='esMX' AND `ID`=24635; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Muestras dadas' WHERE `locale`='esMX' AND `ID`=24636; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24638; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24645; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24647; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24648; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24649; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24650; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24651; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24652; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Guardias perfumados analizados' WHERE `locale`='esMX' AND `ID`=24655; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24658; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24659; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24660; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24662; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24663; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24664; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24665; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Vagón químico destruido' WHERE `locale`='esMX' AND `ID`=24666; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habitantes del pueblo perfumados analizados' WHERE `locale`='esMX' AND `ID`=24746; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rey Exánime derrotado' WHERE `locale`='esMX' AND `ID`=24748; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Encontrar a Sylvanas Brisaveloz' WHERE `locale`='esMX' AND `ID`=24802; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Escapar del Rey Exánime' WHERE `locale`='esMX' AND `ID`=24802; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Contaduría de Ventormenta revisada' WHERE `locale`='esMX' AND `ID`=24849; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Casa de subastas de Ventormenta revisada' WHERE `locale`='esMX' AND `ID`=24849; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Peluquería de Ventormenta revisada' WHERE `locale`='esMX' AND `ID`=24849; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Banco de Orgrimmar revisado' WHERE `locale`='esMX' AND `ID`=24851; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Casa de subastas de Orgrimmar revisada' WHERE `locale`='esMX' AND `ID`=24851; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Peluquería de Orgrimmar revisada' WHERE `locale`='esMX' AND `ID`=24851; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rescata a Darnavan' WHERE `locale`='esMX' AND `ID`=24869; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Minchar rescatado' WHERE `locale`='esMX' AND `ID`=24874; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Rescata a Darnavan' WHERE `locale`='esMX' AND `ID`=24875; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Minchar rescatado' WHERE `locale`='esMX' AND `ID`=24879; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Saluda al sargento de maniobras' WHERE `locale`='esMX' AND `ID`=25199; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ruge con el sargento de maniobras' WHERE `locale`='esMX' AND `ID`=25199; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Brinda con el sargento de maniobras' WHERE `locale`='esMX' AND `ID`=25199; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Baila con el sargento de maniobras' WHERE `locale`='esMX' AND `ID`=25199; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Lanzar Radiageigatrones a los conductos de ventilación de Gnomeregan' WHERE `locale`='esMX' AND `ID`=25212; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Escucha el discurso de los presagistas de la Fatalidad' WHERE `locale`='esMX' AND `ID`=25228; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Gnomos motivados' WHERE `locale`='esMX' AND `ID`=25229; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Gnomos motivados traidos al Capitán Chispaboquilla' WHERE `locale`='esMX' AND `ID`=25229; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Escucha el discurso de los presagistas de la Fatalidad' WHERE `locale`='esMX' AND `ID`=25253; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carteles colocados' WHERE `locale`='esMX' AND `ID`=25254; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Carteles colocados' WHERE `locale`='esMX' AND `ID`=25282; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Dar un discurso a Ozzie Voltiflop' WHERE `locale`='esMX' AND `ID`=25283; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Dar un discurso a Milli Plumasilba' WHERE `locale`='esMX' AND `ID`=25283; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Dar un discurso a Tog Oxidentado' WHERE `locale`='esMX' AND `ID`=25283; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sistema de eyección probado' WHERE `locale`='esMX' AND `ID`=25285; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Únete al Culto del Juicio Final' WHERE `locale`='esMX' AND `ID`=25288; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Servo de la pata izquierda probada' WHERE `locale`='esMX' AND `ID`=25289; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Servo de la pata derecha probada' WHERE `locale`='esMX' AND `ID`=25289; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Sistema de maniobras evasivas probada' WHERE `locale`='esMX' AND `ID`=25289; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Únete al Culto del Juicio Final' WHERE `locale`='esMX' AND `ID`=25290; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con el cultor Kagarn' WHERE `locale`='esMX' AND `ID`=25293; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Habla con el cultor Agtar' WHERE `locale`='esMX' AND `ID`=25293; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Habla con la cultora Tokka' WHERE `locale`='esMX' AND `ID`=25293; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Habla con la cultora Rokaga' WHERE `locale`='esMX' AND `ID`=25293; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sistemas armamentísticos probados' WHERE `locale`='esMX' AND `ID`=25295; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Sistema de eyección probado' WHERE `locale`='esMX' AND `ID`=25306; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Revelación de Cho\'Gall' WHERE `locale`='esMX' AND `ID`=25343; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Difundir el mensaje en la torre de zepelín este' WHERE `locale`='esMX' AND `ID`=25380; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Difundir el mensaje en la torre de zepelín oeste' WHERE `locale`='esMX' AND `ID`=25380; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Difundir el mensaje en Cerrotajo' WHERE `locale`='esMX' AND `ID`=25380; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Recuperar la superficie de Gnomeregan' WHERE `locale`='esMX' AND `ID`=25393; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Habla con la cultora Lethelyn' WHERE `locale`='esMX' AND `ID`=25414; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Habla con la cultora Kaima' WHERE `locale`='esMX' AND `ID`=25414; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Habla con el cultor Wyman' WHERE `locale`='esMX' AND `ID`=25414; +UPDATE `quest_template_locale` SET `ObjectiveText4`='Habla con el cultor Orlunn' WHERE `locale`='esMX' AND `ID`=25414; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Difundir el mensaje en el Cuartel de Arroyoeste' WHERE `locale`='esMX' AND `ID`=25415; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Difundir el mensaje en el Valle de los Héroes' WHERE `locale`='esMX' AND `ID`=25415; +UPDATE `quest_template_locale` SET `ObjectiveText3`='Difundir el mensaje en Villadorada' WHERE `locale`='esMX' AND `ID`=25415; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Revelación de Cho\'Gall' WHERE `locale`='esMX' AND `ID`=25416; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Ranas de Sen\'jin armonizadas' WHERE `locale`='esMX' AND `ID`=25444; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Zalazane matado' WHERE `locale`='esMX' AND `ID`=25445; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Ranas sintonizadas colocadas' WHERE `locale`='esMX' AND `ID`=25446; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Voluntarios trol reclutados' WHERE `locale`='esMX' AND `ID`=25461; +UPDATE `quest_template_locale` SET `ObjectiveText2`='Voluntarios trol entregados al Campeón Uru\'zin' WHERE `locale`='esMX' AND `ID`=25461; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Reta a la matriarca tigresa' WHERE `locale`='esMX' AND `ID`=25470; +UPDATE `quest_template_locale` SET `ObjectiveText1`='Danza de los espíritus' WHERE `locale`='esMX' AND `ID`=25480; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_03_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_03_00_world.sql new file mode 100644 index 00000000000..4e9365c39fa --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_03_00_world.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (64414); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13,1,64414,0,0,31,0,3,33109,0,0,0,0,'','Load Into Catapult target Salvaged Demolisher'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_00_world.sql new file mode 100644 index 00000000000..147a694a151 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_00_world.sql @@ -0,0 +1,249 @@ +-- Ymirheim Updates +UPDATE `creature` SET `position_x`=7178.28, `position_y`=1939.18, `position_z`=558.933, `orientation`=5.497786998748779296 WHERE `guid`=121141; +UPDATE `creature_addon` SET `StandState`=1 WHERE `guid` IN (121141,121164); +UPDATE `waypoint_data` SET `id`=1214230 WHERE `id`=1211710; +UPDATE `creature` SET `position_x`=7151.5, `position_y`=1895.11, `position_z`=540.436, `orientation`=4.6, `MovementType`=2, `wander_distance`=0 WHERE `guid`=121423; +UPDATE `creature_addon` SET `path_id`=1214230 WHERE `guid`=121423; +UPDATE `creature` SET `equipment_id`=0, `position_x`=7211.31201171875, `position_y`=1803.10546875, `position_z`=527.7430419921875, `orientation`=4.660028934478759765, `MovementType`=0 WHERE `guid`=121137; +UPDATE `creature_addon` SET `SheathState`=0 WHERE `guid` IN (121137,121152); +UPDATE `creature` SET `position_x`=7185.58203125, `position_y`=1861.2357177734375, `position_z`=532.28070068359375, `orientation`=3.211405754089355468, `MovementType`=0 WHERE `guid`=121171; +UPDATE `creature` SET `position_x`=7263.79443359375, `position_y`=1664.0059814453125, `position_z`=443.9375, `orientation`=6.126105785369873046 WHERE `guid`=120901; +UPDATE `creature_addon` SET `path_id`=0, `StandState`=1 WHERE `guid`=121171; +UPDATE `creature` SET `equipment_id`=0 WHERE `guid` IN (121143,121152,121154); +UPDATE `creature_addon` SET `emote`=333 WHERE `guid`=121169; +UPDATE `creature_addon` SET `emote`=459 WHERE `guid` IN (121138,121159); +UPDATE `creature` SET `position_x`=6815.93408203125, `position_y`=1826.19189453125, `position_z`=578.795166015625, `orientation`=4.852015495300292968 WHERE `guid`=121159; +UPDATE `waypoint_data` SET `id`=1212370 WHERE `id`=1214690; +UPDATE `creature` SET `position_x`=7235.66, `position_y`=2026.75, `position_z`=574.407, `MovementType`=2, `wander_distance`=0 WHERE `guid`=121237; +UPDATE `creature` SET `position_x`=7178.044921875, `position_y`=1975.9620361328125, `position_z`=574.13299560546875, `orientation`=2.757620096206665039, `MovementType`=0 WHERE `guid`=121469; +UPDATE `creature_addon` SET `path_id`=0, `StandState`=8 WHERE `guid`=121469; +UPDATE `creature` SET `position_x`=7225.90966796875, `position_y`=1592.8804931640625, `position_z`=379.873382568359375, `orientation`=5.235987663269042968 WHERE `guid`=120902; +UPDATE `creature_addon` SET `StandState`=8 WHERE `guid`=120902; + +DELETE FROM `creature_template_addon` WHERE `entry`=31262; +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(31262, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'); +DELETE FROM `creature_addon` WHERE `guid` IN (121229,121230,121231,121232,121233,121234,121235,121236,121237,121238,121239,121240); +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(121229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '59532'), +(121230, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'), +(121231, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'), +(121232, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'), +(121233, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'), +(121234, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'), +(121235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'), +(121236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'), +(121237, 1212370, 0, 0, 0, 0, 0, 0, 0, 0, 0, '59532'), +(121238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '59532'), +(121239, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'), +(121240, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '59532'); + +UPDATE `creature_template_addon` SET `AnimTier`=0, `auras`='54775' WHERE `entry`=31263; + +-- Ymirheim Defender +SET @GUID=40296; -- 8 free guid needed +DELETE FROM `creature` WHERE `guid`=@GUID; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID, 31746, 571, 0, 0, 1, 1, 0, 1, 7320.869140625, 1710.2799072265625, 465.02459716796875, 0.78539818525314331, 300, 0, 0, 12600, 0, 0, 0, 0, 0, '', NULL, 57292); +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, 0, 0, 0, 8, 0, 0, 1, 0, 0, 0, NULL); + +-- Ymirheim Chosen Warrior +DELETE FROM `creature` WHERE `guid`=@GUID+1; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID+1, 31258, 571, 0, 0, 1, 1, 0, 1, 7248.92724609375, 1974.7469482421875, 570.17535400390625, 2.844886541366577148, 300, 0, 0, 12600, 0, 0, 0, 0, 0, '', NULL, 56819); +DELETE FROM `creature_addon` WHERE `guid`=@GUID+1; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID+1, 0, 0, 0, 0, 0, 0, 1, 0, 459, 0, NULL); + +-- Ymirheim Chosen Warrior +DELETE FROM `creature` WHERE `guid`=@GUID+2; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID+2, 31258, 571, 0, 0, 1, 1, 0, 1, 7196.0791015625, 2003.345947265625, 575.2510986328125, 0.122173048555850982, 300, 0, 0, 12600, 0, 0, 0, 0, 0, '', NULL, 56819); +DELETE FROM `creature_addon` WHERE `guid`=@GUID+2; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID+2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, NULL); + +-- Ymirheim Chosen Warrior +DELETE FROM `creature` WHERE `guid`=@GUID+3; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID+3, 31258, 571, 0, 0, 1, 1, 0, 1, 7219.29541015625, 1893.203125, 567.2725830078125, 4.921828269958496093, 300, 0, 0, 12600, 0, 0, 0, 0, 0, '', NULL, 56819); +DELETE FROM `creature_addon` WHERE `guid`=@GUID+3; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID+3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); + +-- Ymirjar Element Shaper +DELETE FROM `creature` WHERE `guid`=@GUID+4; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID+4, 31267, 571, 0, 0, 1, 1, 0, 1, 7220.52978515625, 1889.025146484375, 567.76910400390625, 1.919862151145935058, 300, 0, 0, 10080, 8814, 0, 0, 0, 0, '', NULL, 56819); +DELETE FROM `creature_addon` WHERE `guid`=@GUID+4; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID+4, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); + +-- Ymirheim Chosen Warrior +DELETE FROM `creature` WHERE `guid`=@GUID+5; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID+5, 31258, 571, 0, 0, 1, 1, 0, 1, 7147.21728515625, 1701.251953125, 477.1998291015625, 3.054326057434082031, 300, 0, 0, 12600, 0, 0, 0, 0, 0, '', NULL, 56819); +DELETE FROM `creature_addon` WHERE `guid`=@GUID+5; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID+5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); + +-- Ymirjar Element Shaper +DELETE FROM `creature` WHERE `guid`=@GUID+6; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID+6, 31267, 571, 0, 0, 1, 1, 0, 1, 7141.1181640625, 1700.5926513671875, 477.7032470703125, 0.383972436189651489, 300, 0, 0, 10080, 8814, 0, 0, 0, 0, '', NULL, 56819); +DELETE FROM `creature_addon` WHERE `guid`=@GUID+6; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID+6, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); + +-- Ymirheim Chosen Warrior +DELETE FROM `creature` WHERE `guid`=@GUID+7; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@GUID+7, 31258, 571, 0, 0, 1, 1, 0, 1, 7122.36962890625, 1693.2943115234375, 478.649810791015625, 1.65806281566619873, 300, 0, 0, 12600, 0, 0, 0, 0, 0, '', NULL, 56819); +DELETE FROM `creature_addon` WHERE `guid`=@GUID+7; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID+7, 0, 0, 0, 0, 0, 0, 1, 0, 426, 0, NULL); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` IN (31267,31258); +DELETE FROM `smart_scripts` WHERE `source_type` = 9 AND `entryorguid` = 3125800; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(3125800, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 11, 58952, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - On Script - Cast 'Drink Alcohol'"), +(3125800, 9, 1, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 0, 11, 58952, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - On Script - Cast 'Drink Alcohol'"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121140; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121140, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121141; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121141, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -(@GUID+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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@GUID+1), 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -(@GUID+2); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@GUID+2), 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121144; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121144, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121145; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121145, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121149; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121149, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -(@GUID+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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@GUID+7), 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121155; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121155, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121156; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121156, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121159; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121159, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121163; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121163, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121164; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121164, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121165; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121165, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121170; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121170, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` = -121171; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121171, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 30000, 30000, 0, 80, 3125800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Chosen Warrior - OOC - Call Timed Actionlist"); + +-- Emotes +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121465; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121465, 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121166; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121166, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121467; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121467, 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121167; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121167, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-(@GUID+6); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@GUID+6), 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-(@GUID+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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@GUID+5), 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-(@GUID+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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@GUID+4), 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-(@GUID+3); +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@GUID+3), 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121468; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121468, 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121172; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121172, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121410; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121410, 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121139; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121139, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121455; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121455, 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121162; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121162, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121451; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121451, 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121158; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121158, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121453; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121453, 0, 0, 0, 1, 0, 100, 0, 4000, 4000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirjar Element Shaper - OOC - Play Emote 1"); + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=-121160; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-121160, 0, 0, 0, 1, 0, 100, 0, 5000, 5000, 17000, 17000, 0, 5, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Ymirheim Chosen Warrior - OOC - Play Emote 1"); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_01_world.sql new file mode 100644 index 00000000000..d1e4583c8b3 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_01_world.sql @@ -0,0 +1,5 @@ +-- Portal: Darnassus AND Portal: Thunder Bluff required lvl 50 +UPDATE `trainer_spell` SET `ReqLevel`=50 WHERE `SpellID` IN (11419,11420); + +-- Teleport: Darnassus AND Teleport: Thunder Bluff required lvl 30 +UPDATE `trainer_spell` SET `ReqLevel`=30 WHERE `SpellID` IN (3565,3566); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_02_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_02_world.sql new file mode 100644 index 00000000000..264fec668d8 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_05_02_world.sql @@ -0,0 +1,3 @@ +-- +UPDATE `gameobject` SET `rotation2`=-0.99026775360107421, `rotation3`=0.139175355434417724 WHERE `guid` IN (13553); +UPDATE `gameobject` SET `rotation2`=-0.13917255401611328, `rotation3`=0.990268170833587646 WHERE `guid` IN (13563); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_07_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_07_00_world.sql new file mode 100644 index 00000000000..1cab47751ea --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_07_00_world.sql @@ -0,0 +1,17 @@ +-- Birgitte Cranston +SET @NPC=5957; +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = @NPC; +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = @NPC); +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@NPC,0,0,0,22,0,100,0,41,5000,5000,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Birgitte Cranston - On Received Emote 'Flex' - Say Line 0"), +(@NPC,0,1,0,22,0,100,0,77,5000,5000,0,0,1,1,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Birgitte Cranston - On Received Emote 'Rude' - Say Line 1"), +(@NPC,0,2,0,22,0,100,0,17,5000,5000,0,0,5,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Birgitte Cranston - On Received Emote 'Bow' - Play Emote 2"), +(@NPC,0,3,0,22,0,100,0,78,5000,5000,0,0,5,66,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Birgitte Cranston - On Received Emote 'Salute' - Play Emote 66"), +(@NPC,0,4,0,22,0,100,0,101,5000,5000,0,0,5,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Birgitte Cranston - On Received Emote 'Wave' - Play Emote 3"); + +DELETE FROM `creature_text` WHERE `CreatureID`=@NPC; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(@NPC,0,0,"%s is not impressed.",16,0,100,11,0,0,1401,0,"Birgitte Cranston"), +(@NPC,1,0,"You're pushing it, $n.",12,0,100,0,0,0,1402,0,"Birgitte Cranston"), +(@NPC,1,1,"Don't make me go medieval on you.",12,0,100,0,0,0,1403,0,"Birgitte Cranston"), +(@NPC,1,2,"Keep it up, $n, and I'll beat some manners into you.",12,0,100,0,0,0,1404,0,"Birgitte Cranston"); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_07_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_07_01_world.sql new file mode 100644 index 00000000000..7aa21f53c4e --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_07_01_world.sql @@ -0,0 +1,2 @@ +-- Adjust minimum reputation value required for 'A Special Thank You' (Friendly) +UPDATE `quest_template_addon` SET `RequiredMinRepValue`=3000 WHERE `ID`=11091; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_08_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_08_00_world.sql new file mode 100644 index 00000000000..538927b043b --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_08_00_world.sql @@ -0,0 +1,14 @@ +-- https://www.wowhead.com/wotlk/quest=467/stonegears-search +-- 2nd Questgiver for "Stonegear's Search" (Pilot Longbeard) +DELETE FROM `creature_queststarter` WHERE `id` = 2092 AND `quest` = 467; +INSERT INTO `creature_queststarter` (`id`, `quest`) VALUES (2092, 467); + +-- https://www.wowhead.com/wotlk/quest=1698/yorus-barleybrew +-- 2nd Questgiver for "Yorus Barleybrew" (Darnath Bladesinger) +DELETE FROM `creature_queststarter` WHERE `id` = 7315 AND `quest` = 1698; +INSERT INTO `creature_queststarter` (`id`, `quest`) VALUES (7315, 1698); + +-- https://www.wowhead.com/wotlk/quest=1684/elanaria +-- 3rd Questgiver for "Elanaria" (Sentinel Elissa Starbreeze) +DELETE FROM `creature_queststarter` WHERE `id` = 3657 AND `quest` = 1684; +INSERT INTO `creature_queststarter` (`id`, `quest`) VALUES (3657, 1684); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_00_world.sql new file mode 100644 index 00000000000..312792cb6f7 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_00_world.sql @@ -0,0 +1,51 @@ +-- Rivendark +SET @NPC=23061; +DELETE FROM `creature_text` WHERE `CreatureID`=@NPC; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(@NPC,0,0,"Get away from my clutch!!!",14,0,100,0,0,7274,21696,0,'Rivendark'), +(@NPC,0,1,"I know you by your stench, little $n. Here, in my perch, is where your bones shall finally rest.",14,0,100,0,0,7274,21706,0,'Rivendark'), +(@NPC,0,2,"I tire of interruptions from the insignificant. Your time has come, $n!",14,0,100,0,0,7274,21710,0,'Rivendark'), +(@NPC,0,3,"The Skyguard shall pay for your temerity, $n!",14,0,100,0,0,7274,21714,0,'Rivendark'), +(@NPC,0,4,"I believe that I shall feast upon both $r and ogre flesh tonight.",14,0,100,0,0,7274,21718,0,'Rivendark'), +(@NPC,0,5,"Little $r, you will now come to appreciate my wrath!",14,0,100,0,0,7274,21720,0,'Rivendark'), +(@NPC,0,6,"You have dared to defile my perch and must now be cleansed in fire!",14,0,100,0,0,7274,21726,0,'Rivendark'), +(@NPC,0,7,"What's this?! $n and $g his : her; friends come to play?",14,0,100,0,0,7274,21733,0,'Rivendark'); + +-- Furywing +SET @NPC=23261; +DELETE FROM `creature_text` WHERE `CreatureID`=@NPC; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(@NPC,0,0,"Get away from my clutch!!!",14,0,100,0,0,7274,21696,0,'Furywing'), +(@NPC,0,1,"I know you by your stench, little $n. Here, in my perch, is where your bones shall finally rest.",14,0,100,0,0,7274,21706,0,'Furywing'), +(@NPC,0,2,"I tire of interruptions from the insignificant. Your time has come, $n!",14,0,100,0,0,7274,21710,0,'Furywing'), +(@NPC,0,3,"The Skyguard shall pay for your temerity, $n!",14,0,100,0,0,7274,21714,0,'Furywing'), +(@NPC,0,4,"I believe that I shall feast upon both $r and ogre flesh tonight.",14,0,100,0,0,7274,21718,0,'Furywing'), +(@NPC,0,5,"Little $r, you will now come to appreciate my wrath!",14,0,100,0,0,7274,21720,0,'Furywing'), +(@NPC,0,6,"You have dared to defile my perch and must now be cleansed in fire!",14,0,100,0,0,7274,21726,0,'Furywing'), +(@NPC,0,7,"What's this?! $n and $g his : her; friends come to play?",14,0,100,0,0,7274,21733,0,'Furywing'); + +-- Insidion +SET @NPC=23281; +DELETE FROM `creature_text` WHERE `CreatureID`=@NPC; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(@NPC,0,0,"Get away from my clutch!!!",14,0,100,0,0,7274,21696,0,'Insidion'), +(@NPC,0,1,"I know you by your stench, little $n. Here, in my perch, is where your bones shall finally rest.",14,0,100,0,0,7274,21706,0,'Insidion'), +(@NPC,0,2,"I tire of interruptions from the insignificant. Your time has come, $n!",14,0,100,0,0,7274,21710,0,'Insidion'), +(@NPC,0,3,"The Skyguard shall pay for your temerity, $n!",14,0,100,0,0,7274,21714,0,'Insidion'), +(@NPC,0,4,"I believe that I shall feast upon both $r and ogre flesh tonight.",14,0,100,0,0,7274,21718,0,'Insidion'), +(@NPC,0,5,"Little $r, you will now come to appreciate my wrath!",14,0,100,0,0,7274,21720,0,'Insidion'), +(@NPC,0,6,"You have dared to defile my perch and must now be cleansed in fire!",14,0,100,0,0,7274,21726,0,'Insidion'), +(@NPC,0,7,"What's this?! $n and $g his : her; friends come to play?",14,0,100,0,0,7274,21733,0,'Insidion'); + +-- Obsidia +SET @NPC=23282; +DELETE FROM `creature_text` WHERE `CreatureID`=@NPC; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(@NPC,0,0,"Get away from my clutch!!!",14,0,100,0,0,7274,21696,0,'Obsidia'), +(@NPC,0,1,"I know you by your stench, little $n. Here, in my perch, is where your bones shall finally rest.",14,0,100,0,0,7274,21706,0,'Obsidia'), +(@NPC,0,2,"I tire of interruptions from the insignificant. Your time has come, $n!",14,0,100,0,0,7274,21710,0,'Obsidia'), +(@NPC,0,3,"The Skyguard shall pay for your temerity, $n!",14,0,100,0,0,7274,21714,0,'Obsidia'), +(@NPC,0,4,"I believe that I shall feast upon both $r and ogre flesh tonight.",14,0,100,0,0,7274,21718,0,'Obsidia'), +(@NPC,0,5,"Little $r, you will now come to appreciate my wrath!",14,0,100,0,0,7274,21720,0,'Obsidia'), +(@NPC,0,6,"You have dared to defile my perch and must now be cleansed in fire!",14,0,100,0,0,7274,21726,0,'Obsidia'), +(@NPC,0,7,"What's this?! $n and $g his : her; friends come to play?",14,0,100,0,0,7274,21733,0,'Obsidia'); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_01_world.sql new file mode 100644 index 00000000000..73b6f34647a --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_01_world.sql @@ -0,0 +1,104 @@ +-- Hildana Deathstealer +SET @GUID = 151987; +SET @PATH = @GUID * 10; +UPDATE `creature` SET `position_x`=7192.40869140625,`position_y`=2087.502197265625,`position_z`=591.82122802734375,`orientation`=5.334992408752441406, `wander_distance`=0,`MovementType`=2 WHERE `guid`=@GUID; +DELETE FROM `creature_template_movement` WHERE `CreatureId`=32495; +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(32495, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 3, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH, 0, 7222.452, 2049.397, 586.3735, NULL, 0, 0, 0, 100, 0), +(@PATH, 1, 7242.69, 2020.932, 586.3621, NULL, 0, 0, 0, 100, 0), +(@PATH, 2, 7239.754, 1992.342, 582.9315, NULL, 0, 0, 0, 100, 0), +(@PATH, 3, 7217.938, 1967.975, 582.8708, NULL, 0, 0, 0, 100, 0), +(@PATH, 4, 7215.49, 1953.749, 579.5094, NULL, 0, 0, 0, 100, 0), +(@PATH, 5, 7209.799, 1933.954, 573.6544, NULL, 0, 0, 0, 100, 0), +(@PATH, 6, 7189.471, 1920.425, 566.2871, NULL, 0, 0, 0, 100, 0), +(@PATH, 7, 7176.588, 1908.39, 561.8888, NULL, 0, 0, 0, 100, 0), +(@PATH, 8, 7158.939, 1897.289, 554.6441, NULL, 0, 0, 0, 100, 0), +(@PATH, 9, 7142.65, 1883.022, 546.8456, NULL, 0, 0, 0, 100, 0), +(@PATH, 10, 7146.625, 1871.005, 542.7414, NULL, 0, 0, 0, 100, 0), +(@PATH, 11, 7143.43, 1853.5, 534.7924, NULL, 0, 0, 0, 100, 0), +(@PATH, 12, 7140.116, 1829.073, 522.2319, NULL, 0, 0, 0, 100, 0), +(@PATH, 13, 7147.326, 1802.581, 511.2054, NULL, 0, 0, 0, 100, 0), +(@PATH, 14, 7160.529, 1777.781, 502.085, NULL, 0, 0, 0, 100, 0), +(@PATH, 15, 7154.228, 1756.151, 497.3007, NULL, 0, 0, 0, 100, 0), +(@PATH, 16, 7136.289, 1737.988, 497.017, NULL, 0, 0, 0, 100, 0), +(@PATH, 17, 7111.468, 1737.822, 502.8012, NULL, 0, 0, 0, 100, 0), +(@PATH, 18, 7093.092, 1746.867, 507.5394, NULL, 0, 0, 0, 100, 0), +(@PATH, 19, 7074.251, 1757.452, 510.6808, NULL, 0, 0, 0, 100, 0), +(@PATH, 20, 7053.318, 1765.741, 513.947, NULL, 0, 0, 0, 100, 0), +(@PATH, 21, 7029.345, 1773.791, 517.5663, NULL, 0, 0, 0, 100, 0), +(@PATH, 22, 7011.002, 1761.331, 518.4968, NULL, 0, 0, 0, 100, 0), +(@PATH, 23, 6997.615, 1747.272, 519.6525, NULL, 0, 0, 0, 100, 0), +(@PATH, 24, 6977.209, 1726.555, 523.2506, NULL, 0, 0, 0, 100, 0), +(@PATH, 25, 6959.343, 1709.8, 528.5284, NULL, 0, 0, 0, 100, 0), +(@PATH, 26, 6944.034, 1703.351, 531.3673, NULL, 0, 0, 0, 100, 0), +(@PATH, 27, 6922.215, 1702.405, 535.2693, NULL, 0, 0, 0, 100, 0), +(@PATH, 28, 6905.099, 1705.328, 538.6309, NULL, 0, 0, 0, 100, 0), +(@PATH, 29, 6886.74, 1703.085, 543.012, NULL, 0, 0, 0, 100, 0), +(@PATH, 30, 6864.976, 1700.863, 548.3915, NULL, 0, 0, 0, 100, 0), +(@PATH, 31, 6848.176, 1702.512, 552.8682, NULL, 0, 0, 0, 100, 0), +(@PATH, 32, 6832.075, 1708.631, 557.7967, NULL, 0, 0, 0, 100, 0), +(@PATH, 33, 6821.65, 1718.504, 562.5582, NULL, 0, 0, 0, 100, 0), +(@PATH, 34, 6809.965, 1730.085, 568.9621, NULL, 0, 0, 0, 100, 0), +(@PATH, 35, 6803.283, 1742.857, 574.6663, NULL, 0, 0, 0, 100, 0), +(@PATH, 36, 6801.305, 1755.202, 578.022, NULL, 0, 0, 0, 100, 0), +(@PATH, 37, 6798.108, 1766.889, 580.5387, NULL, 0, 0, 0, 100, 0), +(@PATH, 38, 6797.701, 1780.178, 582.3558, NULL, 0, 0, 0, 100, 0), +(@PATH, 39, 6800.344, 1789.98, 584.1855, NULL, 0, 0, 0, 100, 0), +(@PATH, 40, 6804.535, 1803.005, 587.1995, NULL, 0, 0, 0, 100, 0), +(@PATH, 41, 6809.243, 1811.058, 589.2962, NULL, 0, 0, 0, 100, 0), +(@PATH, 42, 6804.535, 1803.005, 587.1995, NULL, 0, 0, 0, 100, 0), +(@PATH, 43, 6800.344, 1789.98, 584.1855, NULL, 0, 0, 0, 100, 0), +(@PATH, 44, 6797.701, 1780.178, 582.3558, NULL, 0, 0, 0, 100, 0), +(@PATH, 45, 6798.108, 1766.889, 580.5387, NULL, 0, 0, 0, 100, 0), +(@PATH, 46, 6801.272, 1755.311, 578.0976, NULL, 0, 0, 0, 100, 0), +(@PATH, 47, 6803.283, 1742.857, 574.6663, NULL, 0, 0, 0, 100, 0), +(@PATH, 48, 6809.965, 1730.085, 568.9621, NULL, 0, 0, 0, 100, 0), +(@PATH, 49, 6821.65, 1718.504, 562.5582, NULL, 0, 0, 0, 100, 0), +(@PATH, 50, 6832.075, 1708.631, 557.7967, NULL, 0, 0, 0, 100, 0), +(@PATH, 51, 6848.176, 1702.512, 552.8682, NULL, 0, 0, 0, 100, 0), +(@PATH, 52, 6864.976, 1700.863, 548.3915, NULL, 0, 0, 0, 100, 0), +(@PATH, 53, 6886.74, 1703.085, 543.012, NULL, 0, 0, 0, 100, 0), +(@PATH, 54, 6905.099, 1705.328, 538.6309, NULL, 0, 0, 0, 100, 0), +(@PATH, 55, 6922.215, 1702.405, 535.2693, NULL, 0, 0, 0, 100, 0), +(@PATH, 56, 6944.034, 1703.351, 531.3673, NULL, 0, 0, 0, 100, 0), +(@PATH, 57, 6959.343, 1709.8, 528.5284, NULL, 0, 0, 0, 100, 0), +(@PATH, 58, 6977.209, 1726.555, 523.2506, NULL, 0, 0, 0, 100, 0), +(@PATH, 59, 6997.615, 1747.272, 519.6525, NULL, 0, 0, 0, 100, 0), +(@PATH, 60, 7011.002, 1761.331, 518.4968, NULL, 0, 0, 0, 100, 0), +(@PATH, 61, 7029.345, 1773.791, 517.5663, NULL, 0, 0, 0, 100, 0), +(@PATH, 62, 7053.318, 1765.741, 513.947, NULL, 0, 0, 0, 100, 0), +(@PATH, 63, 7074.251, 1757.452, 510.6808, NULL, 0, 0, 0, 100, 0), +(@PATH, 64, 7093.092, 1746.867, 507.5394, NULL, 0, 0, 0, 100, 0), +(@PATH, 65, 7111.468, 1737.822, 502.8012, NULL, 0, 0, 0, 100, 0), +(@PATH, 66, 7136.289, 1737.988, 497.017, NULL, 0, 0, 0, 100, 0), +(@PATH, 67, 7154.228, 1756.151, 497.3007, NULL, 0, 0, 0, 100, 0), +(@PATH, 68, 7160.529, 1777.781, 502.085, NULL, 0, 0, 0, 100, 0), +(@PATH, 69, 7147.326, 1802.581, 511.2054, NULL, 0, 0, 0, 100, 0), +(@PATH, 70, 7140.116, 1829.073, 522.2319, NULL, 0, 0, 0, 100, 0), +(@PATH, 71, 7143.43, 1853.5, 534.7924, NULL, 0, 0, 0, 100, 0), +(@PATH, 72, 7146.625, 1871.005, 542.7414, NULL, 0, 0, 0, 100, 0), +(@PATH, 73, 7142.65, 1883.022, 546.8456, NULL, 0, 0, 0, 100, 0), +(@PATH, 74, 7158.939, 1897.289, 554.6441, NULL, 0, 0, 0, 100, 0), +(@PATH, 75, 7176.588, 1908.39, 561.8888, NULL, 0, 0, 0, 100, 0), +(@PATH, 76, 7189.471, 1920.425, 566.2871, NULL, 0, 0, 0, 100, 0), +(@PATH, 77, 7209.799, 1933.954, 573.6544, NULL, 0, 0, 0, 100, 0), +(@PATH, 78, 7215.49, 1953.749, 579.5094, NULL, 0, 0, 0, 100, 0), +(@PATH, 79, 7217.938, 1967.975, 582.8708, NULL, 0, 0, 0, 100, 0), +(@PATH, 80, 7239.754, 1992.342, 582.9315, NULL, 0, 0, 0, 100, 0), +(@PATH, 81, 7242.69, 2020.932, 586.3621, NULL, 0, 0, 0, 100, 0), +(@PATH, 82, 7222.452, 2049.397, 586.3735, NULL, 0, 0, 0, 100, 0), +(@PATH, 83, 7199.488, 2077.641, 588.7512, NULL, 0, 0, 0, 100, 0), +(@PATH, 84, 7180.812, 2103.658, 596.8508, NULL, 0, 0, 0, 100, 0), +(@PATH, 85, 7159.934, 2123.704, 608.3088, NULL, 0, 0, 0, 100, 0), +(@PATH, 86, 7137.276, 2137.024, 619.1228, NULL, 0, 0, 0, 100, 0), +(@PATH, 87, 7113.819, 2138.252, 627.6207, NULL, 0, 0, 0, 100, 0), +(@PATH, 88, 7099.208, 2130.521, 633.0135, NULL, 0, 0, 0, 100, 0), +(@PATH, 89, 7088.263, 2131.638, 637.222, NULL, 0, 0, 0, 100, 0), +(@PATH, 90, 7099.208, 2130.521, 633.0135, NULL, 0, 0, 0, 100, 0), +(@PATH, 91, 7113.819, 2138.252, 627.6207, NULL, 0, 0, 0, 100, 0); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_02_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_02_world.sql new file mode 100644 index 00000000000..6f3507cc8f1 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_10_02_world.sql @@ -0,0 +1,14 @@ +-- +SET @OGUID := 12647; -- Need 4 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+3; +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 +(@OGUID+0, 195256, 571, 4197, 4589, 1, 1, 5015.90380859375, 3672.697998046875, 362.823822021484375, 6.248279094696044921, 0, 0, -0.01745223999023437, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Chilled Quagmire - Difficulty: 0) CreateObject1 +(@OGUID+1, 195256, 571, 4197, 4589, 1, 1, 5030.37744140625, 3683.822509765625, 362.924468994140625, 3.892086982727050781, 0, 0, -0.93041706085205078, 0.366502493619918823, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Chilled Quagmire - Difficulty: 0) CreateObject1 +(@OGUID+2, 195259, 571, 4197, 4589, 1, 1, 5027.66162109375, 3690.940185546875, 364.056243896484375, 5.567600727081298828, 0, 0, -0.35020732879638671, 0.936672210693359375, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: The Chilled Quagmire - Difficulty: 0) CreateObject1 +(@OGUID+3, 195259, 571, 4197, 4589, 1, 1, 5018.60205078125, 3683.81982421875, 363.97735595703125, 5.969027042388916015, 0, 0, -0.1564340591430664, 0.987688362598419189, 120, 255, 1, 0); -- Hanging, Square, Small - Brewfest (Area: The Chilled Quagmire - Difficulty: 0) CreateObject1 + + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+3 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+3; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_00_world.sql new file mode 100644 index 00000000000..0dbb4e44082 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_00_world.sql @@ -0,0 +1,137 @@ +-- +SET @OGUID := 92657; -- Need 128 +SET @EVENT := 8; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+127; +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 +(@OGUID+0, 181016, 595, 4100, 4100, 3, 1, 1560.3992919921875, 577.02606201171875, 106.6330337524414062, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+1, 181019, 595, 4100, 4100, 3, 1, 1558.921875, 589.404541015625, 100.94000244140625, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+2, 181060, 595, 4100, 4100, 3, 1, 1556.5103759765625, 607.83856201171875, 99.869842529296875, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+3, 181060, 595, 4100, 4100, 3, 1, 1555.2725830078125, 608.5069580078125, 99.8471221923828125, 5.794494152069091796, 0, 0, -0.24192142486572265, 0.970295846462249755, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+4, 181017, 595, 4100, 4100, 3, 1, 1569.8316650390625, 597.65277099609375, 103.2068328857421875, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 7200, 255, 1, 0), -- Hanging, Streamer - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+5, 181016, 595, 4100, 4100, 3, 1, 1555.8038330078125, 601.5711669921875, 99.15207672119140625, 1.012289404869079589, 0, 0, 0.484808921813964843, 0.87462007999420166, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+6, 181016, 595, 4100, 4100, 3, 1, 1573.171875, 622.828125, 99.63867950439453125, 0.855210542678833007, 0, 0, 0.414692878723144531, 0.909961462020874023, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+7, 181017, 595, 4100, 4100, 3, 1, 1575.0347900390625, 618.4757080078125, 104.6546630859375, 1.099556446075439453, 0, 0, 0.522498130798339843, 0.852640450000762939, 7200, 255, 1, 0), -- Hanging, Streamer - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+8, 181025, 595, 4100, 4100, 3, 1, 1580.1197509765625, 668.140625, 117.7477493286132812, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Large - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+9, 181016, 595, 4100, 4100, 3, 1, 1587.892333984375, 667.3992919921875, 103.0756301879882812, 4.834563255310058593, 0, 0, -0.66261959075927734, 0.748956084251403808, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+10, 181016, 595, 4100, 4100, 3, 1, 1599.44970703125, 661.5625, 103.2282791137695312, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+11, 181025, 595, 4100, 4100, 3, 1, 1605.654541015625, 657.39410400390625, 118.0041275024414062, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Large - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+12, 181016, 595, 4100, 4100, 3, 1, 1593.1632080078125, 681.8524169921875, 104.6160125732421875, 0.541050612926483154, 0, 0, 0.267237663269042968, 0.96363067626953125, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+13, 181016, 595, 4100, 4100, 3, 1, 1606.8975830078125, 677.27081298828125, 105.852813720703125, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+14, 181025, 595, 4100, 4100, 3, 1, 1613.7396240234375, 674.62152099609375, 117.991363525390625, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Large - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+15, 181025, 595, 4100, 4100, 3, 1, 1587.7569580078125, 686.79168701171875, 117.908416748046875, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Large - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+16, 181016, 595, 4100, 4100, 3, 1, 1616.62158203125, 754.20660400390625, 115.3078079223632812, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+17, 181016, 595, 4100, 4100, 3, 1, 1635.25, 816.97222900390625, 120.2372894287109375, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+18, 181016, 595, 4100, 4100, 3, 1, 1664.5660400390625, 890.685791015625, 120.117706298828125, 4.782202720642089843, 0, 0, -0.68199825286865234, 0.731353819370269775, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+19, 181016, 595, 4100, 4100, 3, 1, 1691.2239990234375, 954.69964599609375, 120.3922805786132812, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+20, 181016, 595, 4100, 4100, 3, 1, 1669.0660400390625, 1018.2603759765625, 125.0752334594726562, 5.480334281921386718, 0, 0, -0.39073085784912109, 0.920504987239837646, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+21, 181016, 595, 4100, 4100, 3, 1, 1669.842041015625, 1098.0364990234375, 127.4882278442382812, 5.393068790435791015, 0, 0, -0.43051052093505859, 0.902585566043853759, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+22, 181016, 595, 4100, 4100, 3, 1, 1688.30908203125, 1185.3697509765625, 132.57421875, 4.799657344818115234, 0, 0, -0.67558956146240234, 0.737277925014495849, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+23, 181016, 595, 4100, 4100, 3, 1, 1739.0538330078125, 1249.53125, 137.72503662109375, 4.572763919830322265, 0, 0, -0.75470924377441406, 0.656059443950653076, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+24, 181016, 595, 4100, 4100, 3, 1, 1830.8524169921875, 1287.626708984375, 143.58587646484375, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+25, 181016, 595, 4100, 4100, 3, 1, 1915.9947509765625, 1298.732666015625, 142.4404754638671875, 3.874631166458129882, 0, 0, -0.93358039855957031, 0.358368009328842163, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+26, 181016, 595, 4100, 4100, 3, 1, 1916.1285400390625, 1275.9288330078125, 142.4715576171875, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+27, 181016, 595, 4100, 4100, 3, 1, 1937.1944580078125, 1298.96875, 145.9376373291015625, 4.59021615982055664, 0, 0, -0.74895572662353515, 0.662620067596435546, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+28, 181016, 595, 4100, 4100, 3, 1, 1937.0538330078125, 1275.6927490234375, 145.923309326171875, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+29, 181016, 595, 4100, 4100, 3, 1, 1958.76220703125, 1299.123291015625, 146.205230712890625, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+30, 181016, 595, 4100, 4100, 3, 1, 1958.6754150390625, 1275.9444580078125, 146.2058258056640625, 1.535889506340026855, 0, 0, 0.694658279418945312, 0.719339847564697265, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+31, 181016, 595, 4100, 4100, 3, 1, 1980.545166015625, 1298.796875, 146.1197052001953125, 4.939284324645996093, 0, 0, -0.6225137710571289, 0.78260880708694458, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+32, 181016, 595, 4100, 4100, 3, 1, 1980.185791015625, 1276.2708740234375, 146.119354248046875, 1.413715124130249023, 0, 0, 0.649447441101074218, 0.760406434535980224, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+33, 181016, 595, 4100, 4100, 3, 1, 1984.2742919921875, 1244.0191650390625, 143.217498779296875, 0.453785061836242675, 0, 0, 0.224950790405273437, 0.974370121955871582, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+34, 181016, 595, 4100, 4100, 3, 1, 1984.6771240234375, 1332.60595703125, 143.220458984375, 6.03883981704711914, 0, 0, -0.12186908721923828, 0.9925462007522583, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+35, 181025, 595, 4100, 4100, 3, 1, 2009.1771240234375, 1273.814208984375, 147.477203369140625, 3.124123096466064453, 0, 0, 0.99996185302734375, 0.008734640665352344, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Large - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+36, 181025, 595, 4100, 4100, 3, 1, 2009.1910400390625, 1299.392333984375, 147.3836212158203125, 3.141592741012573242, 0, 0, -1, 0, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Large - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+37, 181016, 595, 4100, 4100, 3, 1, 2017.4617919921875, 1313.5625, 142.949127197265625, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+38, 181016, 595, 4100, 4100, 3, 1, 2017.642333984375, 1261.329833984375, 142.9531097412109375, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+39, 181016, 595, 4100, 4100, 3, 1, 2033.34033203125, 1281.6285400390625, 143.624755859375, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+40, 181016, 595, 4100, 4100, 3, 1, 2033.7569580078125, 1293.685791015625, 143.4059295654296875, 4.834563255310058593, 0, 0, -0.66261959075927734, 0.748956084251403808, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+41, 181016, 595, 4100, 4100, 3, 1, 2067.857666015625, 1281.2413330078125, 141.9698333740234375, 1.204277276992797851, 0, 0, 0.56640625, 0.824126183986663818, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+42, 181016, 595, 4100, 4100, 3, 1, 2067.348876953125, 1293.375, 141.9972686767578125, 5.061456203460693359, 0, 0, -0.57357597351074218, 0.819152355194091796, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+43, 181018, 595, 4100, 4100, 3, 1, 2092.87841796875, 1309.795166015625, 148.9744415283203125, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+44, 181017, 595, 4100, 4100, 3, 1, 2104.20654296875, 1306.1927490234375, 144.4675750732421875, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 7200, 255, 1, 0), -- Hanging, Streamer - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+45, 181018, 595, 4100, 4100, 3, 1, 2109.835205078125, 1266.607666015625, 142.9143218994140625, 1.343901276588439941, 0, 0, 0.622513771057128906, 0.78260880708694458, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+46, 181060, 595, 4100, 4100, 3, 1, 2123.31591796875, 1350.734375, 132.9212188720703125, 4.9218292236328125, 0, 0, -0.62932014465332031, 0.77714616060256958, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+47, 181018, 595, 4100, 4100, 3, 1, 2139.3681640625, 1271.6614990234375, 139.33447265625, 1.117009282112121582, 0, 0, 0.529918670654296875, 0.84804844856262207, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+48, 181060, 595, 4100, 4100, 3, 1, 2120.295166015625, 1351.359375, 132.89581298828125, 3.9793548583984375, 0, 0, -0.9135446548461914, 0.406738430261611938, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+49, 181060, 595, 4100, 4100, 3, 1, 2118.611083984375, 1353.998291015625, 132.7572174072265625, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+50, 181018, 595, 4100, 4100, 3, 1, 2153.6806640625, 1264.5660400390625, 139.2888641357421875, 1.117009282112121582, 0, 0, 0.529918670654296875, 0.84804844856262207, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+51, 181060, 595, 4100, 4100, 3, 1, 2126.51904296875, 1355.3941650390625, 132.9130706787109375, 0.069811686873435974, 0, 0, 0.034898757934570312, 0.999390840530395507, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+52, 181016, 595, 4100, 4100, 3, 1, 2154.65625, 1293.204833984375, 134.4106597900390625, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+53, 181060, 595, 4100, 4100, 3, 1, 2124.921875, 1357.8853759765625, 132.658203125, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+54, 181060, 595, 4100, 4100, 3, 1, 2119.279541015625, 1356.9461669921875, 132.63006591796875, 2.408554315567016601, 0, 0, 0.933580398559570312, 0.358368009328842163, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+55, 181060, 595, 4100, 4100, 3, 1, 2125.8681640625, 1352.4132080078125, 132.9042205810546875, 5.619962215423583984, 0, 0, -0.32556724548339843, 0.945518851280212402, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+56, 181060, 595, 4100, 4100, 3, 1, 2121.8525390625, 1358.5867919921875, 132.593780517578125, 1.710421562194824218, 0, 0, 0.754709243774414062, 0.656059443950653076, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+57, 181017, 595, 4100, 4100, 3, 1, 2106.89404296875, 1380.51220703125, 139.30267333984375, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 7200, 255, 1, 0), -- Hanging, Streamer - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+58, 181018, 595, 4100, 4100, 3, 1, 2143.01220703125, 1371.3541259765625, 138.8475799560546875, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+59, 181018, 595, 4100, 4100, 3, 1, 2151.5, 1370.189208984375, 139.0308074951171875, 4.555310726165771484, 0, 0, -0.76040554046630859, 0.649448513984680175, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+60, 181016, 595, 4100, 4100, 3, 1, 2194.291748046875, 1288.751708984375, 134.5957794189453125, 2.949595451354980468, 0, 0, 0.995395660400390625, 0.095851235091686248, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+61, 181016, 595, 4100, 4100, 3, 1, 2177.614501953125, 1234.0035400390625, 137.313629150390625, 2.216565132141113281, 0, 0, 0.894933700561523437, 0.44619917869567871, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+62, 181020, 595, 4100, 4100, 3, 1, 2185.94091796875, 1235.0260009765625, 147.9004974365234375, 2.356194972991943359, 0, 0, 0.923879623413085937, 0.382683247327804565, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+63, 181016, 595, 4100, 4100, 3, 1, 2187.078125, 1243.5625, 137.3231964111328125, 2.583080768585205078, 0, 0, 0.961260795593261718, 0.275640487670898437, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+64, 181016, 595, 4100, 4100, 3, 1, 2267.93408203125, 1323.55908203125, 125.9082565307617187, 0.296705186367034912, 0, 0, 0.147809028625488281, 0.989015936851501464, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+65, 181016, 595, 4100, 4100, 3, 1, 2228.91845703125, 1337.0347900390625, 127.625213623046875, 3.473210096359252929, 0, 0, -0.98628520965576171, 0.165049895644187927, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+66, 181016, 595, 4100, 4100, 3, 1, 2228.6806640625, 1326.1197509765625, 127.8867874145507812, 2.984498262405395507, 0, 0, 0.996916770935058593, 0.078466430306434631, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+67, 181016, 595, 4100, 4100, 3, 1, 2214.890625, 1212.2586669921875, 137.1099395751953125, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+68, 181020, 595, 4100, 4100, 3, 1, 2231.80908203125, 1331.7899169921875, 134.8952178955078125, 3.176533222198486328, 0, 0, -0.999847412109375, 0.017469281330704689, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+69, 181020, 595, 4100, 4100, 3, 1, 2262.826416015625, 1330.9305419921875, 134.6929931640625, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+70, 181016, 595, 4100, 4100, 3, 1, 2267.907958984375, 1337.30908203125, 124.4250564575195312, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+71, 181020, 595, 4100, 4100, 3, 1, 2310.739501953125, 1326.7847900390625, 129.516876220703125, 3.22885894775390625, 0, 0, -0.99904823303222656, 0.043619260191917419, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+72, 181020, 595, 4100, 4100, 3, 1, 2309.182373046875, 1341.0816650390625, 129.5749053955078125, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+73, 181016, 595, 4100, 4100, 3, 1, 2204.904541015625, 1204.0086669921875, 136.990386962890625, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+74, 181016, 595, 4100, 4100, 3, 1, 2231.807373046875, 1145.2222900390625, 139.6356353759765625, 0.959929943084716796, 0, 0, 0.461748123168945312, 0.887011110782623291, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+75, 181060, 595, 4100, 4100, 3, 1, 2271.588623046875, 1159.736083984375, 139.2359161376953125, 3.735006093978881835, 0, 0, -0.95630455017089843, 0.292372345924377441, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+76, 181060, 595, 4100, 4100, 3, 1, 2278.616455078125, 1162.15283203125, 139.49664306640625, 5.986480236053466796, 0, 0, -0.14780902862548828, 0.989015936851501464, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+77, 181060, 595, 4100, 4100, 3, 1, 2274.322998046875, 1158.34375, 139.2575836181640625, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+78, 181060, 595, 4100, 4100, 3, 1, 2271.869873046875, 1165.2864990234375, 139.429107666015625, 2.338739633560180664, 0, 0, 0.920504570007324218, 0.3907318115234375, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+79, 181060, 595, 4100, 4100, 3, 1, 2274.772705078125, 1166.314208984375, 139.54522705078125, 1.535889506340026855, 0, 0, 0.694658279418945312, 0.719339847564697265, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+80, 181060, 595, 4100, 4100, 3, 1, 2277.48095703125, 1165.0521240234375, 139.55718994140625, 0.698131442070007324, 0, 0, 0.342020034790039062, 0.939692676067352294, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+81, 181060, 595, 4100, 4100, 3, 1, 2270.616455078125, 1162.486083984375, 139.2928314208984375, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+82, 181060, 595, 4100, 4100, 3, 1, 2277.26220703125, 1159.328125, 139.402099609375, 2.338739633560180664, 0, 0, 0.920504570007324218, 0.3907318115234375, 7200, 255, 1, 0), -- Standing, Interior, Small - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+83, 181020, 595, 4100, 4100, 3, 1, 2282.592041015625, 1133.670166015625, 146.3243408203125, 1.937312245368957519, 0, 0, 0.824125289916992187, 0.566407561302185058, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+84, 181018, 595, 4100, 4100, 3, 1, 2306.2275390625, 1157.298583984375, 139.9674530029296875, 2.059488296508789062, 0, 0, 0.857167243957519531, 0.515038192272186279, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+85, 181018, 595, 4100, 4100, 3, 1, 2318.600830078125, 1166.8646240234375, 140.214630126953125, 2.199114561080932617, 0, 0, 0.8910064697265625, 0.453990638256072998, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+86, 181016, 595, 4100, 4100, 3, 1, 2316.713623046875, 1157.361083984375, 135.58953857421875, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+87, 181016, 595, 4100, 4100, 3, 1, 2344.272705078125, 1216.18408203125, 131.106964111328125, 4.991643905639648437, 0, 0, -0.60181427001953125, 0.798636078834533691, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+88, 181016, 595, 4100, 4100, 3, 1, 2369.5087890625, 1189.9566650390625, 132.0734100341796875, 3.298687219619750976, 0, 0, -0.99691677093505859, 0.078466430306434631, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+89, 181017, 595, 4100, 4100, 3, 1, 2371.5, 1199.4288330078125, 140.5843963623046875, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 7200, 255, 1, 0), -- Hanging, Streamer - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+90, 181018, 595, 4100, 4100, 3, 1, 2373.557373046875, 1193.4774169921875, 137.450439453125, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+91, 181016, 595, 4100, 4100, 3, 1, 2365.51220703125, 1206.0208740234375, 131.530059814453125, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+92, 181018, 595, 4100, 4100, 3, 1, 2370.361083984375, 1204.6910400390625, 137.312408447265625, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+93, 181016, 595, 4100, 4100, 3, 1, 2332.710205078125, 1253.6978759765625, 133.481353759765625, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+94, 181016, 595, 4100, 4100, 3, 1, 2389.998291015625, 1194.26220703125, 148.0759124755859375, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+95, 181055, 595, 4100, 4100, 3, 1, 2395.723876953125, 1194.1319580078125, 142.4735870361328125, 1.745326757431030273, 0, 0, 0.766043663024902343, 0.642788589000701904, 7200, 255, 1, 0), -- Hanging, Streamer x3 - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+96, 181016, 595, 4100, 4100, 3, 1, 2395.064208984375, 1176.1875, 133.93292236328125, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+97, 181018, 595, 4100, 4100, 3, 1, 2384.97216796875, 1211.7396240234375, 136.561065673828125, 0.226892471313476562, 0, 0, 0.113203048706054687, 0.993571877479553222, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+98, 181018, 595, 4100, 4100, 3, 1, 2389.04345703125, 1194.34033203125, 136.4981231689453125, 0.24434557557106018, 0, 0, 0.121869087219238281, 0.9925462007522583, 7200, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+99, 181019, 595, 4100, 4100, 3, 1, 2403.560791015625, 1186.376708984375, 134.8163299560546875, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+100, 181016, 595, 4100, 4100, 3, 1, 2399.833251953125, 1172.3489990234375, 148.0749053955078125, 1.361356139183044433, 0, 0, 0.629320144653320312, 0.77714616060256958, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+101, 181019, 595, 4100, 4100, 3, 1, 2398.585205078125, 1213.4879150390625, 134.9222564697265625, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+102, 181016, 595, 4100, 4100, 3, 1, 2400.90966796875, 1219.62158203125, 134.0390167236328125, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+103, 181055, 595, 4100, 4100, 3, 1, 2407.859375, 1196.763916015625, 142.53497314453125, 1.815141916275024414, 0, 0, 0.788010597229003906, 0.615661680698394775, 7200, 255, 1, 0), -- Hanging, Streamer x3 - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+104, 181016, 595, 4100, 4100, 3, 1, 2411.060791015625, 1175.234375, 148.074920654296875, 2.059488296508789062, 0, 0, 0.857167243957519531, 0.515038192272186279, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+105, 181016, 595, 4100, 4100, 3, 1, 2407.21533203125, 1138.1649169921875, 148.0759124755859375, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+106, 181016, 595, 4100, 4100, 3, 1, 2408.55029296875, 1113.0538330078125, 148.0759124755859375, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+107, 181019, 595, 4100, 4100, 3, 1, 2408.90966796875, 1202.2379150390625, 134.9315948486328125, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+108, 181019, 595, 4100, 4100, 3, 1, 2416.3681640625, 1188.4583740234375, 134.820526123046875, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+109, 181016, 595, 4100, 4100, 3, 1, 2418.864501953125, 1141.2552490234375, 148.075897216796875, 4.45059061050415039, 0, 0, -0.79335308074951171, 0.608761727809906005, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+110, 181019, 595, 4100, 4100, 3, 1, 2420.16845703125, 1205.138916015625, 134.9156036376953125, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+111, 181016, 595, 4100, 4100, 3, 1, 2418.4775390625, 1223.9947509765625, 134.0390167236328125, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+112, 181055, 595, 4100, 4100, 3, 1, 2421.213623046875, 1200.0069580078125, 142.5443267822265625, 1.797688722610473632, 0, 0, 0.7826080322265625, 0.622514784336090087, 7200, 255, 1, 0), -- Hanging, Streamer x3 - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+113, 181055, 595, 4100, 4100, 3, 1, 2433.482666015625, 1202.951416015625, 142.5956878662109375, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 7200, 255, 1, 0), -- Hanging, Streamer x3 - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+114, 181019, 595, 4100, 4100, 3, 1, 2434.3125, 1201.4600830078125, 135.110137939453125, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+115, 181019, 595, 4100, 4100, 3, 1, 2428.33154296875, 1219.71533203125, 134.9208984375, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+116, 181019, 595, 4100, 4100, 3, 1, 2434.413330078125, 1194.01220703125, 135.109893798828125, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 0), -- Standing, Interior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+117, 181020, 595, 4100, 4100, 3, 1, 2443.84716796875, 1227.2117919921875, 135.6902618408203125, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+118, 181016, 595, 4100, 4100, 3, 1, 2452.13720703125, 1122.0504150390625, 148.075897216796875, 3.281238555908203125, 0, 0, -0.99756336212158203, 0.069766148924827575, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+119, 181020, 595, 4100, 4100, 3, 1, 2469.7587890625, 1127.2882080078125, 155.570281982421875, 3.351046562194824218, 0, 0, -0.99452114105224609, 0.104535527527332305, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+120, 181055, 595, 4100, 4100, 3, 1, 2412.736083984375, 1103.907958984375, 154.756591796875, 0.209439441561698913, 0, 0, 0.104528427124023437, 0.994521915912628173, 7200, 255, 1, 0), -- Hanging, Streamer x3 - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+121, 181016, 595, 4100, 4100, 3, 1, 2455.65625, 1104.7725830078125, 148.075897216796875, 3.316144466400146484, 0, 0, -0.99619388580322265, 0.087165042757987976, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+122, 181016, 595, 4100, 4100, 3, 1, 2412.786376953125, 1094.19970703125, 148.0759124755859375, 0.331610709428787231, 0, 0, 0.16504669189453125, 0.986285746097564697, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+123, 181020, 595, 4100, 4100, 3, 1, 2473.532958984375, 1110.1285400390625, 155.2871856689453125, 3.141592741012573242, 0, 0, -1, 0, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+124, 181016, 595, 4100, 4100, 3, 1, 2520.549560546875, 1138.0416259765625, 132.076507568359375, 4.328419685363769531, 0, 0, -0.82903671264648437, 0.559194147586822509, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+125, 181016, 595, 4100, 4100, 3, 1, 2338.635498046875, 1423.48095703125, 128.1294097900390625, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 7200, 255, 1, 0), -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+126, 181020, 595, 4100, 4100, 3, 1, 2326.923583984375, 1420.046875, 135.85186767578125, 5.026549339294433593, 0, 0, -0.5877847671508789, 0.809017360210418701, 7200, 255, 1, 0), -- Hanging, Square, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+127, 181016, 595, 4100, 4100, 3, 1, 2316.064208984375, 1410.5867919921875, 128.1347808837890625, 0, 0, 0, 0, 1, 7200, 255, 1, 0); -- Standing, Exterior, Medium - Val (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+127 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+127; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_01_world.sql new file mode 100644 index 00000000000..bcca0c9a62f --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_01_world.sql @@ -0,0 +1,189 @@ +-- +SET @OGUID := 92785; -- Need 180 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+179; +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 +(@OGUID+0, 195259, 571, 3537, 4032, 1, 1, 2279.2080078125, 5188.57763671875, 16.22224235534667968, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+1, 195257, 571, 3537, 4032, 1, 1, 2272.831298828125, 5198.1494140625, 14.36125659942626953, 5.829400539398193359, 0, 0, -0.22495079040527343, 0.974370121955871582, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+2, 195260, 571, 3537, 4032, 1, 1, 2276.773681640625, 5199.5341796875, 24.89459800720214843, 4.258606910705566406, 0, 0, -0.84804725646972656, 0.529920578002929687, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+3, 195266, 571, 3537, 4032, 1, 1, 2270.001708984375, 5197.173828125, 17.32867622375488281, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+4, 195256, 571, 3537, 4032, 1, 1, 2238.3603515625, 5132.744140625, 5.344913959503173828, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+5, 195257, 571, 3537, 4032, 1, 1, 2280.92578125, 5198.3935546875, 14.63274002075195312, 4.188792228698730468, 0, 0, -0.86602497100830078, 0.50000077486038208, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+6, 195257, 571, 3537, 4032, 1, 1, 2281.225830078125, 5199.1005859375, 14.57226085662841796, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+7, 195257, 571, 3537, 4032, 1, 1, 2271.331298828125, 5194.4423828125, 14.39652824401855468, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+8, 195259, 571, 3537, 4032, 1, 1, 2288.10888671875, 5196.54931640625, 14.44637584686279296, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+9, 195266, 571, 3537, 4032, 1, 1, 2274.93408203125, 5189.16943359375, 26.13615226745605468, 4.258606910705566406, 0, 0, -0.84804725646972656, 0.529920578002929687, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+10, 195255, 571, 3537, 4032, 1, 1, 2288.474365234375, 5160.943359375, 25.54812049865722656, 4.345870018005371093, 0, 0, -0.82412624359130859, 0.566406130790710449, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+11, 195255, 571, 3537, 4032, 1, 1, 2293.540283203125, 5174.7177734375, 25.11964607238769531, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+12, 195260, 571, 3537, 4032, 1, 1, 2278.044921875, 5202.72509765625, 24.89858818054199218, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+13, 195263, 571, 3537, 4032, 1, 1, 2264.359375, 5199.47314453125, 21.16697502136230468, 2.792518377304077148, 0, 0, 0.984807014465332031, 0.173652306199073791, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+14, 195256, 571, 3537, 4032, 1, 1, 2248.404052734375, 5206.861328125, 14.71352863311767578, 0.523597896099090576, 0, 0, 0.258818626403808593, 0.965925931930541992, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+15, 195256, 571, 3537, 4032, 1, 1, 2238.516845703125, 5180.17626953125, 14.71352958679199218, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+16, 195256, 571, 3537, 4032, 1, 1, 2226.790771484375, 5136.91455078125, 5.344574928283691406, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+17, 195266, 571, 3537, 4032, 1, 1, 2270.87890625, 5210.54248046875, 28.94805908203125, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+18, 195264, 571, 3537, 4032, 1, 1, 2295.146484375, 5194.60400390625, 16.54580879211425781, 3.752462387084960937, 0, 0, -0.95371627807617187, 0.300707906484603881, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+19, 195260, 571, 3537, 4032, 1, 1, 2304.0087890625, 5195.68896484375, 18.77863693237304687, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+20, 195257, 571, 3537, 4032, 1, 1, 2299.134033203125, 5198.04443359375, 13.93274211883544921, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+21, 195260, 571, 3537, 4032, 1, 1, 2288.107666015625, 5203.8837890625, 13.63426113128662109, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+22, 195266, 571, 3537, 4032, 1, 1, 2288.640625, 5214.3359375, 27.50825309753417968, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+23, 195264, 571, 3537, 4032, 1, 1, 2292.770751953125, 5195.49072265625, 16.54580879211425781, 1.692969322204589843, 0, 0, 0.748955726623535156, 0.662620067596435546, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+24, 195256, 571, 3537, 4032, 1, 1, 2255.3095703125, 5225.85595703125, 14.71352863311767578, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+25, 195260, 571, 3537, 4032, 1, 1, 2290.5908203125, 5201.154296875, 24.89418220520019531, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+26, 195260, 571, 3537, 4032, 1, 1, 2289.228515625, 5206.75927734375, 13.63449668884277343, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+27, 195260, 571, 3537, 4032, 1, 1, 2289.666259765625, 5198.8798828125, 24.89882850646972656, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+28, 195266, 571, 3537, 4032, 1, 1, 2314.89404296875, 5185.27587890625, 23.48017692565917968, 4.363324165344238281, 0, 0, -0.81915187835693359, 0.573576688766479492, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+29, 195260, 571, 3537, 4032, 1, 1, 2291.030517578125, 5196.255859375, 16.54580879211425781, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+30, 195260, 571, 3537, 4032, 1, 1, 2303.144287109375, 5193.45849609375, 18.77863883972167968, 5.89921426773071289, 0, 0, -0.19080829620361328, 0.981627285480499267, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+31, 195256, 571, 3537, 4032, 1, 1, 2207.053466796875, 5222.54248046875, 14.10004520416259765, 2.70525527000427246, 0, 0, 0.97629547119140625, 0.216442063450813293, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+32, 195260, 571, 3537, 4032, 1, 1, 2296.923095703125, 5193.869140625, 16.54580879211425781, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+33, 195260, 571, 3537, 4032, 1, 1, 2300.87109375, 5202.06591796875, 18.77513504028320312, 5.881760597229003906, 0, 0, -0.19936752319335937, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+34, 195263, 571, 3537, 4032, 1, 1, 2282.703125, 5218.59619140625, 20.98289680480957031, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+35, 195263, 571, 3537, 4032, 1, 1, 2296.557373046875, 5212.9931640625, 20.75706672668457031, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+36, 195255, 571, 3537, 4032, 1, 1, 2330.237060546875, 5169.8720703125, 25.63700103759765625, 1.832594871520996093, 0, 0, 0.793353080749511718, 0.608761727809906005, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+37, 195263, 571, 3537, 4032, 1, 1, 2309.713623046875, 5207.69384765625, 20.94551467895507812, 1.117009282112121582, 0, 0, 0.529918670654296875, 0.84804844856262207, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+38, 195266, 571, 3537, 4032, 1, 1, 2320.046875, 5198.4697265625, 23.7144622802734375, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+39, 195266, 571, 3537, 4032, 1, 1, 2303.013916015625, 5208.548828125, 27.68203544616699218, 1.186823248863220214, 0, 0, 0.559192657470703125, 0.829037725925445556, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+40, 195256, 571, 3537, 4032, 1, 1, 2302.697509765625, 5237.80029296875, 11.33970260620117187, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+41, 195256, 571, 3537, 4032, 1, 1, 2352.74169921875, 5196.42041015625, 7.632044792175292968, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+42, 195256, 571, 3537, 4032, 1, 1, 2214.6953125, 5241.33349609375, 14.10004520416259765, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+43, 195255, 571, 3537, 4032, 1, 1, 2362.818603515625, 5195.90087890625, 19.76927375793457031, 2.373644113540649414, 0, 0, 0.927183151245117187, 0.37460830807685852, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+44, 195256, 571, 3537, 4032, 1, 1, 2234.98681640625, 5298.37890625, 15.05626106262207031, 2.687806606292724609, 0, 0, 0.974370002746582031, 0.224951311945915222, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+45, 195256, 571, 3537, 4032, 1, 1, 2187.26904296875, 5257.0966796875, 23.37514686584472656, 2.932138919830322265, 0, 0, 0.994521141052246093, 0.104535527527332305, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+46, 195256, 571, 3537, 4032, 1, 1, 2276.3203125, 5282.166015625, 15.66974735260009765, 5.811946868896484375, 0, 0, -0.2334451675415039, 0.972369968891143798, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+47, 195256, 571, 3537, 4032, 1, 1, 2192.25537109375, 5270.982421875, 24.4593658447265625, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+48, 195256, 571, 3537, 4032, 1, 1, 2366.833251953125, 5211.396484375, 7.632043838500976562, 2.70525527000427246, 0, 0, 0.97629547119140625, 0.216442063450813293, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+49, 195255, 571, 3537, 4032, 1, 1, 2361.501708984375, 5274.708984375, 25.85167312622070312, 3.52557229995727539, 0, 0, -0.98162651062011718, 0.190812408924102783, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+50, 195256, 571, 3537, 4032, 1, 1, 2288.013427734375, 5313.14697265625, 14.71353340148925781, 5.044002056121826171, 0, 0, -0.58070278167724609, 0.814115643501281738, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+51, 195255, 571, 3537, 4032, 1, 1, 2373.8203125, 5235.90185546875, 20.25008392333984375, 3.071766138076782226, 0, 0, 0.999390602111816406, 0.034906134009361267, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+52, 195256, 571, 3537, 4032, 1, 1, 2197.986083984375, 5288.5576171875, 24.45936393737792968, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+53, 195256, 571, 3537, 4032, 1, 1, 2213.9501953125, 5333.77783203125, 23.37514877319335937, 3.45575571060180664, 0, 0, -0.98768806457519531, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+54, 195256, 571, 3537, 4032, 1, 1, 2208.510009765625, 5319.640625, 23.37514686584472656, 2.897245407104492187, 0, 0, 0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+55, 195256, 571, 3537, 4032, 1, 1, 2202.939453125, 5302.73291015625, 23.37514686584472656, 2.827429771423339843, 0, 0, 0.987688064575195312, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+56, 195256, 571, 3537, 4032, 1, 1, 2151.34326171875, 5284.07080078125, 24.66521263122558593, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+57, 195256, 571, 3537, 4032, 1, 1, 2157.4755859375, 5301.4140625, 24.66485023498535156, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+58, 195256, 571, 3537, 4032, 1, 1, 2112.849853515625, 5291.52392578125, 32.77573776245117187, 1.239183306694030761, 0, 0, 0.580702781677246093, 0.814115643501281738, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+59, 195256, 571, 3537, 4032, 1, 1, 2122.561279296875, 5320.2626953125, 32.77589035034179687, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+60, 195256, 571, 3537, 4113, 1, 1, 2872.568603515625, 4041.227783203125, 5.269433975219726562, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+61, 195256, 571, 3537, 4113, 1, 1, 2899.83154296875, 4067.15625, 1.792299985885620117, 6.09120035171508789, 0, 0, -0.09584522247314453, 0.995396256446838378, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+62, 195256, 571, 3537, 4113, 1, 1, 2927.11669921875, 4077.87158203125, 2.141782999038696289, 5.881760597229003906, 0, 0, -0.19936752319335937, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+63, 195256, 571, 3537, 4113, 1, 1, 2910.1943359375, 4046.255615234375, 1.670829057693481445, 0.122172988951206207, 0, 0, 0.061048507690429687, 0.998134791851043701, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+64, 195256, 571, 3537, 4113, 1, 1, 2904.64013671875, 4073.700439453125, 1.964231014251708984, 4.904376029968261718, 0, 0, -0.636077880859375, 0.771624863147735595, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+65, 195256, 571, 3537, 4113, 1, 1, 2875.32763671875, 4035.009033203125, 5.44103097915649414, 0.890116631984710693, 0, 0, 0.430510520935058593, 0.902585566043853759, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+66, 195256, 571, 3537, 4113, 1, 1, 2922.883056640625, 4037.387939453125, 1.768460988998413085, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+67, 195259, 571, 3537, 4113, 1, 1, 2980.37939453125, 4053.989501953125, 28.38085365295410156, 3.089183330535888671, 0, 0, 0.99965667724609375, 0.026201646775007247, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+68, 195256, 571, 3537, 4113, 1, 1, 2997.856689453125, 4049.579345703125, 26.61824226379394531, 6.213373661041259765, 0, 0, -0.03489875793457031, 0.999390840530395507, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+69, 195256, 571, 3537, 4113, 1, 1, 2959.033935546875, 3995.015625, 1.87953805923461914, 2.338739633560180664, 0, 0, 0.920504570007324218, 0.3907318115234375, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+70, 195256, 571, 3537, 4113, 1, 1, 2998.711181640625, 4070.604248046875, 26.91522789001464843, 1.047197580337524414, 0, 0, 0.5, 0.866025388240814208, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+71, 195273, 571, 3537, 4113, 1, 1, 3001.96337890625, 4042.353759765625, 29.05370521545410156, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+72, 195256, 571, 3537, 4113, 1, 1, 3008.4267578125, 4048.362548828125, 26.36823272705078125, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+73, 195259, 571, 3537, 4113, 1, 1, 3007.1640625, 4071.764892578125, 35.894866943359375, 1.553341388702392578, 0, 0, 0.700908660888671875, 0.713251054286956787, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+74, 195256, 571, 3537, 4113, 1, 1, 3017.189453125, 4065.65185546875, 26.77532768249511718, 1.710421562194824218, 0, 0, 0.754709243774414062, 0.656059443950653076, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+75, 195259, 571, 3537, 4113, 1, 1, 3026.244873046875, 4045.87841796875, 28.50894927978515625, 5.829400539398193359, 0, 0, -0.22495079040527343, 0.974370121955871582, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Unu'pe - Difficulty: 0) CreateObject1 +(@OGUID+76, 195256, 571, 3537, 4114, 1, 1, 3099.8447265625, 3831.98388671875, 23.01079750061035156, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Death's Stand - Difficulty: 0) CreateObject1 +(@OGUID+77, 195256, 571, 3537, 4047, 1, 1, 3426.033447265625, 4071.887939453125, 18.08249664306640625, 4.014260292053222656, 0, 0, -0.90630722045898437, 0.422619491815567016, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village- Difficulty: 0) CreateObject1 +(@OGUID+78, 195259, 571, 3537, 4047, 1, 1, 3449.408447265625, 4085.985595703125, 17.83682441711425781, 1.815141916275024414, 0, 0, 0.788010597229003906, 0.615661680698394775, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+79, 195256, 571, 3537, 4047, 1, 1, 3458.690673828125, 4082.39453125, 17.32234382629394531, 0.453785061836242675, 0, 0, 0.224950790405273437, 0.974370121955871582, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+80, 195256, 571, 3537, 4047, 1, 1, 3437.81884765625, 4086.139892578125, 17.098114013671875, 1.518436193466186523, 0, 0, 0.6883544921875, 0.725374460220336914, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+81, 195256, 571, 3537, 4047, 1, 1, 3409.351806640625, 4091.084228515625, 18.57693290710449218, 4.468043327331542968, 0, 0, -0.7880105972290039, 0.615661680698394775, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+82, 195256, 571, 3537, 4037, 1, 1, 3469.8837890625, 4115.69970703125, 16.7065582275390625, 3.682650327682495117, 0, 0, -0.96362972259521484, 0.26724100112915039, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+83, 195256, 571, 3537, 4037, 1, 1, 3418.99951171875, 4110.04150390625, 17.55773353576660156, 6.021387100219726562, 0, 0, -0.13052558898925781, 0.991444945335388183, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+84, 195256, 571, 3537, 4037, 1, 1, 3455.852783203125, 4140.36328125, 15.27708816528320312, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+85, 195256, 571, 3537, 4037, 1, 1, 3429.658447265625, 4124.90087890625, 16.82855606079101562, 5.253442287445068359, 0, 0, -0.49242305755615234, 0.870355963706970214, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+86, 195260, 571, 3537, 4037, 1, 1, 3458.477783203125, 4132.48046875, 17.17744827270507812, 4.97418975830078125, 0, 0, -0.60876083374023437, 0.793353796005249023, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+87, 195256, 571, 3537, 4037, 1, 1, 3473.78662109375, 4089.2470703125, 17.13011360168457031, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+88, 195273, 571, 3537, 4037, 1, 1, 3462.82373046875, 4143.79541015625, 26.0062713623046875, 4.642575740814208984, 0, 0, -0.731353759765625, 0.681998312473297119, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+89, 195256, 571, 3537, 4037, 1, 1, 3468.706787109375, 4138.94482421875, 15.28419017791748046, 4.276057243347167968, 0, 0, -0.84339141845703125, 0.537299633026123046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+90, 195260, 571, 3537, 4037, 1, 1, 3455.599365234375, 4164.83447265625, 19.33243370056152343, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+91, 195256, 571, 3537, 4037, 1, 1, 3444.581298828125, 4167.64453125, 17.16287422180175781, 1.466075778007507324, 0, 0, 0.669130325317382812, 0.74314504861831665, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+92, 195273, 571, 3537, 4037, 1, 1, 3437.626220703125, 4173.6826171875, 27.005615234375, 3.019413232803344726, 0, 0, 0.998134613037109375, 0.061051756143569946, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+93, 195256, 571, 3537, 4037, 1, 1, 3445.000244140625, 4178.58154296875, 17.1581573486328125, 4.729844093322753906, 0, 0, -0.70090866088867187, 0.713251054286956787, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+94, 195260, 571, 3537, 4037, 1, 1, 3472.409912109375, 4163.70458984375, 19.309173583984375, 1.623155713081359863, 0, 0, 0.725374221801757812, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+95, 195266, 571, 3537, 4037, 1, 1, 3464.88623046875, 4177.20654296875, 24.38718986511230468, 4.642575740814208984, 0, 0, -0.731353759765625, 0.681998312473297119, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+96, 195256, 571, 3537, 4037, 1, 1, 3484.244873046875, 4164.78759765625, 17.17531013488769531, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+97, 195256, 571, 3537, 4037, 1, 1, 3460.450439453125, 4186.22998046875, 18.21274757385253906, 6.14356088638305664, 0, 0, -0.06975555419921875, 0.997564136981964111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+98, 195273, 571, 3537, 4037, 1, 1, 3491.174072265625, 4170.66796875, 27.20992469787597656, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+99, 195256, 571, 3537, 4037, 1, 1, 3484.916748046875, 4176.37646484375, 17.19301986694335937, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+100, 195256, 571, 3537, 4037, 1, 1, 3472.248291015625, 4185.59228515625, 18.24645614624023437, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+101, 195273, 571, 3537, 4037, 1, 1, 3466.47216796875, 4192.8837890625, 28.92045021057128906, 1.535889506340026855, 0, 0, 0.694658279418945312, 0.719339847564697265, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+102, 195255, 571, 3537, 4037, 1, 1, 3466.603759765625, 4204.2744140625, 36.17081069946289062, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Taunka'le Village - Difficulty: 0) CreateObject1 +(@OGUID+103, 195256, 571, 3537, 4108, 1, 1, 4079.892333984375, 5272.37060546875, 27.84728622436523437, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+104, 195256, 571, 3537, 4108, 1, 1, 4116.859375, 5260.4541015625, 24.72841644287109375, 1.658061861991882324, 0, 0, 0.737277030944824218, 0.67559051513671875, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+105, 195256, 571, 3537, 4109, 1, 1, 4133.6513671875, 5261.0810546875, 25.04359626770019531, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+106, 195256, 571, 3537, 4108, 1, 1, 4064.177001953125, 5287.177734375, 28.33382987976074218, 0.488691210746765136, 0, 0, 0.241921424865722656, 0.970295846462249755, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+107, 195256, 571, 3537, 4108, 1, 1, 4124.85400390625, 5302.79833984375, 29.5003662109375, 1.623155713081359863, 0, 0, 0.725374221801757812, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+108, 195259, 571, 3537, 4108, 1, 1, 4111.60302734375, 5303.91943359375, 31.38319969177246093, 2.391098499298095703, 0, 0, 0.930417060852050781, 0.366502493619918823, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+109, 195256, 571, 3537, 4108, 1, 1, 4038.372802734375, 5295.92822265625, 24.80444717407226562, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+110, 195256, 571, 3537, 4108, 1, 1, 4047.685302734375, 5298.59326171875, 24.65438461303710937, 2.408554315567016601, 0, 0, 0.933580398559570312, 0.358368009328842163, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+111, 195266, 571, 3537, 4108, 1, 1, 4172.98779296875, 5271.83642578125, 40.90478515625, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+112, 195266, 571, 3537, 4108, 1, 1, 4173.98291015625, 5280.55029296875, 30.62881851196289062, 6.213373661041259765, 0, 0, -0.03489875793457031, 0.999390840530395507, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+113, 195257, 571, 3537, 4108, 1, 1, 4178.8759765625, 5273.9072265625, 40.731475830078125, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+114, 195266, 571, 3537, 4108, 1, 1, 4165.8828125, 5280.9384765625, 31.36930656433105468, 3.089183330535888671, 0, 0, 0.99965667724609375, 0.026201646775007247, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+115, 195256, 571, 3537, 4108, 1, 1, 4166.07080078125, 5288.28369140625, 26.3767242431640625, 2.827429771423339843, 0, 0, 0.987688064575195312, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+116, 195257, 571, 3537, 4108, 1, 1, 4176.3017578125, 5277.0546875, 28.09964752197265625, 1.117009282112121582, 0, 0, 0.529918670654296875, 0.84804844856262207, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+117, 195266, 571, 3537, 4108, 1, 1, 4174.3681640625, 5270.97509765625, 41.095703125, 5.637413978576660156, 0, 0, -0.31730461120605468, 0.948323667049407958, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+118, 195257, 571, 3537, 4108, 1, 1, 4176.38525390625, 5285.04248046875, 28.296112060546875, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+119, 195257, 571, 3537, 4108, 1, 1, 4171.79541015625, 5282.20556640625, 41.54663467407226562, 0.034906249493360519, 0, 0, 0.017452239990234375, 0.999847710132598876, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+120, 195256, 571, 3537, 4108, 1, 1, 4174.55029296875, 5310.48095703125, 25.47459602355957031, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+121, 195256, 571, 3537, 4108, 1, 1, 4188.306640625, 5253.25244140625, 26.37672233581542968, 3.298687219619750976, 0, 0, -0.99691677093505859, 0.078466430306434631, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fizzcrank Airstrip - Difficulty: 0) CreateObject1 +(@OGUID+122, 195256, 571, 3537, 4122, 1, 1, 4464.80078125, 5710.1494140625, 81.19541168212890625, 0.488691210746765136, 0, 0, 0.241921424865722656, 0.970295846462249755, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+123, 195256, 571, 3537, 4122, 1, 1, 4474.953125, 5701.2958984375, 81.268310546875, 0.296705186367034912, 0, 0, 0.147809028625488281, 0.989015936851501464, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+124, 195259, 571, 3537, 4122, 1, 1, 4475.26611328125, 5707.76416015625, 82.3621063232421875, 1.466075778007507324, 0, 0, 0.669130325317382812, 0.74314504861831665, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+125, 195259, 571, 3537, 4122, 1, 1, 4470.28466796875, 5710.63525390625, 82.27143096923828125, 0.994837164878845214, 0, 0, 0.477158546447753906, 0.878817260265350341, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+126, 195264, 571, 3537, 4122, 1, 1, 4502.47314453125, 5716.3740234375, 83.29630279541015625, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+127, 195253, 571, 3537, 4122, 1, 1, 4505.32763671875, 5718.3759765625, 87.04782867431640625, 2.234017848968505859, 0, 0, 0.898793220520019531, 0.438372820615768432, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+128, 195256, 571, 3537, 4122, 1, 1, 4503.0888671875, 5725.7080078125, 81.2832489013671875, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+129, 195256, 571, 3537, 4122, 1, 1, 4504.060546875, 5681.630859375, 81.4865570068359375, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+130, 195253, 571, 3537, 4122, 1, 1, 4502.59375, 5701.0087890625, 86.93270111083984375, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+131, 195256, 571, 3537, 4122, 1, 1, 4496.20556640625, 5716.17431640625, 81.43398284912109375, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+132, 195256, 571, 3537, 4122, 1, 1, 4509.7333984375, 5758.8916015625, 81.67447662353515625, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+133, 195253, 571, 3537, 4122, 1, 1, 4520.1025390625, 5699.3740234375, 86.9876251220703125, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+134, 195253, 571, 3537, 4122, 1, 1, 4522.38671875, 5716.76220703125, 86.95365142822265625, 0.663223206996917724, 0, 0, 0.325567245483398437, 0.945518851280212402, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+135, 195256, 571, 3537, 4122, 1, 1, 4518.92626953125, 5710.13525390625, 81.47955322265625, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Bor'gorok Outpost - Difficulty: 0) CreateObject1 +(@OGUID+136, 195256, 571, 3537, 4023, 1, 1, 3633.384521484375, 5887.4833984375, 140.0764923095703125, 0.994837164878845214, 0, 0, 0.477158546447753906, 0.878817260265350341, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+137, 195273, 571, 3537, 4023, 1, 1, 3634.594482421875, 5865.390625, 179.9925079345703125, 1.361356139183044433, 0, 0, 0.629320144653320312, 0.77714616060256958, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+138, 195256, 571, 3537, 4023, 1, 1, 3647.803466796875, 5882.2255859375, 174.494293212890625, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+139, 195273, 571, 3537, 4023, 1, 1, 3664.061767578125, 5884.24072265625, 180.0220184326171875, 2.914689540863037109, 0, 0, 0.993571281433105468, 0.113208353519439697, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+140, 195273, 571, 3537, 4023, 1, 1, 3644.9609375, 5913.44189453125, 180.1508026123046875, 4.468043327331542968, 0, 0, -0.7880105972290039, 0.615661680698394775, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+141, 195273, 571, 3537, 4023, 1, 1, 3615.73779296875, 5895.03125, 180.1674957275390625, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+142, 195256, 571, 3537, 4023, 1, 1, 3612.380126953125, 5919.876953125, 136.0995330810546875, 1.954769015312194824, 0, 0, 0.829037666320800781, 0.559192776679992675, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+143, 195256, 571, 3537, 4023, 1, 1, 3624.637451171875, 5926.56884765625, 136.21624755859375, 2.617989301681518554, 0, 0, 0.965925216674804687, 0.258821308612823486, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+144, 195266, 571, 3537, 4023, 1, 1, 3624.583251953125, 5913.43603515625, 144.8048858642578125, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+145, 195256, 571, 3537, 4023, 1, 1, 3623.188232421875, 5947.21337890625, 136.2162322998046875, 3.368495941162109375, 0, 0, -0.99357128143310546, 0.113208353519439697, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+146, 195256, 571, 3537, 4023, 1, 1, 3584.385498046875, 5975.64404296875, 136.21575927734375, 6.248279094696044921, 0, 0, -0.01745223999023437, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+147, 195256, 571, 3537, 4023, 1, 1, 3605.88623046875, 5989.13623046875, 136.2162322998046875, 4.084071159362792968, 0, 0, -0.8910064697265625, 0.453990638256072998, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+148, 195256, 571, 3537, 4023, 1, 1, 3519.408935546875, 5943.52685546875, 134.4015960693359375, 0.139624491333961486, 0, 0, 0.06975555419921875, 0.997564136981964111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+149, 195256, 571, 3537, 4023, 1, 1, 3521.80224609375, 5957.62744140625, 134.07440185546875, 5.462882041931152343, 0, 0, -0.39874839782714843, 0.917060375213623046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amber Ledge - Difficulty: 0) CreateObject1 +(@OGUID+150, 195256, 571, 3537, 4129, 1, 1, 2892.68212890625, 6263.138671875, 209.03607177734375, 5.201082706451416015, 0, 0, -0.51503753662109375, 0.857167601585388183, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+151, 195256, 571, 3537, 4129, 1, 1, 2899.378173828125, 6242.91259765625, 208.8885040283203125, 3.839725255966186523, 0, 0, -0.93969249725341796, 0.34202045202255249, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+152, 195256, 571, 3537, 4129, 1, 1, 2888.891357421875, 6247.6015625, 208.8507232666015625, 4.276057243347167968, 0, 0, -0.84339141845703125, 0.537299633026123046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+153, 195254, 571, 3537, 4129, 1, 1, 2754.732421875, 6279.3740234375, 181.27337646484375, 2.286378860473632812, 0, 0, 0.909960746765136718, 0.414694398641586303, 120, 255, 1, 0), -- Hanging, Square, Large - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+154, 195256, 571, 3537, 4129, 1, 1, 2860.568603515625, 6221.08056640625, 208.737518310546875, 0.541050612926483154, 0, 0, 0.267237663269042968, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+155, 195256, 571, 3537, 4129, 1, 1, 2799.83544921875, 6186.32763671875, 84.08406829833984375, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+156, 195257, 571, 3537, 4129, 1, 1, 2792.786376953125, 6176.63037109375, 88.45963287353515625, 0.226892471313476562, 0, 0, 0.113203048706054687, 0.993571877479553222, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+157, 195257, 571, 3537, 4129, 1, 1, 2789.380126953125, 6177.330078125, 88.61862945556640625, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+158, 195273, 571, 3537, 4129, 1, 1, 2794.3359375, 6171.5009765625, 88.1082763671875, 5.445427894592285156, 0, 0, -0.40673637390136718, 0.913545548915863037, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+159, 195256, 571, 3537, 4129, 1, 1, 2788.65966796875, 6162.68017578125, 84.8553009033203125, 5.515241622924804687, 0, 0, -0.37460613250732421, 0.927184045314788818, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+160, 195256, 571, 3537, 4129, 1, 1, 2815.3046875, 6174.10107421875, 121.9517669677734375, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+161, 195256, 571, 3537, 4129, 1, 1, 2853.403564453125, 6207.33447265625, 208.7359161376953125, 5.462882041931152343, 0, 0, -0.39874839782714843, 0.917060375213623046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+162, 195273, 571, 3537, 4129, 1, 1, 2815.826416015625, 6166.080078125, 94.5452728271484375, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+163, 195256, 571, 3537, 4129, 1, 1, 2861.186279296875, 6199.25244140625, 208.7365570068359375, 2.234017848968505859, 0, 0, 0.898793220520019531, 0.438372820615768432, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+164, 195256, 571, 3537, 4129, 1, 1, 2823.608642578125, 6165.09228515625, 121.9373092651367187, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+165, 195266, 571, 3537, 4129, 1, 1, 2815.302978515625, 6165.52587890625, 90.96311187744140625, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+166, 195260, 571, 3537, 4129, 1, 1, 2817.585205078125, 6154.6435546875, 86.02152252197265625, 3.52557229995727539, 0, 0, -0.98162651062011718, 0.190812408924102783, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+167, 195256, 571, 3537, 4129, 1, 1, 2876.30810546875, 6204.3359375, 208.739349365234375, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+168, 195260, 571, 3537, 4129, 1, 1, 2789.674560546875, 6148.0439453125, 86.64035797119140625, 0.715584874153137207, 0, 0, 0.350207328796386718, 0.936672210693359375, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+169, 195273, 571, 3537, 4129, 1, 1, 2786.773681640625, 6151.3671875, 89.299530029296875, 0.802850961685180664, 0, 0, 0.390730857849121093, 0.920504987239837646, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+170, 195273, 571, 3537, 4129, 1, 1, 2819.26953125, 6144.357421875, 87.8765716552734375, 2.303830623626708984, 0, 0, 0.913544654846191406, 0.406738430261611938, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+171, 195257, 571, 3537, 4129, 1, 1, 2824.10205078125, 6142.4697265625, 88.44103240966796875, 0.855210542678833007, 0, 0, 0.414692878723144531, 0.909961462020874023, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+172, 195273, 571, 3537, 4129, 1, 1, 2798.917724609375, 6138.15283203125, 89.22512054443359375, 0.663223206996917724, 0, 0, 0.325567245483398437, 0.945518851280212402, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+173, 195256, 571, 3537, 4129, 1, 1, 2805.133544921875, 6135.2744140625, 84.6513214111328125, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+174, 195257, 571, 3537, 4129, 1, 1, 2824.46826171875, 6139.03173828125, 88.58995819091796875, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+175, 195266, 571, 3537, 4129, 1, 1, 2769.889892578125, 6123.314453125, 96.68723297119140625, 3.822272777557373046, 0, 0, -0.94264125823974609, 0.333807557821273803, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+176, 195256, 571, 3537, 4129, 1, 1, 2902.970458984375, 6231.560546875, 208.8656158447265625, 3.45575571060180664, 0, 0, -0.98768806457519531, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+177, 195256, 571, 3537, 4129, 1, 1, 2922.967529296875, 6238.52978515625, 208.905548095703125, 2.478367090225219726, 0, 0, 0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+178, 195259, 571, 3537, 4129, 1, 1, 2924.9033203125, 6244.49951171875, 210.3615570068359375, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 +(@OGUID+179, 195259, 571, 3537, 4129, 1, 1, 2924.55908203125, 6242.06298828125, 209.84368896484375, 2.687806606292724609, 0, 0, 0.974370002746582031, 0.224951311945915222, 120, 255, 1, 0); -- Hanging, Square, Small - Brewfest (Area: Warsong Hold - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+179 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+179; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_02_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_02_world.sql new file mode 100644 index 00000000000..519f0b5087b --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_02_world.sql @@ -0,0 +1,32 @@ +-- +SET @OGUID := 48195; -- Need 23 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+32; +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 +(@OGUID+0, 195266, 571, 67, 4428, 1, 1, 6653.6044921875, -203.622772216796875, 954.6893310546875, 5.759587764739990234, 0, 0, -0.25881862640380859, 0.965925931930541992, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frosthold - Difficulty: 0) CreateObject1 +(@OGUID+1, 195266, 571, 67, 4428, 1, 1, 6663.80712890625, -184.669891357421875, 958.21551513671875, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frosthold - Difficulty: 0) CreateObject1 +(@OGUID+2, 195266, 571, 67, 4428, 1, 1, 6654.4990234375, -190.976272583007812, 956.8074951171875, 0.418878614902496337, 0, 0, 0.207911491394042968, 0.978147625923156738, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frosthold - Difficulty: 0) CreateObject1 +(@OGUID+3, 195256, 571, 67, 4429, 1, 1, 7850.470703125, -793.32989501953125, 1183.955078125, 3.106652259826660156, 0, 0, 0.999847412109375, 0.017469281330704689, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Grom'arsh Crash-Site - Difficulty: 0) CreateObject1 +(@OGUID+4, 195256, 571, 67, 4429, 1, 1, 7879.49853515625, -759.57012939453125, 1175.3660888671875, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Grom'arsh Crash-Site - Difficulty: 0) CreateObject1 +(@OGUID+5, 195256, 571, 67, 4429, 1, 1, 7856.44189453125, -742.138916015625, 1177.6876220703125, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Grom'arsh Crash-Site - Difficulty: 0) CreateObject1 +(@OGUID+6, 195259, 571, 67, 4429, 1, 1, 7856.078125, -735.815673828125, 1178.389404296875, 0.122172988951206207, 0, 0, 0.061048507690429687, 0.998134791851043701, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Grom'arsh Crash-Site - Difficulty: 0) CreateObject1 +(@OGUID+7, 195256, 571, 67, 4441, 1, 1, 7816.5849609375, -2769.4921875, 1188.7803955078125, 2.234017848968505859, 0, 0, 0.898793220520019531, 0.438372820615768432, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+8, 195256, 571, 67, 4441, 1, 1, 7791.91650390625, -2804.66845703125, 1216.7884521484375, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+9, 195259, 571, 67, 4441, 1, 1, 7795.13720703125, -2808.116455078125, 1217.7559814453125, 4.415683269500732421, 0, 0, -0.80385684967041015, 0.594822824001312255, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+10, 195256, 571, 67, 4441, 1, 1, 7776.33837890625, -2838.651123046875, 1217.1214599609375, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+11, 195256, 571, 67, 4441, 1, 1, 7825.24072265625, -2903.61279296875, 1240.8853759765625, 3.124123096466064453, 0, 0, 0.99996185302734375, 0.008734640665352344, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+12, 195266, 571, 67, 4441, 1, 1, 7801.470703125, -2961.203125, 1263.813232421875, 1.082102894783020019, 0, 0, 0.51503753662109375, 0.857167601585388183, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+13, 195257, 571, 67, 4441, 1, 1, 7797.767578125, -2957.82763671875, 1261.513671875, 1.204277276992797851, 0, 0, 0.56640625, 0.824126183986663818, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+14, 195266, 571, 67, 4441, 1, 1, 7799.6337890625, -2964.865966796875, 1264.69921875, 4.171337604522705078, 0, 0, -0.87035560607910156, 0.492423713207244873, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+15, 195257, 571, 67, 4441, 1, 1, 7806.43212890625, -2962.62890625, 1261.4276123046875, 1.012289404869079589, 0, 0, 0.484808921813964843, 0.87462007999420166, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+16, 195260, 571, 67, 4441, 1, 1, 7809.75341796875, -2956.811279296875, 1259.6474609375, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+17, 195263, 571, 67, 4441, 1, 1, 7802.56689453125, -2958.5283203125, 1264.48193359375, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+18, 195256, 571, 67, 4441, 1, 1, 7819.58251953125, -2965.007080078125, 1257.747314453125, 1.466075778007507324, 0, 0, 0.669130325317382812, 0.74314504861831665, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+19, 195256, 571, 67, 4441, 1, 1, 7784.9697265625, -2964.5390625, 1259, 5.654868602752685546, 0, 0, -0.30901622772216796, 0.95105677843093872, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+20, 195256, 571, 67, 4441, 1, 1, 7794.875, -2944.564208984375, 1257.248291015625, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+21, 195259, 571, 67, 4441, 1, 1, 7817.0693359375, -2963.26904296875, 1259.724609375, 0.541050612926483154, 0, 0, 0.267237663269042968, 0.96363067626953125, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 +(@OGUID+22, 195256, 571, 67, 4441, 1, 1, 7807.439453125, -2977.43408203125, 1258.9766845703125, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0); -- Standing, Exterior, Medium - Brewfest (Area: Camp Tunka'lo - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+22 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+22; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_03_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_03_world.sql new file mode 100644 index 00000000000..0655d381a2d --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_03_world.sql @@ -0,0 +1,54 @@ +-- +SET @OGUID := 55259; -- Need 46 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+45; +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 +(@OGUID+0, 195256, 571, 3711, 4284, 1, 1, 5575.6259765625, 5710.97119140625, -76.6946334838867187, 5.35816192626953125, 0, 0, -0.446197509765625, 0.894934535026550292, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+1, 195266, 571, 3711, 4284, 1, 1, 5550.9208984375, 5732.02978515625, -72.8947296142578125, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+2, 195266, 571, 3711, 4284, 1, 1, 5544.88623046875, 5730.65380859375, -72.8956222534179687, 4.1538848876953125, 0, 0, -0.8746194839477539, 0.484810054302215576, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+3, 195256, 571, 3711, 4284, 1, 1, 5547.86279296875, 5726.3916015625, -76.0391387939453125, 4.502951622009277343, 0, 0, -0.7771453857421875, 0.629321098327636718, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+4, 195266, 571, 3711, 4284, 1, 1, 5549.515625, 5738.0556640625, -72.9350662231445312, 0.994837164878845214, 0, 0, 0.477158546447753906, 0.878817260265350341, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+5, 195264, 571, 3711, 4284, 1, 1, 5543.533203125, 5732.81884765625, -75.006072998046875, 4.45059061050415039, 0, 0, -0.79335308074951171, 0.608761727809906005, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+6, 195266, 571, 3711, 4284, 1, 1, 5543.41943359375, 5736.71630859375, -72.8888320922851562, 2.583080768585205078, 0, 0, 0.961260795593261718, 0.275640487670898437, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+7, 195256, 571, 3711, 4284, 1, 1, 5538.6083984375, 5734.04248046875, -76.7061233520507812, 3.316144466400146484, 0, 0, -0.99619388580322265, 0.087165042757987976, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+8, 195256, 571, 3711, 4284, 1, 1, 5594.93408203125, 5715.6484375, -72.77392578125, 4.084071159362792968, 0, 0, -0.8910064697265625, 0.453990638256072998, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+9, 195266, 571, 3711, 4284, 1, 1, 5584.953125, 5748.9140625, -68.31658935546875, 3.281238555908203125, 0, 0, -0.99756336212158203, 0.069766148924827575, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+10, 195256, 571, 3711, 4284, 1, 1, 5565.49072265625, 5758.58251953125, -75.2259063720703125, 5.794494152069091796, 0, 0, -0.24192142486572265, 0.970295846462249755, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+11, 195264, 571, 3711, 4284, 1, 1, 5558.14453125, 5760.76123046875, -76.66796875, 2.286378860473632812, 0, 0, 0.909960746765136718, 0.414694398641586303, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+12, 195260, 571, 3711, 4284, 1, 1, 5547.07373046875, 5741.958984375, -75.4053497314453125, 0.820303261280059814, 0, 0, 0.398748397827148437, 0.917060375213623046, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+13, 195264, 571, 3711, 4284, 1, 1, 5546.4443359375, 5741.97412109375, -75.4053497314453125, 3.560472726821899414, 0, 0, -0.97814750671386718, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+14, 195264, 571, 3711, 4284, 1, 1, 5564.951171875, 5763.7421875, -74.1049652099609375, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+15, 195266, 571, 3711, 4284, 1, 1, 5569.91650390625, 5759.85791015625, -69.3228530883789062, 4.677483558654785156, 0, 0, -0.71933937072753906, 0.694658815860748291, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+16, 195256, 571, 3711, 4284, 1, 1, 5581.7734375, 5765.79248046875, -74.648590087890625, 5.061456203460693359, 0, 0, -0.57357597351074218, 0.819152355194091796, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+17, 195256, 571, 3711, 4284, 1, 1, 5584.72509765625, 5752.109375, -72.0627365112304687, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+19, 195264, 571, 3711, 4284, 1, 1, 5592.455078125, 5748.15673828125, -70.1986236572265625, 0.453785061836242675, 0, 0, 0.224950790405273437, 0.974370121955871582, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+20, 195260, 571, 3711, 4284, 1, 1, 5591.068359375, 5747.46630859375, -70.5360488891601562, 2.059488296508789062, 0, 0, 0.857167243957519531, 0.515038192272186279, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+21, 195264, 571, 3711, 4284, 1, 1, 5565.40087890625, 5770.0302734375, -74.0870285034179687, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+22, 195266, 571, 3711, 4284, 1, 1, 5562.83837890625, 5767.767578125, -69.3107070922851562, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+23, 195260, 571, 3711, 4284, 1, 1, 5555.88525390625, 5763.05224609375, -76.6834869384765625, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+24, 195266, 571, 3711, 4284, 1, 1, 5577.76123046875, 5766.7099609375, -69.3400802612304687, 6.230826377868652343, 0, 0, -0.02617645263671875, 0.999657332897186279, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+25, 195260, 571, 3711, 4284, 1, 1, 5564.96337890625, 5765.20947265625, -74.1218185424804687, 6.265733242034912109, 0, 0, -0.00872611999511718, 0.999961912631988525, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+26, 195266, 571, 3711, 4284, 1, 1, 5570.90087890625, 5774.63525390625, -69.3967971801757812, 1.448621988296508789, 0, 0, 0.662619590759277343, 0.748956084251403808, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+27, 195256, 571, 3711, 4284, 1, 1, 5623.017578125, 5797.69189453125, -71.1530685424804687, 1.605701684951782226, 0, 0, 0.719339370727539062, 0.694658815860748291, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+28, 195256, 571, 3711, 4284, 1, 1, 5590.330078125, 5779.95458984375, -71.8887252807617187, 5.672322273254394531, 0, 0, -0.3007049560546875, 0.953717231750488281, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+29, 195256, 571, 3711, 4284, 1, 1, 5533.6171875, 5764.57275390625, -78.6415481567382812, 0.802850961685180664, 0, 0, 0.390730857849121093, 0.920504987239837646, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+30, 195256, 571, 3711, 4284, 1, 1, 5591.7470703125, 5812.30810546875, -69.8521499633789062, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+31, 195256, 571, 3711, 4284, 1, 1, 5609.3271484375, 5807.85888671875, -70.49896240234375, 0.645771682262420654, 0, 0, 0.317304611206054687, 0.948323667049407958, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Nesingwary Base Camp - Difficulty: 0) CreateObject1 +(@OGUID+32, 195260, 571, 3711, 4383, 1, 1, 5479.8720703125, 4726.02978515625, -194.349822998046875, 4.049167633056640625, 0, 0, -0.89879322052001953, 0.438372820615768432, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+33, 195256, 571, 3711, 4383, 1, 1, 5478.01904296875, 4730.70654296875, -195.108367919921875, 0.785396754741668701, 0, 0, 0.38268280029296875, 0.923879802227020263, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+34, 195256, 571, 3711, 4383, 1, 1, 5480.52197265625, 4749.84375, -197.169540405273437, 5.654868602752685546, 0, 0, -0.30901622772216796, 0.95105677843093872, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+35, 195259, 571, 3711, 4383, 1, 1, 5482.611328125, 4728.69482421875, -191.631149291992187, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+36, 195260, 571, 3711, 4383, 1, 1, 5509.4775390625, 4741.9794921875, -194.433822631835937, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+37, 195260, 571, 3711, 4383, 1, 1, 5510.404296875, 4753.5478515625, -194.433822631835937, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+38, 195256, 571, 3711, 4383, 1, 1, 5489.2490234375, 4730.6259765625, -194.757522583007812, 1.186823248863220214, 0, 0, 0.559192657470703125, 0.829037725925445556, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+39, 195260, 571, 3711, 4383, 1, 1, 5502.95654296875, 4741.2734375, -194.433822631835937, 1.32644820213317871, 0, 0, 0.615660667419433593, 0.788011372089385986, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+40, 195256, 571, 3711, 4383, 1, 1, 5480.35498046875, 4744.158203125, -196.428298950195312, 0.087265998125076293, 0, 0, 0.043619155883789062, 0.999048233032226562, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+41, 195260, 571, 3711, 4383, 1, 1, 5503.82666015625, 4755.5263671875, -194.433822631835937, 4.904376029968261718, 0, 0, -0.636077880859375, 0.771624863147735595, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+42, 195260, 571, 3711, 4383, 1, 1, 5498.5927734375, 4745.71630859375, -194.433822631835937, 0.523597896099090576, 0, 0, 0.258818626403808593, 0.965925931930541992, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+43, 195260, 571, 3711, 4383, 1, 1, 5498.83642578125, 4751.91796875, -194.433822631835937, 5.89921426773071289, 0, 0, -0.19080829620361328, 0.981627285480499267, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+44, 195256, 571, 3711, 4383, 1, 1, 5499.65478515625, 4733.095703125, -194.544998168945312, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 +(@OGUID+45, 195260, 571, 3711, 4383, 1, 1, 5513.060546875, 4747.65869140625, -194.433822631835937, 2.932138919830322265, 0, 0, 0.994521141052246093, 0.104535527527332305, 120, 255, 1, 0); -- Standing, Interior, Small - Brewfest (Area: Lakeside Landing - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+45 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+45; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_04_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_04_world.sql new file mode 100644 index 00000000000..b8c1006c8fc --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_04_world.sql @@ -0,0 +1,5 @@ +-- https://www.wowhead.com/wotlk/npc=18220/ravenous-windroc#abilities +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 18220; +DELETE FROM `smart_scripts` WHERE `entryorguid`=18220 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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18220, 0, 0, 0, 0, 0, 100, 0, 4000, 4000, 6000, 6000, 0, 11, 30285, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, "Ravenous Windroc - In Combat - Cast 'Eagle Claw'"); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_05_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_05_world.sql new file mode 100644 index 00000000000..392e1ad24ba --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_05_world.sql @@ -0,0 +1,256 @@ +-- +SET @OGUID := 92965; -- Need 247 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+246; +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 +(@OGUID+0, 195257, 571, 65, 4158, 1, 1, 3484.33251953125, 2013.51025390625, 68.88947296142578125, 5.044002056121826171, 0, 0, -0.58070278167724609, 0.814115643501281738, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+1, 195257, 571, 65, 4158, 1, 1, 3476.03857421875, 2008.531494140625, 68.95276641845703125, 5.515241622924804687, 0, 0, -0.37460613250732421, 0.927184045314788818, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+2, 195260, 571, 65, 4158, 1, 1, 3490.9501953125, 2015.37939453125, 65.6033477783203125, 5.462882041931152343, 0, 0, -0.39874839782714843, 0.917060375213623046, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+3, 195257, 571, 65, 4158, 1, 1, 3472.212158203125, 1983.8604736328125, 69.0006866455078125, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+4, 195260, 571, 65, 4158, 1, 1, 3474.909423828125, 1975.4425048828125, 65.53430938720703125, 4.328419685363769531, 0, 0, -0.82903671264648437, 0.559194147586822509, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+5, 195256, 571, 65, 4158, 1, 1, 3487.094970703125, 1996.3912353515625, 64.86275482177734375, 3.22885894775390625, 0, 0, -0.99904823303222656, 0.043619260191917419, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+6, 195273, 571, 65, 4158, 1, 1, 3518.782958984375, 1993.7606201171875, 67.3443603515625, 3.682650327682495117, 0, 0, -0.96362972259521484, 0.26724100112915039, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+7, 195256, 571, 65, 4158, 1, 1, 3463.337646484375, 1991.167724609375, 64.6158905029296875, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+8, 195260, 571, 65, 4158, 1, 1, 3499.606689453125, 1984.6790771484375, 66.1546783447265625, 3.24634718894958496, 0, 0, -0.99862861633300781, 0.052353221923112869, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+9, 195256, 571, 65, 4158, 1, 1, 3503.747314453125, 2013.1265869140625, 64.86234283447265625, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+10, 195273, 571, 65, 4158, 1, 1, 3505.42236328125, 2014.634521484375, 68.2199554443359375, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+11, 195264, 571, 65, 4158, 1, 1, 3498.045166015625, 1985.9210205078125, 66.49420166015625, 1.466075778007507324, 0, 0, 0.669130325317382812, 0.74314504861831665, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+12, 195257, 571, 65, 4158, 1, 1, 3480.1650390625, 1977.2899169921875, 70.61582183837890625, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+13, 195260, 571, 65, 4158, 1, 1, 3467.421142578125, 1988.0499267578125, 66.54555511474609375, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+14, 195256, 571, 65, 4158, 1, 1, 3533.274658203125, 2028.2117919921875, 67.83712005615234375, 0.296705186367034912, 0, 0, 0.147809028625488281, 0.989015936851501464, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+15, 195264, 571, 65, 4158, 1, 1, 3472.78466796875, 1978.6875, 66.46651458740234375, 1.274088263511657714, 0, 0, 0.594821929931640625, 0.80385744571685791, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+16, 195260, 571, 65, 4158, 1, 1, 3494.897705078125, 1995.773193359375, 65.536407470703125, 4.066620349884033203, 0, 0, -0.89493370056152343, 0.44619917869567871, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+17, 195264, 571, 65, 4158, 1, 1, 3515.049072265625, 1995.760009765625, 66.579864501953125, 5.515241622924804687, 0, 0, -0.37460613250732421, 0.927184045314788818, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+18, 195273, 571, 65, 4158, 1, 1, 3519.55029296875, 2023.3880615234375, 67.93622589111328125, 0.122172988951206207, 0, 0, 0.061048507690429687, 0.998134791851043701, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+19, 195264, 571, 65, 4158, 1, 1, 3497.954345703125, 1962.58984375, 67.00489044189453125, 5.148722648620605468, 0, 0, -0.53729915618896484, 0.843391716480255126, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+20, 195273, 571, 65, 4158, 1, 1, 3500.45654296875, 1971.029541015625, 67.74578857421875, 2.513273954391479492, 0, 0, 0.951056480407714843, 0.309017121791839599, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+21, 195260, 571, 65, 4158, 1, 1, 3490.325439453125, 1972.8038330078125, 66.77190399169921875, 1.064649581909179687, 0, 0, 0.507537841796875, 0.861629426479339599, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+22, 195264, 571, 65, 4158, 1, 1, 3489.517822265625, 1973.3082275390625, 66.71260833740234375, 4.171337604522705078, 0, 0, -0.87035560607910156, 0.492423713207244873, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+23, 195273, 571, 65, 4158, 1, 1, 3492.437255859375, 1968.1041259765625, 68.17337799072265625, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+24, 195256, 571, 65, 4158, 1, 1, 3515.82763671875, 1981.8394775390625, 64.86244964599609375, 2.548179388046264648, 0, 0, 0.956304550170898437, 0.292372345924377441, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+25, 195259, 571, 65, 4158, 1, 1, 3643.3837890625, 1884.2996826171875, 80.81537628173828125, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+26, 195259, 571, 65, 0, 1, 1, 3553.18017578125, 1827.4703369140625, 81.07700347900390625, 4.310965538024902343, 0, 0, -0.83388519287109375, 0.55193793773651123, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: 0 - Difficulty: 0) CreateObject1 +(@OGUID+27, 195259, 571, 65, 0, 1, 1, 3612.02685546875, 1412.470458984375, 92.6059722900390625, 4.852017402648925781, 0, 0, -0.65605831146240234, 0.754710197448730468, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: 0 - Difficulty: 0) CreateObject1 +(@OGUID+28, 195256, 571, 65, 4165, 1, 1, 3763.40625, 1539.2960205078125, 87.0437469482421875, 3.647741317749023437, 0, 0, -0.96814727783203125, 0.250381410121917724, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Agmar's Hammer - Difficulty: 0) CreateObject1 +(@OGUID+29, 195254, 571, 65, 4165, 1, 1, 3771.653564453125, 1596.68408203125, 107.9984970092773437, 5.009094715118408203, 0, 0, -0.59482288360595703, 0.80385679006576538, 120, 255, 1, 0), -- Hanging, Square, Large - Brewfest (Area: Agmar's Hammer - Difficulty: 0) CreateObject1 +(@OGUID+30, 195259, 571, 65, 4165, 1, 1, 3770.22998046875, 1602.4271240234375, 95.7740936279296875, 5.044002056121826171, 0, 0, -0.58070278167724609, 0.814115643501281738, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Agmar's Hammer - Difficulty: 0) CreateObject1 +(@OGUID+31, 195259, 571, 65, 4165, 1, 1, 3857.14404296875, 1496.1441650390625, 95.12448883056640625, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Agmar's Hammer - Difficulty: 0) CreateObject1 +(@OGUID+32, 195256, 571, 65, 4169, 1, 1, 4462.36083984375, 1266.4830322265625, 142.2846527099609375, 5.009094715118408203, 0, 0, -0.59482288360595703, 0.80385679006576538, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+33, 195256, 571, 65, 4169, 1, 1, 4469.087890625, 1267.6422119140625, 141.8955841064453125, 4.520402908325195312, 0, 0, -0.77162456512451171, 0.636078238487243652, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+34, 195256, 571, 65, 4169, 1, 1, 4515.189453125, 1271.204833984375, 137.71160888671875, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+35, 195256, 571, 65, 4169, 1, 1, 4528.02587890625, 1252.005615234375, 139.5977325439453125, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+36, 195256, 571, 65, 4169, 1, 1, 4570.0712890625, 1394.9468994140625, 193.0703582763671875, 0, 0, 0, 0, 1, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+37, 195256, 571, 65, 4169, 1, 1, 4591.20654296875, 1394.501708984375, 193.8046722412109375, 2.373644113540649414, 0, 0, 0.927183151245117187, 0.37460830807685852, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+38, 195256, 571, 65, 4169, 1, 1, 4569.6728515625, 1388.65380859375, 192.9149932861328125, 4.9218292236328125, 0, 0, -0.62932014465332031, 0.77714616060256958, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+39, 195253, 571, 65, 4169, 1, 1, 4568.4990234375, 1399.640625, 198.230712890625, 0.017452461645007133, 0, 0, 0.008726119995117187, 0.999961912631988525, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+40, 195256, 571, 65, 4169, 1, 1, 4605.55810546875, 1414.258544921875, 194.6596527099609375, 4.642575740814208984, 0, 0, -0.731353759765625, 0.681998312473297119, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+41, 195256, 571, 65, 4169, 1, 1, 4576.10009765625, 1411.882568359375, 192.8129730224609375, 6.14356088638305664, 0, 0, -0.06975555419921875, 0.997564136981964111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+42, 195256, 571, 65, 4169, 1, 1, 4618.97119140625, 1409.7882080078125, 194.7805938720703125, 3.508116960525512695, 0, 0, -0.98325443267822265, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+43, 195256, 571, 65, 4169, 1, 1, 4616.93212890625, 1401.3851318359375, 195.17340087890625, 2.478367090225219726, 0, 0, 0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+44, 195256, 571, 65, 4169, 1, 1, 4613.7509765625, 1415.2470703125, 194.660675048828125, 4.48549652099609375, 0, 0, -0.7826080322265625, 0.622514784336090087, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+45, 195256, 571, 65, 4169, 1, 1, 4571.2490234375, 1421.1475830078125, 189.2039642333984375, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+46, 195256, 571, 65, 4169, 1, 1, 4616.95458984375, 1458.38525390625, 180.9932403564453125, 5.183629035949707031, 0, 0, -0.52249813079833984, 0.852640450000762939, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+47, 195256, 571, 65, 4169, 1, 1, 4570.48876953125, 1446.2413330078125, 189.23175048828125, 1.692969322204589843, 0, 0, 0.748955726623535156, 0.662620067596435546, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+48, 195256, 571, 65, 4169, 1, 1, 4592.09912109375, 1465.794189453125, 194.402008056640625, 3.019413232803344726, 0, 0, 0.998134613037109375, 0.061051756143569946, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+49, 195256, 571, 65, 4169, 1, 1, 4690.8232421875, 1517.4398193359375, 261.107513427734375, 0.034906249493360519, 0, 0, 0.017452239990234375, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+50, 195256, 571, 65, 4169, 1, 1, 4692.9306640625, 1529.1580810546875, 261.002197265625, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fordragon Hold - Difficulty: 0) CreateObject1 +(@OGUID+51, 195256, 571, 65, 4170, 1, 1, 4866.24853515625, 1289.0113525390625, 222.6893768310546875, 3.735006093978881835, 0, 0, -0.95630455017089843, 0.292372345924377441, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+52, 195256, 571, 65, 4170, 1, 1, 4919.08642578125, 1318.598388671875, 229.56298828125, 4.188792228698730468, 0, 0, -0.86602497100830078, 0.50000077486038208, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+53, 195256, 571, 65, 4170, 1, 1, 4925.45947265625, 1257.5225830078125, 226.8903961181640625, 1.32644820213317871, 0, 0, 0.615660667419433593, 0.788011372089385986, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+54, 195256, 571, 65, 4170, 1, 1, 4908.990234375, 1241.1226806640625, 226.8822021484375, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+55, 195256, 571, 65, 4170, 1, 1, 4896.076171875, 1252.8404541015625, 227.641632080078125, 0.24434557557106018, 0, 0, 0.121869087219238281, 0.9925462007522583, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+56, 195259, 571, 65, 4170, 1, 1, 4967.13916015625, 1265.5989990234375, 227.70660400390625, 4.869470596313476562, 0, 0, -0.64944744110107421, 0.760406434535980224, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+57, 195256, 571, 65, 4170, 1, 1, 4950.56494140625, 1309.805908203125, 235.062042236328125, 3.368495941162109375, 0, 0, -0.99357128143310546, 0.113208353519439697, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+58, 195256, 571, 65, 4170, 1, 1, 4978.830078125, 1243.00390625, 227.4904327392578125, 2.949595451354980468, 0, 0, 0.995395660400390625, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+59, 195256, 571, 65, 4170, 1, 1, 4958.9189453125, 1196.347900390625, 226.805145263671875, 1.797688722610473632, 0, 0, 0.7826080322265625, 0.622514784336090087, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+60, 195259, 571, 65, 4170, 1, 1, 4971.7099609375, 1267.1671142578125, 228.3887786865234375, 5.096362113952636718, 0, 0, -0.55919265747070312, 0.829037725925445556, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+61, 195256, 571, 65, 4170, 1, 1, 4967.2216796875, 1205.6607666015625, 227.3894805908203125, 2.548179388046264648, 0, 0, 0.956304550170898437, 0.292372345924377441, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+62, 195256, 571, 65, 4170, 1, 1, 4985.3779296875, 1269.7122802734375, 229.3460540771484375, 3.24634718894958496, 0, 0, -0.99862861633300781, 0.052353221923112869, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+63, 195266, 571, 65, 4170, 1, 1, 4986.63525390625, 1237.8038330078125, 232.5177154541015625, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+64, 195259, 571, 65, 4170, 1, 1, 4951.85693359375, 1167.7017822265625, 240.147674560546875, 4.206246376037597656, 0, 0, -0.86162853240966796, 0.50753939151763916, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+65, 195256, 571, 65, 4170, 1, 1, 4980.44580078125, 1205.4207763671875, 227.706817626953125, 1.117009282112121582, 0, 0, 0.529918670654296875, 0.84804844856262207, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+66, 195256, 571, 65, 4170, 1, 1, 4948.5654296875, 1174.3785400390625, 239.7920684814453125, 4.48549652099609375, 0, 0, -0.7826080322265625, 0.622514784336090087, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+67, 195256, 571, 65, 4170, 1, 1, 4986.67431640625, 1189.0426025390625, 227.4760894775390625, 5.986480236053466796, 0, 0, -0.14780902862548828, 0.989015936851501464, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+68, 195259, 571, 65, 4170, 1, 1, 4942.5888671875, 1170.193359375, 239.8133392333984375, 4.97418975830078125, 0, 0, -0.60876083374023437, 0.793353796005249023, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+69, 195256, 571, 65, 4170, 1, 1, 4956.7509765625, 1164.541748046875, 239.6501007080078125, 4.258606910705566406, 0, 0, -0.84804725646972656, 0.529920578002929687, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+70, 195259, 571, 65, 4170, 1, 1, 4937.84619140625, 1158.6041259765625, 240.5037994384765625, 0.663223206996917724, 0, 0, 0.325567245483398437, 0.945518851280212402, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+71, 195259, 571, 65, 4170, 1, 1, 5009.38525390625, 1205.94970703125, 231.4590606689453125, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+72, 195256, 571, 65, 4170, 1, 1, 5003.66259765625, 1190.1903076171875, 227.3822784423828125, 2.792518377304077148, 0, 0, 0.984807014465332031, 0.173652306199073791, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+73, 195266, 571, 65, 4170, 1, 1, 5027.05322265625, 1209.40625, 240.2350311279296875, 1.082102894783020019, 0, 0, 0.51503753662109375, 0.857167601585388183, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+74, 195266, 571, 65, 4170, 1, 1, 5013.38134765625, 1244.9617919921875, 238.303924560546875, 5.969027042388916015, 0, 0, -0.1564340591430664, 0.987688362598419189, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+75, 195266, 571, 65, 4170, 1, 1, 5006.91064453125, 1195.970458984375, 235.5181732177734375, 2.44346022605895996, 0, 0, 0.939692497253417968, 0.34202045202255249, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+76, 195256, 571, 65, 4170, 1, 1, 5019.80078125, 1236.829833984375, 230.09747314453125, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+77, 195266, 571, 65, 4170, 1, 1, 5027.01318359375, 1209.4305419921875, 233.940460205078125, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Kor'kron Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+78, 195255, 571, 65, 4177, 1, 1, 3966.296875, -733.61083984375, 257.43707275390625, 1.745326757431030273, 0, 0, 0.766043663024902343, 0.642788589000701904, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+79, 195256, 571, 65, 4177, 1, 1, 3951.35546875, -780.912841796875, 244.6300201416015625, 4.118979454040527343, 0, 0, -0.88294696807861328, 0.469472706317901611, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+80, 195255, 571, 65, 4177, 1, 1, 3928.12841796875, -732.9033203125, 262.249664306640625, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+81, 195255, 571, 65, 4177, 1, 1, 3893.7587890625, -696.30322265625, 261.979034423828125, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+82, 195255, 571, 65, 4177, 1, 1, 3905.212646484375, -659.330078125, 257.803314208984375, 5.602506637573242187, 0, 0, -0.33380699157714843, 0.942641437053680419, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+83, 195256, 571, 65, 4177, 1, 1, 3862.428466796875, -745.89483642578125, 221.11981201171875, 3.874631166458129882, 0, 0, -0.93358039855957031, 0.358368009328842163, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+84, 195256, 571, 65, 4177, 1, 1, 3826.775634765625, -685.09710693359375, 223.0012969970703125, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+85, 195256, 571, 65, 4177, 1, 1, 3858.989990234375, -724.02996826171875, 221.2303924560546875, 3.752462387084960937, 0, 0, -0.95371627807617187, 0.300707906484603881, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+86, 195256, 571, 65, 4177, 1, 1, 3843.91064453125, -763.3690185546875, 219.3805694580078125, 1.466075778007507324, 0, 0, 0.669130325317382812, 0.74314504861831665, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+87, 195256, 571, 65, 4177, 1, 1, 3822.774658203125, -695.2535400390625, 223.0012664794921875, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+88, 195256, 571, 65, 4177, 1, 1, 3866.354248046875, -771.1375732421875, 220.3779449462890625, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+89, 195255, 571, 65, 4177, 1, 1, 3815.779541015625, -754.2735595703125, 213.8813934326171875, 4.817109584808349609, 0, 0, -0.66913032531738281, 0.74314504861831665, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+90, 195255, 571, 65, 4177, 1, 1, 3893.3837890625, -829.67462158203125, 205.0926055908203125, 5.218535900115966796, 0, 0, -0.507537841796875, 0.861629426479339599, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+91, 195255, 571, 65, 4177, 1, 1, 3767.4033203125, -747.827392578125, 211.6566619873046875, 4.345870018005371093, 0, 0, -0.82412624359130859, 0.566406130790710449, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+92, 195259, 571, 65, 4177, 1, 1, 3720.31591796875, -705.8350830078125, 216.007415771484375, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+93, 195256, 571, 65, 4177, 1, 1, 3716.31591796875, -708.1944580078125, 215.4729766845703125, 2.268925428390502929, 0, 0, 0.906307220458984375, 0.422619491815567016, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+94, 195256, 571, 65, 4177, 1, 1, 3749.342041015625, -769.87677001953125, 197.4348602294921875, 0.750490784645080566, 0, 0, 0.3665008544921875, 0.93041771650314331, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+95, 195259, 571, 65, 4177, 1, 1, 3713.5712890625, -686.2274169921875, 216.5030059814453125, 4.45059061050415039, 0, 0, -0.79335308074951171, 0.608761727809906005, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+96, 195256, 571, 65, 4177, 1, 1, 3704.834228515625, -687.13714599609375, 215.5728302001953125, 5.148722648620605468, 0, 0, -0.53729915618896484, 0.843391716480255126, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+97, 195256, 571, 65, 4177, 1, 1, 3698.530517578125, -714.2257080078125, 214.1509552001953125, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+98, 195256, 571, 65, 4177, 1, 1, 3697.3759765625, -742.7100830078125, 213.7969818115234375, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+99, 195256, 571, 65, 4177, 1, 1, 3676.882080078125, -702.15106201171875, 214.36669921875, 5.427974700927734375, 0, 0, -0.41469287872314453, 0.909961462020874023, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+100, 195256, 571, 65, 4177, 1, 1, 3794.0703125, -804.03143310546875, 197.33807373046875, 2.146752834320068359, 0, 0, 0.878816604614257812, 0.477159708738327026, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+101, 195255, 571, 65, 4177, 1, 1, 3743.799560546875, -773.857666015625, 209.3840789794921875, 0.785396754741668701, 0, 0, 0.38268280029296875, 0.923879802227020263, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+102, 195256, 571, 65, 4177, 1, 1, 3803.819580078125, -793.8428955078125, 197.235595703125, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+103, 195256, 571, 65, 4177, 1, 1, 3781.02783203125, -803.45452880859375, 197.207733154296875, 0.942476630210876464, 0, 0, 0.453989982604980468, 0.891006767749786376, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+104, 195255, 571, 65, 4177, 1, 1, 3816.917236328125, -800.0577392578125, 208.6811676025390625, 1.308995485305786132, 0, 0, 0.608760833740234375, 0.793353796005249023, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+105, 195255, 571, 65, 4177, 1, 1, 3826.9765625, -809.499755859375, 208.5765533447265625, 0.261798173189163208, 0, 0, 0.130525588989257812, 0.991444945335388183, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+106, 195255, 571, 65, 4177, 1, 1, 3847.43017578125, -835.56915283203125, 200.8210906982421875, 5.096362113952636718, 0, 0, -0.55919265747070312, 0.829037725925445556, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+107, 195255, 571, 65, 4177, 1, 1, 3809.892333984375, -826.83380126953125, 208.5438385009765625, 4.433136463165283203, 0, 0, -0.79863548278808593, 0.60181504487991333, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+108, 195255, 571, 65, 4177, 1, 1, 3800.188720703125, -817.22357177734375, 208.8302154541015625, 3.45575571060180664, 0, 0, -0.98768806457519531, 0.156436234712600708, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+109, 195255, 571, 65, 4177, 1, 1, 3779.26904296875, -809.5614013671875, 209.6387481689453125, 0.802850961685180664, 0, 0, 0.390730857849121093, 0.920504987239837646, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+110, 195255, 571, 65, 4177, 1, 1, 3807.228271484375, -855.24261474609375, 203.9785614013671875, 5.201082706451416015, 0, 0, -0.51503753662109375, 0.857167601585388183, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+111, 195255, 571, 65, 4177, 1, 1, 3797.328125, -852.06500244140625, 204.159820556640625, 3.630291461944580078, 0, 0, -0.97029495239257812, 0.241925001144409179, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+112, 195255, 571, 65, 4177, 1, 1, 3695.23486328125, -765.36968994140625, 202.1208038330078125, 4.415683269500732421, 0, 0, -0.80385684967041015, 0.594822824001312255, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+113, 195256, 571, 65, 4177, 1, 1, 3674.52685546875, -739.81768798828125, 213.895782470703125, 0.994837164878845214, 0, 0, 0.477158546447753906, 0.878817260265350341, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+114, 195260, 571, 65, 4177, 1, 1, 3652.607177734375, -715.25677490234375, 215.9242706298828125, 5.445427894592285156, 0, 0, -0.40673637390136718, 0.913545548915863037, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+115, 195260, 571, 65, 4177, 1, 1, 3645.81201171875, -721.057373046875, 216.1720123291015625, 6.195919513702392578, 0, 0, -0.04361915588378906, 0.999048233032226562, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+116, 195260, 571, 65, 4177, 1, 1, 3659.44091796875, -693.828369140625, 223.6274871826171875, 4.031712055206298828, 0, 0, -0.90258502960205078, 0.430511653423309326, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+117, 195264, 571, 65, 4177, 1, 1, 3655.505615234375, -720.5035400390625, 216.2393341064453125, 1.448621988296508789, 0, 0, 0.662619590759277343, 0.748956084251403808, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+118, 195266, 571, 65, 4177, 1, 1, 3654.854248046875, -700.45977783203125, 228.6396484375, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+119, 195255, 571, 65, 4177, 1, 1, 3650.591064453125, -754.50836181640625, 201.845123291015625, 4.555310726165771484, 0, 0, -0.76040554046630859, 0.649448513984680175, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+120, 195257, 571, 65, 4177, 1, 1, 3666.34716796875, -703.86016845703125, 217.6456451416015625, 6.230826377868652343, 0, 0, -0.02617645263671875, 0.999657332897186279, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+121, 195264, 571, 65, 4177, 1, 1, 3660.451904296875, -698.0406494140625, 223.627471923828125, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+122, 195256, 571, 65, 4177, 1, 1, 3658.59033203125, -706.50018310546875, 224.4459991455078125, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+123, 195259, 571, 65, 4177, 1, 1, 3658.615478515625, -719.43780517578125, 218.7647552490234375, 3.054326534271240234, 0, 0, 0.999048233032226562, 0.043619260191917419, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+124, 195257, 571, 65, 4177, 1, 1, 3651.5986328125, -711.7225341796875, 216.841339111328125, 4.747295856475830078, 0, 0, -0.69465827941894531, 0.719339847564697265, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+125, 195266, 571, 65, 4177, 1, 1, 3667.354248046875, -727.1336669921875, 218.360137939453125, 6.12610626220703125, 0, 0, -0.07845878601074218, 0.996917366981506347, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+126, 195260, 571, 65, 4177, 1, 1, 3660.471923828125, -699.21014404296875, 223.6274871826171875, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+127, 195256, 571, 65, 4177, 1, 1, 3649.294677734375, -702.2972412109375, 215.0317840576171875, 6.195919513702392578, 0, 0, -0.04361915588378906, 0.999048233032226562, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+128, 195260, 571, 65, 4177, 1, 1, 3650.23046875, -698.5430908203125, 223.6274871826171875, 0.034906249493360519, 0, 0, 0.017452239990234375, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+129, 195264, 571, 65, 4177, 1, 1, 3658.077392578125, -721.1656494140625, 216.2393035888671875, 5.35816192626953125, 0, 0, -0.446197509765625, 0.894934535026550292, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+130, 195266, 571, 65, 4177, 1, 1, 3665.362060546875, -707.2430419921875, 221.1085357666015625, 6.12610626220703125, 0, 0, -0.07845878601074218, 0.996917366981506347, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+131, 195259, 571, 65, 4177, 1, 1, 3644.34765625, -723.92327880859375, 218.8717803955078125, 1.448621988296508789, 0, 0, 0.662619590759277343, 0.748956084251403808, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+132, 195266, 571, 65, 4177, 1, 1, 3663.72216796875, -720.04339599609375, 224.00762939453125, 6.230826377868652343, 0, 0, -0.02617645263671875, 0.999657332897186279, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+133, 195264, 571, 65, 4177, 1, 1, 3658.893310546875, -693.3231201171875, 223.627471923828125, 1.413715124130249023, 0, 0, 0.649447441101074218, 0.760406434535980224, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+134, 195259, 571, 65, 4177, 1, 1, 3647.875, -707.907470703125, 217.1875, 6.178466320037841796, 0, 0, -0.05233573913574218, 0.998629570007324218, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+135, 195260, 571, 65, 4177, 1, 1, 3646.14794921875, -718.1917724609375, 216.1720123291015625, 6.09120035171508789, 0, 0, -0.09584522247314453, 0.995396256446838378, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+136, 195266, 571, 65, 4177, 1, 1, 3668.15283203125, -722.36114501953125, 218.7000274658203125, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+137, 195264, 571, 65, 4177, 1, 1, 3653.489990234375, -720.23321533203125, 216.2393341064453125, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+138, 195260, 571, 65, 4177, 1, 1, 3652.887939453125, -712.58856201171875, 215.92706298828125, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+139, 195264, 571, 65, 4177, 1, 1, 3652.147705078125, -720.3037109375, 216.2393341064453125, 0.034906249493360519, 0, 0, 0.017452239990234375, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+140, 195264, 571, 65, 4177, 1, 1, 3655.91064453125, -710.796630859375, 227.4317626953125, 3.52557229995727539, 0, 0, -0.98162651062011718, 0.190812408924102783, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+141, 195257, 571, 65, 4177, 1, 1, 3665.5869140625, -710.9298095703125, 217.473846435546875, 6.161012649536132812, 0, 0, -0.06104850769042968, 0.998134791851043701, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+142, 195266, 571, 65, 4177, 1, 1, 3668.486083984375, -717.06597900390625, 218.909515380859375, 6.230826377868652343, 0, 0, -0.02617645263671875, 0.999657332897186279, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+143, 195264, 571, 65, 4177, 1, 1, 3630.090576171875, -711.75091552734375, 215.4510498046875, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+144, 195255, 571, 65, 4177, 1, 1, 3641.374267578125, -671.68048095703125, 245.1111907958984375, 4.939284324645996093, 0, 0, -0.6225137710571289, 0.78260880708694458, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+145, 195264, 571, 65, 4177, 1, 1, 3630.2119140625, -709.900390625, 215.450927734375, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+146, 195264, 571, 65, 4177, 1, 1, 3653.0712890625, -692.71044921875, 223.627471923828125, 0.645771682262420654, 0, 0, 0.317304611206054687, 0.948323667049407958, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+147, 195260, 571, 65, 4177, 1, 1, 3652.268310546875, -693.3177490234375, 223.6274871826171875, 5.305802345275878906, 0, 0, -0.46947097778320312, 0.882947921752929687, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+148, 195264, 571, 65, 4177, 1, 1, 3650.30908203125, -697.84649658203125, 223.6274871826171875, 3.194002151489257812, 0, 0, -0.99965667724609375, 0.026201646775007247, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+149, 195257, 571, 65, 4177, 1, 1, 3640.114501953125, -711.26043701171875, 215.9584503173828125, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+150, 195264, 571, 65, 4177, 1, 1, 3629.59130859375, -716.77105712890625, 215.4509124755859375, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+151, 195256, 571, 65, 4177, 1, 1, 3632.08740234375, -711.01788330078125, 214.2405242919921875, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+152, 195257, 571, 65, 4177, 1, 1, 3635.86376953125, -710.77606201171875, 215.8188018798828125, 4.869470596313476562, 0, 0, -0.64944744110107421, 0.760406434535980224, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+153, 195264, 571, 65, 4177, 1, 1, 3629.776611328125, -714.98272705078125, 215.4509124755859375, 3.281238555908203125, 0, 0, -0.99756336212158203, 0.069766148924827575, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+154, 195255, 571, 65, 4177, 1, 1, 3628.027099609375, -668.01666259765625, 244.94390869140625, 3.892086982727050781, 0, 0, -0.93041706085205078, 0.366502493619918823, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+155, 195255, 571, 65, 4177, 1, 1, 3647.8125, -648.90618896484375, 243.9453125, 0.767943859100341796, 0, 0, 0.374606132507324218, 0.927184045314788818, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+156, 195255, 571, 65, 4177, 1, 1, 3634.61669921875, -644.8275146484375, 244.1315460205078125, 1.797688722610473632, 0, 0, 0.7826080322265625, 0.622514784336090087, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+157, 195255, 571, 65, 4177, 1, 1, 3599.903076171875, -757.46661376953125, 199.196746826171875, 4.764749526977539062, 0, 0, -0.6883544921875, 0.725374460220336914, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+158, 195255, 571, 65, 4177, 1, 1, 3557.50146484375, -768.26031494140625, 203.72564697265625, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wintergarde Keep - Difficulty: 0) CreateObject1 +(@OGUID+159, 195266, 571, 65, 4186, 1, 1, 3215.221435546875, -748.22918701171875, 173.981292724609375, 3.106652259826660156, 0, 0, 0.999847412109375, 0.017469281330704689, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Venomspite - Difficulty: 0) CreateObject1 +(@OGUID+160, 195256, 571, 65, 4161, 1, 1, 3463.682373046875, 274.773651123046875, 52.29326248168945312, 4.886923789978027343, 0, 0, -0.64278697967529296, 0.766044974327087402, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+161, 195256, 571, 65, 4161, 1, 1, 3477.0625, 249.06353759765625, -120.141532897949218, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+162, 195256, 571, 65, 4161, 1, 1, 3466.39453125, 254.6163177490234375, 52.29463577270507812, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+163, 195256, 571, 65, 4161, 1, 1, 3471.139892578125, 281.183441162109375, -120.144790649414062, 5.881760597229003906, 0, 0, -0.19936752319335937, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+164, 195255, 571, 65, 4161, 1, 1, 3457.30126953125, 300.75, 59.3188629150390625, 3.071766138076782226, 0, 0, 0.999390602111816406, 0.034906134009361267, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+165, 195256, 571, 65, 4161, 1, 1, 3480.77099609375, 279.447265625, 52.26997756958007812, 4.939284324645996093, 0, 0, -0.6225137710571289, 0.78260880708694458, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+166, 195255, 571, 65, 4161, 1, 1, 3465.232666015625, 228.173614501953125, 59.3188629150390625, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+167, 195256, 571, 65, 4161, 1, 1, 3483.588134765625, 254.1246795654296875, 52.26856231689453125, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+168, 195256, 571, 65, 4161, 1, 1, 3518.373291015625, 281.8262939453125, 47.31753921508789062, 5.986480236053466796, 0, 0, -0.14780902862548828, 0.989015936851501464, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+169, 195260, 571, 65, 4161, 1, 1, 3526.265625, 290.728240966796875, 45.74524307250976562, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+170, 195264, 571, 65, 4161, 1, 1, 3529.885986328125, 252.3538970947265625, 45.70510482788085937, 3.316144466400146484, 0, 0, -0.99619388580322265, 0.087165042757987976, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+171, 195260, 571, 65, 4161, 1, 1, 3522.945068359375, 260.23529052734375, 45.71449661254882812, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+172, 195266, 571, 65, 4161, 1, 1, 3521.08984375, 240.675506591796875, 53.60064697265625, 0.890116631984710693, 0, 0, 0.430510520935058593, 0.902585566043853759, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+173, 195256, 571, 65, 4161, 1, 1, 3492.134033203125, 322.442291259765625, -120.144508361816406, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+174, 195256, 571, 65, 4161, 1, 1, 3501.746826171875, 212.192657470703125, -120.14520263671875, 0.558503925800323486, 0, 0, 0.275636672973632812, 0.961261868476867675, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+175, 195256, 571, 65, 4161, 1, 1, 3527.9951171875, 301.946990966796875, 117.1260833740234375, 5.288348197937011718, 0, 0, -0.4771585464477539, 0.878817260265350341, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+176, 195256, 571, 65, 4161, 1, 1, 3517.434326171875, 257.018707275390625, 117.1312637329101562, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+177, 195256, 571, 65, 4161, 1, 1, 3514.206787109375, 282.375701904296875, 117.1297073364257812, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+178, 195264, 571, 65, 4161, 1, 1, 3521.04638671875, 280.959625244140625, 45.70491409301757812, 0.558503925800323486, 0, 0, 0.275636672973632812, 0.961261868476867675, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+179, 195256, 571, 65, 4161, 1, 1, 3520.52001953125, 258.977874755859375, 47.31750106811523437, 0.488691210746765136, 0, 0, 0.241921424865722656, 0.970295846462249755, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+180, 195266, 571, 65, 4161, 1, 1, 3515.23779296875, 299.431549072265625, 53.5312347412109375, 5.585053920745849609, 0, 0, -0.34202003479003906, 0.939692676067352294, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+181, 195256, 571, 65, 4161, 1, 1, 3549.405517578125, 317.3907470703125, 116.7897720336914062, 3.281238555908203125, 0, 0, -0.99756336212158203, 0.069766148924827575, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+182, 195256, 571, 65, 4161, 1, 1, 3530.838134765625, 337.955718994140625, 52.2563934326171875, 6.195919513702392578, 0, 0, -0.04361915588378906, 0.999048233032226562, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+183, 195256, 571, 65, 4161, 1, 1, 3561.059814453125, 247.0675506591796875, 47.31746292114257812, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+184, 195256, 571, 65, 4161, 1, 1, 3539.344970703125, 210.2894439697265625, 116.840606689453125, 4.834563255310058593, 0, 0, -0.66261959075927734, 0.748956084251403808, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+185, 195256, 571, 65, 4161, 1, 1, 3555.46044921875, 301.823577880859375, 47.31740188598632812, 4.415683269500732421, 0, 0, -0.80385684967041015, 0.594822824001312255, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+186, 195256, 571, 65, 4161, 1, 1, 3543.595947265625, 229.015350341796875, 116.7897567749023437, 0.15707901120185852, 0, 0, 0.078458786010742187, 0.996917366981506347, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+187, 195256, 571, 65, 4161, 1, 1, 3527.48779296875, 332.788970947265625, 116.7998123168945312, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+188, 195256, 571, 65, 4161, 1, 1, 3538.464111328125, 244.53662109375, 47.31742095947265625, 1.291541695594787597, 0, 0, 0.60181427001953125, 0.798636078834533691, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+189, 195264, 571, 65, 4161, 1, 1, 3555.038330078125, 299.092620849609375, 45.70467758178710937, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+190, 195256, 571, 65, 4161, 1, 1, 3535.775634765625, 241.7472381591796875, 117.1205062866210937, 1.256635904312133789, 0, 0, 0.587784767150878906, 0.809017360210418701, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+191, 195264, 571, 65, 4161, 1, 1, 3560.05810546875, 249.095703125, 45.70547866821289062, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+192, 195260, 571, 65, 4161, 1, 1, 3549.798583984375, 245.620880126953125, 45.7057647705078125, 4.642575740814208984, 0, 0, -0.731353759765625, 0.681998312473297119, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+193, 195256, 571, 65, 4161, 1, 1, 3532.950439453125, 299.915374755859375, 47.31732559204101562, 5.183629035949707031, 0, 0, -0.52249813079833984, 0.852640450000762939, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+194, 195256, 571, 65, 4161, 1, 1, 3542.328857421875, 206.0333099365234375, 52.25639724731445312, 0.261798173189163208, 0, 0, 0.130525588989257812, 0.991444945335388183, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+195, 195256, 571, 65, 4161, 1, 1, 3535.763427734375, 316.01409912109375, 116.7897567749023437, 0.034906249493360519, 0, 0, 0.017452239990234375, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+196, 195256, 571, 65, 4161, 1, 1, 3532.222412109375, 198.499237060546875, -120.144523620605468, 1.500982880592346191, 0, 0, 0.681998252868652343, 0.731353819370269775, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+197, 195256, 571, 65, 4161, 1, 1, 3515.109375, 342.43658447265625, -120.144523620605468, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+198, 195256, 571, 65, 4161, 1, 1, 3573.3193359375, 287.205413818359375, 47.31745147705078125, 3.630291461944580078, 0, 0, -0.97029495239257812, 0.241925001144409179, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+199, 195260, 571, 65, 4161, 1, 1, 3564.302734375, 294.137481689453125, 45.70593643188476562, 3.996806621551513671, 0, 0, -0.90996074676513671, 0.414694398641586303, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+200, 195264, 571, 65, 4161, 1, 1, 3573.747314453125, 275.677520751953125, 45.70751571655273437, 5.061456203460693359, 0, 0, -0.57357597351074218, 0.819152355194091796, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+201, 195256, 571, 65, 4161, 1, 1, 3559.00341796875, 305.341644287109375, 117.1256637573242187, 4.328419685363769531, 0, 0, -0.82903671264648437, 0.559194147586822509, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+202, 195256, 571, 65, 4161, 1, 1, 3531.9853515625, 349.9049072265625, 52.27656936645507812, 0.017452461645007133, 0, 0, 0.008726119995117187, 0.999961912631988525, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+203, 195266, 571, 65, 4161, 1, 1, 3570.42236328125, 301.91058349609375, 53.45551681518554687, 4.031712055206298828, 0, 0, -0.90258502960205078, 0.430511653423309326, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+204, 195256, 571, 65, 4161, 1, 1, 3576.93408203125, 290.008087158203125, 117.1280517578125, 3.647741317749023437, 0, 0, -0.96814727783203125, 0.250381410121917724, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+205, 195256, 571, 65, 4161, 1, 1, 3553.869140625, 335.977325439453125, 116.7961578369140625, 1.710421562194824218, 0, 0, 0.754709243774414062, 0.656059443950653076, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+206, 195256, 571, 65, 4161, 1, 1, 3551.696533203125, 340.12841796875, 52.25639724731445312, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+207, 195256, 571, 65, 4161, 1, 1, 3548.8056640625, 191.4957122802734375, 52.29361724853515625, 0.104719325900077819, 0, 0, 0.052335739135742187, 0.998629570007324218, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+208, 195256, 571, 65, 4161, 1, 1, 3562.233642578125, 345.9384765625, -120.144523620605468, 4.014260292053222656, 0, 0, -0.90630722045898437, 0.422619491815567016, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+209, 195256, 571, 65, 4161, 1, 1, 3546.335693359375, 351.499725341796875, 52.27733230590820312, 3.368495941162109375, 0, 0, -0.99357128143310546, 0.113208353519439697, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+210, 195256, 571, 65, 4161, 1, 1, 3592.6552734375, 332.868927001953125, -120.144790649414062, 4.310965538024902343, 0, 0, -0.83388519287109375, 0.55193793773651123, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+211, 195256, 571, 65, 4152, 1, 1, 2837.892822265625, 884.14825439453125, 15.93669509887695312, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+212, 195256, 571, 65, 4152, 1, 1, 2802.755615234375, 890.158447265625, 12.88576412200927734, 4.97418975830078125, 0, 0, -0.60876083374023437, 0.793353796005249023, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+213, 195260, 571, 65, 4152, 1, 1, 2796.747802734375, 906.89013671875, 22.36409950256347656, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+214, 195256, 571, 65, 4152, 1, 1, 2815.472412109375, 918.79949951171875, 20.88776397705078125, 3.857182979583740234, 0, 0, -0.93667125701904296, 0.350209832191467285, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+215, 195259, 571, 65, 4152, 1, 1, 2791.1015625, 904.5616455078125, 23.04510879516601562, 1.256635904312133789, 0, 0, 0.587784767150878906, 0.809017360210418701, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+216, 195256, 571, 65, 4152, 1, 1, 2801.711669921875, 908.50860595703125, 22.29059219360351562, 1.745326757431030273, 0, 0, 0.766043663024902343, 0.642788589000701904, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+217, 195256, 571, 65, 4152, 1, 1, 2787.1181640625, 905.95831298828125, 22.15630531311035156, 1.308995485305786132, 0, 0, 0.608760833740234375, 0.793353796005249023, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+218, 195259, 571, 65, 4152, 1, 1, 2787.111083984375, 910.8663330078125, 32.0193634033203125, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+219, 195256, 571, 65, 4152, 1, 1, 2793.772705078125, 931.6573486328125, 22.35704803466796875, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+220, 195259, 571, 65, 4152, 1, 1, 2798.08935546875, 941.06768798828125, 24.67208290100097656, 0.314158439636230468, 0, 0, 0.156434059143066406, 0.987688362598419189, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+221, 195256, 571, 65, 4152, 1, 1, 2763.372314453125, 862.8992919921875, 6.277842044830322265, 5.777040958404541015, 0, 0, -0.25037956237792968, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+222, 195256, 571, 65, 4152, 1, 1, 2781.196533203125, 933.69793701171875, 22.78250503540039062, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+223, 195259, 571, 65, 4152, 1, 1, 2742.899658203125, 887.79473876953125, 6.358366012573242187, 2.426007747650146484, 0, 0, 0.936672210693359375, 0.350207358598709106, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+224, 195259, 571, 65, 4152, 1, 1, 2756.8154296875, 926.76348876953125, 23.21160125732421875, 2.984498262405395507, 0, 0, 0.996916770935058593, 0.078466430306434631, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+225, 195259, 571, 65, 4152, 1, 1, 2792.319580078125, 944.921875, 23.26566123962402343, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+226, 195256, 571, 65, 4152, 1, 1, 2784.236083984375, 959.46875, 22.49838066101074218, 5.462882041931152343, 0, 0, -0.39874839782714843, 0.917060375213623046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+227, 195256, 571, 65, 4152, 1, 1, 2771.326171875, 914.00445556640625, 22.36398696899414062, 5.619962215423583984, 0, 0, -0.32556724548339843, 0.945518851280212402, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+228, 195257, 571, 65, 4152, 1, 1, 2777.521240234375, 938.154541015625, 25.58710670471191406, 4.345870018005371093, 0, 0, -0.82412624359130859, 0.566406130790710449, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+229, 195259, 571, 65, 4152, 1, 1, 2756.885498046875, 920.03125, 24.40833282470703125, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+230, 195256, 571, 65, 4152, 1, 1, 2795.231689453125, 971.228759765625, 22.84726524353027343, 3.78736734390258789, 0, 0, -0.94832324981689453, 0.317305892705917358, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+231, 195256, 571, 65, 4152, 1, 1, 2772.131103515625, 928.72784423828125, 22.78977012634277343, 0.733038187026977539, 0, 0, 0.358367919921875, 0.933580458164215087, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+232, 195260, 571, 65, 4152, 1, 1, 2751.039794921875, 907.93927001953125, 6.676070213317871093, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+233, 195256, 571, 65, 4152, 1, 1, 2754.22412109375, 894.705810546875, 5.906911849975585937, 4.764749526977539062, 0, 0, -0.6883544921875, 0.725374460220336914, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+234, 195257, 571, 65, 4152, 1, 1, 2770.710205078125, 934.4930419921875, 25.70063018798828125, 5.672322273254394531, 0, 0, -0.3007049560546875, 0.953717231750488281, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+235, 195256, 571, 65, 4152, 1, 1, 2731.75537109375, 930.22222900390625, 0.360352993011474609, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+236, 195259, 571, 65, 4152, 1, 1, 2713.987060546875, 894.1632080078125, 16.31461143493652343, 2.059488296508789062, 0, 0, 0.857167243957519531, 0.515038192272186279, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+237, 195273, 571, 65, 4152, 1, 1, 2714.57470703125, 895.9132080078125, 10.3496856689453125, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+238, 195256, 571, 65, 4152, 1, 1, 2743.731689453125, 851.451416015625, 6.691174983978271484, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+239, 195256, 571, 65, 4152, 1, 1, 2720.492431640625, 904.63189697265625, 5.697000026702880859, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+240, 195259, 571, 65, 4152, 1, 1, 2732.103271484375, 881.14410400390625, 6.379679203033447265, 1.186823248863220214, 0, 0, 0.559192657470703125, 0.829037725925445556, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+241, 195256, 571, 65, 4152, 1, 1, 2722.36474609375, 888.5218505859375, 5.181850910186767578, 0.401424884796142578, 0, 0, 0.199367523193359375, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+242, 195273, 571, 65, 4152, 1, 1, 2715.4375, 895.96417236328125, 10.36511802673339843, 0.209439441561698913, 0, 0, 0.104528427124023437, 0.994521915912628173, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+243, 195256, 571, 65, 4152, 1, 1, 2659.202392578125, 906.3992919921875, 4.293645858764648437, 4.852017402648925781, 0, 0, -0.65605831146240234, 0.754710197448730468, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+244, 195256, 571, 65, 4152, 1, 1, 2663.8447265625, 880.25518798828125, 4.281791210174560546, 1.85004889965057373, 0, 0, 0.798635482788085937, 0.60181504487991333, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+245, 195256, 571, 65, 4152, 1, 1, 2645.36279296875, 884.6475830078125, 4.748452186584472656, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 +(@OGUID+246, 195256, 571, 65, 4152, 1, 1, 2643.08154296875, 897.57989501953125, 4.501050949096679687, 6.021387100219726562, 0, 0, -0.13052558898925781, 0.991444945335388183, 120, 255, 1, 0); -- Standing, Exterior, Medium - Brewfest (Area: Moa'ki Harbor - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+246 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+246; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_06_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_06_world.sql new file mode 100644 index 00000000000..360638e6b58 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_06_world.sql @@ -0,0 +1,83 @@ +-- +SET @OGUID := 85578; -- Need 74 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+73; +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 +(@OGUID+0, 195256, 571, 66, 4323, 1, 1, 5794.01025390625, -3586.30517578125, 388.6536865234375, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+1, 195256, 571, 66, 4323, 1, 1, 5789.33837890625, -3595.7900390625, 388.8240966796875, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+2, 195260, 571, 66, 4323, 1, 1, 5796.28759765625, -3573.15673828125, 388.1470947265625, 3.211419343948364257, 0, 0, -0.9993906021118164, 0.034906134009361267, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+3, 195260, 571, 66, 4323, 1, 1, 5801.0478515625, -3572.99658203125, 389.088653564453125, 3.019413232803344726, 0, 0, 0.998134613037109375, 0.061051756143569946, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+4, 195260, 571, 66, 4323, 1, 1, 5800.0751953125, -3557.563232421875, 389.77008056640625, 0.331610709428787231, 0, 0, 0.16504669189453125, 0.986285746097564697, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+5, 195253, 571, 66, 4323, 1, 1, 5779.60693359375, -3647.15673828125, 397.078765869140625, 4.817109584808349609, 0, 0, -0.66913032531738281, 0.74314504861831665, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+6, 195257, 571, 66, 4323, 1, 1, 5796.578125, -3553.885498046875, 388.331024169921875, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+7, 195259, 571, 66, 4323, 1, 1, 5768.53369140625, -3620.057373046875, 389.515899658203125, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+8, 195259, 571, 66, 4323, 1, 1, 5778.517578125, -3600.4619140625, 387.3365478515625, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+9, 195256, 571, 66, 4323, 1, 1, 5783.69384765625, -3600.810302734375, 387.71563720703125, 2.356194972991943359, 0, 0, 0.923879623413085937, 0.382683247327804565, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+10, 195260, 571, 66, 4323, 1, 1, 5771.67333984375, -3602.202392578125, 388.42059326171875, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+11, 195256, 571, 66, 4323, 1, 1, 5790.5546875, -3548.06201171875, 387.1112060546875, 3.735006093978881835, 0, 0, -0.95630455017089843, 0.292372345924377441, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+12, 195260, 571, 66, 4323, 1, 1, 5794.41943359375, -3557.553955078125, 388.896392822265625, 3.176533222198486328, 0, 0, -0.999847412109375, 0.017469281330704689, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+13, 195256, 571, 66, 4323, 1, 1, 5774.17041015625, -3614.330078125, 387.690093994140625, 3.316144466400146484, 0, 0, -0.99619388580322265, 0.087165042757987976, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+14, 195260, 571, 66, 4323, 1, 1, 5767.890625, -3581.119873046875, 388.561767578125, 4.747295856475830078, 0, 0, -0.69465827941894531, 0.719339847564697265, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+15, 195256, 571, 66, 4323, 1, 1, 5758.55078125, -3620.203125, 385.835174560546875, 0.663223206996917724, 0, 0, 0.325567245483398437, 0.945518851280212402, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+16, 195260, 571, 66, 4323, 1, 1, 5760.94091796875, -3580.5234375, 388.68145751953125, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+17, 195260, 571, 66, 4323, 1, 1, 5768.9931640625, -3564.651123046875, 388.132049560546875, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+18, 195260, 571, 66, 4323, 1, 1, 5759.46728515625, -3565.396484375, 388.25091552734375, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+19, 195259, 571, 66, 4323, 1, 1, 5746.46826171875, -3556.42822265625, 390.089630126953125, 6.056293010711669921, 0, 0, -0.11320304870605468, 0.993571877479553222, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+20, 195273, 571, 66, 4323, 1, 1, 5769.6552734375, -3530.541748046875, 396.830230712890625, 4.904376029968261718, 0, 0, -0.636077880859375, 0.771624863147735595, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+21, 195273, 571, 66, 4323, 1, 1, 5745.5791015625, -3534.723876953125, 396.684967041015625, 5.026549339294433593, 0, 0, -0.5877847671508789, 0.809017360210418701, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+22, 195256, 571, 66, 4323, 1, 1, 5750.7998046875, -3535.454345703125, 389.026702880859375, 5.532694816589355468, 0, 0, -0.3665008544921875, 0.93041771650314331, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+23, 195256, 571, 66, 4323, 1, 1, 5764.80029296875, -3532.1552734375, 388.3555908203125, 4.45059061050415039, 0, 0, -0.79335308074951171, 0.608761727809906005, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+24, 195259, 571, 66, 4323, 1, 1, 5762.9599609375, -3526.6650390625, 391.175689697265625, 3.9793548583984375, 0, 0, -0.9135446548461914, 0.406738430261611938, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zim'Torga - Difficulty: 0) CreateObject1 +(@OGUID+25, 195260, 571, 66, 4275, 1, 1, 5524.15576171875, -2679.053466796875, 305.170166015625, 1.291541695594787597, 0, 0, 0.60181427001953125, 0.798636078834533691, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+26, 195254, 571, 66, 4275, 1, 1, 5391.95947265625, -2692.567626953125, 310.286285400390625, 3.874631166458129882, 0, 0, -0.93358039855957031, 0.358368009328842163, 120, 255, 1, 0), -- Hanging, Square, Large - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+27, 195260, 571, 66, 4275, 1, 1, 5500.44873046875, -2662.013427734375, 304.96588134765625, 6.161012649536132812, 0, 0, -0.06104850769042968, 0.998134791851043701, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+28, 195253, 571, 66, 4275, 1, 1, 5481.4208984375, -2655.850830078125, 310.491180419921875, 0, 0, 0, 0, 1, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+29, 195256, 571, 66, 4275, 1, 1, 5408.3564453125, -2679.760986328125, 303.953948974609375, 1.012289404869079589, 0, 0, 0.484808921813964843, 0.87462007999420166, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+30, 195253, 571, 66, 4275, 1, 1, 5472.98193359375, -2649.109375, 310.313873291015625, 1.623155713081359863, 0, 0, 0.725374221801757812, 0.688354730606079101, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+31, 195259, 571, 66, 4275, 1, 1, 5526.03369140625, -2669.76416015625, 304.288970947265625, 3.124123096466064453, 0, 0, 0.99996185302734375, 0.008734640665352344, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+32, 195253, 571, 66, 4275, 1, 1, 5426.5380859375, -2647.54638671875, 310.758880615234375, 1.553341388702392578, 0, 0, 0.700908660888671875, 0.713251054286956787, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+33, 195253, 571, 66, 4275, 1, 1, 5418.21728515625, -2654.892333984375, 310.675201416015625, 3.124123096466064453, 0, 0, 0.99996185302734375, 0.008734640665352344, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+34, 195256, 571, 66, 4275, 1, 1, 5500.0859375, -2657.1953125, 303.953948974609375, 6.12610626220703125, 0, 0, -0.07845878601074218, 0.996917366981506347, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+35, 195260, 571, 66, 4275, 1, 1, 5492.63525390625, -2649.155517578125, 305.27008056640625, 3.089183330535888671, 0, 0, 0.99965667724609375, 0.026201646775007247, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+36, 195256, 571, 66, 4275, 1, 1, 5528.21435546875, -2651.125, 303.953948974609375, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+37, 195256, 571, 66, 4275, 1, 1, 5526.2255859375, -2674.839599609375, 303.953948974609375, 2.513273954391479492, 0, 0, 0.951056480407714843, 0.309017121791839599, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+38, 195260, 571, 66, 4275, 1, 1, 5410.43212890625, -2652.655029296875, 306.23101806640625, 2.635444164276123046, 0, 0, 0.96814727783203125, 0.250381410121917724, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+39, 195256, 571, 66, 4275, 1, 1, 5527.7744140625, -2637.86279296875, 303.953948974609375, 3.106652259826660156, 0, 0, 0.999847412109375, 0.017469281330704689, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+40, 195253, 571, 66, 4275, 1, 1, 5482.34716796875, -2610.53125, 310.678924560546875, 6.265733242034912109, 0, 0, -0.00872611999511718, 0.999961912631988525, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+41, 195253, 571, 66, 4275, 1, 1, 5465.97607421875, -2609.939453125, 310.7265625, 3.124123096466064453, 0, 0, 0.99996185302734375, 0.008734640665352344, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+42, 195260, 571, 66, 4275, 1, 1, 5492.884765625, -2617.63232421875, 305.299072265625, 0.034906249493360519, 0, 0, 0.017452239990234375, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+43, 195256, 571, 66, 4275, 1, 1, 5464.55859375, -2619.046142578125, 306.5511474609375, 3.717553615570068359, 0, 0, -0.95881938934326171, 0.284016460180282592, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+44, 195253, 571, 66, 4275, 1, 1, 5473.11669921875, -2618.064697265625, 310.783782958984375, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+45, 195253, 571, 66, 4275, 1, 1, 5474.36474609375, -2602.700927734375, 310.6907958984375, 1.553341388702392578, 0, 0, 0.700908660888671875, 0.713251054286956787, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+46, 195255, 571, 66, 4275, 1, 1, 5490.34912109375, -2575.416748046875, 313.053253173828125, 4.729844093322753906, 0, 0, -0.70090866088867187, 0.713251054286956787, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+47, 195256, 571, 66, 4275, 1, 1, 5436.38916015625, -2618.3818359375, 306.5511474609375, 5.567600727081298828, 0, 0, -0.35020732879638671, 0.936672210693359375, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+48, 195260, 571, 66, 4275, 1, 1, 5407.5224609375, -2646.7421875, 305.290191650390625, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: The Argent Stand - Difficulty: 0) CreateObject1 +(@OGUID+49, 195256, 571, 66, 4317, 1, 1, 5135.755859375, -2204.338134765625, 236.5435638427734375, 0.383971005678176879, 0, 0, 0.190808296203613281, 0.981627285480499267, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+50, 195256, 571, 66, 4317, 1, 1, 5190.787109375, -2215.080810546875, 239.398193359375, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+51, 195259, 571, 66, 4317, 1, 1, 5196.89697265625, -2215.81591796875, 243.9397735595703125, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+52, 195264, 571, 66, 4317, 1, 1, 5157.71240234375, -2215.264892578125, 238.4418182373046875, 1.553341388702392578, 0, 0, 0.700908660888671875, 0.713251054286956787, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+53, 195260, 571, 66, 4317, 1, 1, 5143.44677734375, -2210.877197265625, 237.8242950439453125, 0.15707901120185852, 0, 0, 0.078458786010742187, 0.996917366981506347, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+54, 195264, 571, 66, 4317, 1, 1, 5157.25927734375, -2201.743896484375, 237.5309295654296875, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+55, 195264, 571, 66, 4317, 1, 1, 5141.53857421875, -2211.604248046875, 238.1585235595703125, 0.296705186367034912, 0, 0, 0.147809028625488281, 0.989015936851501464, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+56, 195260, 571, 66, 4317, 1, 1, 5190.736328125, -2212.201171875, 239.39776611328125, 2.513273954391479492, 0, 0, 0.951056480407714843, 0.309017121791839599, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+57, 195260, 571, 66, 4317, 1, 1, 5134.634765625, -2201.14453125, 238.8164825439453125, 0.401424884796142578, 0, 0, 0.199367523193359375, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+58, 195256, 571, 66, 4317, 1, 1, 5153.60595703125, -2216.569091796875, 236.80499267578125, 1.919861555099487304, 0, 0, 0.819151878356933593, 0.573576688766479492, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+59, 195264, 571, 66, 4317, 1, 1, 5137.095703125, -2201.546142578125, 237.8018951416015625, 4.48549652099609375, 0, 0, -0.7826080322265625, 0.622514784336090087, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+60, 195259, 571, 66, 4317, 1, 1, 5193.83837890625, -2203.542236328125, 239.8356170654296875, 3.560472726821899414, 0, 0, -0.97814750671386718, 0.207912087440490722, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+61, 195260, 571, 66, 4317, 1, 1, 5148.00146484375, -2198.407958984375, 237.6139678955078125, 5.70722818374633789, 0, 0, -0.28401470184326171, 0.958819925785064697, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+62, 195264, 571, 66, 4317, 1, 1, 5177.1533203125, -2180.083740234375, 236.542449951171875, 4.555310726165771484, 0, 0, -0.76040554046630859, 0.649448513984680175, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+63, 195256, 571, 66, 4317, 1, 1, 5135.95458984375, -2183.2392578125, 236.8366241455078125, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+64, 195256, 571, 66, 4317, 1, 1, 5196.79931640625, -2208.14404296875, 239.3988494873046875, 2.932138919830322265, 0, 0, 0.994521141052246093, 0.104535527527332305, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+65, 195259, 571, 66, 4317, 1, 1, 5179.93212890625, -2192.0244140625, 239.8267669677734375, 2.897245407104492187, 0, 0, 0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+66, 195264, 571, 66, 4317, 1, 1, 5192.4345703125, -2209.911376953125, 239.398193359375, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+67, 195259, 571, 66, 4317, 1, 1, 5111.6787109375, -2201.835205078125, 243.7792205810546875, 1.082102894783020019, 0, 0, 0.51503753662109375, 0.857167601585388183, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+68, 195256, 571, 66, 4317, 1, 1, 5174.27978515625, -2190.904052734375, 236.5398712158203125, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+69, 195260, 571, 66, 4317, 1, 1, 5173.9501953125, -2179.033203125, 236.537872314453125, 6.14356088638305664, 0, 0, -0.06975555419921875, 0.997564136981964111, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+70, 195256, 571, 66, 4317, 1, 1, 5170.6552734375, -2175.09375, 236.523956298828125, 3.9793548583984375, 0, 0, -0.9135446548461914, 0.406738430261611938, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+71, 195259, 571, 66, 4317, 1, 1, 5141.9833984375, -2154.614501953125, 244.30865478515625, 0.052358884364366531, 0, 0, 0.02617645263671875, 0.999657332897186279, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Light's Breach - Difficulty: 0) CreateObject1 +(@OGUID+72, 195256, 571, 66, 4312, 1, 1, 5235.5537109375, -1320.3189697265625, 242.1471405029296875, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Ebon Watch - Difficulty: 0) CreateObject1 +(@OGUID+73, 195256, 571, 66, 4312, 1, 1, 5233.94384765625, -1309.33349609375, 242.7247772216796875, 0.261798173189163208, 0, 0, 0.130525588989257812, 0.991444945335388183, 120, 255, 1, 0); -- Standing, Exterior, Medium - Brewfest (Area: Ebon Watch - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+73 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+73; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_07_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_07_world.sql new file mode 100644 index 00000000000..26b4cadf39d --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_07_world.sql @@ -0,0 +1,132 @@ +-- +SET @OGUID := 93212; -- Need 123 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+122; +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 +(@OGUID+0, 195259, 571, 394, 4159, 1, 1, 4588.76904296875, -4259.3974609375, 183.012725830078125, 2.129300594329833984, 0, 0, 0.874619483947753906, 0.484810054302215576, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+1, 195256, 571, 394, 4159, 1, 1, 4578.9130859375, -4263.68212890625, 182.0264434814453125, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+2, 195256, 571, 394, 4159, 1, 1, 4549.17822265625, -4253.70751953125, 170.7494049072265625, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+3, 195256, 571, 394, 4159, 1, 1, 4585.376953125, -4225.4306640625, 178.0588226318359375, 2.548179388046264648, 0, 0, 0.956304550170898437, 0.292372345924377441, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+4, 195256, 571, 394, 4159, 1, 1, 4574.1748046875, -4252.90234375, 182.207916259765625, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+5, 195256, 571, 394, 4159, 1, 1, 4554.02978515625, -4232.88720703125, 170.6884307861328125, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+6, 195255, 571, 394, 4159, 1, 1, 4524.68408203125, -4252.0185546875, 177.024627685546875, 2.687806606292724609, 0, 0, 0.974370002746582031, 0.224951311945915222, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+7, 195266, 571, 394, 4159, 1, 1, 4551.2802734375, -4238.45703125, 173.6894989013671875, 2.408554315567016601, 0, 0, 0.933580398559570312, 0.358368009328842163, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+8, 195266, 571, 394, 4159, 1, 1, 4596.6259765625, -4237.6162109375, 181.892181396484375, 2.303830623626708984, 0, 0, 0.913544654846191406, 0.406738430261611938, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+9, 195259, 571, 394, 4159, 1, 1, 4608.650390625, -4233.8955078125, 181.3111572265625, 3.054326534271240234, 0, 0, 0.999048233032226562, 0.043619260191917419, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+10, 195256, 571, 394, 4159, 1, 1, 4544.07275390625, -4208.38623046875, 170.67333984375, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+11, 195256, 571, 394, 4159, 1, 1, 4604.29931640625, -4216.10986328125, 178.7165374755859375, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+12, 195259, 571, 394, 4159, 1, 1, 4583.4599609375, -4214.486328125, 178.7119903564453125, 5.096362113952636718, 0, 0, -0.55919265747070312, 0.829037725925445556, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+13, 195259, 571, 394, 4159, 1, 1, 4516.88134765625, -4237.6982421875, 172.096099853515625, 3.316144466400146484, 0, 0, -0.99619388580322265, 0.087165042757987976, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+14, 195259, 571, 394, 4159, 1, 1, 4525.02587890625, -4220.74462890625, 171.4342803955078125, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+15, 195256, 571, 394, 4159, 1, 1, 4531.97900390625, -4176.56103515625, 173.4835968017578125, 6.178466320037841796, 0, 0, -0.05233573913574218, 0.998629570007324218, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+16, 195256, 571, 394, 4159, 1, 1, 4550.19091796875, -4182.83642578125, 173.4988555908203125, 1.518436193466186523, 0, 0, 0.6883544921875, 0.725374460220336914, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+17, 195259, 571, 394, 4159, 1, 1, 4545.50537109375, -4198.65283203125, 174.6675567626953125, 3.176533222198486328, 0, 0, -0.999847412109375, 0.017469281330704689, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+18, 195255, 571, 394, 4159, 1, 1, 4532.3466796875, -4148.5302734375, 182.7989044189453125, 3.106652259826660156, 0, 0, 0.999847412109375, 0.017469281330704689, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+19, 195259, 571, 394, 4159, 1, 1, 4530.67822265625, -4141.923828125, 175.909332275390625, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+20, 195259, 571, 394, 4159, 1, 1, 4524.59814453125, -4165.27978515625, 174.0964508056640625, 2.879789113998413085, 0, 0, 0.991444587707519531, 0.130528271198272705, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+21, 195259, 571, 394, 4159, 1, 1, 4456.92236328125, -4314.45556640625, 160.9202117919921875, 4.572763919830322265, 0, 0, -0.75470924377441406, 0.656059443950653076, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Westfall Brigade Encampment - Difficulty: 0) CreateObject1 +(@OGUID+22, 195256, 571, 394, 4211, 1, 1, 3883.56591796875, -4522.05712890625, 217.3779754638671875, 2.635444164276123046, 0, 0, 0.96814727783203125, 0.250381410121917724, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Solstice Village - Difficulty: 0) CreateObject1 +(@OGUID+23, 195255, 571, 394, 4211, 1, 1, 3881.885986328125, -4516.8974609375, 223.729248046875, 3.211419343948364257, 0, 0, -0.9993906021118164, 0.034906134009361267, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+24, 195259, 571, 394, 4211, 1, 1, 3876.389892578125, -4523.8134765625, 218.0924530029296875, 1.954769015312194824, 0, 0, 0.829037666320800781, 0.559192776679992675, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+25, 195256, 571, 394, 4211, 1, 1, 3866.0244140625, -4531.32470703125, 209.7258758544921875, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+26, 195264, 571, 394, 4211, 1, 1, 3877.072509765625, -4546.67822265625, 210.9720001220703125, 0.453785061836242675, 0, 0, 0.224950790405273437, 0.974370121955871582, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+27, 195260, 571, 394, 4211, 1, 1, 3873.443115234375, -4541.18505859375, 210.1432647705078125, 4.188792228698730468, 0, 0, -0.86602497100830078, 0.50000077486038208, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+28, 195264, 571, 394, 4211, 1, 1, 3874.092529296875, -4541.466796875, 210.1389007568359375, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+29, 195273, 571, 394, 4211, 1, 1, 3876.380126953125, -4541.03125, 209.7021484375, 4.520402908325195312, 0, 0, -0.77162456512451171, 0.636078238487243652, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+30, 195260, 571, 394, 4211, 1, 1, 3876.73779296875, -4547.53125, 210.96728515625, 5.183629035949707031, 0, 0, -0.52249813079833984, 0.852640450000762939, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+31, 195273, 571, 394, 4211, 1, 1, 3865.14501953125, -4556.1748046875, 211.0864410400390625, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+32, 195256, 571, 394, 4211, 1, 1, 3871.14501953125, -4567.24462890625, 207.544708251953125, 5.619962215423583984, 0, 0, -0.32556724548339843, 0.945518851280212402, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+33, 195260, 571, 394, 4211, 1, 1, 3862.3212890625, -4549.05517578125, 211.58984375, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+34, 195256, 571, 394, 4211, 1, 1, 3844.86767578125, -4517.59375, 210.5048370361328125, 5.323255538940429687, 0, 0, -0.46174812316894531, 0.887011110782623291, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+35, 195256, 571, 394, 4211, 1, 1, 3848.001708984375, -4506.845703125, 207.78558349609375, 1.867502212524414062, 0, 0, 0.803856849670410156, 0.594822824001312255, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+36, 195256, 571, 394, 4211, 1, 1, 3854.529541015625, -4499.98291015625, 208.038604736328125, 2.827429771423339843, 0, 0, 0.987688064575195312, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+37, 195273, 571, 394, 4211, 1, 1, 3858.30078125, -4564.548828125, 210.174102783203125, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+38, 195273, 571, 394, 4211, 1, 1, 3854.253173828125, -4497.0986328125, 208.4462890625, 2.635444164276123046, 0, 0, 0.96814727783203125, 0.250381410121917724, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+39, 195273, 571, 394, 4211, 1, 1, 3845.2626953125, -4506.48291015625, 208.087860107421875, 2.338739633560180664, 0, 0, 0.920504570007324218, 0.3907318115234375, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+40, 195256, 571, 394, 4211, 1, 1, 3847.24560546875, -4556.36474609375, 210.1267852783203125, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+41, 195256, 571, 394, 4211, 1, 1, 3835.150146484375, -4527.1494140625, 210.6371307373046875, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+42, 195264, 571, 394, 4211, 1, 1, 3838.455810546875, -4544.68408203125, 209.2908935546875, 2.530723094940185546, 0, 0, 0.953716278076171875, 0.300707906484603881, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Camp Oneqwah - Difficulty: 0) CreateObject1 +(@OGUID+43, 195256, 571, 394, 4229, 1, 1, 3818.5986328125, -5155.80908203125, 119.0596237182617187, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Prospector's Point - Difficulty: 0) CreateObject1 +(@OGUID+44, 195257, 571, 394, 4229, 1, 1, 3822.3515625, -5152.14404296875, 122.9666213989257812, 2.897245407104492187, 0, 0, 0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Prospector's Point - Difficulty: 0) CreateObject1 +(@OGUID+45, 195257, 571, 394, 4229, 1, 1, 3814.752685546875, -5158.24462890625, 123.3370208740234375, 1.937312245368957519, 0, 0, 0.824125289916992187, 0.566407561302185058, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Prospector's Point - Difficulty: 0) CreateObject1 +(@OGUID+46, 195256, 571, 394, 4204, 1, 1, 3432.5625, -2829.0361328125, 201.703643798828125, 1.972219824790954589, 0, 0, 0.83388519287109375, 0.55193793773651123, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+47, 195256, 571, 394, 4204, 1, 1, 3413.370361328125, -2812.23095703125, 200.457550048828125, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+48, 195266, 571, 394, 4204, 1, 1, 3396.490234375, -2809.564697265625, 207.413726806640625, 5.323255538940429687, 0, 0, -0.46174812316894531, 0.887011110782623291, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+49, 195266, 571, 394, 4204, 1, 1, 3407.77783203125, -2803.8828125, 205.8443145751953125, 4.520402908325195312, 0, 0, -0.77162456512451171, 0.636078238487243652, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+50, 195253, 571, 394, 4204, 1, 1, 3415.611572265625, -2804.817626953125, 207.874542236328125, 5.340708732604980468, 0, 0, -0.45398998260498046, 0.891006767749786376, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+51, 195257, 571, 394, 4204, 1, 1, 3421.742431640625, -2795.542236328125, 203.7708282470703125, 2.286378860473632812, 0, 0, 0.909960746765136718, 0.414694398641586303, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+52, 195259, 571, 394, 4204, 1, 1, 3454.6015625, -2802.049072265625, 202.4846343994140625, 3.351046562194824218, 0, 0, -0.99452114105224609, 0.104535527527332305, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+53, 195253, 571, 394, 4204, 1, 1, 3426.070068359375, -2797.111328125, 207.8059844970703125, 5.340708732604980468, 0, 0, -0.45398998260498046, 0.891006767749786376, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+54, 195257, 571, 394, 4204, 1, 1, 3416.353759765625, -2799.534912109375, 203.6573638916015625, 2.042035102844238281, 0, 0, 0.852640151977539062, 0.522498607635498046, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+55, 195256, 571, 394, 4204, 1, 1, 3457.1279296875, -2785.356689453125, 201.2522735595703125, 0.174532130360603332, 0, 0, 0.087155342102050781, 0.996194720268249511, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Amberpine Lodge - Difficulty: 0) CreateObject1 +(@OGUID+56, 195253, 571, 394, 4206, 1, 1, 3248.33447265625, -2376.1298828125, 125.8162994384765625, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+57, 195255, 571, 394, 4206, 1, 1, 3300.6015625, -2378.8994140625, 117.8946762084960937, 4.939284324645996093, 0, 0, -0.6225137710571289, 0.78260880708694458, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+58, 195255, 571, 394, 4206, 1, 1, 3282.833251953125, -2368.123291015625, 117.8988037109375, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+59, 195253, 571, 394, 4206, 1, 1, 3272.99169921875, -2376.118408203125, 126.1800537109375, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+60, 195255, 571, 394, 4206, 1, 1, 3311.09326171875, -2361.425048828125, 117.9167327880859375, 0.226892471313476562, 0, 0, 0.113203048706054687, 0.993571877479553222, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+61, 195255, 571, 394, 4206, 1, 1, 3293.471435546875, -2350.23779296875, 117.6906509399414062, 1.884953022003173828, 0, 0, 0.809016227722167968, 0.587786316871643066, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+62, 195256, 571, 394, 4206, 1, 1, 3302.054443359375, -2350.771240234375, 108.88916015625, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+63, 195253, 571, 394, 4206, 1, 1, 3313.639892578125, -2339.25927734375, 135.3806304931640625, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+64, 195256, 571, 394, 4206, 1, 1, 3316.352783203125, -2328.825439453125, 111.091400146484375, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+65, 195253, 571, 394, 4206, 1, 1, 3220.80810546875, -2360.81640625, 129.0979461669921875, 0.558503925800323486, 0, 0, 0.275636672973632812, 0.961261868476867675, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+66, 195260, 571, 394, 4206, 1, 1, 3313.64697265625, -2337.28125, 112.4452133178710937, 0.15707901120185852, 0, 0, 0.078458786010742187, 0.996917366981506347, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+67, 195253, 571, 394, 4206, 1, 1, 3207.483154296875, -2339.074462890625, 129.03857421875, 0.541050612926483154, 0, 0, 0.267237663269042968, 0.96363067626953125, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+68, 195253, 571, 394, 4206, 1, 1, 3194.915283203125, -2304.802978515625, 131.448150634765625, 0.15707901120185852, 0, 0, 0.078458786010742187, 0.996917366981506347, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+69, 195256, 571, 394, 4206, 1, 1, 3225.8291015625, -2298.3994140625, 107.2934036254882812, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+70, 195260, 571, 394, 4206, 1, 1, 3201.634033203125, -2297.766845703125, 109.0517196655273437, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+71, 195263, 571, 394, 4206, 1, 1, 3194.85546875, -2292.01611328125, 108.0623779296875, 0.174532130360603332, 0, 0, 0.087155342102050781, 0.996194720268249511, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+72, 195256, 571, 394, 4206, 1, 1, 3184.45751953125, -2253.97314453125, 114.862762451171875, 2.408554315567016601, 0, 0, 0.933580398559570312, 0.358368009328842163, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+73, 195256, 571, 394, 4206, 1, 1, 3237.112060546875, -2271.501708984375, 113.9171981811523437, 1.605701684951782226, 0, 0, 0.719339370727539062, 0.694658815860748291, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+74, 195266, 571, 394, 4206, 1, 1, 3270.23046875, -2299.0166015625, 105.3504867553710937, 1.047197580337524414, 0, 0, 0.5, 0.866025388240814208, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+75, 195253, 571, 394, 4206, 1, 1, 3191.101806640625, -2279.25439453125, 131.501220703125, 0.139624491333961486, 0, 0, 0.06975555419921875, 0.997564136981964111, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+76, 195255, 571, 394, 4206, 1, 1, 3193.161376953125, -2253.91259765625, 117.8537979125976562, 1.727874636650085449, 0, 0, 0.760405540466308593, 0.649448513984680175, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+77, 195263, 571, 394, 4206, 1, 1, 3264.849853515625, -2273.001220703125, 109.3768386840820312, 4.799657344818115234, 0, 0, -0.67558956146240234, 0.737277925014495849, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject +(@OGUID+78, 195256, 571, 394, 4206, 1, 1, 3267.522705078125, -2271.92529296875, 114.2197036743164062, 2.199114561080932617, 0, 0, 0.8910064697265625, 0.453990638256072998, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+79, 195260, 571, 394, 4206, 1, 1, 3240.246826171875, -2236.566162109375, 117.1561431884765625, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+80, 195259, 571, 394, 4206, 1, 1, 3263.252685546875, -2264.286865234375, 115.017852783203125, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+81, 195263, 571, 394, 4206, 1, 1, 3272.4453125, -2284.549560546875, 109.6323165893554687, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+82, 195259, 571, 394, 4206, 1, 1, 3259.02099609375, -2267.587158203125, 114.3780288696289062, 2.007128477096557617, 0, 0, 0.84339141845703125, 0.537299633026123046, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+83, 195256, 571, 394, 4206, 1, 1, 3248.891845703125, -2223.040283203125, 116.8296966552734375, 4.799657344818115234, 0, 0, -0.67558956146240234, 0.737277925014495849, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+84, 195266, 571, 394, 4206, 1, 1, 3253.43408203125, -2199.932373046875, 127.3123626708984375, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+85, 195266, 571, 394, 4206, 1, 1, 3272.255126953125, -2192.747802734375, 127.4287490844726562, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+86, 195256, 571, 394, 4206, 1, 1, 3268.58544921875, -2230.66064453125, 116.8296966552734375, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+87, 195256, 571, 394, 4206, 1, 1, 3286.429443359375, -2201.52294921875, 117.3725967407226562, 3.839725255966186523, 0, 0, -0.93969249725341796, 0.34202045202255249, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+88, 195266, 571, 394, 4206, 1, 1, 3280.344970703125, -2211.23193359375, 127.408203125, 2.70525527000427246, 0, 0, 0.97629547119140625, 0.216442063450813293, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+89, 195253, 571, 394, 4206, 1, 1, 3325.67529296875, -2187.1416015625, 134.12451171875, 3.78736734390258789, 0, 0, -0.94832324981689453, 0.317305892705917358, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+90, 195255, 571, 394, 4206, 1, 1, 3336.53369140625, -2207.365478515625, 120.0340728759765625, 5.288348197937011718, 0, 0, -0.4771585464477539, 0.878817260265350341, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+91, 195256, 571, 394, 4206, 1, 1, 3344.211669921875, -2203.409912109375, 119.4522705078125, 0.331610709428787231, 0, 0, 0.16504669189453125, 0.986285746097564697, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+92, 195256, 571, 394, 4206, 1, 1, 3308.39501953125, -2221.642333984375, 115.8079681396484375, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+93, 195256, 571, 394, 4206, 1, 1, 3352.523193359375, -2221.0791015625, 119.4522705078125, 0.401424884796142578, 0, 0, 0.199367523193359375, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+94, 195255, 571, 394, 4206, 1, 1, 3346.118408203125, -2225.081787109375, 119.375030517578125, 2.042035102844238281, 0, 0, 0.852640151977539062, 0.522498607635498046, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+95, 195253, 571, 394, 4206, 1, 1, 3351.66796875, -2245.885498046875, 137.426025390625, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+96, 195256, 571, 394, 4206, 1, 1, 3294.6728515625, -2261.470458984375, 111.9283218383789062, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+97, 195253, 571, 394, 4206, 1, 1, 3342.093994140625, -2281.307373046875, 137.6797637939453125, 2.70525527000427246, 0, 0, 0.97629547119140625, 0.216442063450813293, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+98, 195256, 571, 394, 4206, 1, 1, 3323.304443359375, -2296.871826171875, 110.109283447265625, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+99, 195253, 571, 394, 4206, 1, 1, 3331.026611328125, -2305.594970703125, 137.53759765625, 2.70525527000427246, 0, 0, 0.97629547119140625, 0.216442063450813293, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+100, 195263, 571, 394, 4206, 1, 1, 3281.507568359375, -2289.552978515625, 109.7591781616210937, 1.064649581909179687, 0, 0, 0.507537841796875, 0.861629426479339599, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Conquest Hold - Difficulty: 0) CreateObject1 +(@OGUID+101, 195256, 571, 394, 4242, 1, 1, 2538.16455078125, -1999.589599609375, 8.439572334289550781, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+102, 195256, 571, 394, 4242, 1, 1, 2549.787353515625, -1992.144775390625, 8.439572334289550781, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+103, 195256, 571, 394, 4242, 1, 1, 2493.72705078125, -1921.8819580078125, 10.72952842712402343, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+104, 195256, 571, 394, 4242, 1, 1, 2546.96533203125, -1915.29345703125, 2.871465921401977539, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+105, 195256, 571, 394, 4242, 1, 1, 2547.7998046875, -1930.666259765625, 3.251395940780639648, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+106, 195256, 571, 394, 4242, 1, 1, 2503.9619140625, -1936.4486083984375, 10.39561176300048828, 1.012289404869079589, 0, 0, 0.484808921813964843, 0.87462007999420166, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+107, 195253, 571, 394, 4242, 1, 1, 2495.748046875, -1930.49267578125, 18.890869140625, 0.593410074710845947, 0, 0, 0.292370796203613281, 0.95630502700805664, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+108, 195256, 571, 394, 4242, 1, 1, 2485.73681640625, -1895.5426025390625, 10.02251052856445312, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+109, 195256, 571, 394, 4242, 1, 1, 2485.413330078125, -1882.3096923828125, 9.955285072326660156, 5.881760597229003906, 0, 0, -0.19936752319335937, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+110, 195253, 571, 394, 4242, 1, 1, 2482.12109375, -1838.0968017578125, 19.10610771179199218, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+111, 195253, 571, 394, 4242, 1, 1, 2493.71923828125, -1840.646240234375, 18.18875885009765625, 5.515241622924804687, 0, 0, -0.37460613250732421, 0.927184045314788818, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+112, 195256, 571, 394, 4242, 1, 1, 2546.4873046875, -1837.44384765625, 10.57294368743896484, 1.954769015312194824, 0, 0, 0.829037666320800781, 0.559192776679992675, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+113, 195253, 571, 394, 4242, 1, 1, 2510.754150390625, -1823.16259765625, 18.16746330261230468, 5.515241622924804687, 0, 0, -0.37460613250732421, 0.927184045314788818, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+114, 195256, 571, 394, 4242, 1, 1, 2438.87548828125, -1853.4410400390625, 1.204813957214355468, 0.24434557557106018, 0, 0, 0.121869087219238281, 0.9925462007522583, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+115, 195256, 571, 394, 4242, 1, 1, 2444.650634765625, -1838.691162109375, 1.022343039512634277, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+116, 195256, 571, 394, 4242, 1, 1, 2497.920166015625, -1838.302978515625, 10.55218505859375, 5.323255538940429687, 0, 0, -0.46174812316894531, 0.887011110782623291, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+117, 195253, 571, 394, 4242, 1, 1, 2502.159423828125, -1831.97314453125, 18.18279266357421875, 5.480334281921386718, 0, 0, -0.39073085784912109, 0.920504987239837646, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+118, 195256, 571, 394, 4242, 1, 1, 2491.8291015625, -1845.1595458984375, 10.70640087127685546, 5.654868602752685546, 0, 0, -0.30901622772216796, 0.95105677843093872, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+119, 195256, 571, 394, 4242, 1, 1, 2559.23046875, -1828.40283203125, 10.51216411590576171, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+120, 195253, 571, 394, 4242, 1, 1, 2508.89111328125, -1811.1556396484375, 18.57204437255859375, 0.802850961685180664, 0, 0, 0.390730857849121093, 0.920504987239837646, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+121, 195256, 571, 394, 4242, 1, 1, 2600.052734375, -1802.4447021484375, 10.64246273040771484, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 +(@OGUID+122, 195256, 571, 394, 4242, 1, 1, 2595.77978515625, -1789.1341552734375, 10.64246177673339843, 5.585053920745849609, 0, 0, -0.34202003479003906, 0.939692676067352294, 120, 255, 1, 0); -- Standing, Exterior, Medium - Brewfest (Area: Venture Bay - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+122 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+122; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_08_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_08_world.sql new file mode 100644 index 00000000000..6e678b487b5 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_12_08_world.sql @@ -0,0 +1,206 @@ +-- +SET @OGUID := 93335; -- Need 197 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+196; +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 +(@OGUID+0, 195266, 571, 495, 4062, 1, 1, 2127.25, -2962.01904296875, 155.307586669921875, 4.991643905639648437, 0, 0, -0.60181427001953125, 0.798636078834533691, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+1, 195256, 571, 495, 4062, 1, 1, 2117.1181640625, -2965.381591796875, 148.6168670654296875, 4.031712055206298828, 0, 0, -0.90258502960205078, 0.430511653423309326, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+2, 195266, 571, 495, 4062, 1, 1, 2122.88720703125, -2959.94287109375, 155.2806854248046875, 3.473210096359252929, 0, 0, -0.98628520965576171, 0.165049895644187927, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+3, 195266, 571, 495, 4062, 1, 1, 2124.927490234375, -2955.5634765625, 154.968414306640625, 1.85004889965057373, 0, 0, 0.798635482788085937, 0.60181504487991333, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+4, 195266, 571, 495, 4062, 1, 1, 2129.3310546875, -2957.728759765625, 155.2841796875, 0.366517573595046997, 0, 0, 0.182234764099121093, 0.98325502872467041, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+5, 195266, 571, 495, 4062, 1, 1, 2132.39404296875, -2996.244873046875, 155.843231201171875, 0.122172988951206207, 0, 0, 0.061048507690429687, 0.998134791851043701, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+6, 195256, 571, 495, 4062, 1, 1, 2142.095703125, -2984.89208984375, 148.91650390625, 1.937312245368957519, 0, 0, 0.824125289916992187, 0.566407561302185058, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+7, 195256, 571, 495, 4062, 1, 1, 2109.81591796875, -2988.44970703125, 148.3804473876953125, 2.181660413742065429, 0, 0, 0.887010574340820312, 0.461749136447906494, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+8, 195266, 571, 495, 4062, 1, 1, 2125.528564453125, -2997.119873046875, 155.7462615966796875, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+9, 195256, 571, 495, 4062, 1, 1, 2140.401123046875, -2968.3994140625, 148.33563232421875, 4.433136463165283203, 0, 0, -0.79863548278808593, 0.60181504487991333, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+10, 195266, 571, 495, 4062, 1, 1, 2128.5087890625, -2993.26904296875, 155.7663116455078125, 1.710421562194824218, 0, 0, 0.754709243774414062, 0.656059443950653076, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+11, 195266, 571, 495, 4062, 1, 1, 2129.307373046875, -3000.026123046875, 155.8247222900390625, 4.852017402648925781, 0, 0, -0.65605831146240234, 0.754710197448730468, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Apothecary Camp - Difficulty: 0) CreateObject1 +(@OGUID+12, 195256, 571, 495, 4018, 1, 1, 2642.450439453125, -4384.39404296875, 283.269317626953125, 6.03883981704711914, 0, 0, -0.12186908721923828, 0.9925462007522583, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+13, 195256, 571, 495, 4018, 1, 1, 2654.309814453125, -4365.0380859375, 277.507476806640625, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+14, 195256, 571, 495, 4018, 1, 1, 2620.653564453125, -4361.46142578125, 276.49017333984375, 5.602506637573242187, 0, 0, -0.33380699157714843, 0.942641437053680419, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+15, 195256, 571, 495, 4018, 1, 1, 2657.28466796875, -4403.33837890625, 283.921661376953125, 1.500982880592346191, 0, 0, 0.681998252868652343, 0.731353819370269775, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+16, 195256, 571, 495, 4018, 1, 1, 2675.205810546875, -4331.74853515625, 289.77642822265625, 0.820303261280059814, 0, 0, 0.398748397827148437, 0.917060375213623046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+17, 195266, 571, 495, 4018, 1, 1, 2673.549072265625, -4383.2900390625, 290.49188232421875, 2.600535154342651367, 0, 0, 0.963629722595214843, 0.26724100112915039, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+18, 195259, 571, 495, 4018, 1, 1, 2653.467041015625, -4398.361328125, 284.529449462890625, 0.925023794174194335, 0, 0, 0.446197509765625, 0.894934535026550292, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+19, 195259, 571, 495, 4018, 1, 1, 2645.27880859375, -4389.67822265625, 283.946197509765625, 0.104719325900077819, 0, 0, 0.052335739135742187, 0.998629570007324218, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+20, 195260, 571, 495, 4018, 1, 1, 2676.61669921875, -4381.39453125, 285.759613037109375, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+21, 195256, 571, 495, 4018, 1, 1, 2681.397705078125, -4378.91162109375, 282.961212158203125, 1.989672422409057617, 0, 0, 0.838669776916503906, 0.544640243053436279, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+22, 195257, 571, 495, 4018, 1, 1, 2677.323486328125, -4386.642578125, 290.094268798828125, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+23, 195257, 571, 495, 4018, 1, 1, 2681.623291015625, -4397.51220703125, 285.5596923828125, 0.959929943084716796, 0, 0, 0.461748123168945312, 0.887011110782623291, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+24, 195260, 571, 495, 4018, 1, 1, 2688.802001953125, -4390.22998046875, 285.700103759765625, 2.949595451354980468, 0, 0, 0.995395660400390625, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+25, 195257, 571, 495, 4018, 1, 1, 2678.708251953125, -4395.55712890625, 285.5654296875, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+26, 195256, 571, 495, 4018, 1, 1, 2681.611083984375, -4385.32421875, 284.433746337890625, 4.555310726165771484, 0, 0, -0.76040554046630859, 0.649448513984680175, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+27, 195266, 571, 495, 4003, 1, 1, 2501.50537109375, -5059.52490234375, 285.9002685546875, 6.161012649536132812, 0, 0, -0.06104850769042968, 0.998134791851043701, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+28, 195256, 571, 495, 4003, 1, 1, 2462.8271484375, -5023.974609375, 283.71392822265625, 5.410521507263183593, 0, 0, -0.42261791229248046, 0.906307935714721679, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+29, 195256, 571, 495, 4003, 1, 1, 2464.11669921875, -5036.9130859375, 283.756134033203125, 0.733038187026977539, 0, 0, 0.358367919921875, 0.933580458164215087, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+30, 195259, 571, 495, 4003, 1, 1, 2499.96435546875, -5059.01953125, 286.9637451171875, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+31, 195266, 571, 495, 4003, 1, 1, 2485.302490234375, -5048.4013671875, 296.412353515625, 1.466075778007507324, 0, 0, 0.669130325317382812, 0.74314504861831665, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+32, 195266, 571, 495, 4003, 1, 1, 2496.864013671875, -5066.93310546875, 302.693145751953125, 6.161012649536132812, 0, 0, -0.06104850769042968, 0.998134791851043701, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+33, 195256, 571, 495, 4003, 1, 1, 2476.259765625, -5072.8115234375, 283.03717041015625, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+34, 195266, 571, 495, 4003, 1, 1, 2469.69970703125, -5056.40966796875, 296.069091796875, 3.019413232803344726, 0, 0, 0.998134613037109375, 0.061051756143569946, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+35, 195259, 571, 495, 4003, 1, 1, 2474.880859375, -5069.70947265625, 286.004119873046875, 3.839725255966186523, 0, 0, -0.93969249725341796, 0.34202045202255249, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+36, 195266, 571, 495, 4003, 1, 1, 2477.305908203125, -5073.56103515625, 291.637451171875, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+37, 195259, 571, 495, 4003, 1, 1, 2491.536376953125, -5071.005859375, 298.8145751953125, 1.466075778007507324, 0, 0, 0.669130325317382812, 0.74314504861831665, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+38, 195259, 571, 495, 4003, 1, 1, 2472.168212890625, -5058.8740234375, 292.487213134765625, 6.178466320037841796, 0, 0, -0.05233573913574218, 0.998629570007324218, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+39, 195266, 571, 495, 4003, 1, 1, 2483.536376953125, -5065.3662109375, 301.697540283203125, 3.071766138076782226, 0, 0, 0.999390602111816406, 0.034906134009361267, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+40, 195259, 571, 495, 4003, 1, 1, 2472.028564453125, -5066.28125, 286.071380615234375, 3.78736734390258789, 0, 0, -0.94832324981689453, 0.317305892705917358, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+41, 195266, 571, 495, 4003, 1, 1, 2475.982421875, -5063.1513671875, 289.160797119140625, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Frostblade Peak - Difficulty: 0) CreateObject1 +(@OGUID+42, 195256, 571, 495, 4003, 1, 1, 2422.8447265625, -5074.8505859375, 272.242706298828125, 0, 0, 0, 0, 1, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fort Wildervar - Difficulty: 0) CreateObject1 +(@OGUID+43, 195256, 571, 495, 4003, 1, 1, 2438.944580078125, -5120.9755859375, 275.9085693359375, 2.408554315567016601, 0, 0, 0.933580398559570312, 0.358368009328842163, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fort Wildervar - Difficulty: 0) CreateObject1 +(@OGUID+44, 195256, 571, 495, 4003, 1, 1, 2417.9619140625, -5122.1416015625, 276.593963623046875, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fort Wildervar - Difficulty: 0) CreateObject1 +(@OGUID+45, 195256, 571, 495, 4003, 1, 1, 2429.50341796875, -5159.25, 277.0015869140625, 5.061456203460693359, 0, 0, -0.57357597351074218, 0.819152355194091796, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fort Wildervar - Difficulty: 0) CreateObject1 +(@OGUID+46, 195256, 571, 495, 4003, 1, 1, 2429.84716796875, -5168.77587890625, 277.110870361328125, 1.291541695594787597, 0, 0, 0.60181427001953125, 0.798636078834533691, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Fort Wildervar - Difficulty: 0) CreateObject1 +(@OGUID+47, 195266, 571, 495, 4000, 1, 1, 1955.9967041015625, -6111.82958984375, 41.53107452392578125, 4.084071159362792968, 0, 0, -0.8910064697265625, 0.453990638256072998, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+48, 195266, 571, 495, 4000, 1, 1, 1971.8021240234375, -6102.19775390625, 73.710601806640625, 0.925023794174194335, 0, 0, 0.446197509765625, 0.894934535026550292, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+49, 195266, 571, 495, 4000, 1, 1, 1960.259521484375, -6117.28662109375, 41.52031326293945312, 3.996806621551513671, 0, 0, -0.90996074676513671, 0.414694398641586303, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+50, 195266, 571, 495, 4000, 1, 1, 1966.4713134765625, -6119.72265625, 41.52581024169921875, 4.066620349884033203, 0, 0, -0.89493370056152343, 0.44619917869567871, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+51, 195266, 571, 495, 4000, 1, 1, 1949.329833984375, -6147.3056640625, 31.00298500061035156, 2.862335443496704101, 0, 0, 0.990267753601074218, 0.139175355434417724, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+52, 195256, 571, 495, 4000, 1, 1, 1919.9151611328125, -6182.5986328125, 24.47692298889160156, 1.727874636650085449, 0, 0, 0.760405540466308593, 0.649448513984680175, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+53, 195257, 571, 495, 4532, 1, 1, 1891.3333740234375, -6175.7236328125, 26.62350845336914062, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+54, 195256, 571, 495, 4000, 1, 1, 1927.3294677734375, -6186.8359375, 24.11248397827148437, 1.727874636650085449, 0, 0, 0.760405540466308593, 0.649448513984680175, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+55, 195256, 571, 495, 4000, 1, 1, 1882.5814208984375, -6170.53076171875, 23.82955741882324218, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+56, 195273, 571, 495, 4532, 1, 1, 1896.3685302734375, -6177.45849609375, 28.25125503540039062, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+57, 195273, 571, 495, 4532, 1, 1, 1900.7137451171875, -6182.30615234375, 31.16156959533691406, 0.401424884796142578, 0, 0, 0.199367523193359375, 0.979924798011779785, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+58, 195256, 571, 495, 4000, 1, 1, 1899.3099365234375, -6178.33203125, 24.02913856506347656, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+59, 195273, 571, 495, 4532, 1, 1, 1889.537353515625, -6174.26025390625, 27.78375434875488281, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+60, 195257, 571, 495, 4532, 1, 1, 1894.1710205078125, -6177.046875, 26.61498832702636718, 1.256635904312133789, 0, 0, 0.587784767150878906, 0.809017360210418701, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+61, 195266, 571, 495, 4000, 1, 1, 1933.8350830078125, -6188.439453125, 30.40494155883789062, 1.710421562194824218, 0, 0, 0.754709243774414062, 0.656059443950653076, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+62, 195273, 571, 495, 4532, 1, 1, 1883.0047607421875, -6173.48095703125, 30.73777008056640625, 1.867502212524414062, 0, 0, 0.803856849670410156, 0.594822824001312255, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+63, 195273, 571, 495, 4532, 1, 1, 1892.77783203125, -6183.73583984375, 25.80629158020019531, 4.310965538024902343, 0, 0, -0.83388519287109375, 0.55193793773651123, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+64, 195273, 571, 495, 4532, 1, 1, 1886.857421875, -6181.00341796875, 26.00834846496582031, 4.328419685363769531, 0, 0, -0.82903671264648437, 0.559194147586822509, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+65, 195256, 571, 495, 4000, 1, 1, 2021.9947509765625, -6214.67822265625, 7.750906944274902343, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Vengeance Landing - Difficulty: 0) CreateObject1 +(@OGUID+66, 195257, 571, 495, 4532, 1, 1, 1872.6788330078125, -6195.767578125, 26.33468437194824218, 5.777040958404541015, 0, 0, -0.25037956237792968, 0.968147754669189453, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+67, 195257, 571, 495, 4532, 1, 1, 1890.347900390625, -6204.115234375, 26.52462577819824218, 2.617989301681518554, 0, 0, 0.965925216674804687, 0.258821308612823486, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+68, 195266, 571, 495, 4532, 1, 1, 1881.4010009765625, -6201.0380859375, 33.84504318237304687, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+69, 195273, 571, 495, 4532, 1, 1, 1869.909912109375, -6225.537109375, 14.98772907257080078, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+70, 195266, 571, 495, 4532, 1, 1, 1872.57861328125, -6219.77392578125, 42.40207672119140625, 1.099556446075439453, 0, 0, 0.522498130798339843, 0.852640450000762939, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+71, 195259, 571, 495, 0, 1, 1, 1420.2181396484375, -3720.072998046875, 139.7719268798828125, 3.752462387084960937, 0, 0, -0.95371627807617187, 0.300707906484603881, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: 0 - Difficulty: 0) CreateObject1 +(@OGUID+72, 195256, 571, 495, 3998, 1, 1, 1351.6649169921875, -3457.366455078125, 175.92462158203125, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+73, 195256, 571, 495, 3998, 1, 1, 1400.15625, -3458.59033203125, 174.57183837890625, 2.234017848968505859, 0, 0, 0.898793220520019531, 0.438372820615768432, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+74, 195255, 571, 495, 3998, 1, 1, 1390.8802490234375, -3366.663330078125, 194.8545074462890625, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+75, 195255, 571, 495, 3998, 1, 1, 1350.9930419921875, -3356.947998046875, 196.8577423095703125, 1.343901276588439941, 0, 0, 0.622513771057128906, 0.78260880708694458, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+76, 195256, 571, 495, 3998, 1, 1, 1370.0364990234375, -3334.958251953125, 173.6849517822265625, 4.852017402648925781, 0, 0, -0.65605831146240234, 0.754710197448730468, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+77, 195256, 571, 495, 3998, 1, 1, 1394.3992919921875, -3307.069580078125, 166.7923126220703125, 1.902408957481384277, 0, 0, 0.814115524291992187, 0.580702960491180419, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+78, 195256, 571, 495, 3998, 1, 1, 1349.4683837890625, -3297.907470703125, 174.712890625, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+79, 195256, 571, 495, 3998, 1, 1, 1401.3507080078125, -3262.329345703125, 163.0069122314453125, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+80, 195256, 571, 495, 3998, 1, 1, 1341.441650390625, -3276.220947265625, 174.6176910400390625, 4.537858963012695312, 0, 0, -0.76604366302490234, 0.642788589000701904, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+81, 195266, 571, 495, 3998, 1, 1, 1425.03125, -3316.349365234375, 173.511322021484375, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+82, 195256, 571, 495, 3998, 1, 1, 1352.595947265625, -3284.4013671875, 174.7100830078125, 3.508116960525512695, 0, 0, -0.98325443267822265, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+83, 195257, 571, 495, 3998, 1, 1, 1438.02783203125, -3267.56591796875, 169.51300048828125, 5.637413978576660156, 0, 0, -0.31730461120605468, 0.948323667049407958, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+84, 195266, 571, 495, 3998, 1, 1, 1426.4947509765625, -3265.442626953125, 172.1591796875, 2.426007747650146484, 0, 0, 0.936672210693359375, 0.350207358598709106, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+85, 195264, 571, 495, 3998, 1, 1, 1422.9478759765625, -3265.15283203125, 165.6198883056640625, 4.328419685363769531, 0, 0, -0.82903671264648437, 0.559194147586822509, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+86, 195257, 571, 495, 3998, 1, 1, 1437.1353759765625, -3266.9150390625, 169.50579833984375, 2.391098499298095703, 0, 0, 0.930417060852050781, 0.366502493619918823, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+87, 195257, 571, 495, 3998, 1, 1, 1427.001708984375, -3268.350830078125, 169.1820831298828125, 5.70722818374633789, 0, 0, -0.28401470184326171, 0.958819925785064697, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+88, 195257, 571, 495, 3998, 1, 1, 1429.5816650390625, -3265.2744140625, 169.2191925048828125, 5.462882041931152343, 0, 0, -0.39874839782714843, 0.917060375213623046, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+89, 195266, 571, 495, 3998, 1, 1, 1428.7725830078125, -3274.498291015625, 181.041748046875, 4.014260292053222656, 0, 0, -0.90630722045898437, 0.422619491815567016, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+90, 195257, 571, 495, 3998, 1, 1, 1431.482666015625, -3274.532958984375, 169.1914825439453125, 1.047197580337524414, 0, 0, 0.5, 0.866025388240814208, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+91, 195273, 571, 495, 3998, 1, 1, 1421.9583740234375, -3261.317626953125, 175.985443115234375, 2.478367090225219726, 0, 0, 0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+92, 195256, 571, 495, 3998, 1, 1, 1435.888916015625, -3265.0625, 178.281341552734375, 0.139624491333961486, 0, 0, 0.06975555419921875, 0.997564136981964111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+93, 195264, 571, 495, 3998, 1, 1, 1425.6666259765625, -3261.8369140625, 165.59271240234375, 1.710421562194824218, 0, 0, 0.754709243774414062, 0.656059443950653076, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+94, 195260, 571, 495, 3998, 1, 1, 1457.2899169921875, -3270.154541015625, 173.5816192626953125, 5.567600727081298828, 0, 0, -0.35020732879638671, 0.936672210693359375, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+95, 195266, 571, 495, 3998, 1, 1, 1465.5989990234375, -3290.569580078125, 178.728485107421875, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+96, 195257, 571, 495, 3998, 1, 1, 1454.4930419921875, -3273.579833984375, 168.527313232421875, 2.408554315567016601, 0, 0, 0.933580398559570312, 0.358368009328842163, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+97, 195256, 571, 495, 3998, 1, 1, 1428.2559814453125, -3256.800048828125, 165.614959716796875, 2.199114561080932617, 0, 0, 0.8910064697265625, 0.453990638256072998, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+98, 195260, 571, 495, 3998, 1, 1, 1447.376708984375, -3267.913330078125, 179.70086669921875, 2.426007747650146484, 0, 0, 0.936672210693359375, 0.350207358598709106, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+99, 195260, 571, 495, 3998, 1, 1, 1445.7447509765625, -3269.810791015625, 179.7055511474609375, 2.373644113540649414, 0, 0, 0.927183151245117187, 0.37460830807685852, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+100, 195260, 571, 495, 3998, 1, 1, 1445.814208984375, -3264.553955078125, 168.4409942626953125, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+101, 195266, 571, 495, 3998, 1, 1, 1474.51806640625, -3279.563232421875, 178.9401397705078125, 0.820303261280059814, 0, 0, 0.398748397827148437, 0.917060375213623046, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+102, 195260, 571, 495, 3998, 1, 1, 1456.939208984375, -3279.14404296875, 173.58538818359375, 0.925023794174194335, 0, 0, 0.446197509765625, 0.894934535026550292, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+103, 195260, 571, 495, 3998, 1, 1, 1454.4375, -3273.76220703125, 173.581878662109375, 5.602506637573242187, 0, 0, -0.33380699157714843, 0.942641437053680419, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+104, 195260, 571, 495, 3998, 1, 1, 1458.5521240234375, -3277.08154296875, 173.58538818359375, 2.44346022605895996, 0, 0, 0.939692497253417968, 0.34202045202255249, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+105, 195260, 571, 495, 3998, 1, 1, 1447.826416015625, -3262.189208984375, 168.4409942626953125, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+106, 195266, 571, 495, 3998, 1, 1, 1431.548095703125, -3252.89404296875, 183.7872772216796875, 2.44346022605895996, 0, 0, 0.939692497253417968, 0.34202045202255249, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+107, 195264, 571, 495, 3998, 1, 1, 1432.4129638671875, -3253.822021484375, 166.5709686279296875, 5.288348197937011718, 0, 0, -0.4771585464477539, 0.878817260265350341, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+108, 195256, 571, 495, 3998, 1, 1, 1408.13037109375, -3251.247314453125, 162.0142974853515625, 3.78736734390258789, 0, 0, -0.94832324981689453, 0.317305892705917358, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+109, 195256, 571, 495, 3998, 1, 1, 1355.770751953125, -3193.905029296875, 162.8225250244140625, 2.024578809738159179, 0, 0, 0.848047256469726562, 0.529920578002929687, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+110, 195257, 571, 495, 3998, 1, 1, 1445.7396240234375, -3257.578125, 169.240325927734375, 4.014260292053222656, 0, 0, -0.90630722045898437, 0.422619491815567016, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+111, 195266, 571, 495, 3998, 1, 1, 1449.8897705078125, -3254.639404296875, 183.129852294921875, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+112, 195266, 571, 495, 3998, 1, 1, 1461.296630859375, -3264.23828125, 183.4601287841796875, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+113, 195256, 571, 495, 3998, 1, 1, 1371.2991943359375, -3185.6533203125, 162.822479248046875, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+114, 195256, 571, 495, 3998, 1, 1, 1458.7532958984375, -3200.10009765625, 165.5916900634765625, 3.054326534271240234, 0, 0, 0.999048233032226562, 0.043619260191917419, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+115, 195256, 571, 495, 3998, 1, 1, 1431.1324462890625, -3152.292236328125, 164.81585693359375, 3.560472726821899414, 0, 0, -0.97814750671386718, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+116, 195256, 571, 495, 3998, 1, 1, 1429.0374755859375, -3131.0703125, 167.7346038818359375, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+117, 195256, 571, 495, 3998, 1, 1, 1416.0601806640625, -3120.2861328125, 167.5702056884765625, 4.345870018005371093, 0, 0, -0.82412624359130859, 0.566406130790710449, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+118, 195256, 571, 495, 3998, 1, 1, 1389.0931396484375, -3096.109375, 167.4994659423828125, 3.700104713439941406, 0, 0, -0.96126079559326171, 0.275640487670898437, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Westguard Keep - Difficulty: 0) CreateObject1 +(@OGUID+119, 195256, 571, 495, 3988, 1, 1, 784.982666015625, -2956.30029296875, 8.627841949462890625, 4.171337604522705078, 0, 0, -0.87035560607910156, 0.492423713207244873, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+120, 195256, 571, 495, 3988, 1, 1, 807.62677001953125, -2945.673583984375, 6.90543985366821289, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+121, 195256, 571, 495, 3988, 1, 1, 811.69793701171875, -2925.720458984375, 7.491168022155761718, 3.473210096359252929, 0, 0, -0.98628520965576171, 0.165049895644187927, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+122, 195256, 571, 495, 3988, 1, 1, 786.56964111328125, -2895.315673828125, 7.33187723159790039, 2.652894020080566406, 0, 0, 0.970294952392578125, 0.241925001144409179, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+123, 195256, 571, 495, 3988, 1, 1, 765.16839599609375, -2962.79345703125, 9.955371856689453125, 6.021387100219726562, 0, 0, -0.13052558898925781, 0.991444945335388183, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+124, 195259, 571, 495, 3988, 1, 1, 789.05792236328125, -2887.321533203125, 6.061471939086914062, 4.276057243347167968, 0, 0, -0.84339141845703125, 0.537299633026123046, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+125, 195256, 571, 495, 3988, 1, 1, 728.25341796875, -2936.780029296875, 8.085320472717285156, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+126, 195259, 571, 495, 3988, 1, 1, 737.04168701171875, -2925.069580078125, 7.038447856903076171, 5.969027042388916015, 0, 0, -0.1564340591430664, 0.987688362598419189, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+127, 195256, 571, 495, 3988, 1, 1, 731.57293701171875, -2945.84375, 9.6584320068359375, 0.558503925800323486, 0, 0, 0.275636672973632812, 0.961261868476867675, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+128, 195256, 571, 495, 3988, 1, 1, 738.81585693359375, -2917.705810546875, 7.835750102996826171, 5.777040958404541015, 0, 0, -0.25037956237792968, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+129, 195256, 571, 495, 3988, 1, 1, 785.8663330078125, -2882.145751953125, 4.52708292007446289, 3.9793548583984375, 0, 0, -0.9135446548461914, 0.406738430261611938, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+130, 195256, 571, 495, 3988, 1, 1, 726.3077392578125, -2921.696044921875, 7.548036098480224609, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+131, 195259, 571, 495, 3988, 1, 1, 737.80206298828125, -2929.8369140625, 6.96212005615234375, 0.593410074710845947, 0, 0, 0.292370796203613281, 0.95630502700805664, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+132, 195256, 571, 495, 3988, 1, 1, 785.396484375, -2856.019287109375, 4.484004974365234375, 4.415683269500732421, 0, 0, -0.80385684967041015, 0.594822824001312255, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+133, 195256, 571, 495, 3988, 1, 1, 775.663818359375, -2854.297607421875, 4.683801174163818359, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+134, 195256, 571, 495, 3988, 1, 1, 708.98089599609375, -2939.20654296875, -3.25597691535949707, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+135, 195264, 571, 495, 3988, 1, 1, 701.36212158203125, -2933.382568359375, -3.06848502159118652, 0.523597896099090576, 0, 0, 0.258818626403808593, 0.965925931930541992, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+136, 195266, 571, 495, 3988, 1, 1, 713.49896240234375, -2931.3994140625, 2.87617802619934082, 0.139624491333961486, 0, 0, 0.06975555419921875, 0.997564136981964111, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+137, 195256, 571, 495, 3988, 1, 1, 706.6024169921875, -2924.741455078125, -3.16570091247558593, 3.996806621551513671, 0, 0, -0.90996074676513671, 0.414694398641586303, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+138, 195256, 571, 495, 3988, 1, 1, 733.01739501953125, -2896.645751953125, 7.161568164825439453, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+139, 195264, 571, 495, 3988, 1, 1, 701.6728515625, -2935.085205078125, -3.06848907470703125, 1.623155713081359863, 0, 0, 0.725374221801757812, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Kamagua - Difficulty: 0) CreateObject1 +(@OGUID+140, 195256, 571, 495, 3991, 1, 1, 403.79498291015625, -4652.39501953125, 243.967742919921875, 2.181660413742065429, 0, 0, 0.887010574340820312, 0.461749136447906494, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+141, 195256, 571, 495, 3991, 1, 1, 412.763092041015625, -4658.490234375, 246.6353302001953125, 0.349065244197845458, 0, 0, 0.173647880554199218, 0.984807789325714111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+142, 195266, 571, 495, 3991, 1, 1, 445.420135498046875, -4640.56103515625, 253.317840576171875, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+143, 195256, 571, 495, 3991, 1, 1, 493.69927978515625, -4605.00634765625, 243.6478118896484375, 3.316144466400146484, 0, 0, -0.99619388580322265, 0.087165042757987976, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+144, 195256, 571, 495, 3991, 1, 1, 446.30670166015625, -4559.88427734375, 245.503204345703125, 4.363324165344238281, 0, 0, -0.81915187835693359, 0.573576688766479492, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+145, 195273, 571, 495, 3991, 1, 1, 447.466217041015625, -4556.9453125, 252.1781463623046875, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+146, 195273, 571, 495, 3991, 1, 1, 442.438262939453125, -4552.8017578125, 249.541961669921875, 4.415683269500732421, 0, 0, -0.80385684967041015, 0.594822824001312255, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+147, 195257, 571, 495, 3991, 1, 1, 440.052093505859375, -4547.9130859375, 248.6341094970703125, 3.839725255966186523, 0, 0, -0.93969249725341796, 0.34202045202255249, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+148, 195257, 571, 495, 3991, 1, 1, 458.644866943359375, -4542.12353515625, 247.725830078125, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+149, 195273, 571, 495, 3991, 1, 1, 438.434295654296875, -4546.44677734375, 249.345184326171875, 3.001946926116943359, 0, 0, 0.997563362121582031, 0.069766148924827575, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+150, 195257, 571, 495, 3991, 1, 1, 441.81829833984375, -4550.703125, 248.5897979736328125, 3.577930212020874023, 0, 0, -0.97629547119140625, 0.216442063450813293, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+151, 195266, 571, 495, 3991, 1, 1, 465.8819580078125, -4545.6630859375, 251.8805694580078125, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+152, 195266, 571, 495, 3991, 1, 1, 463.704864501953125, -4534.5625, 254.9478607177734375, 3.717553615570068359, 0, 0, -0.95881938934326171, 0.284016460180282592, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+153, 195257, 571, 495, 3991, 1, 1, 455.163299560546875, -4536.6796875, 247.5673370361328125, 3.857182979583740234, 0, 0, -0.93667125701904296, 0.350209832191467285, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+154, 195273, 571, 495, 3991, 1, 1, 437.384185791015625, -4539.97119140625, 252.37353515625, 3.054326534271240234, 0, 0, 0.999048233032226562, 0.043619260191917419, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+155, 195266, 571, 495, 3991, 1, 1, 454.9619140625, -4528.65185546875, 251.8440704345703125, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+156, 195256, 571, 495, 3991, 1, 1, 434.159942626953125, -4539.46826171875, 245.803192138671875, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+157, 195256, 571, 495, 3991, 1, 1, 404.2421875, -4538.7001953125, 245.8211212158203125, 3.769911527633666992, 0, 0, -0.95105648040771484, 0.309017121791839599, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+158, 195256, 571, 495, 3991, 1, 1, 400.006561279296875, -4535.0859375, 246.1531829833984375, 4.258606910705566406, 0, 0, -0.84804725646972656, 0.529920578002929687, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+159, 195273, 571, 495, 3991, 1, 1, 481.2320556640625, -4523.52294921875, 260.99676513671875, 3.700104713439941406, 0, 0, -0.96126079559326171, 0.275640487670898437, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+160, 195266, 571, 495, 3991, 1, 1, 486.494781494140625, -4520.140625, 239.765869140625, 3.735006093978881835, 0, 0, -0.95630455017089843, 0.292372345924377441, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: New Agamand - Difficulty: 0) CreateObject1 +(@OGUID+161, 195260, 571, 495, 3997, 1, 1, 492.902740478515625, -5928.03076171875, 309.63958740234375, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+162, 195264, 571, 495, 3997, 1, 1, 491.8101806640625, -5927.2802734375, 309.67877197265625, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+163, 195256, 571, 495, 3997, 1, 1, 493.364593505859375, -5904.35595703125, 308.904937744140625, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+164, 195256, 571, 495, 3997, 1, 1, 469.700531005859375, -5927.3427734375, 308.720245361328125, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+165, 195256, 571, 495, 3997, 1, 1, 499.0128173828125, -5932.87744140625, 308.70391845703125, 2.687806606292724609, 0, 0, 0.974370002746582031, 0.224951311945915222, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+166, 195264, 571, 495, 3997, 1, 1, 491.35296630859375, -5933.67138671875, 310.585845947265625, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+167, 195260, 571, 495, 3997, 1, 1, 490.626617431640625, -5934.06298828125, 309.60113525390625, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+168, 195256, 571, 495, 3980, 1, 1, 604.16217041015625, -5108.1396484375, 4.842274188995361328, 1.623155713081359863, 0, 0, 0.725374221801757812, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Daggercap Bay - Difficulty: 0) CreateObject1 +(@OGUID+169, 195256, 571, 495, 3980, 1, 1, 575.376953125, -5101.06884765625, 5.191133975982666015, 0.698131442070007324, 0, 0, 0.342020034790039062, 0.939692676067352294, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Daggercap Bay - Difficulty: 0) CreateObject1 +(@OGUID+170, 195266, 571, 495, 3980, 1, 1, 548.75616455078125, -5021.97314453125, 17.4747467041015625, 1.745326757431030273, 0, 0, 0.766043663024902343, 0.642788589000701904, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Daggercap Bay - Difficulty: 0) CreateObject1 +(@OGUID+171, 195256, 571, 495, 3980, 1, 1, 563.8280029296875, -5017.78271484375, 11.59004878997802734, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Daggercap Bay - Difficulty: 0) CreateObject1 +(@OGUID+172, 195256, 571, 495, 3980, 1, 1, 569.19403076171875, -5003.27001953125, 11.09979629516601562, 2.949595451354980468, 0, 0, 0.995395660400390625, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Daggercap Bay - Difficulty: 0) CreateObject1 +(@OGUID+173, 195266, 571, 495, 3980, 1, 1, 597.41204833984375, -5011.13818359375, 9.712256431579589843, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Daggercap Bay - Difficulty: 0) CreateObject1 +(@OGUID+174, 195256, 571, 495, 3980, 1, 1, 641.049072265625, -5019.35498046875, 4.459393024444580078, 3.211419343948364257, 0, 0, -0.9993906021118164, 0.034906134009361267, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Daggercap Bay - Difficulty: 0) CreateObject1 +(@OGUID+175, 195256, 571, 495, 3981, 1, 1, 540.11920166015625, -4999.92041015625, 10.53384208679199218, 4.782202720642089843, 0, 0, -0.68199825286865234, 0.731353819370269775, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+176, 195266, 571, 495, 3981, 1, 1, 639.2745361328125, -5012.3408203125, 11.1266031265258789, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+177, 195256, 571, 495, 3981, 1, 1, 577.20660400390625, -4954.4150390625, 18.21570014953613281, 3.106652259826660156, 0, 0, 0.999847412109375, 0.017469281330704689, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+178, 195273, 571, 495, 3981, 1, 1, 592.29864501953125, -4952.79345703125, 23.01476669311523437, 5.567600727081298828, 0, 0, -0.35020732879638671, 0.936672210693359375, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+179, 195266, 571, 495, 3981, 1, 1, 587.5086669921875, -4945.892578125, 32.499114990234375, 4.886923789978027343, 0, 0, -0.64278697967529296, 0.766044974327087402, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+180, 195273, 571, 495, 3981, 1, 1, 585.97393798828125, -4954.36474609375, 22.95369911193847656, 4.310965538024902343, 0, 0, -0.83388519287109375, 0.55193793773651123, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+181, 195257, 571, 495, 3981, 1, 1, 587.33953857421875, -4934.3564453125, 20.82388496398925781, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+182, 195273, 571, 495, 3981, 1, 1, 572.94793701171875, -4943.798828125, 27.16759872436523437, 3.473210096359252929, 0, 0, -0.98628520965576171, 0.165049895644187927, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+183, 195260, 571, 495, 3981, 1, 1, 593.67724609375, -4929.41357421875, 31.07939338684082031, 3.351046562194824218, 0, 0, -0.99452114105224609, 0.104535527527332305, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+184, 195260, 571, 495, 3981, 1, 1, 582.01080322265625, -4933.2568359375, 31.07901382446289062, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+185, 195257, 571, 495, 3981, 1, 1, 581.4718017578125, -4943.68310546875, 20.6307525634765625, 0.383971005678176879, 0, 0, 0.190808296203613281, 0.981627285480499267, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+186, 195256, 571, 495, 3981, 1, 1, 569.71356201171875, -4931.642578125, 17.79272079467773437, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+187, 195257, 571, 495, 3981, 1, 1, 586.26324462890625, -4934.662109375, 20.74441337585449218, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+188, 195260, 571, 495, 3981, 1, 1, 589.42169189453125, -4926.30126953125, 19.81484222412109375, 3.368495941162109375, 0, 0, -0.99357128143310546, 0.113208353519439697, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+189, 195266, 571, 495, 3981, 1, 1, 578.79864501953125, -4942.296875, 23.31464767456054687, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+190, 195256, 571, 495, 3981, 1, 1, 584.046142578125, -4934.74365234375, 29.65518951416015625, 1.029743075370788574, 0, 0, 0.492423057556152343, 0.870355963706970214, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+191, 195257, 571, 495, 3981, 1, 1, 580.5125732421875, -4939.84228515625, 20.76777458190917968, 0.209439441561698913, 0, 0, 0.104528427124023437, 0.994521915912628173, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+192, 195260, 571, 495, 3981, 1, 1, 600.79669189453125, -4920.2919921875, 24.95571327209472656, 3.368495941162109375, 0, 0, -0.99357128143310546, 0.113208353519439697, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+193, 195260, 571, 495, 3981, 1, 1, 588.70184326171875, -4923.255859375, 19.81484222412109375, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+194, 195260, 571, 495, 3981, 1, 1, 606.9359130859375, -4923.4345703125, 24.95921707153320312, 1.919861555099487304, 0, 0, 0.819151878356933593, 0.573576688766479492, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+195, 195260, 571, 495, 3981, 1, 1, 601.9345703125, -4924.68603515625, 24.95571327209472656, 1.745326757431030273, 0, 0, 0.766043663024902343, 0.642788589000701904, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+196, 195260, 571, 495, 3981, 1, 1, 607.8848876953125, -4925.90478515625, 24.95921707153320312, 3.298687219619750976, 0, 0, -0.99691677093505859, 0.078466430306434631, 120, 255, 1, 0); -- Standing, Interior, Small - Brewfest (Area: Valgarde - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+196 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+196; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_13_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_13_00_world.sql new file mode 100644 index 00000000000..efcba6395a1 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_13_00_world.sql @@ -0,0 +1,135 @@ +-- +SET @OGUID := 93532; -- Need 126 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+125; +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 +(@OGUID+0, 195256, 530, 3520, 3744, 1, 1, -3052.810546875, 2481.651123046875, 66.6568756103515625, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+1, 195253, 530, 3520, 3744, 1, 1, -3097.6240234375, 2522.84716796875, 75.95374298095703125, 2.44346022605895996, 0, 0, 0.939692497253417968, 0.34202045202255249, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+2, 195253, 530, 3520, 3744, 1, 1, -3081.949951171875, 2509.12744140625, 75.9600982666015625, 5.585053920745849609, 0, 0, -0.34202003479003906, 0.939692676067352294, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+3, 195253, 530, 3520, 3744, 1, 1, -3092.005126953125, 2502.067626953125, 76.35167694091796875, 4.555310726165771484, 0, 0, -0.76040554046630859, 0.649448513984680175, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+4, 195253, 530, 3520, 3744, 1, 1, -3099.529296875, 2512.387451171875, 75.96468353271484375, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+5, 195253, 530, 3520, 3744, 1, 1, -3080.0166015625, 2519.665771484375, 75.95195770263671875, 0.349065244197845458, 0, 0, 0.173647880554199218, 0.984807789325714111, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+6, 195253, 530, 3520, 3744, 1, 1, -3088.04736328125, 2526.279541015625, 75.95489501953125, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+7, 195259, 530, 3520, 3744, 1, 1, -3012.2177734375, 2548.628173828125, 79.439208984375, 1.500982880592346191, 0, 0, 0.681998252868652343, 0.731353819370269775, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+8, 195256, 530, 3520, 3744, 1, 1, -3107.00341796875, 2545.11376953125, 62.05596923828125, 1.029743075370788574, 0, 0, 0.492423057556152343, 0.870355963706970214, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+9, 195256, 530, 3520, 3744, 1, 1, -3006.597900390625, 2549.3125, 78.11643218994140625, 2.129300594329833984, 0, 0, 0.874619483947753906, 0.484810054302215576, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+10, 195256, 530, 3520, 3744, 1, 1, -3065.579345703125, 2555.546875, 65.7581634521484375, 3.752462387084960937, 0, 0, -0.95371627807617187, 0.300707906484603881, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+11, 195273, 530, 3520, 3744, 1, 1, -3124.81884765625, 2572.86279296875, 66.77591705322265625, 2.949595451354980468, 0, 0, 0.995395660400390625, 0.095851235091686248, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+12, 195256, 530, 3520, 3744, 1, 1, -3104.676513671875, 2582.694580078125, 61.97699737548828125, 4.642575740814208984, 0, 0, -0.731353759765625, 0.681998312473297119, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+13, 195259, 530, 3520, 3744, 1, 1, -3026.7685546875, 2565.997802734375, 80.07525634765625, 0.139624491333961486, 0, 0, 0.06975555419921875, 0.997564136981964111, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+14, 195256, 530, 3520, 3744, 1, 1, -2979.335205078125, 2554.049072265625, 76.5433502197265625, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+15, 195253, 530, 3520, 3744, 1, 1, -2978.6533203125, 2545.870361328125, 97.51944732666015625, 3.78736734390258789, 0, 0, -0.94832324981689453, 0.317305892705917358, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+16, 195256, 530, 3520, 3744, 1, 1, -2986.574462890625, 2565.178466796875, 76.5433502197265625, 2.600535154342651367, 0, 0, 0.963629722595214843, 0.26724100112915039, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+17, 195273, 530, 3520, 3744, 1, 1, -2982.045654296875, 2563.971923828125, 79.34058380126953125, 2.897245407104492187, 0, 0, 0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+18, 195273, 530, 3520, 3744, 1, 1, -3123.6474609375, 2558.356689453125, 67.05743408203125, 3.106652259826660156, 0, 0, 0.999847412109375, 0.017469281330704689, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+19, 195256, 530, 3520, 3744, 1, 1, -3081.04248046875, 2598.579345703125, 61.7496337890625, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+20, 195253, 530, 3520, 3744, 1, 1, -2980.73779296875, 2565.907958984375, 97.976104736328125, 2.70525527000427246, 0, 0, 0.97629547119140625, 0.216442063450813293, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+21, 195266, 530, 3520, 3744, 1, 1, -3022.693603515625, 2624.56494140625, 85.78185272216796875, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+22, 195259, 530, 3520, 3744, 1, 1, -2979.819091796875, 2565.840087890625, 79.8294525146484375, 5.829400539398193359, 0, 0, -0.22495079040527343, 0.974370121955871582, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+23, 195273, 530, 3520, 3744, 1, 1, -3020.8701171875, 2621.105712890625, 81.12374114990234375, 2.827429771423339843, 0, 0, 0.987688064575195312, 0.156436234712600708, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+24, 195273, 530, 3520, 3744, 1, 1, -3026.05517578125, 2626.85986328125, 81.1064300537109375, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+25, 195266, 530, 3520, 3744, 1, 1, -2972.56494140625, 2562.6748046875, 83.66947174072265625, 5.829400539398193359, 0, 0, -0.22495079040527343, 0.974370121955871582, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+26, 195255, 530, 3520, 3744, 1, 1, -2969.581787109375, 2560.9619140625, 107.1340179443359375, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+27, 195256, 530, 3520, 3744, 1, 1, -3031.268798828125, 2631.005859375, 76.5433502197265625, 4.48549652099609375, 0, 0, -0.7826080322265625, 0.622514784336090087, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+28, 195253, 530, 3520, 3744, 1, 1, -2963.10595703125, 2578.467041015625, 97.77729034423828125, 1.658061861991882324, 0, 0, 0.737277030944824218, 0.67559051513671875, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+29, 195256, 530, 3520, 3744, 1, 1, -2970.73095703125, 2573.00341796875, 76.5433502197265625, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+30, 195257, 530, 3520, 3744, 1, 1, -2963.262451171875, 2557.669189453125, 96.9534759521484375, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+31, 195259, 530, 3520, 3744, 1, 1, -2963.2314453125, 2558.7470703125, 80.31774139404296875, 2.617989301681518554, 0, 0, 0.965925216674804687, 0.258821308612823486, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+32, 195257, 530, 3520, 3744, 1, 1, -2961.015380859375, 2557.951416015625, 93.8766632080078125, 6.213373661041259765, 0, 0, -0.03489875793457031, 0.999390840530395507, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+33, 195257, 530, 3520, 3744, 1, 1, -2954.9580078125, 2567.07763671875, 81.00614166259765625, 3.822272777557373046, 0, 0, -0.94264125823974609, 0.333807557821273803, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+34, 195260, 530, 3520, 3744, 1, 1, -2955.542236328125, 2564.842041015625, 79.5325775146484375, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+35, 195260, 530, 3520, 3744, 1, 1, -2954.606689453125, 2547.318359375, 92.7652587890625, 0, 0, 0, 0, 1, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+36, 195264, 530, 3520, 3744, 1, 1, -2955.876708984375, 2547.72314453125, 92.740325927734375, 3.647741317749023437, 0, 0, -0.96814727783203125, 0.250381410121917724, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+37, 195266, 530, 3520, 3744, 1, 1, -2955.604736328125, 2554.495361328125, 110.3285293579101562, 5.84685373306274414, 0, 0, -0.21643924713134765, 0.976296067237854003, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+38, 195253, 530, 3520, 3744, 1, 1, -2944.712158203125, 2569.651123046875, 97.11517333984375, 0.610863447189331054, 0, 0, 0.3007049560546875, 0.953717231750488281, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+39, 195264, 530, 3520, 3744, 1, 1, -2956.9921875, 2566.442626953125, 79.3311920166015625, 4.136432647705078125, 0, 0, -0.87881660461425781, 0.477159708738327026, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+40, 195256, 530, 3520, 3744, 1, 1, -2932.841552734375, 2657.233154296875, 94.24631500244140625, 4.502951622009277343, 0, 0, -0.7771453857421875, 0.629321098327636718, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+41, 195257, 530, 3520, 3744, 1, 1, -2961.58154296875, 2546.88134765625, 79.9313201904296875, 1.692969322204589843, 0, 0, 0.748955726623535156, 0.662620067596435546, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+42, 195256, 530, 3520, 3744, 1, 1, -2956.543701171875, 2554.591552734375, 126.6190719604492187, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+43, 195253, 530, 3520, 3744, 1, 1, -2960.053955078125, 2536.85107421875, 96.7497406005859375, 4.817109584808349609, 0, 0, -0.66913032531738281, 0.74314504861831665, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+44, 195253, 530, 3520, 3744, 1, 1, -2943.146484375, 2549.089111328125, 96.6855316162109375, 5.84685373306274414, 0, 0, -0.21643924713134765, 0.976296067237854003, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+45, 195266, 530, 3520, 3744, 1, 1, -2927.349853515625, 2650.86083984375, 100.1286468505859375, 3.822272777557373046, 0, 0, -0.94264125823974609, 0.333807557821273803, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+46, 195256, 530, 3520, 3744, 1, 1, -2921.616943359375, 2644.62451171875, 94.40192413330078125, 3.351046562194824218, 0, 0, -0.99452114105224609, 0.104535527527332305, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Shadowmoon Village - Difficulty: 0) CreateObject1 +(@OGUID+47, 195264, 530, 3520, 3745, 1, 1, -4082.78125, 2168.835205078125, 112.272796630859375, 6.178466320037841796, 0, 0, -0.05233573913574218, 0.998629570007324218, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+48, 195257, 530, 3520, 3745, 1, 1, -4076.149658203125, 2162.083740234375, 111.4253463745117187, 1.605701684951782226, 0, 0, 0.719339370727539062, 0.694658815860748291, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+49, 195253, 530, 3520, 3745, 1, 1, -4063.404541015625, 2159.092041015625, 117.938629150390625, 4.729844093322753906, 0, 0, -0.70090866088867187, 0.713251054286956787, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+50, 195257, 530, 3520, 3745, 1, 1, -4072.6220703125, 2162.17578125, 111.429656982421875, 1.658061861991882324, 0, 0, 0.737277030944824218, 0.67559051513671875, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+51, 195257, 530, 3520, 3745, 1, 1, -4074.34716796875, 2162.1298828125, 111.4437026977539062, 1.535889506340026855, 0, 0, 0.694658279418945312, 0.719339847564697265, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+52, 195260, 530, 3520, 3745, 1, 1, -4050.7421875, 2163.79638671875, 111.68609619140625, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+53, 195260, 530, 3520, 3745, 1, 1, -4052.369384765625, 2168.781982421875, 111.6152267456054687, 0.034906249493360519, 0, 0, 0.017452239990234375, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+54, 195259, 530, 3520, 3745, 1, 1, -4069.704345703125, 2183.112060546875, 108.5346221923828125, 3.298687219619750976, 0, 0, -0.99691677093505859, 0.078466430306434631, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+55, 195260, 530, 3520, 3745, 1, 1, -4073.99267578125, 2183.056396484375, 108.3961029052734375, 0.401424884796142578, 0, 0, 0.199367523193359375, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+56, 195253, 530, 3520, 3745, 1, 1, -4053.135498046875, 2167.243408203125, 117.8958206176757812, 0.017452461645007133, 0, 0, 0.008726119995117187, 0.999961912631988525, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+57, 195253, 530, 3520, 3745, 1, 1, -4063.2900390625, 2183.958251953125, 117.9620437622070312, 0.034906249493360519, 0, 0, 0.017452239990234375, 0.999847710132598876, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+58, 195264, 530, 3520, 3745, 1, 1, -4082.23486328125, 2188.566162109375, 108.3726119995117187, 0.767943859100341796, 0, 0, 0.374606132507324218, 0.927184045314788818, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+59, 195263, 530, 3520, 3745, 1, 1, -4063.59716796875, 2172.936767578125, 112.3214263916015625, 0.104719325900077819, 0, 0, 0.052335739135742187, 0.998629570007324218, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+60, 195264, 530, 3520, 3745, 1, 1, -4052.1689453125, 2163.6630859375, 111.6860733032226562, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+61, 195259, 530, 3520, 3745, 1, 1, -4075.490478515625, 2189.596923828125, 111.4620437622070312, 4.764749526977539062, 0, 0, -0.6883544921875, 0.725374460220336914, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+62, 195266, 530, 3520, 3745, 1, 1, -4058.76220703125, 2175.68505859375, 117.8551864624023437, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+63, 195260, 530, 3520, 3745, 1, 1, -4082.025634765625, 2186.263671875, 108.372711181640625, 6.265733242034912109, 0, 0, -0.00872611999511718, 0.999961912631988525, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+64, 195264, 530, 3520, 3745, 1, 1, -4051.087158203125, 2170.192626953125, 111.6160202026367187, 2.338739633560180664, 0, 0, 0.920504570007324218, 0.3907318115234375, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+65, 195256, 530, 3520, 3745, 1, 1, -4062.358642578125, 2190.830322265625, 109.8542861938476562, 5.602506637573242187, 0, 0, -0.33380699157714843, 0.942641437053680419, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+66, 195264, 530, 3520, 3745, 1, 1, -3976.319580078125, 2143.522705078125, 105.8609390258789062, 5.881760597229003906, 0, 0, -0.19936752319335937, 0.979924798011779785, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+67, 195256, 530, 3520, 3745, 1, 1, -4008.3447265625, 2172.324951171875, 105.0965194702148437, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+68, 195266, 530, 3520, 3745, 1, 1, -4010.3671875, 2155.552001953125, 109.9921112060546875, 1.064649581909179687, 0, 0, 0.507537841796875, 0.861629426479339599, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+69, 195260, 530, 3520, 3745, 1, 1, -3977.75, 2144.866455078125, 105.8776626586914062, 1.954769015312194824, 0, 0, 0.829037666320800781, 0.559192776679992675, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+70, 195256, 530, 3520, 3745, 1, 1, -3981.39501953125, 2150.5869140625, 105.0282135009765625, 2.600535154342651367, 0, 0, 0.963629722595214843, 0.26724100112915039, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+71, 195256, 530, 3520, 3745, 1, 1, -3984.70361328125, 2162.161865234375, 105.4418182373046875, 4.380776405334472656, 0, 0, -0.81411552429199218, 0.580702960491180419, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+72, 195255, 530, 3520, 3745, 1, 1, -3923.835205078125, 2072.3330078125, 100.5962066650390625, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+73, 195255, 530, 3520, 3745, 1, 1, -3922.776611328125, 2062.048583984375, 100.12078857421875, 4.939284324645996093, 0, 0, -0.6225137710571289, 0.78260880708694458, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+74, 195255, 530, 3520, 3745, 1, 1, -3891.201416015625, 2089.9423828125, 100.371063232421875, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+75, 195256, 530, 3520, 3745, 1, 1, -3930.80908203125, 2115.1484375, 96.81003570556640625, 3.508116960525512695, 0, 0, -0.98325443267822265, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+76, 195255, 530, 3520, 3745, 1, 1, -3882.01171875, 2085.140625, 99.7375030517578125, 5.759587764739990234, 0, 0, -0.25881862640380859, 0.965925931930541992, 120, 255, 1, 0), -- Hanging, Tall/Thin, Large - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+77, 195256, 530, 3520, 3745, 1, 1, -3948.71875, 2165.37548828125, 100.8409271240234375, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+78, 195253, 530, 3520, 3745, 1, 1, -3956.79345703125, 2241.56689453125, 107.9687118530273437, 4.572763919830322265, 0, 0, -0.75470924377441406, 0.656059443950653076, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+79, 195259, 530, 3520, 3745, 1, 1, -3977.41015625, 2165.697998046875, 106.9871063232421875, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+80, 195256, 530, 3520, 3745, 1, 1, -3966.46533203125, 2185.426025390625, 101.895050048828125, 1.692969322204589843, 0, 0, 0.748955726623535156, 0.662620067596435546, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+81, 195256, 530, 3520, 3745, 1, 1, -4026.630126953125, 2188.57958984375, 109.117340087890625, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+82, 195256, 530, 3520, 3745, 1, 1, -4035.944091796875, 2238.972900390625, 112.2723388671875, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+83, 195253, 530, 3520, 3745, 1, 1, -4044.76513671875, 2237.18359375, 118.0772323608398437, 5.515241622924804687, 0, 0, -0.37460613250732421, 0.927184045314788818, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+84, 195256, 530, 3520, 3745, 1, 1, -4047.15625, 2228.052734375, 112.0462265014648437, 5.95157480239868164, 0, 0, -0.16504669189453125, 0.986285746097564697, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Wildhammer Stronghold - Difficulty: 0) CreateObject1 +(@OGUID+85, 195273, 530, 3520, 3938, 1, 1, -4120.05859375, 1134.972900390625, 47.51078414916992187, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+86, 195256, 530, 3520, 3938, 1, 1, -4130.572265625, 1173.3890380859375, 49.58153533935546875, 5.777040958404541015, 0, 0, -0.25037956237792968, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+87, 195256, 530, 3520, 3938, 1, 1, -4135.37353515625, 1128.6754150390625, 54.5828857421875, 4.223697185516357421, 0, 0, -0.85716724395751953, 0.515038192272186279, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+88, 195260, 530, 3520, 3938, 1, 1, -4141.9140625, 1121.7178955078125, 45.45482635498046875, 0.959929943084716796, 0, 0, 0.461748123168945312, 0.887011110782623291, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+89, 195253, 530, 3520, 3938, 1, 1, -4114.49462890625, 1119.6181640625, 52.3812408447265625, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+90, 195264, 530, 3520, 3938, 1, 1, -4143.16162109375, 1122.7239990234375, 45.38457107543945312, 4.328419685363769531, 0, 0, -0.82903671264648437, 0.559194147586822509, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+91, 195256, 530, 3520, 3938, 1, 1, -4084.19482421875, 1138.9263916015625, 44.43297576904296875, 4.537858963012695312, 0, 0, -0.76604366302490234, 0.642788589000701904, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+92, 195256, 530, 3520, 3938, 1, 1, -4114.81884765625, 1116.676513671875, 44.5312652587890625, 0.174532130360603332, 0, 0, 0.087155342102050781, 0.996194720268249511, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+93, 195256, 530, 3520, 3938, 1, 1, -4088.48828125, 1139.845703125, 44.42666244506835937, 4.572763919830322265, 0, 0, -0.75470924377441406, 0.656059443950653076, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+94, 195264, 530, 3520, 3938, 1, 1, -4140.7392578125, 1120.9261474609375, 45.42783737182617187, 5.148722648620605468, 0, 0, -0.53729915618896484, 0.843391716480255126, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+95, 195273, 530, 3520, 3938, 1, 1, -4130.57666015625, 1117.59765625, 46.677337646484375, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+96, 195256, 530, 3520, 3938, 1, 1, -4112.09619140625, 1121.5782470703125, 44.54679107666015625, 5.288348197937011718, 0, 0, -0.4771585464477539, 0.878817260265350341, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+97, 195256, 530, 3520, 3938, 1, 1, -4065.079833984375, 1138.2952880859375, 43.17560195922851562, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+98, 195259, 530, 3520, 3938, 1, 1, -4064.587646484375, 1124.2447509765625, 43.41815567016601562, 2.44346022605895996, 0, 0, 0.939692497253417968, 0.34202045202255249, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+99, 195256, 530, 3520, 3938, 1, 1, -4062.444091796875, 1135.4744873046875, 43.182769775390625, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sanctum of the Stars - Difficulty: 0) CreateObject1 +(@OGUID+100, 195256, 530, 3520, 3754, 1, 1, -3061.826904296875, 853.1981201171875, -11.372446060180664, 4.066620349884033203, 0, 0, -0.89493370056152343, 0.44619917869567871, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+101, 195256, 530, 3520, 3754, 1, 1, -3080.7724609375, 825.7005615234375, -11.3570261001586914, 1.029743075370788574, 0, 0, 0.492423057556152343, 0.870355963706970214, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+102, 195256, 530, 3520, 3754, 1, 1, -3055.613525390625, 812.4754638671875, -9.50643634796142578, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+103, 195256, 530, 3520, 3754, 1, 1, -3075.423828125, 858.77508544921875, -20.02081298828125, 3.298687219619750976, 0, 0, -0.99691677093505859, 0.078466430306434631, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+104, 195256, 530, 3520, 3754, 1, 1, -3089.802490234375, 837.77227783203125, -19.9238052368164062, 1.867502212524414062, 0, 0, 0.803856849670410156, 0.594822824001312255, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+105, 195256, 530, 3520, 3754, 1, 1, -3079.41455078125, 748.1234130859375, -10.3399553298950195, 6.248279094696044921, 0, 0, -0.01745223999023437, 0.999847710132598876, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+106, 195256, 530, 3520, 3754, 1, 1, -3041.075439453125, 832.12030029296875, -9.4848947525024414, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+107, 195256, 530, 3520, 3754, 1, 1, -3028.215087890625, 823.3272705078125, -9.54635906219482421, 3.45575571060180664, 0, 0, -0.98768806457519531, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+108, 195256, 530, 3520, 3754, 1, 1, -3040.775146484375, 806.68359375, -9.70629119873046875, 1.692969322204589843, 0, 0, 0.748955726623535156, 0.662620067596435546, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+109, 195263, 530, 3520, 3754, 1, 1, -3006.30908203125, 859.59552001953125, -5.97701120376586914, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+110, 195253, 530, 3520, 3754, 1, 1, -3006.022705078125, 795.25811767578125, -1.8910219669342041, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+111, 195256, 530, 3520, 3754, 1, 1, -3016.65771484375, 795.047607421875, -9.91684436798095703, 2.129300594329833984, 0, 0, 0.874619483947753906, 0.484810054302215576, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+112, 195256, 530, 3520, 3754, 1, 1, -3009.98681640625, 803.83917236328125, -10.395700454711914, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+113, 195256, 530, 3520, 3754, 1, 1, -3007.626220703125, 853.58880615234375, -10.4860382080078125, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+114, 195256, 530, 3520, 3754, 1, 1, -3012.275146484375, 861.4300537109375, -10.4898605346679687, 4.014260292053222656, 0, 0, -0.90630722045898437, 0.422619491815567016, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+115, 195260, 530, 3520, 3754, 1, 1, -2979.788330078125, 854.04339599609375, -6.90769720077514648, 1.186823248863220214, 0, 0, 0.559192657470703125, 0.829037725925445556, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+116, 195260, 530, 3520, 3754, 1, 1, -2981.595458984375, 858.29339599609375, -6.68239784240722656, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+117, 195264, 530, 3520, 3754, 1, 1, -2980.90283203125, 856.31597900390625, -6.71913814544677734, 4.555310726165771484, 0, 0, -0.76040554046630859, 0.649448513984680175, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+118, 195256, 530, 3520, 3754, 1, 1, -3010.563232421875, 770.08599853515625, -6.93308401107788085, 0.890116631984710693, 0, 0, 0.430510520935058593, 0.902585566043853759, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+119, 195256, 530, 3520, 3754, 1, 1, -2983.507080078125, 869.46856689453125, -7.47986507415771484, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+120, 195256, 530, 3520, 3754, 1, 1, -2983.704833984375, 809.15484619140625, -6.90789985656738281, 4.066620349884033203, 0, 0, -0.89493370056152343, 0.44619917869567871, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+121, 195257, 530, 3520, 3754, 1, 1, -2979.53515625, 851.0223388671875, -5.23691987991333007, 1.658061861991882324, 0, 0, 0.737277030944824218, 0.67559051513671875, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+122, 195257, 530, 3520, 3754, 1, 1, -2974.166015625, 852.98956298828125, -5.18410921096801757, 1.884953022003173828, 0, 0, 0.809016227722167968, 0.587786316871643066, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+123, 195259, 530, 3520, 3754, 1, 1, -3061.328125, 737.1944580078125, -8.77170085906982421, 1.448621988296508789, 0, 0, 0.662619590759277343, 0.748956084251403808, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+124, 195260, 530, 3520, 3754, 1, 1, -2970.28466796875, 860.4757080078125, -6.32565212249755859, 2.583080768585205078, 0, 0, 0.961260795593261718, 0.275640487670898437, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 +(@OGUID+125, 195264, 530, 3520, 3754, 1, 1, -2970.079833984375, 861.28125, -6.31812810897827148, 2.286378860473632812, 0, 0, 0.909960746765136718, 0.414694398641586303, 120, 255, 1, 0); -- Standing, Interior, Medium - Brewfest (Area: Altar of Sha'tar - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+125 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+125; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_14_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_14_00_world.sql new file mode 100644 index 00000000000..d39d0ec5a63 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_14_00_world.sql @@ -0,0 +1,6 @@ +-- Cloth Scavenging - Dalaran (13272) +UPDATE `quest_offer_reward` SET `RewardText`="I think you will find this skill helps you a great deal on your path to tailoring greatness!" WHERE `ID`=13272; +-- Cloth Scavenging - Valiance Keep (13265) +UPDATE `quest_offer_reward` SET `RewardText`="Turn that extra cloth you find into something that looks marvelous!" WHERE `ID`=13265; +-- Cloth Scavenging - Warsong Hold (13270) +UPDATE `quest_offer_reward` SET `RewardText`="I be appreciatin' your business." WHERE `ID`=13270; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_14_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_14_01_world.sql new file mode 100644 index 00000000000..909de3ebdb1 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_14_01_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template_movement` SET `Swim`=0, `Rooted`=1 WHERE `CreatureId`=27987; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_18_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_18_00_world.sql new file mode 100644 index 00000000000..2f938cc0855 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_18_00_world.sql @@ -0,0 +1,2 @@ +-- Firemane Flamecaller +UPDATE `creature` SET `position_x`=-4964.78955078125, `position_y`=-3821.1826171875, `position_z`=43.62102127075195312, `orientation`=2.776098012924194335, `wander_distance`=5, `MovementType`=1 WHERE `guid`=30504; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_20_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_20_00_world.sql new file mode 100644 index 00000000000..dcec2e975e5 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_20_00_world.sql @@ -0,0 +1,2 @@ +-- they only have one gender and it seems DisplayID_Other_Gender will be dropped in the future +UPDATE `creature_model_info` SET `DisplayID_Other_Gender`=0 WHERE `DisplayID` IN (18566,18567,18568,18569); diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_20_01_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_20_01_world.sql new file mode 100644 index 00000000000..ba85644e89c --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_20_01_world.sql @@ -0,0 +1,2 @@ +-- Death Knights shoud start with Journeyman Riding (150) +UPDATE `playercreateinfo_skills` SET `rank`=2 WHERE `raceMask`=0 AND `classMask`=32 AND `skill`=762; diff --git a/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_22_00_world.sql b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_22_00_world.sql new file mode 100644 index 00000000000..1e516578e94 --- /dev/null +++ b/sql/old/3.3.5a/world/24081_2024_11_22/2024_11_22_00_world.sql @@ -0,0 +1,2 @@ +-- Pit of Saron: Set Tyrannus as vehicle minion +UPDATE `vehicle_template_accessory` SET `minion`=1 WHERE `entry`=36794; diff --git a/sql/updates/auth/3.3.5/2024_11_22_00_auth.sql b/sql/updates/auth/3.3.5/2024_11_22_00_auth.sql new file mode 100644 index 00000000000..75986885739 --- /dev/null +++ b/sql/updates/auth/3.3.5/2024_11_22_00_auth.sql @@ -0,0 +1,2 @@ +-- TDB 335.24111 auth +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/auth/3.3.5/2025_02_14_00_auth.sql b/sql/updates/auth/3.3.5/2025_02_14_00_auth.sql new file mode 100644 index 00000000000..d147a6b499f --- /dev/null +++ b/sql/updates/auth/3.3.5/2025_02_14_00_auth.sql @@ -0,0 +1,2 @@ +-- +UPDATE `rbac_permissions` SET `name`='Can ignore non-strong lower security checks if it\'s disabled in config' WHERE `id`=47; diff --git a/sql/updates/characters/3.3.5/2024_11_22_00_characters.sql b/sql/updates/characters/3.3.5/2024_11_22_00_characters.sql new file mode 100644 index 00000000000..6bece070f8f --- /dev/null +++ b/sql/updates/characters/3.3.5/2024_11_22_00_characters.sql @@ -0,0 +1,2 @@ +-- TDB 335.24111 characters +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/world/3.3.5/2024_11_22_01_world.sql b/sql/updates/world/3.3.5/2024_11_22_01_world.sql new file mode 100644 index 00000000000..7a7783a21c0 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_11_22_01_world.sql @@ -0,0 +1,3 @@ +-- TDB 335.24111 world +UPDATE `version` SET `db_version`='TDB 335.24111', `cache_id`=24111 LIMIT 1; +UPDATE `updates` SET `state`='ARCHIVED'; diff --git a/sql/updates/world/3.3.5/2024_11_24_00_world.sql b/sql/updates/world/3.3.5/2024_11_24_00_world.sql new file mode 100644 index 00000000000..0de062956da --- /dev/null +++ b/sql/updates/world/3.3.5/2024_11_24_00_world.sql @@ -0,0 +1,4 @@ +-- Add Gates of Ironforge graveyard for Ally when dying in Ironforge +DELETE FROM `graveyard_zone` WHERE `ID`=852 AND `GhostZone`=1537; +INSERT INTO `graveyard_zone` (`ID`, `GhostZone`, `Faction`, `Comment`) VALUES +(852, 1537, 469, 'Dun Morogh, Gates of Ironforge - Ironforge'); diff --git a/sql/updates/world/3.3.5/2024_12_05_00_world.sql b/sql/updates/world/3.3.5/2024_12_05_00_world.sql new file mode 100644 index 00000000000..af0ae9f53a3 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_05_00_world.sql @@ -0,0 +1,75 @@ +-- +SET @OGUID := 93658; -- Need 66 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+65; +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 +(@OGUID+0, 195273, 530, 3522, 3951, 1, 1, 2945.66259765625, 5412.689453125, 150.0002593994140625, 4.031712055206298828, 0, 0, -0.90258502960205078, 0.430511653423309326, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+1, 195273, 530, 3522, 3951, 1, 1, 2935.668212890625, 5418.9306640625, 149.9498291015625, 4.206246376037597656, 0, 0, -0.86162853240966796, 0.50753939151763916, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+2, 195253, 530, 3522, 3951, 1, 1, 2940.299072265625, 5415.8017578125, 165.9381561279296875, 4.084071159362792968, 0, 0, -0.8910064697265625, 0.453990638256072998, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+3, 195264, 530, 3522, 3951, 1, 1, 3016.26220703125, 5430.1806640625, 148.0060577392578125, 4.380776405334472656, 0, 0, -0.81411552429199218, 0.580702960491180419, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+4, 195259, 530, 3522, 3951, 1, 1, 3013.2666015625, 5429.97119140625, 148.0764007568359375, 0.575957298278808593, 0, 0, 0.284014701843261718, 0.958819925785064697, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+5, 195259, 530, 3522, 3951, 1, 1, 2944.679443359375, 5466.7021484375, 150.6358184814453125, 0, 0, 0, 0, 1, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+6, 195256, 530, 3522, 3951, 1, 1, 2969.010498046875, 5459.72509765625, 144.69720458984375, 4.066620349884033203, 0, 0, -0.89493370056152343, 0.44619917869567871, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+7, 195260, 530, 3522, 3951, 1, 1, 3017.862548828125, 5435.4111328125, 147.436614990234375, 0.663223206996917724, 0, 0, 0.325567245483398437, 0.945518851280212402, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+8, 195266, 530, 3522, 3951, 1, 1, 3016.6123046875, 5445.06884765625, 151.876983642578125, 2.146752834320068359, 0, 0, 0.878816604614257812, 0.477159708738327026, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+9, 195260, 530, 3522, 3951, 1, 1, 3026.326904296875, 5430.9189453125, 148.449310302734375, 2.146752834320068359, 0, 0, 0.878816604614257812, 0.477159708738327026, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+10, 195260, 530, 3522, 3951, 1, 1, 3027.364990234375, 5431.576171875, 148.4505157470703125, 2.146752834320068359, 0, 0, 0.878816604614257812, 0.477159708738327026, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+11, 195256, 530, 3522, 3951, 1, 1, 2950.8291015625, 5486.53076171875, 144.1426544189453125, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+12, 195253, 530, 3522, 3951, 1, 1, 2944.295654296875, 5533.42822265625, 163.8209686279296875, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+13, 195273, 530, 3522, 3951, 1, 1, 2941.7880859375, 5528.2353515625, 149.5076751708984375, 2.44346022605895996, 0, 0, 0.939692497253417968, 0.34202045202255249, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+14, 195266, 530, 3522, 3951, 1, 1, 3026.51025390625, 5497.439453125, 151.5306549072265625, 3.700104713439941406, 0, 0, -0.96126079559326171, 0.275640487670898437, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+15, 195256, 530, 3522, 3951, 1, 1, 3011.184814453125, 5493.75, 145.0009307861328125, 0.680676698684692382, 0, 0, 0.333806037902832031, 0.942641794681549072, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+16, 195273, 530, 3522, 3951, 1, 1, 2947.150634765625, 5538.0439453125, 149.5360260009765625, 2.617989301681518554, 0, 0, 0.965925216674804687, 0.258821308612823486, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+17, 195273, 530, 3522, 3951, 1, 1, 3083.156982421875, 5479.302734375, 146.721160888671875, 0.331610709428787231, 0, 0, 0.16504669189453125, 0.986285746097564697, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+18, 195253, 530, 3522, 3951, 1, 1, 3085.63330078125, 5473.6279296875, 162.5823516845703125, 0.296705186367034912, 0, 0, 0.147809028625488281, 0.989015936851501464, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Evergrove - Difficulty: 0) CreateObject1 +(@OGUID+19, 195259, 530, 3522, 3844, 1, 1, 2188.35693359375, 4795.171875, 158.6740264892578125, 4.9218292236328125, 0, 0, -0.62932014465332031, 0.77714616060256958, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+20, 195260, 530, 3522, 3844, 1, 1, 2173.998779296875, 4726.61572265625, 157.7523651123046875, 3.9793548583984375, 0, 0, -0.9135446548461914, 0.406738430261611938, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+21, 195259, 530, 3522, 3844, 1, 1, 2181.06591796875, 4706.8447265625, 159.597625732421875, 5.35816192626953125, 0, 0, -0.446197509765625, 0.894934535026550292, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+22, 195259, 530, 3522, 3844, 1, 1, 2165.545654296875, 4727.486328125, 159.5631103515625, 2.268925428390502929, 0, 0, 0.906307220458984375, 0.422619491815567016, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+23, 195273, 530, 3522, 3844, 1, 1, 2148.1455078125, 4823.4619140625, 153.2520599365234375, 1.291541695594787597, 0, 0, 0.60181427001953125, 0.798636078834533691, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+24, 195266, 530, 3522, 3844, 1, 1, 2154.755859375, 4716.65576171875, 160.954681396484375, 3.001946926116943359, 0, 0, 0.997563362121582031, 0.069766148924827575, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+25, 195266, 530, 3522, 3844, 1, 1, 2155.24951171875, 4720.380859375, 160.944915771484375, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+26, 195273, 530, 3522, 3844, 1, 1, 2137.6142578125, 4828.30615234375, 155.2135772705078125, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+27, 195253, 530, 3522, 3844, 1, 1, 2092.12744140625, 4792.1640625, 175.636199951171875, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+28, 195253, 530, 3522, 3844, 1, 1, 2098.94580078125, 4779.43212890625, 175.532470703125, 6.178466320037841796, 0, 0, -0.05233573913574218, 0.998629570007324218, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+29, 195253, 530, 3522, 3844, 1, 1, 2090.407470703125, 4769.77099609375, 175.6497344970703125, 4.9218292236328125, 0, 0, -0.62932014465332031, 0.77714616060256958, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+30, 195256, 530, 3522, 3844, 1, 1, 2087.610595703125, 4782.98876953125, 157.7813568115234375, 0.226892471313476562, 0, 0, 0.113203048706054687, 0.993571877479553222, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+31, 195253, 530, 3522, 3844, 1, 1, 2078.7470703125, 4789.83056640625, 175.6967620849609375, 2.391098499298095703, 0, 0, 0.930417060852050781, 0.366502493619918823, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+32, 195260, 530, 3522, 3844, 1, 1, 2045.7447509765625, 4731.15478515625, 151.848724365234375, 4.817109584808349609, 0, 0, -0.66913032531738281, 0.74314504861831665, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+33, 195259, 530, 3522, 3844, 1, 1, 2045.4296875, 4686.2568359375, 153.3060150146484375, 1.029743075370788574, 0, 0, 0.492423057556152343, 0.870355963706970214, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+34, 195266, 530, 3522, 3844, 1, 1, 2035.0504150390625, 4693.1162109375, 154.721710205078125, 1.85004889965057373, 0, 0, 0.798635482788085937, 0.60181504487991333, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+35, 195266, 530, 3522, 3844, 1, 1, 2031.4676513671875, 4692.1103515625, 154.7591094970703125, 1.884953022003173828, 0, 0, 0.809016227722167968, 0.587786316871643066, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+36, 195256, 530, 3522, 3844, 1, 1, 2019.060791015625, 4700.48193359375, 150.237762451171875, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+37, 195259, 530, 3522, 3844, 1, 1, 2032.304443359375, 4663.9609375, 153.4190826416015625, 4.171337604522705078, 0, 0, -0.87035560607910156, 0.492423713207244873, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+38, 195264, 530, 3522, 3844, 1, 1, 2042.164306640625, 4667.0546875, 151.262664794921875, 2.007128477096557617, 0, 0, 0.84339141845703125, 0.537299633026123046, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Mok'Nathal Village - Difficulty: 0) CreateObject1 +(@OGUID+39, 195253, 530, 3522, 3772, 1, 1, 2066.2578125, 6730.63916015625, 181.51666259765625, 1.518436193466186523, 0, 0, 0.6883544921875, 0.725374460220336914, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+40, 195253, 530, 3522, 3772, 1, 1, 2066.148193359375, 6726.275390625, 181.5531158447265625, 4.747295856475830078, 0, 0, -0.69465827941894531, 0.719339847564697265, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+41, 195253, 530, 3522, 3772, 1, 1, 2070.802978515625, 6759.6708984375, 173.274200439453125, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+42, 195253, 530, 3522, 3772, 1, 1, 2055.8271484375, 6759.79150390625, 173.274200439453125, 4.729844093322753906, 0, 0, -0.70090866088867187, 0.713251054286956787, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+43, 195266, 530, 3522, 3772, 1, 1, 2063.30517578125, 6759.89794921875, 173.2681427001953125, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+44, 195266, 530, 3522, 3772, 1, 1, 2163.69384765625, 6745.07666015625, 172.408538818359375, 4.049167633056640625, 0, 0, -0.89879322052001953, 0.438372820615768432, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+45, 195259, 530, 3522, 3772, 1, 1, 1989.3138427734375, 6784.46484375, 167.9163970947265625, 4.537858963012695312, 0, 0, -0.76604366302490234, 0.642788589000701904, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+46, 195266, 530, 3522, 3772, 1, 1, 2162.736572265625, 6751.21435546875, 172.43853759765625, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+47, 195266, 530, 3522, 3772, 1, 1, 2031.962646484375, 6825.552734375, 181.533294677734375, 2.426007747650146484, 0, 0, 0.936672210693359375, 0.350207358598709106, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+48, 195266, 530, 3522, 3772, 1, 1, 2038.027099609375, 6826.09423828125, 181.4816436767578125, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+49, 195266, 530, 3522, 3772, 1, 1, 2038.5650634765625, 6819.837890625, 181.4885406494140625, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+50, 195260, 530, 3522, 3772, 1, 1, 1989.5538330078125, 6785.7109375, 165.7517242431640625, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+51, 195266, 530, 3522, 3772, 1, 1, 2032.2135009765625, 6819.36962890625, 181.5124969482421875, 3.874631166458129882, 0, 0, -0.93358039855957031, 0.358368009328842163, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+52, 195266, 530, 3522, 3772, 1, 1, 2062.016357421875, 6825.853515625, 184.783203125, 4.729844093322753906, 0, 0, -0.70090866088867187, 0.713251054286956787, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+53, 195273, 530, 3522, 3772, 1, 1, 2051.89013671875, 6831.6376953125, 177.0355377197265625, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+54, 195266, 530, 3522, 3772, 1, 1, 2169.92529296875, 6745.9697265625, 172.43658447265625, 5.672322273254394531, 0, 0, -0.3007049560546875, 0.953717231750488281, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+55, 195256, 530, 3522, 3772, 1, 1, 2161.681640625, 6783.0478515625, 183.453582763671875, 0.890116631984710693, 0, 0, 0.430510520935058593, 0.902585566043853759, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+56, 195266, 530, 3522, 3772, 1, 1, 2168.956298828125, 6752.18212890625, 172.4386749267578125, 0.925023794174194335, 0, 0, 0.446197509765625, 0.894934535026550292, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+57, 195253, 530, 3522, 3772, 1, 1, 2095.052490234375, 6899.6201171875, 190.438201904296875, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+58, 195253, 530, 3522, 3772, 1, 1, 2085.431396484375, 6890.10400390625, 190.465667724609375, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+59, 195256, 530, 3522, 3772, 1, 1, 2007.013427734375, 6878.82177734375, 178.9834442138671875, 4.241150379180908203, 0, 0, -0.85264015197753906, 0.522498607635498046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+60, 195266, 530, 3522, 3772, 1, 1, 2009.812744140625, 6871.4130859375, 188.180755615234375, 4.241150379180908203, 0, 0, -0.85264015197753906, 0.522498607635498046, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+61, 195256, 530, 3522, 3772, 1, 1, 2017.318603515625, 6873.4814453125, 178.9829864501953125, 4.241150379180908203, 0, 0, -0.85264015197753906, 0.522498607635498046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+62, 195259, 530, 3522, 3772, 1, 1, 2016.857421875, 6885.0546875, 182.8495941162109375, 4.223697185516357421, 0, 0, -0.85716724395751953, 0.515038192272186279, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+63, 195266, 530, 3522, 3772, 1, 1, 1955.62548828125, 6885.82080078125, 167.1296234130859375, 4.468043327331542968, 0, 0, -0.7880105972290039, 0.615661680698394775, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+64, 195253, 530, 3522, 3772, 1, 1, 1937.43359375, 6838.64013671875, 177.4421844482421875, 3.194002151489257812, 0, 0, -0.99965667724609375, 0.026201646775007247, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 +(@OGUID+65, 195253, 530, 3522, 3772, 1, 1, 1941.3951416015625, 6838.6572265625, 177.4772491455078125, 0.017452461645007133, 0, 0, 0.008726119995117187, 0.999961912631988525, 120, 255, 1, 0); -- Hanging, Streamer x3 - Brewfest (Area: Sylvanaar - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+65 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+65; diff --git a/sql/updates/world/3.3.5/2024_12_05_01_world.sql b/sql/updates/world/3.3.5/2024_12_05_01_world.sql new file mode 100644 index 00000000000..aaa9790521b --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_05_01_world.sql @@ -0,0 +1,60 @@ +-- +SET @OGUID := 55863; -- Need 49 +SET @EVENT := 24; + +UPDATE `gameobject` SET `zoneId`=3521, `areaId`=3565, `position_x`=-184.629074096679687, `position_y`=5506.40576171875, `position_z`=29.47097396850585937, `orientation`=3.141592741012573242, `rotation2`=-1, `rotation3`=0, `spawntimesecs`=120 WHERE `guid`=80085; -- Standing, Exterior, Medium - Brewfest (Area: Cenarion Refuge - Difficulty: 0) CreateObject1 + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+48; +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 +(@OGUID+0, 195256, 530, 3521, 3766, 1, 1, 1068.5582275390625, 7349.52783203125, 40.729827880859375, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Orebor Harborage - Difficulty: 0) CreateObject1 +(@OGUID+1, 195256, 530, 3521, 3766, 1, 1, 1072.7413330078125, 7372.52197265625, 39.58334732055664062, 3.45575571060180664, 0, 0, -0.98768806457519531, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Orebor Harborage - Difficulty: 0) CreateObject1 +(@OGUID+2, 195256, 530, 3521, 3644, 1, 1, 301.71356201171875, 5979.0732421875, 132.4597930908203125, 4.782202720642089843, 0, 0, -0.68199825286865234, 0.731353819370269775, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telredor - Difficulty: 0) CreateObject1 +(@OGUID+3, 195256, 530, 3521, 3644, 1, 1, 269.962310791015625, 5956.73486328125, 26.43292236328125, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telredor - Difficulty: 0) CreateObject1 +(@OGUID+4, 195256, 530, 3521, 3644, 1, 1, 298.295318603515625, 5957.51953125, 26.42815017700195312, 1.745326757431030273, 0, 0, 0.766043663024902343, 0.642788589000701904, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telredor - Difficulty: 0) CreateObject1 +(@OGUID+5, 195273, 530, 3521, 3644, 1, 1, 282.431060791015625, 5967.0205078125, 156.1607208251953125, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Telredor - Difficulty: 0) CreateObject1 +(@OGUID+6, 195256, 530, 3521, 3644, 1, 1, 272.316680908203125, 5944.75048828125, 26.52184486389160156, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telredor - Difficulty: 0) CreateObject1 +(@OGUID+7, 195256, 530, 3521, 3644, 1, 1, 278.588134765625, 5966.77783203125, 150.167694091796875, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telredor - Difficulty: 0) CreateObject1 +(@OGUID+8, 195256, 530, 3521, 3644, 1, 1, 296.528472900390625, 5941.6240234375, 26.55747795104980468, 3.682650327682495117, 0, 0, -0.96362972259521484, 0.26724100112915039, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telredor - Difficulty: 0) CreateObject1 +(@OGUID+9, 195273, 530, 3521, 3565, 1, 1, -183.250381469726562, 5514.36181640625, 30.78355216979980468, 0.471238493919372558, 0, 0, 0.233445167541503906, 0.972369968891143798, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Cenarion Refuge - Difficulty: 0) CreateObject1 +(@OGUID+10, 195256, 530, 3521, 3645, 1, 1, 210.4429779052734375, 7810.77001953125, 23.82720375061035156, 1.099556446075439453, 0, 0, 0.522498130798339843, 0.852640450000762939, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+11, 195259, 530, 3521, 3645, 1, 1, 225.3917694091796875, 7813.88134765625, 22.9826507568359375, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+12, 195259, 530, 3521, 3645, 1, 1, 221.990020751953125, 7810.06591796875, 23.68496131896972656, 2.234017848968505859, 0, 0, 0.898793220520019531, 0.438372820615768432, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+13, 195256, 530, 3521, 3645, 1, 1, 253.7595977783203125, 7836.69970703125, 22.96671676635742187, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+14, 195256, 530, 3521, 3645, 1, 1, 229.98101806640625, 7821.42626953125, 21.99320030212402343, 3.001946926116943359, 0, 0, 0.997563362121582031, 0.069766148924827575, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+15, 195264, 530, 3521, 3645, 1, 1, 269.388092041015625, 7849.4365234375, 24.44972610473632812, 0.383971005678176879, 0, 0, 0.190808296203613281, 0.981627285480499267, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+16, 195256, 530, 3521, 3645, 1, 1, 287.766937255859375, 7842.64306640625, 22.589141845703125, 2.44346022605895996, 0, 0, 0.939692497253417968, 0.34202045202255249, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+17, 195256, 530, 3521, 3645, 1, 1, 293.306427001953125, 7831.15966796875, 24.93296241760253906, 4.415683269500732421, 0, 0, -0.80385684967041015, 0.594822824001312255, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+18, 195264, 530, 3521, 3645, 1, 1, 271.417327880859375, 7860.4853515625, 24.63960075378417968, 6.09120035171508789, 0, 0, -0.09584522247314453, 0.995396256446838378, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+19, 195264, 530, 3521, 3645, 1, 1, 262.776641845703125, 7854.1630859375, 24.14608192443847656, 4.502951622009277343, 0, 0, -0.7771453857421875, 0.629321098327636718, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+20, 195259, 530, 3521, 3645, 1, 1, 332.28717041015625, 7829.9609375, 39.40044784545898437, 6.213373661041259765, 0, 0, -0.03489875793457031, 0.999390840530395507, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+21, 195273, 530, 3521, 3645, 1, 1, 257.303985595703125, 7897.23974609375, 22.72899436950683593, 5.427974700927734375, 0, 0, -0.41469287872314453, 0.909961462020874023, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+22, 195256, 530, 3521, 3645, 1, 1, 334.99078369140625, 7839.56005859375, 22.29417991638183593, 1.658061861991882324, 0, 0, 0.737277030944824218, 0.67559051513671875, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+23, 195256, 530, 3521, 3645, 1, 1, 238.597869873046875, 7893.0703125, 21.80823898315429687, 5.393068790435791015, 0, 0, -0.43051052093505859, 0.902585566043853759, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+24, 195256, 530, 3521, 3645, 1, 1, 250.3988800048828125, 7896.92529296875, 21.685455322265625, 4.59021615982055664, 0, 0, -0.74895572662353515, 0.662620067596435546, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+25, 195256, 530, 3521, 3645, 1, 1, 261.77386474609375, 7872.234375, 23.733184814453125, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+26, 195259, 530, 3521, 3645, 1, 1, 233.8485870361328125, 7910.587890625, 27.21143913269042968, 5.218535900115966796, 0, 0, -0.507537841796875, 0.861629426479339599, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+27, 195259, 530, 3521, 3645, 1, 1, 241.36865234375, 7913.66259765625, 27.14164352416992187, 5.044002056121826171, 0, 0, -0.58070278167724609, 0.814115643501281738, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+28, 195266, 530, 3521, 3645, 1, 1, 237.8500518798828125, 7911.4912109375, 30.47849845886230468, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+29, 195259, 530, 3521, 3645, 1, 1, 342.149322509765625, 7867.58251953125, 45.30078506469726562, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, 0), -- Hanging, Square, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+30, 195263, 530, 3521, 3645, 1, 1, 237.0487213134765625, 7913.60400390625, 30.74815177917480468, 1.972219824790954589, 0, 0, 0.83388519287109375, 0.55193793773651123, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+31, 195266, 530, 3521, 3645, 1, 1, 236.9491119384765625, 7913.625, 30.50174903869628906, 1.972219824790954589, 0, 0, 0.83388519287109375, 0.55193793773651123, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+32, 195257, 530, 3521, 3645, 1, 1, 223.9830780029296875, 7923.5703125, 27.90063095092773437, 1.291541695594787597, 0, 0, 0.60181427001953125, 0.798636078834533691, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+33, 195263, 530, 3521, 3645, 1, 1, 244.1060638427734375, 7939.501953125, 31.13576889038085937, 3.735006093978881835, 0, 0, -0.95630455017089843, 0.292372345924377441, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+34, 195266, 530, 3521, 3645, 1, 1, 244.069549560546875, 7939.38623046875, 30.92425537109375, 3.43830275535583496, 0, 0, -0.98901557922363281, 0.147811368107795715, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+35, 195256, 530, 3521, 3645, 1, 1, 285.1593017578125, 7952.14404296875, 21.52510643005371093, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+36, 195256, 530, 3521, 3645, 1, 1, 247.4571380615234375, 7941.14306640625, 25.69257545471191406, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+37, 195257, 530, 3521, 3645, 1, 1, 239.3765716552734375, 7930.08935546875, 27.8351898193359375, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+38, 195256, 530, 3521, 3645, 1, 1, 210.8226470947265625, 7926.40625, 25.69329643249511718, 0.331610709428787231, 0, 0, 0.16504669189453125, 0.986285746097564697, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+39, 195266, 530, 3521, 3645, 1, 1, 223.4775390625, 7943.31103515625, 30.76141738891601562, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+40, 195263, 530, 3521, 3645, 1, 1, 213.9386444091796875, 7927.57666015625, 30.98103141784667968, 0.418878614902496337, 0, 0, 0.207911491394042968, 0.978147625923156738, 120, 255, 1, 0), -- Hanging, Square, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+41, 195260, 530, 3521, 3645, 1, 1, 231.173614501953125, 7939.26123046875, 41.931976318359375, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+42, 195264, 530, 3521, 3645, 1, 1, 230.4461822509765625, 7939.35400390625, 41.89725494384765625, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+43, 195257, 530, 3521, 3645, 1, 1, 228.63970947265625, 7945.421875, 29.25892829895019531, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 120, 255, 1, 0), -- Hanging, Tall/Thin, Small - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+44, 195266, 530, 3521, 3645, 1, 1, 214.162872314453125, 7927.6787109375, 30.72031021118164062, 0.401424884796142578, 0, 0, 0.199367523193359375, 0.979924798011779785, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+45, 195256, 530, 3521, 3645, 1, 1, 276.127227783203125, 7957.609375, 21.57661247253417968, 4.328419685363769531, 0, 0, -0.82903671264648437, 0.559194147586822509, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Zabra'jin - Difficulty: 0) CreateObject1 +(@OGUID+46, 195256, 530, 3521, 3649, 1, 1, 253.3038177490234375, 8489.0673828125, 23.40814781188964843, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Sporeggar - Difficulty: 0) CreateObject1 +(@OGUID+47, 195266, 530, 3521, 3649, 1, 1, 219.599853515625, 8569.107421875, 33.13797760009765625, 4.677483558654785156, 0, 0, -0.71933937072753906, 0.694658815860748291, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Sporeggar - Difficulty: 0) CreateObject1 +(@OGUID+48, 195256, 530, 3521, 3649, 1, 1, 223.5182647705078125, 8562.453125, 23.26412010192871093, 4.293513298034667968, 0, 0, -0.8386697769165039, 0.544640243053436279, 120, 255, 1, 0); -- Standing, Exterior, Medium - Brewfest (Area: Sporeggar - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+48 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+48; diff --git a/sql/updates/world/3.3.5/2024_12_05_02_world.sql b/sql/updates/world/3.3.5/2024_12_05_02_world.sql new file mode 100644 index 00000000000..184b6c29905 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_05_02_world.sql @@ -0,0 +1,91 @@ +-- +SET @OGUID := 93724; -- Need 82 +SET @EVENT := 24; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+81; +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 +(@OGUID+0, 195256, 530, 3518, 3626, 1, 1, -2571.461181640625, 7378.0302734375, 11.0595703125, 0.261798173189163208, 0, 0, 0.130525588989257812, 0.991444945335388183, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+1, 195256, 530, 3518, 3626, 1, 1, -2561.666259765625, 7378.9599609375, 10.57090091705322265, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+2, 195256, 530, 3518, 3626, 1, 1, -2611.333984375, 7343.45654296875, 23.60636329650878906, 5.393068790435791015, 0, 0, -0.43051052093505859, 0.902585566043853759, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+3, 195256, 530, 3518, 3626, 1, 1, -2573.72021484375, 7300.3046875, 13.90452003479003906, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+4, 195256, 530, 3518, 3626, 1, 1, -2614.57177734375, 7330.8759765625, 24.21088790893554687, 1.500982880592346191, 0, 0, 0.681998252868652343, 0.731353819370269775, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+5, 195256, 530, 3518, 3626, 1, 1, -2618.060791015625, 7338.908203125, 23.65935897827148437, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+6, 195256, 530, 3518, 3626, 1, 1, -2624.407958984375, 7331.68603515625, 24.46343994140625, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+7, 195256, 530, 3518, 3626, 1, 1, -2625.709716796875, 7298.20947265625, 21.14083099365234375, 4.799657344818115234, 0, 0, -0.67558956146240234, 0.737277925014495849, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+8, 195256, 530, 3518, 3626, 1, 1, -2570.704833984375, 7291.2900390625, 14.81432628631591796, 0.541050612926483154, 0, 0, 0.267237663269042968, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+9, 195256, 530, 3518, 3626, 1, 1, -2614.920166015625, 7297.7255859375, 20.74479866027832031, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+10, 195256, 530, 3518, 3626, 1, 1, -2605.266357421875, 7291.26318359375, 19.81580162048339843, 3.647741317749023437, 0, 0, -0.96814727783203125, 0.250381410121917724, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+11, 195256, 530, 3518, 3626, 1, 1, -2602.271240234375, 7282.345703125, 19.39945030212402343, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+12, 195256, 530, 3518, 3626, 1, 1, -2528.43505859375, 7266.2861328125, 16.2702484130859375, 2.478367090225219726, 0, 0, 0.94551849365234375, 0.325568377971649169, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+13, 195256, 530, 3518, 3626, 1, 1, -2534.46826171875, 7256.74951171875, 16.26636314392089843, 2.530723094940185546, 0, 0, 0.953716278076171875, 0.300707906484603881, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+14, 195256, 530, 3518, 3626, 1, 1, -2600.8056640625, 7237.7109375, 12.91721916198730468, 0.349065244197845458, 0, 0, 0.173647880554199218, 0.984807789325714111, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+15, 195256, 530, 3518, 3626, 1, 1, -2692.655517578125, 7296.978515625, 42.78501129150390625, 5.427974700927734375, 0, 0, -0.41469287872314453, 0.909961462020874023, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+16, 195266, 530, 3518, 3626, 1, 1, -2698.241455078125, 7291.55224609375, 49.91637039184570312, 5.969027042388916015, 0, 0, -0.1564340591430664, 0.987688362598419189, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+17, 195256, 530, 3518, 3626, 1, 1, -2720.993896484375, 7355.89599609375, 39.75893783569335937, 6.03883981704711914, 0, 0, -0.12186908721923828, 0.9925462007522583, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+18, 195256, 530, 3518, 3626, 1, 1, -2702.840576171875, 7293.720703125, 88.6365509033203125, 2.827429771423339843, 0, 0, 0.987688064575195312, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+19, 195266, 530, 3518, 3626, 1, 1, -2713.3603515625, 7298.4453125, 51.91501235961914062, 5.84685373306274414, 0, 0, -0.21643924713134765, 0.976296067237854003, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+20, 195256, 530, 3518, 3626, 1, 1, -2721.76171875, 7343.4541015625, 39.4463348388671875, 6.161012649536132812, 0, 0, -0.06104850769042968, 0.998134791851043701, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+21, 195256, 530, 3518, 3626, 1, 1, -2697.950439453125, 7284.06103515625, 42.72089385986328125, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+22, 195256, 530, 3518, 3626, 1, 1, -2596.802490234375, 7228.939453125, 13.47050762176513671, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+23, 195256, 530, 3518, 3626, 1, 1, -2626.202392578125, 7216.5498046875, 20.35766029357910156, 3.560472726821899414, 0, 0, -0.97814750671386718, 0.207912087440490722, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+24, 195256, 530, 3518, 3626, 1, 1, -2630.0986328125, 7224.42529296875, 19.74051475524902343, 3.717553615570068359, 0, 0, -0.95881938934326171, 0.284016460180282592, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+25, 195256, 530, 3518, 3626, 1, 1, -2755.32421875, 7317.08056640625, 56.35858535766601562, 2.617989301681518554, 0, 0, 0.965925216674804687, 0.258821308612823486, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+26, 195264, 530, 3518, 3626, 1, 1, -2760.96923828125, 7304.01025390625, 44.88897705078125, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+27, 195273, 530, 3518, 3626, 1, 1, -2738.57080078125, 7309.4521484375, 63.32978057861328125, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+28, 195256, 530, 3518, 3626, 1, 1, -2752.12109375, 7315.080078125, 43.48479461669921875, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+29, 195264, 530, 3518, 3626, 1, 1, -2765.62548828125, 7302.78564453125, 44.92822265625, 3.996806621551513671, 0, 0, -0.90996074676513671, 0.414694398641586303, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+30, 195266, 530, 3518, 3626, 1, 1, -2730.688720703125, 7306.02099609375, 51.77650070190429687, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+31, 195273, 530, 3518, 3626, 1, 1, -2742.36865234375, 7297.82568359375, 47.8856353759765625, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+32, 195266, 530, 3518, 3626, 1, 1, -2775.22607421875, 7326.033203125, 51.77103042602539062, 5.829400539398193359, 0, 0, -0.22495079040527343, 0.974370121955871582, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+33, 195256, 530, 3518, 3626, 1, 1, -2755.533935546875, 7275.69091796875, 40.2712554931640625, 5.515241622924804687, 0, 0, -0.37460613250732421, 0.927184045314788818, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+34, 195273, 530, 3518, 3626, 1, 1, -2732.494140625, 7320.93212890625, 47.57973098754882812, 3.298687219619750976, 0, 0, -0.99691677093505859, 0.078466430306434631, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+35, 195264, 530, 3518, 3626, 1, 1, -2756.8896484375, 7304.197265625, 44.86130905151367187, 0.558503925800323486, 0, 0, 0.275636672973632812, 0.961261868476867675, 120, 255, 1, 0), -- Standing, Interior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+36, 195273, 530, 3518, 3626, 1, 1, -2772.80078125, 7324.94873046875, 63.32421875, 5.794494152069091796, 0, 0, -0.24192142486572265, 0.970295846462249755, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+37, 195256, 530, 3518, 3626, 1, 1, -2762.166259765625, 7267.40087890625, 40.26733779907226562, 5.724681377410888671, 0, 0, -0.27563667297363281, 0.961261868476867675, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+38, 195256, 530, 3518, 3626, 1, 1, -2670.031005859375, 7211.86328125, 23.66940689086914062, 0.994837164878845214, 0, 0, 0.477158546447753906, 0.878817260265350341, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+39, 195266, 530, 3518, 3626, 1, 1, -2677.658447265625, 7203.91943359375, 32.99669265747070312, 1.204277276992797851, 0, 0, 0.56640625, 0.824126183986663818, 120, 255, 1, 0), -- Hanging, Streamer - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+40, 195256, 530, 3518, 3626, 1, 1, -2678.9892578125, 7214.02978515625, 23.95701217651367187, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Telaar - Difficulty: 0) CreateObject1 +(@OGUID+41, 195256, 530, 3518, 3613, 1, 1, -1296.558349609375, 6953.97314453125, 33.24512863159179687, 4.118979454040527343, 0, 0, -0.88294696807861328, 0.469472706317901611, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+42, 195256, 530, 3518, 3613, 1, 1, -1307.796630859375, 6960.4736328125, 32.2698211669921875, 4.223697185516357421, 0, 0, -0.85716724395751953, 0.515038192272186279, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+43, 195256, 530, 3518, 3613, 1, 1, -1254.381103515625, 7007.265625, 36.6230010986328125, 4.537858963012695312, 0, 0, -0.76604366302490234, 0.642788589000701904, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+44, 195256, 530, 3518, 3613, 1, 1, -1241.7535400390625, 7003.59423828125, 36.79386138916015625, 4.537858963012695312, 0, 0, -0.76604366302490234, 0.642788589000701904, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+45, 195256, 530, 3518, 3613, 1, 1, -1387.220703125, 7134.828125, 34.03578948974609375, 3.874631166458129882, 0, 0, -0.93358039855957031, 0.358368009328842163, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+46, 195256, 530, 3518, 3613, 1, 1, -1364.81298828125, 7156.56494140625, 34.00505447387695312, 0.890116631984710693, 0, 0, 0.430510520935058593, 0.902585566043853759, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+47, 195256, 530, 3518, 3613, 1, 1, -1392.475830078125, 7140.16845703125, 33.73893356323242187, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+48, 195256, 530, 3518, 3613, 1, 1, -1371.6705322265625, 7162.8037109375, 33.253997802734375, 0.820303261280059814, 0, 0, 0.398748397827148437, 0.917060375213623046, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+49, 195256, 530, 3518, 3613, 1, 1, -1454.1597900390625, 7165.0458984375, 44.56573486328125, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+50, 195256, 530, 3518, 3613, 1, 1, -1283.425537109375, 7130.822265625, 59.73568344116210937, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+51, 195256, 530, 3518, 3613, 1, 1, -1282.8367919921875, 7187.43017578125, 58.00640869140625, 2.391098499298095703, 0, 0, 0.930417060852050781, 0.366502493619918823, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+52, 195256, 530, 3518, 3613, 1, 1, -1262.0758056640625, 7107.591796875, 58.8874664306640625, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+53, 195253, 530, 3518, 3613, 1, 1, -1260.942626953125, 7180.6337890625, 63.39373779296875, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Hanging, Streamer x3 - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+54, 195256, 530, 3518, 3613, 1, 1, -1271.8828125, 7197.9970703125, 57.898193359375, 2.356194972991943359, 0, 0, 0.923879623413085937, 0.382683247327804565, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+55, 195273, 530, 3518, 3613, 1, 1, -1253.0084228515625, 7158.91064453125, 61.71668243408203125, 6.265733242034912109, 0, 0, -0.00872611999511718, 0.999961912631988525, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+56, 195256, 530, 3518, 3613, 1, 1, -1247.80078125, 7101.98095703125, 58.06834030151367187, 4.171337604522705078, 0, 0, -0.87035560607910156, 0.492423713207244873, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+57, 195273, 530, 3518, 3613, 1, 1, -1240.11376953125, 7134.3564453125, 61.81643295288085937, 1.064649581909179687, 0, 0, 0.507537841796875, 0.861629426479339599, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+58, 195256, 530, 3518, 3613, 1, 1, -1209.607666015625, 7103.7080078125, 57.44921112060546875, 5.410521507263183593, 0, 0, -0.42261791229248046, 0.906307935714721679, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+59, 195273, 530, 3518, 3613, 1, 1, -1212.329833984375, 7133.37646484375, 61.55224609375, 2.024578809738159179, 0, 0, 0.848047256469726562, 0.529920578002929687, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+60, 195256, 530, 3518, 3613, 1, 1, -1194.7515869140625, 7110.27880859375, 58.06450271606445312, 5.044002056121826171, 0, 0, -0.58070278167724609, 0.814115643501281738, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+61, 195260, 530, 3518, 3613, 1, 1, -1229.2685546875, 7157.3984375, 58.4376373291015625, 2.600535154342651367, 0, 0, 0.963629722595214843, 0.26724100112915039, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+62, 195256, 530, 3518, 3613, 1, 1, -1173.5557861328125, 7134.2314453125, 58.114990234375, 5.95157480239868164, 0, 0, -0.16504669189453125, 0.986285746097564697, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+63, 195260, 530, 3518, 3613, 1, 1, -1224.0504150390625, 7154.1015625, 58.44301223754882812, 5.777040958404541015, 0, 0, -0.25037956237792968, 0.968147754669189453, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+64, 195273, 530, 3518, 3613, 1, 1, -1237.7955322265625, 7183.27978515625, 61.05430984497070312, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+65, 195273, 530, 3518, 3613, 1, 1, -1197.399658203125, 7157.67041015625, 61.52597427368164062, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+66, 195260, 530, 3518, 3613, 1, 1, -1226.032958984375, 7162.578125, 58.451416015625, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+67, 195260, 530, 3518, 3613, 1, 1, -1220.8184814453125, 7159.2900390625, 58.4534912109375, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Interior, Small - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+68, 195273, 530, 3518, 3613, 1, 1, -1210.0084228515625, 7182.3271484375, 61.39197540283203125, 4.084071159362792968, 0, 0, -0.8910064697265625, 0.453990638256072998, 120, 255, 1, 0), -- Hanging, Tall/Thin, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+69, 195256, 530, 3518, 3613, 1, 1, -1249.8062744140625, 7217.7626953125, 58.32961654663085937, 2.146752834320068359, 0, 0, 0.878816604614257812, 0.477159708738327026, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+70, 195256, 530, 3518, 3613, 1, 1, -1221.3048095703125, 7222.46337890625, 59.25885772705078125, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+71, 195256, 530, 3518, 3613, 1, 1, -1201.7222900390625, 7206.6494140625, 58.5518798828125, 0.994837164878845214, 0, 0, 0.477158546447753906, 0.878817260265350341, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+72, 195256, 530, 3518, 3613, 1, 1, -1296.4398193359375, 7267.44384765625, 34.6165313720703125, 4.049167633056640625, 0, 0, -0.89879322052001953, 0.438372820615768432, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+73, 195256, 530, 3518, 3613, 1, 1, -1302.7530517578125, 7271.98974609375, 34.41438674926757812, 4.101525306701660156, 0, 0, -0.88701057434082031, 0.461749136447906494, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+74, 195256, 530, 3518, 3613, 1, 1, -1176.2156982421875, 7200.08447265625, 58.2138214111328125, 0.575957298278808593, 0, 0, 0.284014701843261718, 0.958819925785064697, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+75, 195256, 530, 3518, 3613, 1, 1, -1184.83349609375, 7207.80712890625, 57.92132568359375, 0.541050612926483154, 0, 0, 0.267237663269042968, 0.96363067626953125, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+76, 195256, 530, 3518, 3613, 1, 1, -1198.806640625, 7250.10986328125, 35.1543426513671875, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+77, 195256, 530, 3518, 3613, 1, 1, -1184.6793212890625, 7246.919921875, 35.14312744140625, 2.827429771423339843, 0, 0, 0.987688064575195312, 0.156436234712600708, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+78, 195256, 530, 3518, 3613, 1, 1, -1273.8309326171875, 7316.6728515625, 33.7790985107421875, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+79, 195256, 530, 3518, 3613, 1, 1, -1265.5079345703125, 7313.12939453125, 34.21532440185546875, 1.047197580337524414, 0, 0, 0.5, 0.866025388240814208, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+80, 195256, 530, 3518, 3613, 1, 1, -1220.26416015625, 7388.15966796875, 30.789276123046875, 0.610863447189331054, 0, 0, 0.3007049560546875, 0.953717231750488281, 120, 255, 1, 0), -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 +(@OGUID+81, 195256, 530, 3518, 3613, 1, 1, -1207.9671630859375, 7386.6630859375, 31.42566871643066406, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 120, 255, 1, 0); -- Standing, Exterior, Medium - Brewfest (Area: Garadar - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+81 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+81; diff --git a/sql/updates/world/3.3.5/2024_12_05_03_world.sql b/sql/updates/world/3.3.5/2024_12_05_03_world.sql new file mode 100644 index 00000000000..25ba04bde96 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_05_03_world.sql @@ -0,0 +1,2 @@ +-- Update Draenei Youngling PvPFlags +UPDATE `creature_template_addon` SET `PvPFlags`=0x1 WHERE `entry`=17587; diff --git a/sql/updates/world/3.3.5/2024_12_05_04_world.sql b/sql/updates/world/3.3.5/2024_12_05_04_world.sql new file mode 100644 index 00000000000..b9f6e4e0271 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_05_04_world.sql @@ -0,0 +1,2 @@ +-- Set PvP flag for "Draenei Survivor" to allow targeting for quest "Rescue the Survivors!" +UPDATE `creature_template_addon` SET `PvPFlags`=0x1 WHERE `entry`=16483; diff --git a/sql/updates/world/3.3.5/2024_12_06_00_world.sql b/sql/updates/world/3.3.5/2024_12_06_00_world.sql new file mode 100644 index 00000000000..f659aaec9c8 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_06_00_world.sql @@ -0,0 +1,533 @@ +INSERT INTO `creature_template_addon` (`entry`,`PvPFlags`) VALUES +(54,1),(66,1),(68,1),(74,1),(78,1),(151,1),(152,1),(167,1),(190,1),(196,1),(197,1),(198,1),(219,1),(220,1),(221,1),(222,1),(223,1),(224,1),(225,1),(226,1),(227,1),(228,1),(233,1),(234,1),(235,1), +(237,1),(238,1),(239,1),(240,1),(241,1),(242,1),(244,1),(246,1),(248,1),(250,1),(251,1),(252,1),(253,1),(255,1),(258,1),(260,1),(261,1),(263,1),(264,1),(265,1),(266,1),(267,1),(268,1),(269,1), +(270,1),(271,1),(272,1),(273,1),(274,1),(275,1),(276,1),(277,1),(278,1),(279,1),(288,1),(289,1),(294,1),(295,1),(297,1),(302,1),(311,1),(313,1),(325,1),(328,1),(331,1),(332,1),(338,1),(340,1), +(341,1),(342,1),(343,1),(344,1),(346,1),(347,1),(348,1),(349,1),(352,1),(354,1),(372,1),(374,1),(375,1),(376,1),(377,1),(379,1),(380,1),(381,1),(382,1),(383,1),(384,1),(386,1),(415,1),(459,1), +(460,1),(461,1),(464,1),(465,1),(466,1),(467,1),(468,1),(469,1),(470,1),(482,1),(483,1),(487,1),(488,1),(489,1),(490,1),(491,1),(494,1),(495,1),(496,1),(497,1),(499,1),(514,1),(523,1),(542,1), +(543,1),(576,1),(586,1),(633,1),(648,1),(649,1),(650,1),(651,1),(652,1),(653,1),(656,1),(658,1),(661,1),(663,1),(693,1),(713,1),(714,1),(727,1),(733,1),(734,1),(738,1),(739,1),(754,1),(770,1), +(777,1),(786,1),(789,1),(790,1),(791,1),(793,1),(809,1),(812,1),(820,1),(821,1),(823,1),(826,1),(827,1),(828,1),(829,1),(836,1),(837,1),(840,1),(842,1),(843,1),(844,1),(853,1),(857,1),(859,1), +(861,1),(862,1),(863,1),(864,1),(865,1),(866,1),(867,1),(868,1),(869,1),(870,1),(874,1),(876,1),(878,1),(885,1),(886,1),(887,1),(888,1),(893,1),(894,1),(895,1),(896,1),(897,1),(900,1),(903,1), +(904,1),(906,1),(907,1),(911,1),(912,1),(913,1),(914,1),(915,1),(916,1),(917,1),(918,1),(925,1),(926,1),(927,1),(928,1),(931,1),(932,1),(933,1),(934,1),(935,1),(936,1),(944,1),(945,1),(951,1), +(952,1),(954,1),(955,1),(956,1),(957,1),(958,1),(959,1),(960,1),(963,1),(980,1),(981,1),(982,1),(983,1),(984,1),(985,1),(986,1),(987,1),(988,1),(989,1),(999,1),(1000,1),(1001,1),(1058,1),(1064,1), +(1068,1),(1070,1),(1071,1),(1072,1),(1073,1),(1074,1),(1075,1),(1076,1),(1077,1),(1078,1),(1089,1),(1090,1),(1091,1),(1092,1),(1093,1),(1098,1),(1099,1),(1100,1),(1101,1),(1103,1),(1104,1),(1105,1), +(1139,1),(1141,1),(1146,1),(1147,1),(1148,1),(1149,1),(1153,1),(1154,1),(1155,1),(1156,1),(1182,1),(1187,1),(1198,1),(1203,1),(1204,1),(1212,1),(1213,1),(1214,1),(1215,1),(1217,1),(1218,1),(1226,1), +(1228,1),(1229,1),(1230,1),(1231,1),(1232,1),(1233,1),(1234,1),(1235,1),(1237,1),(1238,1),(1239,1),(1240,1),(1241,1),(1242,1),(1243,1),(1244,1),(1245,1),(1246,1),(1247,1),(1249,1),(1250,1),(1252,1), +(1254,1),(1255,1),(1256,1),(1257,1),(1261,1),(1265,1),(1266,1),(1267,1),(1268,1),(1269,1),(1273,1),(1274,1),(1275,1),(1276,1),(1277,1),(1278,1),(1279,1),(1280,1),(1281,1),(1282,1),(1283,1),(1284,1), +(1285,1),(1286,1),(1287,1),(1288,1),(1289,1),(1290,1),(1291,1),(1292,1),(1293,1),(1294,1),(1295,1),(1296,1),(1297,1),(1298,1),(1299,1),(1300,1),(1301,1),(1302,1),(1303,1),(1304,1),(1305,1),(1306,1), +(1307,1),(1308,1),(1309,1),(1310,1),(1311,1),(1312,1),(1313,1),(1314,1),(1315,1),(1316,1),(1317,1),(1318,1),(1319,1),(1320,1),(1321,1),(1322,1),(1323,1),(1324,1),(1325,1),(1326,1),(1327,1),(1328,1), +(1329,1),(1330,1),(1331,1),(1332,1),(1333,1),(1334,1),(1335,1),(1336,1),(1337,1),(1338,1),(1339,1),(1340,1),(1341,1),(1342,1),(1343,1),(1344,1),(1345,1),(1346,1),(1347,1),(1348,1),(1349,1),(1350,1), +(1351,1),(1354,1),(1355,1),(1356,1),(1358,1),(1360,1),(1362,1),(1365,1),(1373,1),(1374,1),(1375,1),(1376,1),(1377,1),(1378,1),(1379,1),(1381,1),(1382,1),(1383,1),(1384,1),(1385,1),(1386,1),(1387,1), +(1395,1),(1402,1),(1403,1),(1404,1),(1405,1),(1406,1),(1407,1),(1408,1),(1409,1),(1413,1),(1414,1),(1415,1),(1416,1),(1421,1),(1422,1),(1423,1),(1427,1),(1428,1),(1430,1),(1431,1),(1432,1),(1434,1), +(1435,1),(1436,1),(1437,1),(1439,1),(1440,1),(1441,1),(1442,1),(1443,1),(1444,1),(1448,1),(1450,1),(1451,1),(1452,1),(1453,1),(1454,1),(1456,1),(1457,1),(1458,1),(1459,1),(1460,1),(1461,1),(1462,1), +(1463,1),(1464,1),(1465,1),(1466,1),(1467,1),(1469,1),(1470,1),(1471,1),(1472,1),(1473,1),(1474,1),(1475,1),(1476,1),(1477,1),(1478,1),(1479,1),(1480,1),(1481,1),(1482,1),(1483,1),(1484,1),(1485,1), +(1495,1),(1496,1),(1497,1),(1498,1),(1499,1),(1500,1),(1515,1),(1518,1),(1519,1),(1521,1),(1546,1),(1560,1),(1567,1),(1568,1),(1569,1),(1570,1),(1571,1),(1572,1),(1573,1),(1632,1),(1642,1),(1644,1), +(1645,1),(1646,1),(1649,1),(1650,1),(1651,1),(1652,1),(1661,1),(1668,1),(1670,1),(1671,1),(1676,1),(1677,1),(1678,1),(1679,1),(1680,1),(1681,1),(1682,1),(1683,1),(1684,1),(1685,1),(1686,1),(1687,1), +(1690,1),(1691,1),(1692,1),(1694,1),(1695,1),(1697,1),(1698,1),(1699,1),(1700,1),(1701,1),(1702,1),(1703,1),(1719,1),(1721,1),(1733,1),(1735,1),(1736,1),(1737,1),(1738,1),(1739,1),(1740,1),(1741,1), +(1742,1),(1743,1),(1744,1),(1745,1),(1746,1),(1748,1),(1749,1),(1750,1),(1751,1),(1752,1),(1754,1),(1756,1),(1775,1),(1777,1),(1854,1),(1872,1),(1879,1),(1901,1),(1937,1),(1938,1),(1949,1),(1950,1), +(1951,1),(1952,1),(1959,1),(1960,1),(1963,1),(1975,1),(1976,1),(1977,1),(1978,1),(1992,1),(2041,1),(2046,1),(2050,1),(2055,1),(2057,1),(2058,1),(2077,1),(2078,1),(2079,1),(2080,1),(2081,1),(2082,1), +(2083,1),(2084,1),(2086,1),(2092,1),(2093,1),(2094,1),(2096,1),(2097,1),(2099,1),(2104,1),(2105,1),(2107,1),(2111,1),(2112,1),(2113,1),(2114,1),(2115,1),(2116,1),(2117,1),(2118,1),(2119,1),(2121,1), +(2122,1),(2123,1),(2124,1),(2126,1),(2127,1),(2128,1),(2129,1),(2130,1),(2131,1),(2132,1),(2133,1),(2134,1),(2135,1),(2136,1),(2137,1),(2140,1),(2142,1),(2151,1),(2153,1),(2198,1),(2209,1),(2210,1), +(2214,1),(2215,1),(2216,1),(2225,1),(2226,1),(2227,1),(2228,1),(2229,1),(2238,1),(2239,1),(2263,1),(2276,1),(2277,1),(2278,1),(2279,1),(2280,1),(2285,1),(2299,1),(2302,1),(2303,1),(2307,1),(2308,1), +(2309,1),(2310,1),(2311,1),(2314,1),(2315,1),(2316,1),(2326,1),(2327,1),(2329,1),(2330,1),(2352,1),(2357,1),(2361,1),(2362,1),(2363,1),(2364,1),(2365,1),(2366,1),(2367,1),(2378,1),(2379,1),(2380,1), +(2381,1),(2382,1),(2383,1),(2386,1),(2388,1),(2389,1),(2390,1),(2391,1),(2392,1),(2393,1),(2394,1),(2395,1),(2396,1),(2397,1),(2398,1),(2399,1),(2400,1),(2401,1),(2402,1),(2405,1),(2409,1),(2410,1), +(2418,1),(2419,1),(2424,1),(2425,1),(2429,1),(2430,1),(2432,1),(2436,1),(2437,1),(2438,1),(2439,1),(2455,1),(2456,1),(2457,1),(2458,1),(2459,1),(2460,1),(2461,1),(2464,1),(2465,1),(2466,1),(2468,1), +(2469,1),(2470,1),(2485,1),(2489,1),(2492,1),(2497,1),(2504,1),(2506,1),(2507,1),(2508,1),(2509,1),(2510,1),(2511,1),(2512,1),(2513,1),(2514,1),(2515,1),(2516,1),(2517,1),(2518,1),(2519,1),(2524,1), +(2525,1),(2526,1),(2527,1),(2528,1),(2608,1),(2621,1),(2668,1),(2669,1),(2679,1),(2682,1),(2695,1),(2696,1),(2697,1),(2698,1),(2700,1),(2702,1),(2703,1),(2704,1),(2705,1),(2706,1),(2708,1),(2709,1), +(2710,1),(2711,1),(2712,1),(2713,1),(2737,1),(2770,1),(2771,1),(2772,1),(2784,1),(2786,1),(2787,1),(2788,1),(2789,1),(2790,1),(2792,1),(2795,1),(2796,1),(2798,1),(2799,1),(2802,1),(2803,1),(2804,1), +(2805,1),(2806,1),(2808,1),(2809,1),(2810,1),(2812,1),(2814,1),(2816,1),(2818,1),(2819,1),(2820,1),(2821,1),(2833,1),(2835,1),(2851,1),(2855,1),(2856,1),(2857,1),(2858,1),(2859,1),(2860,1),(2861,1), +(2870,1),(2872,1),(2876,1),(2878,1),(2879,1),(2880,1),(2881,1),(2908,1),(2909,1),(2910,1),(2911,1),(2912,1),(2913,1),(2916,1),(2917,1),(2918,1),(2930,1),(2934,1),(2938,1),(2940,1),(2941,1),(2942,1), +(2947,1),(2948,1),(2980,1),(2981,1),(2982,1),(2984,1),(2985,1),(2986,1),(2987,1),(2988,1),(2991,1),(2993,1),(2995,1),(2996,1),(2997,1),(2998,1),(2999,1),(3001,1),(3002,1),(3003,1),(3004,1),(3005,1), +(3007,1),(3008,1),(3009,1),(3010,1),(3011,1),(3012,1),(3013,1),(3014,1),(3015,1),(3016,1),(3017,1),(3018,1),(3019,1),(3020,1),(3021,1),(3022,1),(3023,1),(3024,1),(3025,1),(3026,1),(3027,1),(3028,1), +(3029,1),(3030,1),(3031,1),(3032,1),(3033,1),(3034,1),(3036,1),(3037,1),(3038,1),(3039,1),(3040,1),(3041,1),(3042,1),(3043,1),(3044,1),(3045,1),(3046,1),(3047,1),(3048,1),(3049,1),(3050,1),(3052,1), +(3053,1),(3054,1),(3055,1),(3057,1),(3059,1),(3060,1),(3061,1),(3062,1),(3063,1),(3064,1),(3065,1),(3066,1),(3067,1),(3069,1),(3070,1),(3071,1),(3072,1),(3074,1),(3075,1),(3076,1),(3077,1),(3078,1), +(3079,1),(3080,1),(3081,1),(3082,1),(3083,1),(3084,1),(3085,1),(3086,1),(3087,1),(3088,1),(3089,1),(3090,1),(3091,1),(3092,1),(3093,1),(3095,1),(3097,1),(3133,1),(3135,1),(3136,1),(3137,1),(3138,1), +(3139,1),(3140,1),(3142,1),(3143,1),(3144,1),(3145,1),(3147,1),(3148,1),(3149,1),(3150,1),(3153,1),(3154,1),(3155,1),(3156,1),(3157,1),(3158,1),(3159,1),(3160,1),(3161,1),(3162,1),(3163,1),(3164,1), +(3165,1),(3166,1),(3167,1),(3168,1),(3169,1),(3170,1),(3171,1),(3172,1),(3173,1),(3174,1),(3175,1),(3176,1),(3177,1),(3178,1),(3179,1),(3181,1),(3182,1),(3184,1),(3185,1),(3186,1),(3187,1),(3188,1), +(3189,1),(3190,1),(3191,1),(3193,1),(3194,1),(3208,1),(3210,1),(3211,1),(3212,1),(3213,1),(3214,1),(3215,1),(3216,1),(3217,1),(3218,1),(3219,1),(3220,1),(3221,1),(3222,1),(3223,1),(3224,1),(3230,1), +(3233,1),(3287,1),(3290,1),(3291,1),(3292,1),(3294,1),(3296,1),(3297,1),(3298,1),(3299,1),(3304,1),(3305,1),(3306,1),(3310,1),(3312,1),(3313,1),(3314,1),(3315,1),(3316,1),(3317,1),(3319,1),(3321,1), +(3322,1),(3323,1),(3324,1),(3325,1),(3326,1),(3327,1),(3328,1),(3329,1),(3330,1),(3331,1),(3332,1),(3333,1),(3334,1),(3335,1),(3336,1),(3337,1),(3338,1),(3341,1),(3342,1),(3343,1),(3344,1),(3345,1), +(3346,1),(3347,1),(3348,1),(3349,1),(3350,1),(3351,1),(3352,1),(3353,1),(3354,1),(3355,1),(3356,1),(3357,1),(3358,1),(3359,1),(3360,1),(3361,1),(3362,1),(3363,1),(3364,1),(3365,1),(3366,1),(3367,1), +(3368,1),(3369,1),(3370,1),(3371,1),(3372,1),(3373,1),(3387,1),(3388,1),(3389,1),(3390,1),(3399,1),(3400,1),(3401,1),(3402,1),(3403,1),(3404,1),(3405,1),(3406,1),(3407,1),(3408,1),(3409,1),(3410,1), +(3411,1),(3418,1),(3419,1),(3420,1),(3421,1),(3428,1),(3429,1),(3430,1),(3431,1),(3432,1),(3433,1),(3440,1),(3441,1),(3443,1),(3447,1),(3448,1),(3449,1),(3454,1),(3455,1),(3464,1),(3468,1),(3469,1), +(3477,1),(3478,1),(3479,1),(3480,1),(3481,1),(3482,1),(3483,1),(3484,1),(3485,1),(3486,1),(3487,1),(3488,1),(3489,1),(3490,1),(3500,1),(3501,1),(3514,1),(3515,1),(3516,1),(3517,1),(3518,1),(3519,1), +(3520,1),(3521,1),(3522,1),(3523,1),(3525,1),(3539,1),(3540,1),(3541,1),(3542,1),(3543,1),(3544,1),(3545,1),(3546,1),(3547,1),(3548,1),(3549,1),(3550,1),(3551,1),(3552,1),(3553,1),(3554,1),(3555,1), +(3556,1),(3557,1),(3558,1),(3559,1),(3561,1),(3562,1),(3564,1),(3565,1),(3567,1),(3568,1),(3571,1),(3575,1),(3583,1),(3584,1),(3585,1),(3587,1),(3588,1),(3589,1),(3590,1),(3591,1),(3592,1),(3593,1), +(3594,1),(3595,1),(3596,1),(3597,1),(3598,1),(3599,1),(3600,1),(3601,1),(3602,1),(3603,1),(3604,1),(3605,1),(3606,1),(3607,1),(3608,1),(3609,1),(3610,1),(3611,1),(3612,1),(3613,1),(3614,1),(3615,1), +(3616,1),(3620,1),(3621,1),(3622,1),(3623,1),(3624,1),(3625,1),(3626,1),(3627,1),(3628,1),(3629,1),(3639,1),(3644,1),(3649,1),(3650,1),(3657,1),(3661,1),(3663,1),(3666,1),(3681,1),(3682,1),(3685,1), +(3688,1),(3689,1),(3690,1),(3691,1),(3692,1),(3693,1),(3694,1),(3695,1),(3699,1),(3700,1),(3701,1),(3702,1),(3703,1),(3704,1),(3705,1),(3706,1),(3707,1),(3708,1),(3779,1),(3836,1),(3838,1),(3841,1), +(3842,1),(3845,1),(3846,1),(3847,1),(3848,1),(3849,1),(3880,1),(3881,1),(3882,1),(3883,1),(3884,1),(3885,1),(3890,1),(3894,1),(3895,1),(3896,1),(3901,1),(3916,1),(3920,1),(3933,1),(3934,1),(3935,1), +(3936,1),(3937,1),(3948,1),(3951,1),(3952,1),(3953,1),(3954,1),(3955,1),(3956,1),(3957,1),(3958,1),(3959,1),(3960,1),(3961,1),(3962,1),(3963,1),(3964,1),(3965,1),(3966,1),(3967,1),(3969,1),(3970,1), +(3978,1),(3979,1),(3980,1),(3982,1),(3994,1),(3995,1),(3996,1),(4043,1),(4046,1),(4047,1),(4048,1),(4049,1),(4077,1),(4078,1),(4079,1),(4080,1),(4081,1),(4082,1),(4083,1),(4084,1),(4087,1),(4088,1), +(4089,1),(4090,1),(4091,1),(4092,1),(4138,1),(4146,1),(4149,1),(4153,1),(4155,1),(4156,1),(4157,1),(4159,1),(4160,1),(4161,1),(4163,1),(4164,1),(4165,1),(4167,1),(4168,1),(4169,1),(4170,1),(4171,1), +(4172,1),(4173,1),(4175,1),(4176,1),(4177,1),(4178,1),(4179,1),(4180,1),(4181,1),(4182,1),(4183,1),(4185,1),(4186,1),(4187,1),(4188,1),(4189,1),(4190,1),(4191,1),(4192,1),(4193,1),(4194,1),(4195,1), +(4197,1),(4198,1),(4200,1),(4203,1),(4204,1),(4205,1),(4206,1),(4207,1),(4208,1),(4209,1),(4210,1),(4211,1),(4212,1),(4213,1),(4214,1),(4215,1),(4216,1),(4217,1),(4218,1),(4219,1),(4220,1),(4221,1), +(4222,1),(4223,1),(4225,1),(4226,1),(4228,1),(4229,1),(4230,1),(4231,1),(4232,1),(4233,1),(4234,1),(4235,1),(4236,1),(4237,1),(4239,1),(4240,1),(4241,1),(4242,1),(4243,1),(4244,1),(4254,1),(4255,1), +(4256,1),(4257,1),(4258,1),(4259,1),(4262,1),(4265,1),(4266,1),(4267,1),(4305,1),(4307,1),(4309,1),(4310,1),(4311,1),(4312,1),(4314,1),(4317,1),(4319,1),(4320,1),(4321,1),(4407,1),(4423,1),(4444,1), +(4451,1),(4455,1),(4456,1),(4483,1),(4484,1),(4485,1),(4486,1),(4487,1),(4488,1),(4489,1),(4497,1),(4498,1),(4501,1),(4502,1),(4509,1),(4510,1),(4521,1),(4544,1),(4545,1),(4546,1),(4547,1),(4549,1), +(4550,1),(4551,1),(4552,1),(4553,1),(4554,1),(4555,1),(4556,1),(4557,1),(4558,1),(4559,1),(4560,1),(4561,1),(4562,1),(4563,1),(4564,1),(4565,1),(4566,1),(4567,1),(4568,1),(4569,1),(4570,1),(4571,1), +(4572,1),(4573,1),(4574,1),(4575,1),(4576,1),(4577,1),(4578,1),(4579,1),(4580,1),(4581,1),(4582,1),(4583,1),(4584,1),(4585,1),(4586,1),(4587,1),(4588,1),(4589,1),(4590,1),(4591,1),(4592,1),(4593,1), +(4594,1),(4595,1),(4596,1),(4597,1),(4598,1),(4599,1),(4600,1),(4601,1),(4602,1),(4603,1),(4604,1),(4605,1),(4606,1),(4607,1),(4608,1),(4609,1),(4610,1),(4611,1),(4612,1),(4613,1),(4614,1),(4615,1), +(4616,1),(4617,1),(4621,1),(4721,1),(4722,1),(4730,1),(4731,1),(4732,1),(4752,1),(4753,1),(4772,1),(4773,1),(4775,1),(4782,1),(4791,1),(4794,1),(4875,1),(4876,1),(4877,1),(4878,1),(4879,1),(4881,1), +(4882,1),(4883,1),(4884,1),(4885,1),(4886,1),(4888,1),(4889,1),(4890,1),(4891,1),(4892,1),(4893,1),(4894,1),(4895,1),(4896,1),(4897,1),(4898,1),(4899,1),(4900,1),(4902,1),(4921,1),(4922,1),(4923,1), +(4924,1),(4926,1),(4941,1),(4942,1),(4943,1),(4944,1),(4947,1),(4948,1),(4949,1),(4951,1),(4954,1),(4959,1),(4960,1),(4961,1),(4963,1),(4964,1),(4965,1),(4966,1),(4967,1),(4968,1),(4973,1),(4974,1), +(4976,1),(4979,1),(4981,1),(4983,1),(4984,1),(4995,1),(4996,1),(5042,1),(5047,1),(5049,1),(5050,1),(5051,1),(5052,1),(5054,1),(5081,1),(5082,1),(5083,1),(5084,1),(5087,1),(5090,1),(5091,1),(5092,1), +(5093,1),(5094,1),(5095,1),(5096,1),(5099,1),(5100,1),(5101,1),(5102,1),(5103,1),(5104,1),(5105,1),(5106,1),(5107,1),(5108,1),(5109,1),(5110,1),(5111,1),(5112,1),(5113,1),(5114,1),(5115,1),(5116,1), +(5117,1),(5118,1),(5119,1),(5120,1),(5121,1),(5122,1),(5123,1),(5124,1),(5125,1),(5126,1),(5127,1),(5128,1),(5129,1),(5130,1),(5131,1),(5132,1),(5133,1),(5134,1),(5135,1),(5137,1),(5138,1),(5139,1), +(5140,1),(5141,1),(5142,1),(5143,1),(5144,1),(5145,1),(5146,1),(5147,1),(5148,1),(5149,1),(5150,1),(5151,1),(5152,1),(5153,1),(5154,1),(5155,1),(5156,1),(5157,1),(5158,1),(5159,1),(5160,1),(5161,1), +(5162,1),(5163,1),(5164,1),(5165,1),(5166,1),(5167,1),(5169,1),(5170,1),(5171,1),(5172,1),(5173,1),(5174,1),(5175,1),(5177,1),(5178,1),(5188,1),(5189,1),(5190,1),(5191,1),(5192,1),(5193,1),(5199,1), +(5200,1),(5204,1),(5384,1),(5385,1),(5386,1),(5387,1),(5388,1),(5389,1),(5390,1),(5392,1),(5393,1),(5394,1),(5395,1),(5396,1),(5412,1),(5413,1),(5414,1),(5418,1),(5464,1),(5476,1),(5479,1),(5480,1), +(5482,1),(5483,1),(5484,1),(5489,1),(5491,1),(5492,1),(5493,1),(5494,1),(5495,1),(5496,1),(5497,1),(5498,1),(5499,1),(5500,1),(5501,1),(5502,1),(5503,1),(5504,1),(5505,1),(5506,1),(5507,1),(5508,1), +(5509,1),(5510,1),(5511,1),(5512,1),(5513,1),(5514,1),(5515,1),(5516,1),(5517,1),(5518,1),(5519,1),(5520,1),(5543,1),(5544,1),(5546,1),(5547,1),(5564,1),(5565,1),(5566,1),(5567,1),(5569,1),(5570,1), +(5591,1),(5592,1),(5593,1),(5595,1),(5597,1),(5599,1),(5603,1),(5605,1),(5606,1),(5609,1),(5610,1),(5611,1),(5612,1),(5613,1),(5614,1),(5620,1),(5624,1),(5635,1),(5636,1),(5637,1),(5638,1),(5639,1), +(5640,1),(5641,1),(5642,1),(5644,1),(5651,1),(5653,1),(5654,1),(5655,1),(5656,1),(5657,1),(5658,1),(5659,1),(5660,1),(5661,1),(5662,1),(5663,1),(5664,1),(5665,1),(5667,1),(5668,1),(5670,1),(5675,1), +(5679,1),(5688,1),(5690,1),(5693,1),(5694,1),(5695,1),(5696,1),(5698,1),(5699,1),(5700,1),(5701,1),(5702,1),(5703,1),(5704,1),(5705,1),(5706,1),(5707,1),(5724,1),(5725,1),(5731,1),(5732,1),(5733,1), +(5734,1),(5744,1),(5747,1),(5748,1),(5749,1),(5750,1),(5752,1),(5753,1),(5754,1),(5757,1),(5758,1),(5759,1),(5765,1),(5769,1),(5770,1),(5782,1),(5810,1),(5811,1),(5812,1),(5813,1),(5814,1),(5815,1), +(5816,1),(5817,1),(5819,1),(5820,1),(5821,1),(5870,1),(5871,1),(5875,1),(5878,1),(5880,1),(5882,1),(5883,1),(5884,1),(5885,1),(5886,1),(5887,1),(5888,1),(5892,1),(5899,1),(5900,1),(5904,1),(5905,1), +(5906,1),(5907,1),(5908,1),(5909,1),(5910,1),(5911,1),(5917,1),(5938,1),(5939,1),(5940,1),(5941,1),(5942,1),(5943,1),(5944,1),(5952,1),(5953,1),(5957,1),(5958,1),(5994,1),(6014,1),(6018,1),(6026,1), +(6027,1),(6028,1),(6030,1),(6031,1),(6034,1),(6046,1),(6086,1),(6087,1),(6089,1),(6090,1),(6091,1),(6094,1),(6114,1),(6119,1),(6120,1),(6121,1),(6122,1),(6142,1),(6166,1),(6169,1),(6171,1),(6172,1), +(6173,1),(6174,1),(6175,1),(6177,1),(6178,1),(6179,1),(6181,1),(6182,1),(6183,1),(6237,1),(6241,1),(6244,1),(6267,1),(6272,1),(6286,1),(6287,1),(6288,1),(6289,1),(6290,1),(6291,1),(6292,1),(6293,1), +(6294,1),(6295,1),(6297,1),(6298,1),(6299,1),(6300,1),(6301,1),(6306,1),(6328,1),(6367,1),(6373,1),(6374,1),(6376,1),(6382,1),(6387,1),(6389,1),(6393,1),(6394,1),(6395,1),(6408,1),(6410,1),(6411,1), +(6446,1),(6467,1),(6522,1),(6526,1),(6566,1),(6567,1),(6569,1),(6574,1),(6576,1),(6577,1),(6579,1),(6586,1),(6607,1),(6667,1),(6670,1),(6706,1),(6726,1),(6727,1),(6732,1),(6734,1),(6735,1),(6736,1), +(6737,1),(6738,1),(6739,1),(6740,1),(6741,1),(6746,1),(6747,1),(6749,1),(6774,1),(6775,1),(6776,1),(6778,1),(6780,1),(6781,1),(6784,1),(6785,1),(6786,1),(6787,1),(6790,1),(6806,1),(6826,1),(6868,1), +(6886,1),(6928,1),(6929,1),(6930,1),(6946,1),(6966,1),(6986,1),(6987,1),(7007,1),(7009,1),(7010,1),(7024,1),(7087,1),(7088,1),(7089,1),(7208,1),(7229,1),(7230,1),(7231,1),(7232,1),(7292,1),(7293,1), +(7294,1),(7295,1),(7296,1),(7297,1),(7298,1),(7311,1),(7312,1),(7313,1),(7315,1),(7316,1),(7317,1),(7410,1),(7427,1),(7485,1),(7488,1),(7489,1),(7583,1),(7623,1),(7643,1),(7663,1),(7683,1),(7714,1), +(7730,1),(7731,1),(7733,1),(7736,1),(7737,1),(7740,1),(7744,1),(7763,1),(7764,1),(7765,1),(7766,1),(7776,1),(7777,1),(7779,1),(7780,1),(7790,1),(7792,1),(7793,1),(7798,1),(7823,1),(7824,1),(7825,1), +(7843,1),(7852,1),(7854,1),(7865,1),(7866,1),(7867,1),(7868,1),(7869,1),(7870,1),(7871,1),(7875,1),(7877,1),(7878,1),(7879,1),(7880,1),(7884,1),(7900,1),(7903,1),(7904,1),(7906,1),(7907,1),(7916,1), +(7917,1),(7935,1),(7937,1),(7939,1),(7940,1),(7941,1),(7942,1),(7943,1),(7944,1),(7945,1),(7946,1),(7947,1),(7948,1),(7949,1),(7950,1),(7952,1),(7953,1),(7954,1),(7955,1),(7956,1),(7957,1),(7975,1), +(7976,1),(7978,1),(7980,1),(7999,1),(8015,1),(8016,1),(8017,1),(8018,1),(8019,1),(8020,1),(8021,1),(8022,1),(8026,1),(8055,1),(8096,1),(8115,1),(8117,1),(8118,1),(8140,1),(8141,1),(8142,1),(8143,1), +(8144,1),(8145,1),(8146,1),(8147,1),(8148,1),(8150,1),(8151,1),(8152,1),(8153,1),(8154,1),(8155,1),(8157,1),(8158,1),(8159,1),(8160,1),(8161,1),(8176,1),(8177,1),(8178,1),(8256,1),(8284,1),(8306,1), +(8307,1),(8310,1),(8356,1),(8357,1),(8358,1),(8359,1),(8360,1),(8361,1),(8362,1),(8363,1),(8364,1),(8383,1),(8385,1),(8390,1),(8392,1),(8393,1),(8396,1),(8397,1),(8398,1),(8401,1),(8403,1),(8404,1), +(8416,1),(8436,1),(8507,1),(8508,1),(8517,1),(8576,1),(8582,1),(8583,1),(8584,1),(8586,1),(8587,1),(8609,1),(8610,1),(8659,1),(8664,1),(8665,1),(8669,1),(8670,1),(8671,1),(8672,1),(8674,1),(8681,1), +(8719,1),(8720,1),(8721,1),(8722,1),(8723,1),(8777,1),(8856,1),(8878,1),(8879,1),(8931,1),(8934,1),(8997,1),(9047,1),(9076,1),(9077,1),(9078,1),(9079,1),(9080,1),(9081,1),(9082,1),(9083,1),(9084,1), +(9085,1),(9086,1),(9087,1),(9099,1),(9177,1),(9238,1),(9296,1),(9297,1),(9356,1),(9457,1),(9458,1),(9465,1),(9501,1),(9521,1),(9525,1),(9526,1),(9527,1),(9539,1),(9540,1),(9548,1),(9549,1),(9550,1), +(9551,1),(9552,1),(9553,1),(9555,1),(9560,1),(9561,1),(9562,1),(9564,1),(9565,1),(9566,1),(9576,1),(9578,1),(9579,1),(9580,1),(9581,1),(9582,1),(9584,1),(9598,1),(9599,1),(9616,1),(9617,1),(9620,1), +(9636,1),(9660,1),(9796,1),(9820,1),(9857,1),(9858,1),(9859,1),(9976,1),(9977,1),(9978,1),(9979,1),(9980,1),(9981,1),(9982,1),(9983,1),(9984,1),(9985,1),(9986,1),(9987,1),(9988,1),(9989,1),(9990,1), +(9996,1),(10037,1),(10038,1),(10045,1),(10046,1),(10047,1),(10048,1),(10049,1),(10050,1),(10051,1),(10052,1),(10053,1),(10054,1),(10055,1),(10056,1),(10057,1),(10058,1),(10059,1),(10061,1), +(10062,1),(10079,1),(10085,1),(10086,1),(10088,1),(10089,1),(10090,1),(10118,1),(10136,1),(10176,1),(10181,1),(10182,1),(10204,1),(10216,1),(10219,1),(10266,1),(10276,1),(10277,1),(10278,1), +(10291,1),(10292,1),(10293,1),(10294,1),(10295,1),(10297,1),(10298,1),(10301,1),(10303,1),(10306,1),(10307,1),(10360,1),(10361,1),(10362,1),(10364,1),(10365,1),(10367,1),(10368,1),(10369,1), +(10370,1),(10377,1),(10378,1),(10379,1),(10380,1),(10427,1),(10428,1),(10443,1),(10444,1),(10446,1),(10448,1),(10449,1),(10450,1),(10451,1),(10452,1),(10453,1),(10454,1),(10455,1),(10456,1), +(10460,1),(10537,1),(10539,1),(10540,1),(10578,1),(10582,1),(10583,1),(10599,1),(10600,1),(10604,1),(10606,1),(10610,1),(10611,1),(10612,1),(10616,1),(10618,1),(10619,1),(10636,1),(10638,1), +(10645,1),(10646,1),(10665,1),(10666,1),(10676,1),(10682,1),(10684,1),(10696,1),(10719,1),(10721,1),(10781,1),(10782,1),(10803,1),(10804,1),(10805,1),(10837,1),(10838,1),(10878,1),(10879,1), +(10880,1),(10881,1),(10897,1),(10919,1),(10930,1),(10978,1),(11022,1),(11023,1),(11025,1),(11026,1),(11028,1),(11029,1),(11031,1),(11037,1),(11040,1),(11041,1),(11042,1),(11044,1),(11045,1), +(11046,1),(11047,1),(11048,1),(11049,1),(11050,1),(11051,1),(11052,1),(11053,1),(11055,1),(11056,1),(11057,1),(11065,1),(11066,1),(11067,1),(11068,1),(11069,1),(11070,1),(11071,1),(11072,1), +(11074,1),(11079,1),(11081,1),(11083,1),(11084,1),(11096,1),(11097,1),(11098,1),(11103,1),(11104,1),(11105,1),(11106,1),(11116,1),(11117,1),(11118,1),(11137,1),(11138,1),(11139,1),(11145,1), +(11146,1),(11176,1),(11177,1),(11178,1),(11180,1),(11181,1),(11191,1),(11192,1),(11193,1),(11196,1),(11198,1),(11218,1),(11219,1),(11259,1),(11276,1),(11317,1),(11328,1),(11392,1),(11393,1), +(11394,1),(11395,1),(11396,1),(11397,1),(11398,1),(11399,1),(11400,1),(11401,1),(11402,1),(11403,1),(11404,1),(11405,1),(11406,1),(11407,1),(11408,1),(11409,1),(11410,1),(11411,1),(11412,1), +(11413,1),(11414,1),(11415,1),(11416,1),(11549,1),(11550,1),(11608,1),(11609,1),(11615,1),(11616,1),(11624,1),(11696,1),(11699,1),(11700,1),(11701,1),(11702,1),(11703,1),(11708,1),(11709,1), +(11712,1),(11715,1),(11716,1),(11717,1),(11718,1),(11719,1),(11720,1),(11748,1),(11749,1),(11750,1),(11751,1),(11752,1),(11795,1),(11797,1),(11799,1),(11800,1),(11801,1),(11802,1),(11806,1), +(11807,1),(11808,1),(11809,1),(11814,1),(11815,1),(11816,1),(11817,1),(11818,1),(11819,1),(11820,1),(11821,1),(11822,1),(11823,1),(11824,1),(11825,1),(11826,1),(11827,1),(11828,1),(11829,1), +(11833,1),(11835,1),(11856,1),(11857,1),(11860,1),(11861,1),(11862,1),(11863,1),(11864,1),(11865,1),(11866,1),(11867,1),(11868,1),(11869,1),(11870,1),(11877,1),(11878,1),(11885,1),(11899,1), +(11900,1),(11901,1),(11916,1),(11919,1),(11946,1),(11947,1),(11948,1),(11949,1),(11979,1),(11994,1),(11997,1),(11998,1),(12019,1),(12020,1),(12021,1),(12022,1),(12023,1),(12024,1),(12025,1), +(12026,1),(12027,1),(12028,1),(12029,1),(12030,1),(12031,1),(12032,1),(12033,1),(12035,1),(12036,1),(12038,1),(12039,1),(12040,1),(12042,1),(12043,1),(12044,1),(12045,1),(12047,1),(12048,1), +(12050,1),(12051,1),(12052,1),(12053,1),(12096,1),(12097,1),(12121,1),(12122,1),(12127,1),(12136,1),(12137,1),(12160,1),(12196,1),(12197,1),(12198,1),(12336,1),(12338,1),(12340,1),(12384,1), +(12423,1),(12425,1),(12427,1),(12428,1),(12429,1),(12430,1),(12480,1),(12481,1),(12576,1),(12577,1),(12578,1),(12580,1),(12596,1),(12616,1),(12617,1),(12636,1),(12656,1),(12657,1),(12658,1), +(12696,1),(12716,1),(12717,1),(12718,1),(12719,1),(12720,1),(12721,1),(12722,1),(12723,1),(12724,1),(12736,1),(12737,1),(12740,1),(12756,1),(12757,1),(12777,1),(12778,1),(12779,1),(12780,1), +(12781,1),(12782,1),(12783,1),(12784,1),(12785,1),(12786,1),(12787,1),(12788,1),(12789,1),(12790,1),(12791,1),(12792,1),(12793,1),(12794,1),(12795,1),(12796,1),(12797,1),(12798,1),(12799,1), +(12805,1),(12807,1),(12816,1),(12818,1),(12836,1),(12837,1),(12858,1),(12861,1),(12862,1),(12863,1),(12864,1),(12867,1),(12877,1),(12903,1),(12920,1),(12923,1),(12924,1),(12925,1),(12936,1), +(12937,1),(12938,1),(12939,1),(12960,1),(12961,1),(12962,1),(12996,1),(12997,1),(12998,1),(13000,1),(13018,1),(13076,1),(13078,1),(13079,1),(13080,1),(13084,1),(13086,1),(13087,1),(13088,1), +(13089,1),(13096,1),(13097,1),(13098,1),(13099,1),(13116,1),(13117,1),(13137,1),(13138,1),(13139,1),(13140,1),(13143,1),(13144,1),(13145,1),(13146,1),(13147,1),(13152,1),(13153,1),(13154,1), +(13155,1),(13161,1),(13176,1),(13177,1),(13178,1),(13179,1),(13180,1),(13181,1),(13216,1),(13217,1),(13218,1),(13219,1),(13221,1),(13236,1),(13256,1),(13257,1),(13283,1),(13284,1),(13296,1), +(13297,1),(13298,1),(13299,1),(13300,1),(13316,1),(13318,1),(13319,1),(13320,1),(13324,1),(13325,1),(13326,1),(13327,1),(13328,1),(13329,1),(13330,1),(13331,1),(13332,1),(13333,1),(13334,1), +(13335,1),(13336,1),(13337,1),(13356,1),(13357,1),(13358,1),(13359,1),(13397,1),(13417,1),(13418,1),(13419,1),(13420,1),(13421,1),(13422,1),(13424,1),(13425,1),(13426,1),(13427,1),(13428,1), +(13429,1),(13430,1),(13431,1),(13432,1),(13433,1),(13434,1),(13435,1),(13436,1),(13437,1),(13438,1),(13439,1),(13440,1),(13441,1),(13442,1),(13443,1),(13446,1),(13447,1),(13448,1),(13449,1), +(13476,1),(13516,1),(13517,1),(13518,1),(13519,1),(13520,1),(13521,1),(13522,1),(13523,1),(13524,1),(13525,1),(13526,1),(13527,1),(13528,1),(13529,1),(13530,1),(13531,1),(13534,1),(13535,1), +(13536,1),(13537,1),(13538,1),(13539,1),(13540,1),(13541,1),(13542,1),(13543,1),(13544,1),(13545,1),(13546,1),(13547,1),(13548,1),(13549,1),(13550,1),(13551,1),(13552,1),(13553,1),(13554,1), +(13555,1),(13556,1),(13557,1),(13576,1),(13577,1),(13597,1),(13598,1),(13616,1),(13617,1),(13618,1),(13656,1),(13676,1),(13698,1),(13699,1),(13776,1),(13777,1),(13797,1),(13798,1),(13816,1), +(13817,1),(13839,1),(13840,1),(13841,1),(13842,1),(13843,1),(14041,1),(14121,1),(14141,1),(14142,1),(14182,1),(14185,1),(14186,1),(14187,1),(14188,1),(14201,1),(14242,1),(14282,1),(14283,1), +(14284,1),(14285,1),(14301,1),(14304,1),(14363,1),(14365,1),(14367,1),(14373,1),(14374,1),(14375,1),(14376,1),(14377,1),(14378,1),(14379,1),(14380,1),(14392,1),(14394,1),(14402,1),(14403,1), +(14404,1),(14423,1),(14438,1),(14439,1),(14440,1),(14441,1),(14442,1),(14484,1),(14485,1),(14493,1),(14494,1),(14497,1),(14498,1),(14581,1),(14622,1),(14643,1),(14644,1),(14715,1),(14717,1), +(14718,1),(14720,1),(14721,1),(14730,1),(14731,1),(14733,1),(14734,1),(14736,1),(14737,1),(14738,1),(14739,1),(14740,1),(14741,1),(14746,1),(14753,1),(14754,1),(14757,1),(14762,1),(14763,1), +(14764,1),(14765,1),(14766,1),(14767,1),(14768,1),(14769,1),(14770,1),(14771,1),(14772,1),(14773,1),(14774,1),(14775,1),(14776,1),(14777,1),(14781,1),(14848,1),(14859,1),(14893,1),(14901,1), +(14909,1),(14913,1),(14942,1),(14943,1),(14944,1),(14945,1),(14946,1),(14947,1),(14948,1),(14961,1),(14962,1),(14963,1),(14964,1),(14981,1),(14982,1),(14983,1),(14984,1),(14990,1),(15006,1), +(15007,1),(15008,1),(15011,1),(15012,1),(15021,1),(15022,1),(15102,1),(15103,1),(15105,1),(15106,1),(15124,1),(15125,1),(15126,1),(15127,1),(15128,1),(15130,1),(15131,1),(15136,1),(15137,1), +(15138,1),(15139,1),(15177,1),(15178,1),(15193,1),(15195,1),(15197,1),(15199,1),(15270,1),(15278,1),(15279,1),(15280,1),(15281,1),(15283,1),(15284,1),(15285,1),(15287,1),(15289,1),(15291,1), +(15292,1),(15295,1),(15296,1),(15297,1),(15301,1),(15315,1),(15350,1),(15351,1),(15371,1),(15383,1),(15398,1),(15399,1),(15400,1),(15401,1),(15402,1),(15403,1),(15404,1),(15405,1),(15406,1), +(15416,1),(15417,1),(15418,1),(15419,1),(15431,1),(15432,1),(15433,1),(15434,1),(15437,1),(15440,1),(15441,1),(15442,1),(15443,1),(15444,1),(15445,1),(15446,1),(15448,1),(15450,1),(15451,1), +(15452,1),(15453,1),(15455,1),(15456,1),(15457,1),(15458,1),(15459,1),(15460,1),(15469,1),(15471,1),(15473,1),(15477,1),(15494,1),(15501,1),(15508,1),(15512,1),(15513,1),(15515,1),(15518,1), +(15519,1),(15522,1),(15525,1),(15528,1),(15529,1),(15532,1),(15533,1),(15534,1),(15535,1),(15539,1),(15612,1),(15613,1),(15615,1),(15616,1),(15617,1),(15618,1),(15619,1),(15633,1),(15634,1), +(15659,1),(15660,1),(15663,1),(15672,1),(15675,1),(15676,1),(15677,1),(15678,1),(15679,1),(15680,1),(15681,1),(15682,1),(15683,1),(15684,1),(15686,1),(15694,1),(15696,1),(15700,1),(15701,1), +(15702,1),(15703,1),(15704,1),(15707,1),(15708,1),(15709,1),(15719,1),(15723,1),(15731,1),(15732,1),(15733,1),(15734,1),(15735,1),(15736,1),(15737,1),(15738,1),(15739,1),(15745,1),(15746,1), +(15760,1),(15761,1),(15762,1),(15763,1),(15764,1),(15765,1),(15766,1),(15767,1),(15768,1),(15780,1),(15781,1),(15782,1),(15783,1),(15784,1),(15785,1),(15786,1),(15787,1),(15788,1),(15789,1), +(15790,1),(15791,1),(15792,1),(15793,1),(15794,1),(15795,1),(15852,1),(15853,1),(15854,1),(15855,1),(15856,1),(15857,1),(15858,1),(15859,1),(15860,1),(15861,1),(15862,1),(15863,1),(15866,1), +(15868,1),(15869,1),(15870,1),(15903,1),(15905,1),(15906,1),(15907,1),(15908,1),(15920,1),(15921,1),(15924,1),(15938,1),(15939,1),(15940,1),(15941,1),(15942,1),(15945,1),(15946,1),(15947,1), +(15970,1),(15971,1),(15982,1),(15983,1),(15991,1),(16001,1),(16002,1),(16003,1),(16004,1),(16005,1),(16007,1),(16008,1),(16009,1),(16012,1),(16013,1),(16014,1),(16016,1),(16019,1),(16023,1), +(16031,1),(16032,1),(16033,1),(16091,1),(16094,1),(16096,1),(16105,1),(16106,1),(16107,1),(16108,1),(16109,1),(16110,1),(16112,1),(16113,1),(16114,1),(16115,1),(16116,1),(16123,1),(16131,1), +(16132,1),(16133,1),(16134,1),(16135,1),(16144,1),(16147,1),(16160,1),(16161,1),(16185,1),(16186,1),(16187,1),(16189,1),(16191,1),(16192,1),(16197,1),(16213,1),(16217,1),(16220,1),(16221,1), +(16222,1),(16224,1),(16227,1),(16231,1),(16237,1),(16241,1),(16242,1),(16251,1),(16252,1),(16253,1),(16256,1),(16257,1),(16258,1),(16259,1),(16260,1),(16261,1),(16262,1),(16263,1),(16264,1), +(16265,1),(16266,1),(16267,1),(16268,1),(16269,1),(16270,1),(16271,1),(16272,1),(16273,1),(16274,1),(16275,1),(16276,1),(16277,1),(16278,1),(16279,1),(16280,1),(16283,1),(16285,1),(16287,1), +(16288,1),(16289,1),(16291,1),(16293,1),(16295,1),(16362,1),(16366,1),(16367,1),(16371,1),(16376,1),(16381,1),(16396,1),(16397,1),(16432,1),(16442,1),(16443,1),(16444,1),(16458,1),(16462,1), +(16463,1),(16464,1),(16475,1),(16476,1),(16477,1),(16483,1),(16499,1),(16500,1),(16501,1),(16502,1),(16503,1),(16514,1),(16535,1),(16541,1),(16542,1),(16546,1),(16551,1),(16553,1),(16554,1), +(16568,1),(16574,1),(16575,1),(16576,1),(16577,1),(16578,1),(16579,1),(16580,1),(16582,1),(16583,1),(16584,1),(16585,1),(16586,1),(16587,1),(16588,1),(16589,1),(16590,1),(16591,1),(16599,1), +(16602,1),(16603,1),(16610,1),(16611,1),(16612,1),(16613,1),(16614,1),(16615,1),(16616,1),(16617,1),(16618,1),(16619,1),(16620,1),(16621,1),(16622,1),(16623,1),(16624,1),(16625,1),(16626,1), +(16627,1),(16628,1),(16629,1),(16630,1),(16631,1),(16632,1),(16633,1),(16634,1),(16635,1),(16636,1),(16637,1),(16638,1),(16639,1),(16640,1),(16641,1),(16642,1),(16643,1),(16644,1),(16645,1), +(16646,1),(16647,1),(16648,1),(16649,1),(16650,1),(16651,1),(16652,1),(16653,1),(16654,1),(16655,1),(16656,1),(16657,1),(16658,1),(16659,1),(16660,1),(16661,1),(16662,1),(16663,1),(16664,1), +(16665,1),(16666,1),(16667,1),(16668,1),(16669,1),(16670,1),(16671,1),(16672,1),(16673,1),(16674,1),(16675,1),(16676,1),(16677,1),(16678,1),(16679,1),(16680,1),(16681,1),(16682,1),(16683,1), +(16684,1),(16685,1),(16686,1),(16687,1),(16688,1),(16689,1),(16690,1),(16691,1),(16692,1),(16693,1),(16694,1),(16695,1),(16696,1),(16702,1),(16703,1),(16705,1),(16706,1),(16707,1),(16708,1), +(16709,1),(16710,1),(16711,1),(16712,1),(16713,1),(16714,1),(16715,1),(16716,1),(16717,1),(16718,1),(16719,1),(16720,1),(16721,1),(16722,1),(16723,1),(16724,1),(16725,1),(16726,1),(16727,1), +(16728,1),(16729,1),(16730,1),(16731,1),(16732,1),(16733,1),(16734,1),(16735,1),(16736,1),(16737,1),(16738,1),(16739,1),(16740,1),(16741,1),(16742,1),(16743,1),(16744,1),(16745,1),(16746,1), +(16747,1),(16748,1),(16749,1),(16750,1),(16751,1),(16752,1),(16753,1),(16754,1),(16755,1),(16756,1),(16757,1),(16758,1),(16759,1),(16761,1),(16762,1),(16763,1),(16764,1),(16765,1),(16766,1), +(16767,1),(16768,1),(16770,1),(16771,1),(16773,1),(16774,1),(16780,1),(16781,1),(16782,1),(16786,1),(16789,1),(16790,1),(16791,1),(16792,1),(16793,1),(16794,1),(16795,1),(16796,1),(16797,1), +(16798,1),(16799,1),(16800,1),(16801,1),(16802,1),(16819,1),(16820,1),(16821,1),(16822,1),(16823,1),(16824,1),(16825,1),(16826,1),(16827,1),(16828,1),(16829,1),(16830,1),(16831,1),(16832,1), +(16833,1),(16834,1),(16835,1),(16836,1),(16837,1),(16838,1),(16839,1),(16840,1),(16841,1),(16842,1),(16843,1),(16849,1),(16850,1),(16851,1),(16852,1),(16853,1),(16856,1),(16858,1),(16860,1), +(16862,1),(16864,1),(16866,1),(16885,1),(16886,1),(16888,1),(16896,1),(16915,1),(16917,1),(16918,1),(16919,1),(16920,1),(16921,1),(16923,1),(16924,1),(16991,1),(16993,1),(17002,1),(17004,1), +(17005,1),(17006,1),(17015,1),(17029,1),(17046,1),(17052,1),(17056,1),(17062,1),(17068,1),(17070,1),(17071,1),(17076,1),(17079,1),(17080,1),(17089,1),(17091,1),(17092,1),(17093,1),(17094,1), +(17095,1),(17097,1),(17098,1),(17099,1),(17100,1),(17101,1),(17103,1),(17104,1),(17105,1),(17106,1),(17109,1),(17110,1),(17114,1),(17116,1),(17117,1),(17119,1),(17120,1),(17121,1),(17122,1), +(17127,1),(17162,1),(17204,1),(17209,1),(17212,1),(17214,1),(17215,1),(17218,1),(17219,1),(17222,1),(17223,1),(17226,1),(17227,1),(17228,1),(17232,1),(17238,1),(17240,1),(17241,1),(17242,1), +(17243,1),(17244,1),(17245,1),(17246,1),(17247,1),(17263,1),(17277,1),(17282,1),(17285,1),(17288,1),(17289,1),(17290,1),(17291,1),(17292,1),(17294,1),(17295,1),(17296,1),(17297,1),(17303,1), +(17310,1),(17311,1),(17312,1),(17355,1),(17375,1),(17379,1),(17382,1),(17383,1),(17384,1),(17390,1),(17391,1),(17392,1),(17393,1),(17394,1),(17402,1),(17403,1),(17406,1),(17409,1),(17410,1), +(17412,1),(17421,1),(17422,1),(17423,1),(17424,1),(17425,1),(17426,1),(17431,1),(17432,1),(17433,1),(17434,1),(17437,1),(17439,1),(17440,1),(17441,1),(17442,1),(17443,1),(17444,1),(17445,1), +(17446,1),(17449,1),(17450,1),(17468,1),(17479,1),(17480,1),(17482,1),(17483,1),(17484,1),(17485,1),(17486,1),(17487,1),(17488,1),(17489,1),(17490,1),(17493,1),(17495,1),(17499,1),(17500,1), +(17504,1),(17505,1),(17506,1),(17507,1),(17508,1),(17509,1),(17510,1),(17511,1),(17512,1),(17513,1),(17514,1),(17519,1),(17520,1),(17531,1),(17542,1),(17549,1),(17551,1),(17553,1),(17554,1), +(17555,1),(17557,1),(17558,1),(17584,1),(17586,1),(17587,1),(17593,1),(17594,1),(17597,1),(17598,1),(17599,1),(17600,1),(17601,1),(17614,1),(17627,1),(17628,1),(17629,1),(17630,1),(17631,1), +(17632,1),(17633,1),(17634,1),(17635,1),(17637,1),(17642,1),(17647,1),(17649,1),(17655,1),(17656,1),(17657,1),(17666,1),(17667,1),(17676,1),(17681,1),(17682,1),(17684,1),(17686,1),(17703,1), +(17712,1),(17717,1),(17718,1),(17765,1),(17766,1),(17768,1),(17769,1),(17773,1),(17804,1),(17825,1),(17831,1),(17832,1),(17834,1),(17843,1),(17844,1),(17845,1),(17849,1),(17853,1),(17855,1), +(17866,1),(17874,1),(17875,1),(17876,1),(17884,1),(17885,1),(17890,1),(17900,1),(17901,1),(17926,1),(17927,1),(17953,1),(17983,1),(17986,1),(17995,1),(17996,1),(18003,1),(18004,1),(18005,1), +(18006,1),(18007,1),(18008,1),(18009,1),(18010,1),(18011,1),(18012,1),(18013,1),(18014,1),(18015,1),(18016,1),(18017,1),(18018,1),(18019,1),(18020,1),(18021,1),(18022,1),(18023,1),(18024,1), +(18025,1),(18026,1),(18027,1),(18028,1),(18029,1),(18030,1),(18031,1),(18032,1),(18034,1),(18038,1),(18063,1),(18066,1),(18067,1),(18068,1),(18090,1),(18091,1),(18097,1),(18098,1),(18103,1), +(18106,1),(18126,1),(18139,1),(18141,1),(18146,1),(18147,1),(18169,1),(18174,1),(18175,1),(18183,1),(18192,1),(18194,1),(18221,1),(18222,1),(18223,1),(18224,1),(18229,1),(18243,1),(18245,1), +(18246,1),(18247,1),(18248,1),(18249,1),(18250,1),(18251,1),(18252,1),(18256,1),(18270,1),(18273,1),(18277,1),(18292,1),(18293,1),(18295,1),(18300,1),(18301,1),(18302,1),(18347,1),(18348,1), +(18349,1),(18350,1),(18353,1),(18369,1),(18383,1),(18384,1),(18385,1),(18386,1),(18387,1),(18389,1),(18390,1),(18407,1),(18408,1),(18414,1),(18415,1),(18416,1),(18426,1),(18427,1),(18428,1), +(18443,1),(18445,1),(18447,1),(18459,1),(18488,1),(18489,1),(18507,1),(18542,1),(18565,1),(18566,1),(18666,1),(18672,1),(18675,1),(18676,1),(18687,1),(18704,1),(18705,1),(18712,1),(18713,1), +(18714,1),(18715,1),(18727,1),(18745,1),(18747,1),(18748,1),(18749,1),(18751,1),(18753,1),(18754,1),(18755,1),(18758,1),(18761,1),(18769,1),(18771,1),(18772,1),(18773,1),(18774,1),(18776,1), +(18777,1),(18779,1),(18781,1),(18783,1),(18785,1),(18788,1),(18789,1),(18790,1),(18791,1),(18792,1),(18800,1),(18802,1),(18803,1),(18804,1),(18807,1),(18808,1),(18809,1),(18810,1),(18811,1), +(18812,1),(18813,1),(18815,1),(18816,1),(18817,1),(18819,1),(18820,1),(18821,1),(18822,1),(18844,1),(18892,1),(18899,1),(18900,1),(18901,1),(18902,1),(18903,1),(18905,1),(18906,1),(18907,1), +(18908,1),(18909,1),(18910,1),(18913,1),(18914,1),(18915,1),(18916,1),(18917,1),(18918,1),(18919,1),(18921,1),(18922,1),(18924,1),(18926,1),(18927,1),(18929,1),(18937,1),(18938,1),(18939,1), +(18942,1),(18943,1),(18947,1),(18951,1),(18953,1),(18954,1),(18957,1),(18959,1),(18960,1),(18962,1),(18971,1),(18973,1),(18985,1),(18987,1),(18988,1),(18989,1),(18990,1),(18991,1),(18993,1), +(18997,1),(18998,1),(18999,1),(19000,1),(19001,1),(19002,1),(19003,1),(19004,1),(19011,1),(19012,1),(19013,1),(19014,1),(19015,1),(19017,1),(19018,1),(19019,1),(19020,1),(19021,1),(19022,1), +(19023,1),(19024,1),(19025,1),(19026,1),(19027,1),(19030,1),(19031,1),(19038,1),(19042,1),(19048,1),(19053,1),(19054,1),(19056,1),(19068,1),(19071,1),(19133,1),(19137,1),(19138,1),(19140,1), +(19141,1),(19147,1),(19148,1),(19149,1),(19151,1),(19152,1),(19156,1),(19157,1),(19158,1),(19159,1),(19169,1),(19171,1),(19172,1),(19173,1),(19175,1),(19176,1),(19177,1),(19178,1),(19181,1), +(19185,1),(19227,1),(19241,1),(19254,1),(19255,1),(19256,1),(19257,1),(19258,1),(19265,1),(19273,1),(19274,1),(19293,1),(19294,1),(19296,1),(19308,1),(19309,1),(19310,1),(19314,1),(19315,1), +(19316,1),(19317,1),(19319,1),(19324,1),(19332,1),(19333,1),(19339,1),(19341,1),(19342,1),(19343,1),(19344,1),(19345,1),(19347,1),(19348,1),(19351,1),(19352,1),(19353,1),(19355,1),(19362,1), +(19363,1),(19364,1),(19368,1),(19369,1),(19370,1),(19371,1),(19372,1),(19373,1),(19374,1),(19375,1),(19380,1),(19383,1),(19384,1),(19392,1),(19394,1),(19401,1),(19409,1),(19449,1),(19450,1), +(19454,1),(19470,1),(19471,1),(19472,1),(19473,1),(19474,1),(19476,1),(19478,1),(19479,1),(19495,1),(19497,1),(19498,1),(19499,1),(19500,1),(19504,1),(19529,1),(19531,1),(19533,1),(19534,1), +(19535,1),(19536,1),(19537,1),(19538,1),(19539,1),(19540,1),(19541,1),(19556,1),(19558,1),(19559,1),(19560,1),(19561,1),(19562,1),(19567,1),(19571,1),(19581,1),(19583,1),(19591,1),(19592,1), +(19594,1),(19596,1),(19597,1),(19601,1),(19602,1),(19603,1),(19604,1),(19605,1),(19606,1),(19613,1),(19614,1),(19647,1),(19669,1),(19670,1),(19671,1),(19672,1),(19673,1),(19674,1),(19675,1), +(19676,1),(19679,1),(19682,1),(19683,1),(19694,1),(19702,1),(19722,1),(19736,1),(19774,1),(19775,1),(19777,1),(19778,1),(19828,1),(19835,1),(19836,1),(19837,1),(19848,1),(19850,1),(19855,1), +(19905,1),(19906,1),(19907,1),(19908,1),(19910,1),(19912,1),(19914,1),(20028,1),(20087,1),(20118,1),(20119,1),(20120,1),(20121,1),(20126,1),(20159,1),(20195,1),(20219,1),(20227,1),(20231,1), +(20232,1),(20233,1),(20234,1),(20235,1),(20236,1),(20237,1),(20238,1),(20249,1),(20250,1),(20297,1),(20374,1),(20381,1),(20382,1),(20383,1),(20385,1),(20386,1),(20388,1),(20390,1),(20395,1), +(20406,1),(20407,1),(20447,1),(20484,1),(20485,1),(20494,1),(20500,1),(20510,1),(20511,1),(20513,1),(20515,1),(20556,1),(20603,1),(20672,1),(20674,1),(20762,1),(20793,1),(20799,1),(20812,1), +(20890,1),(20891,1),(20892,1),(20893,1),(20914,1),(20915,1),(20916,1),(20917,1),(20977,1),(20980,1),(20981,1),(20985,1),(20986,1),(20989,1),(21006,1),(21007,1),(21019,1),(21027,1),(21066,1), +(21081,1),(21082,1),(21083,1),(21084,1),(21085,1),(21086,1),(21087,1),(21088,1),(21103,1),(21105,1),(21106,1),(21107,1),(21110,1),(21111,1),(21112,1),(21113,1),(21114,1),(21115,1),(21117,1), +(21118,1),(21133,1),(21145,1),(21147,1),(21151,1),(21152,1),(21153,1),(21155,1),(21156,1),(21158,1),(21165,1),(21167,1),(21172,1),(21175,1),(21188,1),(21192,1),(21193,1),(21194,1),(21197,1), +(21209,1),(21248,1),(21256,1),(21257,1),(21277,1),(21279,1),(21283,1),(21311,1),(21330,1),(21336,1),(21340,1),(21359,1),(21361,1),(21365,1),(21367,1),(21397,1),(21398,1),(21399,1),(21400,1), +(21427,1),(21441,1),(21460,1),(21461,1),(21469,1),(21471,1),(21472,1),(21474,1),(21475,1),(21476,1),(21483,1),(21484,1),(21485,1),(21487,1),(21488,1),(21496,1),(21691,1),(21692,1),(21736,1), +(21749,1),(21755,1),(21766,1),(21769,1),(21770,1),(21771,1),(21772,1),(21773,1),(21774,1),(21775,1),(21777,1),(21789,1),(21790,1),(21824,1),(21829,1),(21858,1),(21895,1),(21896,1),(21968,1), +(21969,1),(21970,1),(21971,1),(21984,1),(21986,1),(21998,1),(22004,1),(22007,1),(22010,1),(22013,1),(22015,1),(22020,1),(22053,1),(22059,1),(22107,1),(22110,1),(22127,1),(22149,1),(22150,1), +(22151,1),(22152,1),(22206,1),(22216,1),(22225,1),(22227,1),(22231,1),(22278,1),(22312,1),(22386,1),(22407,1),(22410,1),(22430,1),(22431,1),(22448,1),(22453,1),(22455,1),(22456,1),(22462,1), +(22468,1),(22469,1),(22476,1),(22477,1),(22485,1),(22488,1),(22489,1),(22494,1),(22498,1),(22834,1),(22901,1),(22916,1),(22922,1),(22931,1),(22935,1),(22936,1),(22937,1),(22990,1),(22998,1), +(22999,1),(23000,1),(23001,1),(23005,1),(23006,1),(23009,1),(23010,1),(23011,1),(23012,1),(23023,1),(23024,1),(23039,1),(23045,1),(23064,1),(23065,1),(23089,1),(23115,1),(23127,1),(23128,1), +(23131,1),(23134,1),(23135,1),(23136,1),(23197,1),(23200,1),(23201,1),(23202,1),(23268,1),(23392,1),(23434,1),(23435,1),(23446,1),(23447,1),(23452,1),(23453,1),(23479,1),(23480,1),(23481,1), +(23482,1),(23504,1),(23510,1),(23511,1),(23521,1),(23522,1),(23525,1),(23532,1),(23533,1),(23534,1),(23535,1),(23536,1),(23540,1),(23546,1),(23547,1),(23548,1),(23549,1),(23550,1),(23551,1), +(23552,1),(23558,1),(23560,1),(23565,1),(23566,1),(23599,1),(23603,1),(23604,1),(23605,1),(23606,1),(23607,1),(23608,1),(23609,1),(23610,1),(23611,1),(23612,1),(23613,1),(23614,1),(23615,1), +(23627,1),(23628,1),(23635,1),(23681,1),(23683,1),(23684,1),(23685,1),(23696,1),(23698,1),(23704,1),(23713,1),(23721,1),(23728,1),(23729,1),(23730,1),(23731,1),(23732,1),(23733,1),(23734,1), +(23735,1),(23736,1),(23737,1),(23738,1),(23739,1),(23748,1),(23749,1),(23766,1),(23770,1),(23773,1),(23779,1),(23783,1),(23791,1),(23792,1),(23802,1),(23804,1),(23819,1),(23820,1),(23823,1), +(23824,1),(23825,1),(23831,1),(23833,1),(23835,1),(23836,1),(23838,1),(23839,1),(23840,1),(23842,1),(23844,1),(23851,1),(23856,1),(23857,1),(23859,1),(23860,1),(23862,1),(23888,1),(23891,1), +(23892,1),(23895,1),(23896,1),(23900,1),(23905,1),(23906,1),(23908,1),(23911,1),(23933,1),(23937,1),(23949,1),(23950,1),(23951,1),(23975,1),(23976,1),(23978,1),(23981,1),(23984,1),(23985,1), +(23986,1),(23987,1),(24005,1),(24006,1),(24028,1),(24031,1),(24032,1),(24033,1),(24038,1),(24040,1),(24050,1),(24052,1),(24053,1),(24054,1),(24055,1),(24056,1),(24057,1),(24058,1),(24061,1), +(24062,1),(24066,1),(24067,1),(24075,1),(24077,1),(24081,1),(24086,1),(24088,1),(24089,1),(24090,1),(24091,1),(24096,1),(24097,1),(24099,1),(24103,1),(24106,1),(24122,1),(24123,1),(24124,1), +(24125,1),(24127,1),(24129,1),(24131,1),(24135,1),(24139,1),(24141,1),(24142,1),(24145,1),(24147,1),(24148,1),(24149,1),(24150,1),(24151,1),(24154,1),(24155,1),(24157,1),(24164,1),(24168,1), +(24176,1),(24186,1),(24188,1),(24189,1),(24190,1),(24191,1),(24192,1),(24195,1),(24197,1),(24208,1),(24209,1),(24218,1),(24226,1),(24227,1),(24232,1),(24233,1),(24234,1),(24236,1),(24253,1), +(24254,1),(24255,1),(24256,1),(24273,1),(24282,1),(24283,1),(24313,1),(24328,1),(24330,1),(24333,1),(24341,1),(24342,1),(24343,1),(24347,1),(24348,1),(24349,1),(24350,1),(24356,1),(24357,1), +(24359,1),(24362,1),(24364,1),(24366,1),(24376,1),(24390,1),(24399,1),(24457,1),(24468,1),(24473,1),(24484,1),(24491,1),(24492,1),(24493,1),(24497,1),(24498,1),(24499,1),(24501,1),(24510,1), +(24520,1),(24522,1),(24527,1),(24528,1),(24531,1),(24532,1),(24534,1),(24535,1),(24545,1),(24631,1),(24632,1),(24634,1),(24667,1),(24668,1),(24670,1),(24671,1),(24672,1),(24702,1),(24703,1), +(24706,1),(24709,1),(24710,1),(24711,1),(24717,1),(24718,1),(24719,1),(24720,1),(24730,1),(24733,1),(24734,1),(24735,1),(24736,1),(24737,1),(24738,1),(24739,1),(24750,1),(24751,1),(24806,1), +(24807,1),(24811,1),(24813,1),(24821,1),(24823,1),(24825,1),(24866,1),(24881,1),(24884,1),(24885,1),(24886,1),(24905,1),(24938,1),(24965,1),(24967,1),(24974,1),(24975,1),(24993,1),(25019,1), +(25020,1),(25032,1),(25036,1),(25037,1),(25039,1),(25043,1),(25045,1),(25059,1),(25061,1),(25088,1),(25089,1),(25108,1),(25112,1),(25115,1),(25145,1),(25162,1),(25163,1),(25164,1),(25167,1), +(25169,1),(25170,1),(25172,1),(25194,1),(25200,1),(25202,1),(25207,1),(25220,1),(25222,1),(25223,1),(25233,1),(25234,1),(25235,1),(25237,1),(25238,1),(25239,1),(25240,1),(25241,1),(25242,1), +(25243,1),(25244,1),(25245,1),(25246,1),(25247,1),(25250,1),(25251,1),(25252,1),(25253,1),(25254,1),(25255,1),(25256,1),(25257,1),(25258,1),(25259,1),(25261,1),(25264,1),(25266,1),(25269,1), +(25270,1),(25271,1),(25272,1),(25273,1),(25274,1),(25275,1),(25276,1),(25277,1),(25278,1),(25279,1),(25280,1),(25281,1),(25282,1),(25285,1),(25286,1),(25288,1),(25289,1),(25298,1),(25299,1), +(25300,1),(25301,1),(25302,1),(25306,1),(25307,1),(25311,1),(25312,1),(25313,1),(25317,1),(25326,1),(25327,1),(25328,1),(25329,1),(25334,1),(25335,1),(25336,1),(25337,1),(25338,1),(25339,1), +(25340,1),(25341,1),(25361,1),(25374,1),(25379,1),(25380,1),(25381,1),(25385,1),(25394,1),(25414,1),(25420,1),(25421,1),(25426,1),(25437,1),(25438,1),(25439,1),(25440,1),(25446,1),(25459,1), +(25475,1),(25476,1),(25477,1),(25503,1),(25504,1),(25519,1),(25526,1),(25527,1),(25528,1),(25529,1),(25530,1),(25531,1),(25532,1),(25533,1),(25589,1),(25590,1),(25602,1),(25604,1),(25606,1), +(25607,1),(25610,1),(25617,1),(25702,1),(25705,1),(25729,1),(25730,1),(25736,1),(25737,1),(25747,1),(25749,1),(25751,1),(25759,1),(25761,1),(25767,1),(25776,1),(25780,1),(25783,1),(25797,1), +(25807,1),(25808,1),(25809,1),(25810,1),(25811,1),(25812,1),(25816,1),(25819,1),(25825,1),(25826,1),(25838,1),(25849,1),(25883,1),(25884,1),(25887,1),(25888,1),(25889,1),(25890,1),(25891,1), +(25892,1),(25893,1),(25894,1),(25895,1),(25896,1),(25897,1),(25898,1),(25899,1),(25900,1),(25901,1),(25902,1),(25903,1),(25904,1),(25905,1),(25906,1),(25907,1),(25908,1),(25909,1),(25910,1), +(25911,1),(25912,1),(25913,1),(25914,1),(25915,1),(25916,1),(25917,1),(25918,1),(25919,1),(25920,1),(25921,1),(25922,1),(25923,1),(25925,1),(25926,1),(25927,1),(25928,1),(25929,1),(25930,1), +(25931,1),(25932,1),(25933,1),(25934,1),(25935,1),(25936,1),(25937,1),(25938,1),(25939,1),(25940,1),(25941,1),(25942,1),(25943,1),(25944,1),(25945,1),(25946,1),(25947,1),(25950,1),(25976,1), +(25977,1),(25978,1),(25982,1),(25983,1),(25992,1),(26044,1),(26078,1),(26083,1),(26084,1),(26085,1),(26089,1),(26090,1),(26091,1),(26092,1),(26104,1),(26109,1),(26112,1),(26123,1),(26124,1), +(26155,1),(26156,1),(26157,1),(26158,1),(26159,1),(26160,1),(26170,1),(26179,1),(26180,1),(26181,1),(26182,1),(26184,1),(26185,1),(26186,1),(26187,1),(26194,1),(26205,1),(26212,1),(26217,1), +(26220,1),(26226,1),(26228,1),(26229,1),(26233,1),(26234,1),(26245,1),(26246,1),(26247,1),(26269,1),(26289,1),(26323,1),(26353,1),(26361,1),(26362,1),(26374,1),(26375,1),(26379,1),(26380,1), +(26381,1),(26382,1),(26387,1),(26388,1),(26392,1),(26393,1),(26394,1),(26395,1),(26396,1),(26397,1),(26398,1),(26415,1),(26432,1),(26433,1),(26437,1),(26448,1),(26456,1),(26459,1),(26471,1), +(26474,1),(26485,1),(26486,1),(26487,1),(26504,1),(26505,1),(26506,1),(26507,1),(26508,1),(26523,1),(26537,1),(26538,1),(26539,1),(26540,1),(26541,1),(26542,1),(26546,1),(26547,1),(26548,1), +(26549,1),(26551,1),(26552,1),(26556,1),(26557,1),(26558,1),(26560,1),(26561,1),(26564,1),(26565,1),(26566,1),(26567,1),(26568,1),(26569,1),(26572,1),(26574,1),(26580,1),(26581,1),(26584,1), +(26585,1),(26595,1),(26596,1),(26597,1),(26598,1),(26599,1),(26600,1),(26601,1),(26602,1),(26603,1),(26617,1),(26618,1),(26619,1),(26634,1),(26645,1),(26649,1),(26652,1),(26654,1),(26664,1), +(26666,1),(26673,1),(26680,1),(26697,1),(26707,1),(26709,1),(26718,1),(26720,1),(26721,1),(26725,1),(26733,1),(26766,1),(26767,1),(26768,1),(26772,1),(26779,1),(26780,1),(26790,1),(26810,1), +(26813,1),(26817,1),(26821,1),(26837,1),(26839,1),(26842,1),(26844,1),(26845,1),(26846,1),(26847,1),(26848,1),(26850,1),(26851,1),(26852,1),(26853,1),(26854,1),(26859,1),(26862,1),(26870,1), +(26875,1),(26876,1),(26877,1),(26878,1),(26879,1),(26880,1),(26881,1),(26883,1),(26885,1),(26888,1),(26894,1),(26900,1),(26901,1),(26903,1),(26904,1),(26905,1),(26906,1),(26907,1),(26908,1), +(26909,1),(26910,1),(26911,1),(26912,1),(26913,1),(26914,1),(26915,1),(26916,1),(26931,1),(26932,1),(26934,1),(26935,1),(26936,1),(26938,1),(26939,1),(26941,1),(26944,1),(26945,1),(26947,1), +(26950,1),(26951,1),(26952,1),(26953,1),(26954,1),(26955,1),(26956,1),(26957,1),(26958,1),(26959,1),(26960,1),(26961,1),(26962,1),(26963,1),(26964,1),(26968,1),(26969,1),(26972,1),(26973,1), +(26974,1),(26975,1),(26976,1),(26977,1),(26978,1),(26979,1),(26980,1),(26981,1),(26982,1),(26984,1),(26985,1),(26986,1),(26987,1),(26988,1),(26989,1),(26990,1),(26991,1),(26992,1),(26993,1), +(26994,1),(26995,1),(26996,1),(26997,1),(26998,1),(26999,1),(27000,1),(27001,1),(27010,1),(27011,1),(27012,1),(27014,1),(27015,1),(27019,1),(27021,1),(27022,1),(27023,1),(27025,1),(27026,1), +(27027,1),(27028,1),(27029,1),(27030,1),(27031,1),(27032,1),(27033,1),(27034,1),(27035,1),(27038,1),(27039,1),(27040,1),(27041,1),(27042,1),(27043,1),(27044,1),(27045,1),(27051,1),(27052,1), +(27053,1),(27054,1),(27055,1),(27056,1),(27057,1),(27058,1),(27060,1),(27061,1),(27063,1),(27065,1),(27066,1),(27067,1),(27068,1),(27069,1),(27070,1),(27071,1),(27072,1),(27073,1),(27088,1), +(27089,1),(27106,1),(27107,1),(27108,1),(27109,1),(27110,1),(27119,1),(27125,1),(27126,1),(27132,1),(27133,1),(27134,1),(27136,1),(27137,1),(27138,1),(27139,1),(27140,1),(27141,1),(27142,1), +(27143,1),(27144,1),(27145,1),(27146,1),(27147,1),(27148,1),(27149,1),(27150,1),(27151,1),(27155,1),(27156,1),(27157,1),(27158,1),(27159,1),(27160,1),(27161,1),(27162,1),(27163,1),(27164,1), +(27167,1),(27168,1),(27170,1),(27172,1),(27173,1),(27174,1),(27175,1),(27176,1),(27178,1),(27181,1),(27182,1),(27183,1),(27184,1),(27185,1),(27186,1),(27187,1),(27188,1),(27189,1),(27190,1), +(27193,1),(27194,1),(27195,1),(27204,1),(27219,1),(27221,1),(27231,1),(27243,1),(27248,1),(27250,1),(27251,1),(27258,1),(27266,1),(27267,1),(27271,1),(27277,1),(27282,1),(27291,1),(27293,1), +(27295,1),(27298,1),(27299,1),(27300,1),(27301,1),(27302,1),(27314,1),(27315,1),(27316,1),(27317,1),(27318,1),(27319,1),(27320,1),(27336,1),(27337,1),(27341,1),(27345,1),(27347,1),(27348,1), +(27350,1),(27351,1),(27359,1),(27361,1),(27364,1),(27365,1),(27368,1),(27371,1),(27376,1),(27378,1),(27379,1),(27381,1),(27385,1),(27388,1),(27391,1),(27400,1),(27411,1),(27412,1),(27414,1), +(27416,1),(27422,1),(27423,1),(27425,1),(27432,1),(27440,1),(27441,1),(27451,1),(27455,1),(27456,1),(27463,1),(27464,1),(27467,1),(27468,1),(27475,1),(27477,1),(27478,1),(27480,1),(27482,1), +(27484,1),(27487,1),(27488,1),(27489,1),(27494,1),(27495,1),(27497,1),(27499,1),(27500,1),(27501,1),(27504,1),(27509,1),(27511,1),(27516,1),(27517,1),(27518,1),(27519,1),(27520,1),(27521,1), +(27532,1),(27535,1),(27536,1),(27537,1),(27538,1),(27540,1),(27543,1),(27544,1),(27545,1),(27549,1),(27550,1),(27553,1),(27557,1),(27558,1),(27559,1),(27560,1),(27562,1),(27563,1),(27564,1), +(27565,1),(27566,1),(27567,1),(27571,1),(27573,1),(27576,1),(27577,1),(27581,1),(27582,1),(27584,1),(27587,1),(27588,1),(27602,1),(27606,1),(27646,1),(27661,1),(27662,1),(27665,1),(27666,1), +(27671,1),(27673,1),(27677,1),(27678,1),(27692,1),(27695,1),(27703,1),(27704,1),(27705,1),(27708,1),(27711,1),(27713,1),(27730,1),(27748,1),(27749,1),(27750,1),(27751,1),(27755,1),(27756,1), +(27758,1),(27760,1),(27761,1),(27764,1),(27783,1),(27784,1),(27788,1),(27791,1),(27803,1),(27804,1),(27806,1),(27810,1),(27811,1),(27812,1),(27813,1),(27814,1),(27815,1),(27816,1),(27817,1), +(27818,1),(27819,1),(27820,1),(27828,1),(27833,1),(27838,1),(27841,1),(27842,1),(27843,1),(27844,1),(27846,1),(27850,1),(27857,1),(27858,1),(27872,1),(27873,1),(27881,1),(27883,1),(27886,1), +(27887,1),(27894,1),(27904,1),(27906,1),(27917,1),(27918,1),(27919,1),(27920,1),(27928,1),(27930,1),(27935,1),(27938,1),(27940,1),(27943,1),(27946,1),(27948,1),(27950,1),(27952,1),(27953,1), +(27954,1),(27955,1),(28031,1),(28032,1),(28033,1),(28038,1),(28039,1),(28040,1),(28042,1),(28043,1),(28044,1),(28045,1),(28046,1),(28047,1),(28054,1),(28057,1),(28061,1),(28063,1),(28065,1), +(28070,1),(28076,1),(28090,1),(28094,1),(28125,1),(28135,1),(28157,1),(28160,1),(28175,1),(28176,1),(28177,1),(28178,1),(28179,1),(28205,1),(28228,1),(28247,1),(28250,1),(28251,1),(28252,1), +(28261,1),(28262,1),(28263,1),(28264,1),(28312,1),(28313,1),(28314,1),(28318,1),(28319,1),(28324,1),(28328,1),(28347,1),(28348,1),(28353,1),(28354,1),(28355,1),(28366,1),(28370,1),(28374,1), +(28376,1),(28383,1),(28390,1),(28391,1),(28392,1),(28393,1),(28394,1),(28405,1),(28486,1),(28487,1),(28488,1),(28489,1),(28490,1),(28491,1),(28507,1),(28545,1),(28566,1),(28568,1),(28569,1), +(28571,1),(28572,1),(28573,1),(28593,1),(28596,1),(28613,1),(28615,1),(28618,1),(28621,1),(28623,1),(28624,1),(28638,1),(28650,1),(28651,1),(28674,1),(28675,1),(28676,1),(28677,1),(28678,1), +(28679,1),(28680,1),(28682,1),(28685,1),(28686,1),(28687,1),(28690,1),(28691,1),(28692,1),(28693,1),(28694,1),(28696,1),(28697,1),(28698,1),(28699,1),(28700,1),(28701,1),(28702,1),(28703,1), +(28704,1),(28705,1),(28706,1),(28707,1),(28708,1),(28714,1),(28715,1),(28716,1),(28718,1),(28721,1),(28722,1),(28723,1),(28725,1),(28726,1),(28727,1),(28728,1),(28742,1),(28771,1),(28774,1), +(28776,1),(28781,1),(28790,1),(28791,1),(28792,1),(28794,1),(28796,1),(28797,1),(28798,1),(28799,1),(28800,1),(28801,1),(28806,1),(28807,1),(28809,1),(28810,1),(28811,1),(28812,1),(28813,1), +(28818,1),(28827,1),(28828,1),(28829,1),(28830,1),(28831,1),(28832,1),(28857,1),(28863,1),(28865,1),(28866,1),(28867,1),(28868,1),(28869,1),(28870,1),(28872,1),(28889,1),(28930,1),(28951,1), +(28956,1),(28958,1),(28987,1),(28989,1),(28990,1),(28991,1),(28992,1),(28993,1),(28994,1),(28995,1),(28997,1),(29016,1),(29019,1),(29020,1),(29039,1),(29043,1),(29088,1),(29093,1),(29095,1), +(29111,1),(29137,1),(29139,1),(29141,1),(29142,1),(29143,1),(29144,1),(29145,1),(29152,1),(29154,1),(29155,1),(29156,1),(29157,1),(29158,1),(29159,1),(29160,1),(29161,1),(29162,1),(29171,1), +(29191,1),(29202,1),(29203,1),(29205,1),(29207,1),(29208,1),(29212,1),(29233,1),(29245,1),(29250,1),(29251,1),(29252,1),(29253,1),(29261,1),(29277,1),(29282,1),(29283,1),(29285,1),(29339,1), +(29346,1),(29348,1),(29476,1),(29478,1),(29480,1),(29491,1),(29493,1),(29494,1),(29495,1),(29496,1),(29497,1),(29499,1),(29505,1),(29506,1),(29507,1),(29508,1),(29509,1),(29510,1),(29511,1), +(29512,1),(29513,1),(29514,1),(29523,1),(29527,1),(29528,1),(29529,1),(29530,1),(29532,1),(29535,1),(29537,1),(29538,1),(29547,1),(29548,1),(29579,1),(29583,1),(29593,1),(29611,1),(29617,1), +(29628,1),(29631,1),(29636,1),(29640,1),(29641,1),(29650,1),(29651,1),(29658,1),(29662,1),(29663,1),(29687,1),(29688,1),(29689,1),(29702,1),(29703,1),(29712,1),(29714,1),(29715,1),(29716,1), +(29727,1),(29729,1),(29730,1),(29731,1),(29732,1),(29740,1),(29743,1),(29744,1),(29745,1),(29750,1),(29776,1),(29795,1),(29799,1),(29855,1),(29910,1),(29921,1),(29922,1),(29923,1),(29924,1), +(29925,1),(29926,1),(29942,1),(29948,1),(29953,1),(29965,1),(29966,1),(29973,1),(29996,1),(30039,1),(30058,1),(30059,1),(30067,1),(30072,1),(30073,1),(30076,1),(30077,1),(30104,1),(30107,1), +(30116,1),(30117,1),(30155,1),(30166,1),(30182,1),(30189,1),(30217,1),(30231,1),(30233,1),(30238,1),(30239,1),(30240,1),(30241,1),(30244,1),(30253,1),(30254,1),(30255,1),(30256,1),(30257,1), +(30259,1),(30261,1),(30263,1),(30265,1),(30266,1),(30269,1),(30271,1),(30274,1),(30280,1),(30281,1),(30290,1),(30344,1),(30346,1),(30347,1),(30351,1),(30352,1),(30354,1),(30355,1),(30377,1), +(30380,1),(30381,1),(30382,1),(30392,1),(30394,1),(30408,1),(30426,1),(30427,1),(30428,1),(30431,1),(30433,1),(30440,1),(30441,1),(30472,1),(30489,1),(30566,1),(30567,1),(30569,1),(30578,1), +(30579,1),(30580,1),(30581,1),(30582,1),(30583,1),(30584,1),(30586,1),(30587,1),(30590,1),(30596,1),(30604,1),(30605,1),(30606,1),(30607,1),(30608,1),(30610,1),(30611,1),(30618,1),(30619,1), +(30671,1),(30672,1),(30678,1),(30706,1),(30709,1),(30710,1),(30711,1),(30713,1),(30715,1),(30716,1),(30717,1),(30721,1),(30722,1),(30723,1),(30724,1),(30726,1),(30727,1),(30729,1),(30730,1), +(30731,1),(30732,1),(30733,1),(30734,1),(30735,1),(30737,1),(30739,1),(30740,1),(30752,1),(30753,1),(30754,1),(30755,1),(30824,1),(30826,1),(30827,1),(30833,1),(30838,1),(30839,1),(30840,1), +(30855,1),(30866,1),(30867,1),(31033,1),(31036,1),(31052,1),(31053,1),(31054,1),(31078,1),(31091,1),(31106,1),(31107,1),(31108,1),(31109,1),(31111,1),(31151,1),(31153,1),(31216,1),(31238,1), +(31247,1),(31248,1),(31273,1),(31285,1),(31290,1),(31291,1),(31294,1),(31295,1),(31296,1),(31297,1),(31298,1),(31299,1),(31300,1),(31302,1),(31304,1),(31305,1),(31307,1),(31310,1),(31313,1), +(31328,1),(31330,1),(31412,1),(31416,1),(31417,1),(31418,1),(31419,1),(31420,1),(31421,1),(31422,1),(31423,1),(31425,1),(31426,1),(31427,1),(31429,1),(31430,1),(31431,1),(31433,1),(31434,1), +(31522,1),(31523,1),(31545,1),(31549,1),(31551,1),(31552,1),(31557,1),(31563,1),(31564,1),(31578,1),(31579,1),(31580,1),(31581,1),(31582,1),(31639,1),(31649,1),(31701,1),(31737,1),(31739,1), +(31784,1),(31785,1),(31804,1),(31805,1),(31806,1),(31808,1),(31810,1),(31832,1),(31833,1),(31834,1),(31841,1),(31842,1),(31882,1),(31891,1),(31916,1),(32150,1),(32169,1),(32170,1),(32172,1), +(32190,1),(32216,1),(32222,1),(32223,1),(32239,1),(32251,1),(32252,1),(32253,1),(32287,1),(32294,1),(32296,1),(32301,1),(32302,1),(32303,1),(32307,1),(32308,1),(32310,1),(32311,1),(32312,1), +(32315,1),(32321,1),(32322,1),(32324,1),(32325,1),(32328,1),(32337,1),(32339,1),(32340,1),(32341,1),(32342,1),(32343,1),(32346,1),(32363,1),(32364,1),(32365,1),(32367,1),(32371,1),(32379,1), +(32380,1),(32381,1),(32382,1),(32383,1),(32384,1),(32385,1),(32387,1),(32401,1),(32402,1),(32403,1),(32411,1),(32412,1),(32413,1),(32418,1),(32419,1),(32420,1),(32421,1),(32424,1),(32426,1), +(32451,1),(32453,1),(32454,1),(32474,1),(32493,1),(32494,1),(32509,1),(32510,1),(32514,1),(32515,1),(32516,1),(32533,1),(32538,1),(32564,1),(32565,1),(32566,1),(32573,1),(32596,1),(32597,1), +(32598,1),(32599,1),(32600,1),(32601,1),(32602,1),(32604,1),(32615,1),(32626,1),(32627,1),(32629,1),(32632,1),(32657,1),(32658,1),(32659,1),(32660,1),(32668,1),(32669,1),(32675,1),(32676,1), +(32677,1),(32678,1),(32679,1),(32680,1),(32681,1),(32683,1),(32684,1),(32685,1),(32686,1),(32687,1),(32688,1),(32689,1),(32690,1),(32691,1),(32692,1),(32693,1),(32695,1),(32697,1),(32700,1), +(32702,1),(32704,1),(32706,1),(32708,1),(32709,1),(32710,1),(32711,1),(32712,1),(32713,1),(32714,1),(32715,1),(32716,1),(32717,1),(32718,1),(32719,1),(32720,1),(32721,1),(32723,1),(32726,1), +(32727,1),(32728,1),(32729,1),(32730,1),(32731,1),(32732,1),(32733,1),(32734,1),(32735,1),(32736,1),(32737,1),(32738,1),(32739,1),(32740,1),(32741,1),(32753,1),(32754,1),(32755,1),(32756,1), +(32757,1),(32758,1),(32759,1),(32760,1),(32761,1),(32762,1),(32763,1),(32773,1),(32774,1),(32777,1),(32801,1),(32802,1),(32803,1),(32804,1),(32805,1),(32806,1),(32807,1),(32808,1),(32809,1), +(32810,1),(32811,1),(32812,1),(32813,1),(32814,1),(32815,1),(32816,1),(32832,1),(32833,1),(32834,1),(32835,1),(32842,1),(32843,1),(32898,1),(33018,1),(33019,1),(33026,1),(33027,1),(33059,1), +(33060,1),(33061,1),(33062,1),(33063,1),(33067,1),(33069,1),(33080,1),(33109,1),(33114,1),(33139,1),(33146,1),(33167,1),(33217,1),(33222,1),(33223,1),(33225,1),(33235,1),(33264,1),(33307,1), +(33309,1),(33310,1),(33312,1),(33315,1),(33316,1),(33317,1),(33318,1),(33319,1),(33320,1),(33321,1),(33322,1),(33323,1),(33324,1),(33335,1),(33361,1),(33372,1),(33373,1),(33379,1),(33403,1), +(33405,1),(33434,1),(33435,1),(33459,1),(33460,1),(33461,1),(33462,1),(33463,1),(33464,1),(33465,1),(33466,1),(33467,1),(33468,1),(33469,1),(33470,1),(33471,1),(33472,1),(33473,1),(33474,1), +(33475,1),(33476,1),(33477,1),(33478,1),(33479,1),(33480,1),(33481,1),(33482,1),(33531,1),(33538,1),(33539,1),(33540,1),(33541,1),(33542,1),(33543,1),(33544,1),(33545,1),(33547,1),(33548,1), +(33549,1),(33553,1),(33554,1),(33555,1),(33556,1),(33557,1),(33560,1),(33563,1),(33565,1),(33566,1),(33579,1),(33580,1),(33581,1),(33583,1),(33586,1),(33587,1),(33588,1),(33589,1),(33590,1), +(33591,1),(33592,1),(33593,1),(33594,1),(33596,1),(33597,1),(33598,1),(33599,1),(33600,1),(33601,1),(33602,1),(33603,1),(33624,1),(33628,1),(33629,1),(33643,1),(33644,1),(33645,1),(33648,1), +(33649,1),(33650,1),(33652,1),(33653,1),(33654,1),(33655,1),(33656,1),(33657,1),(33666,1),(33669,1),(33698,1),(33759,1),(33762,1),(33763,1),(33769,1),(33770,1),(33771,1),(33780,1),(33782,1), +(33783,1),(33784,1),(33788,1),(33844,1),(33845,1),(33853,1),(33854,1),(33863,1),(33865,1),(33866,1),(33867,1),(33868,1),(33869,1),(33871,1),(33872,1),(33956,1),(33957,1),(33963,1),(33964,1), +(33972,1),(33973,1),(33974,1),(33992,1),(33996,1),(34036,1),(34037,1),(34038,1),(34039,1),(34040,1),(34043,1),(34044,1),(34054,1),(34058,1),(34059,1),(34060,1),(34061,1),(34062,1),(34063,1), +(34064,1),(34073,1),(34074,1),(34075,1),(34076,1),(34077,1),(34078,1),(34079,1),(34080,1),(34081,1),(34082,1),(34083,1),(34084,1),(34102,1),(34107,1),(34119,1),(34179,1),(34252,1),(34437,1), +(34526,1),(34528,1),(34612,1),(34765,1),(34766,1),(34775,1),(34776,1),(34777,1),(34778,1),(34793,1),(34802,1),(34882,1),(34885,1),(34895,1),(34948,1),(34949,1),(34950,1),(34951,1),(34955,1), +(34971,1),(34972,1),(34973,1),(34976,1),(34978,1),(34983,1),(34985,1),(34986,1),(34987,1),(34988,1),(34989,1),(34991,1),(34993,1),(34997,1),(34998,1),(34999,1),(35000,1),(35001,1),(35002,1), +(35007,1),(35008,1),(35017,1),(35019,1),(35020,1),(35021,1),(35022,1),(35023,1),(35024,1),(35025,1),(35026,1),(35027,1),(35068,1),(35069,1),(35070,1),(35073,1),(35085,1),(35086,1),(35087,1), +(35088,1),(35090,1),(35091,1),(35093,1),(35094,1),(35098,1),(35099,1),(35100,1),(35101,1),(35102,1),(35131,1),(35132,1),(35133,1),(35135,1),(35273,1),(35281,1),(35290,1),(35291,1),(35299,1), +(35322,1),(35335,1),(35336,1),(35361,1),(35364,1),(35365,1),(35373,1),(35460,1),(35462,1),(35467,1),(35471,1),(35492,1),(35494,1),(35495,1),(35496,1),(35497,1),(35498,1),(35500,1),(35507,1), +(35508,1),(35573,1),(35574,1),(35575,1),(35576,1),(35577,1),(35578,1),(35579,1),(35580,1),(35587,1),(35594,1),(35596,1),(35597,1),(35598,1),(35599,1),(35600,1),(35601,1),(35602,1),(35603,1), +(35607,1),(35611,1),(35612,1),(35644,1),(35790,1),(35983,1),(35984,1),(36095,1),(36151,1),(36152,1),(36162,1),(36164,1),(36165,1),(36166,1),(36169,1),(36208,1),(36213,1),(36217,1),(36224,1), +(36225,1),(36226,1),(36235,1),(36273,1),(36284,1),(36351,1),(36352,1),(36355,1),(36356,1),(36359,1),(36360,1),(36380,1),(36390,1),(36431,1),(36479,1),(36481,1),(36506,1),(36517,1),(36557,1), +(36558,1),(36559,1),(36644,1),(36648,1),(36656,1),(36657,1),(36970,1),(36971,1),(36991,1),(37063,1),(37072,1),(37074,1),(37100,1),(37101,1),(37172,1),(37182,1),(37183,1),(37510,1),(37596,1), +(37687,1),(37688,1),(37689,1),(37693,1),(37696,1),(37699,1),(37700,1),(37715,1),(37764,1),(37765,1),(37775,1),(37781,1),(37790,1),(37798,1),(37800,1),(37825,1),(37831,1),(37833,1),(37860,1), +(37869,1),(37879,1),(37888,1),(37941,1),(37942,1),(37944,1),(38050,1),(38052,1),(38066,1),(38164,1),(38208,1),(38293,1),(38295,1),(38334,1),(38335,1),(38336,1),(38337,1),(38338,1),(38339,1), +(38566,1),(38716,1),(38825,1),(38830,1),(38831,1),(38839,1),(38843,1),(38846,1),(38870,1),(38877,1),(38900,1),(38901,1),(38905,1),(38906,1),(38919,1),(38920,1),(38921,1),(39060,1),(39089,1), +(39158,1),(39172,1),(39173,1),(39371,1),(39633,1),(39712,1),(39934,1),(40120,1),(40138,1),(40160,1),(40184,1),(40204,1),(40253,1),(40352,1),(40356,1),(40374,1),(40388,1),(40405,1),(40413,1), +(40435,1),(40436,1),(40438,1),(40443,1),(40481,1),(40606,1),(40607,1) +ON DUPLICATE KEY UPDATE `PvPFlags`=`PvPFlags`|1; + +UPDATE `creature_addon` SET `PvPFlags`=`PvPFlags`|1 WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` IN (54,66,68,74,78,151,152,167,190,196,197,198,219,220,221,222,223,224,225,226,227,228, +233,234,235,237,238,239,240,241,242,244,246,248,250,251,252,253,255,258,260,261,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,288,289,294,295,297,302,311,313,325,328,331,332, +338,340,341,342,343,344,346,347,348,349,352,354,372,374,375,376,377,379,380,381,382,383,384,386,415,459,460,461,464,465,466,467,468,469,470,482,483,487,488,489,490,491,494,495,496,497,499,514,523, +542,543,576,586,633,648,649,650,651,652,653,656,658,661,663,693,713,714,727,733,734,738,739,754,770,777,786,789,790,791,793,809,812,820,821,823,826,827,828,829,836,837,840,842,843,844,853,857,859, +861,862,863,864,865,866,867,868,869,870,874,876,878,885,886,887,888,893,894,895,896,897,900,903,904,906,907,911,912,913,914,915,916,917,918,925,926,927,928,931,932,933,934,935,936,944,945,951,952, +954,955,956,957,958,959,960,963,980,981,982,983,984,985,986,987,988,989,999,1000,1001,1058,1064,1068,1070,1071,1072,1073,1074,1075,1076,1077,1078,1089,1090,1091,1092,1093,1098,1099,1100,1101,1103, +1104,1105,1139,1141,1146,1147,1148,1149,1153,1154,1155,1156,1182,1187,1198,1203,1204,1212,1213,1214,1215,1217,1218,1226,1228,1229,1230,1231,1232,1233,1234,1235,1237,1238,1239,1240,1241,1242,1243, +1244,1245,1246,1247,1249,1250,1252,1254,1255,1256,1257,1261,1265,1266,1267,1268,1269,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294, +1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333, +1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1354,1355,1356,1358,1360,1362,1365,1373,1374,1375,1376,1377,1378,1379,1381,1382,1383,1384,1385,1386,1387, +1395,1402,1403,1404,1405,1406,1407,1408,1409,1413,1414,1415,1416,1421,1422,1423,1427,1428,1430,1431,1432,1434,1435,1436,1437,1439,1440,1441,1442,1443,1444,1448,1450,1451,1452,1453,1454,1456,1457, +1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1495,1496,1497,1498,1499,1500,1515,1518,1519,1521,1546,1560, +1567,1568,1569,1570,1571,1572,1573,1632,1642,1644,1645,1646,1649,1650,1651,1652,1661,1668,1670,1671,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1690,1691,1692,1694,1695,1697,1698, +1699,1700,1701,1702,1703,1719,1721,1733,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1748,1749,1750,1751,1752,1754,1756,1775,1777,1854,1872,1879,1901,1937,1938,1949,1950,1951,1952, +1959,1960,1963,1975,1976,1977,1978,1992,2041,2046,2050,2055,2057,2058,2077,2078,2079,2080,2081,2082,2083,2084,2086,2092,2093,2094,2096,2097,2099,2104,2105,2107,2111,2112,2113,2114,2115,2116,2117, +2118,2119,2121,2122,2123,2124,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2140,2142,2151,2153,2198,2209,2210,2214,2215,2216,2225,2226,2227,2228,2229,2238,2239,2263,2276,2277,2278, +2279,2280,2285,2299,2302,2303,2307,2308,2309,2310,2311,2314,2315,2316,2326,2327,2329,2330,2352,2357,2361,2362,2363,2364,2365,2366,2367,2378,2379,2380,2381,2382,2383,2386,2388,2389,2390,2391,2392, +2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2405,2409,2410,2418,2419,2424,2425,2429,2430,2432,2436,2437,2438,2439,2455,2456,2457,2458,2459,2460,2461,2464,2465,2466,2468,2469,2470,2485,2489, +2492,2497,2504,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2524,2525,2526,2527,2528,2608,2621,2668,2669,2679,2682,2695,2696,2697,2698,2700,2702,2703,2704,2705,2706,2708, +2709,2710,2711,2712,2713,2737,2770,2771,2772,2784,2786,2787,2788,2789,2790,2792,2795,2796,2798,2799,2802,2803,2804,2805,2806,2808,2809,2810,2812,2814,2816,2818,2819,2820,2821,2833,2835,2851,2855, +2856,2857,2858,2859,2860,2861,2870,2872,2876,2878,2879,2880,2881,2908,2909,2910,2911,2912,2913,2916,2917,2918,2930,2934,2938,2940,2941,2942,2947,2948,2980,2981,2982,2984,2985,2986,2987,2988,2991, +2993,2995,2996,2997,2998,2999,3001,3002,3003,3004,3005,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034, +3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3052,3053,3054,3055,3057,3059,3060,3061,3062,3063,3064,3065,3066,3067,3069,3070,3071,3072,3074,3075,3076,3077,3078,3079, +3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3095,3097,3133,3135,3136,3137,3138,3139,3140,3142,3143,3144,3145,3147,3148,3149,3150,3153,3154,3155,3156,3157,3158,3159,3160, +3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3181,3182,3184,3185,3186,3187,3188,3189,3190,3191,3193,3194,3208,3210,3211,3212,3213,3214,3215,3216, +3217,3218,3219,3220,3221,3222,3223,3224,3230,3233,3287,3290,3291,3292,3294,3296,3297,3298,3299,3304,3305,3306,3310,3312,3313,3314,3315,3316,3317,3319,3321,3322,3323,3324,3325,3326,3327,3328,3329, +3330,3331,3332,3333,3334,3335,3336,3337,3338,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370, +3371,3372,3373,3387,3388,3389,3390,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3418,3419,3420,3421,3428,3429,3430,3431,3432,3433,3440,3441,3443,3447,3448,3449,3454,3455,3464, +3468,3469,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3500,3501,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3525,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548, +3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3561,3562,3564,3565,3567,3568,3571,3575,3583,3584,3585,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, +3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3639,3644,3649,3650,3657,3661,3663,3666,3681,3682,3685,3688,3689,3690,3691,3692, +3693,3694,3695,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3779,3836,3838,3841,3842,3845,3846,3847,3848,3849,3880,3881,3882,3883,3884,3885,3890,3894,3895,3896,3901,3916,3920,3933,3934,3935, +3936,3937,3948,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3969,3970,3978,3979,3980,3982,3994,3995,3996,4043,4046,4047,4048,4049,4077,4078,4079,4080,4081, +4082,4083,4084,4087,4088,4089,4090,4091,4092,4138,4146,4149,4153,4155,4156,4157,4159,4160,4161,4163,4164,4165,4167,4168,4169,4170,4171,4172,4173,4175,4176,4177,4178,4179,4180,4181,4182,4183,4185, +4186,4187,4188,4189,4190,4191,4192,4193,4194,4195,4197,4198,4200,4203,4204,4205,4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4225,4226,4228,4229,4230, +4231,4232,4233,4234,4235,4236,4237,4239,4240,4241,4242,4243,4244,4254,4255,4256,4257,4258,4259,4262,4265,4266,4267,4305,4307,4309,4310,4311,4312,4314,4317,4319,4320,4321,4407,4423,4444,4451,4455, +4456,4483,4484,4485,4486,4487,4488,4489,4497,4498,4501,4502,4509,4510,4521,4544,4545,4546,4547,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568, +4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607, +4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4621,4721,4722,4730,4731,4732,4752,4753,4772,4773,4775,4782,4791,4794,4875,4876,4877,4878,4879,4881,4882,4883,4884,4885,4886,4888,4889,4890,4891, +4892,4893,4894,4895,4896,4897,4898,4899,4900,4902,4921,4922,4923,4924,4926,4941,4942,4943,4944,4947,4948,4949,4951,4954,4959,4960,4961,4963,4964,4965,4966,4967,4968,4973,4974,4976,4979,4981,4983, +4984,4995,4996,5042,5047,5049,5050,5051,5052,5054,5081,5082,5083,5084,5087,5090,5091,5092,5093,5094,5095,5096,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,5113,5114,5115, +5116,5117,5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155, +5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5169,5170,5171,5172,5173,5174,5175,5177,5178,5188,5189,5190,5191,5192,5193,5199,5200,5204,5384,5385,5386,5387,5388,5389,5390,5392,5393, +5394,5395,5396,5412,5413,5414,5418,5464,5476,5479,5480,5482,5483,5484,5489,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514, +5515,5516,5517,5518,5519,5520,5543,5544,5546,5547,5564,5565,5566,5567,5569,5570,5591,5592,5593,5595,5597,5599,5603,5605,5606,5609,5610,5611,5612,5613,5614,5620,5624,5635,5636,5637,5638,5639,5640, +5641,5642,5644,5651,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5667,5668,5670,5675,5679,5688,5690,5693,5694,5695,5696,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5724, +5725,5731,5732,5733,5734,5744,5747,5748,5749,5750,5752,5753,5754,5757,5758,5759,5765,5769,5770,5782,5810,5811,5812,5813,5814,5815,5816,5817,5819,5820,5821,5870,5871,5875,5878,5880,5882,5883,5884, +5885,5886,5887,5888,5892,5899,5900,5904,5905,5906,5907,5908,5909,5910,5911,5917,5938,5939,5940,5941,5942,5943,5944,5952,5953,5957,5958,5994,6014,6018,6026,6027,6028,6030,6031,6034,6046,6086,6087, +6089,6090,6091,6094,6114,6119,6120,6121,6122,6142,6166,6169,6171,6172,6173,6174,6175,6177,6178,6179,6181,6182,6183,6237,6241,6244,6267,6272,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6297, +6298,6299,6300,6301,6306,6328,6367,6373,6374,6376,6382,6387,6389,6393,6394,6395,6408,6410,6411,6446,6467,6522,6526,6566,6567,6569,6574,6576,6577,6579,6586,6607,6667,6670,6706,6726,6727,6732,6734, +6735,6736,6737,6738,6739,6740,6741,6746,6747,6749,6774,6775,6776,6778,6780,6781,6784,6785,6786,6787,6790,6806,6826,6868,6886,6928,6929,6930,6946,6966,6986,6987,7007,7009,7010,7024,7087,7088,7089, +7208,7229,7230,7231,7232,7292,7293,7294,7295,7296,7297,7298,7311,7312,7313,7315,7316,7317,7410,7427,7485,7488,7489,7583,7623,7643,7663,7683,7714,7730,7731,7733,7736,7737,7740,7744,7763,7764,7765, +7766,7776,7777,7779,7780,7790,7792,7793,7798,7823,7824,7825,7843,7852,7854,7865,7866,7867,7868,7869,7870,7871,7875,7877,7878,7879,7880,7884,7900,7903,7904,7906,7907,7916,7917,7935,7937,7939,7940, +7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7952,7953,7954,7955,7956,7957,7975,7976,7978,7980,7999,8015,8016,8017,8018,8019,8020,8021,8022,8026,8055,8096,8115,8117,8118,8140,8141,8142,8143, +8144,8145,8146,8147,8148,8150,8151,8152,8153,8154,8155,8157,8158,8159,8160,8161,8176,8177,8178,8256,8284,8306,8307,8310,8356,8357,8358,8359,8360,8361,8362,8363,8364,8383,8385,8390,8392,8393,8396, +8397,8398,8401,8403,8404,8416,8436,8507,8508,8517,8576,8582,8583,8584,8586,8587,8609,8610,8659,8664,8665,8669,8670,8671,8672,8674,8681,8719,8720,8721,8722,8723,8777,8856,8878,8879,8931,8934,8997, +9047,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,9086,9087,9099,9177,9238,9296,9297,9356,9457,9458,9465,9501,9521,9525,9526,9527,9539,9540,9548,9549,9550,9551,9552,9553,9555,9560,9561,9562, +9564,9565,9566,9576,9578,9579,9580,9581,9582,9584,9598,9599,9616,9617,9620,9636,9660,9796,9820,9857,9858,9859,9976,9977,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990,9996,10037, +10038,10045,10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10061,10062,10079,10085,10086,10088,10089,10090,10118,10136,10176,10181,10182,10204,10216,10219,10266, +10276,10277,10278,10291,10292,10293,10294,10295,10297,10298,10301,10303,10306,10307,10360,10361,10362,10364,10365,10367,10368,10369,10370,10377,10378,10379,10380,10427,10428,10443,10444,10446,10448, +10449,10450,10451,10452,10453,10454,10455,10456,10460,10537,10539,10540,10578,10582,10583,10599,10600,10604,10606,10610,10611,10612,10616,10618,10619,10636,10638,10645,10646,10665,10666,10676,10682, +10684,10696,10719,10721,10781,10782,10803,10804,10805,10837,10838,10878,10879,10880,10881,10897,10919,10930,10978,11022,11023,11025,11026,11028,11029,11031,11037,11040,11041,11042,11044,11045,11046, +11047,11048,11049,11050,11051,11052,11053,11055,11056,11057,11065,11066,11067,11068,11069,11070,11071,11072,11074,11079,11081,11083,11084,11096,11097,11098,11103,11104,11105,11106,11116,11117,11118, +11137,11138,11139,11145,11146,11176,11177,11178,11180,11181,11191,11192,11193,11196,11198,11218,11219,11259,11276,11317,11328,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403, +11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11549,11550,11608,11609,11615,11616,11624,11696,11699,11700,11701,11702,11703,11708,11709,11712,11715,11716,11717,11718, +11719,11720,11748,11749,11750,11751,11752,11795,11797,11799,11800,11801,11802,11806,11807,11808,11809,11814,11815,11816,11817,11818,11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829, +11833,11835,11856,11857,11860,11861,11862,11863,11864,11865,11866,11867,11868,11869,11870,11877,11878,11885,11899,11900,11901,11916,11919,11946,11947,11948,11949,11979,11994,11997,11998,12019,12020, +12021,12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12035,12036,12038,12039,12040,12042,12043,12044,12045,12047,12048,12050,12051,12052,12053,12096,12097,12121,12122,12127, +12136,12137,12160,12196,12197,12198,12336,12338,12340,12384,12423,12425,12427,12428,12429,12430,12480,12481,12576,12577,12578,12580,12596,12616,12617,12636,12656,12657,12658,12696,12716,12717,12718, +12719,12720,12721,12722,12723,12724,12736,12737,12740,12756,12757,12777,12778,12779,12780,12781,12782,12783,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798, +12799,12805,12807,12816,12818,12836,12837,12858,12861,12862,12863,12864,12867,12877,12903,12920,12923,12924,12925,12936,12937,12938,12939,12960,12961,12962,12996,12997,12998,13000,13018,13076,13078, +13079,13080,13084,13086,13087,13088,13089,13096,13097,13098,13099,13116,13117,13137,13138,13139,13140,13143,13144,13145,13146,13147,13152,13153,13154,13155,13161,13176,13177,13178,13179,13180,13181, +13216,13217,13218,13219,13221,13236,13256,13257,13283,13284,13296,13297,13298,13299,13300,13316,13318,13319,13320,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337, +13356,13357,13358,13359,13397,13417,13418,13419,13420,13421,13422,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13446,13447, +13448,13449,13476,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547, +13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13576,13577,13597,13598,13616,13617,13618,13656,13676,13698,13699,13776,13777,13797,13798,13816,13817,13839,13840,13841,13842,13843,14041, +14121,14141,14142,14182,14185,14186,14187,14188,14201,14242,14282,14283,14284,14285,14301,14304,14363,14365,14367,14373,14374,14375,14376,14377,14378,14379,14380,14392,14394,14402,14403,14404,14423, +14438,14439,14440,14441,14442,14484,14485,14493,14494,14497,14498,14581,14622,14643,14644,14715,14717,14718,14720,14721,14730,14731,14733,14734,14736,14737,14738,14739,14740,14741,14746,14753,14754, +14757,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14781,14848,14859,14893,14901,14909,14913,14942,14943,14944,14945,14946,14947,14948,14961,14962, +14963,14964,14981,14982,14983,14984,14990,15006,15007,15008,15011,15012,15021,15022,15102,15103,15105,15106,15124,15125,15126,15127,15128,15130,15131,15136,15137,15138,15139,15177,15178,15193,15195, +15197,15199,15270,15278,15279,15280,15281,15283,15284,15285,15287,15289,15291,15292,15295,15296,15297,15301,15315,15350,15351,15371,15383,15398,15399,15400,15401,15402,15403,15404,15405,15406,15416, +15417,15418,15419,15431,15432,15433,15434,15437,15440,15441,15442,15443,15444,15445,15446,15448,15450,15451,15452,15453,15455,15456,15457,15458,15459,15460,15469,15471,15473,15477,15494,15501,15508, +15512,15513,15515,15518,15519,15522,15525,15528,15529,15532,15533,15534,15535,15539,15612,15613,15615,15616,15617,15618,15619,15633,15634,15659,15660,15663,15672,15675,15676,15677,15678,15679,15680, +15681,15682,15683,15684,15686,15694,15696,15700,15701,15702,15703,15704,15707,15708,15709,15719,15723,15731,15732,15733,15734,15735,15736,15737,15738,15739,15745,15746,15760,15761,15762,15763,15764, +15765,15766,15767,15768,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15866, +15868,15869,15870,15903,15905,15906,15907,15908,15920,15921,15924,15938,15939,15940,15941,15942,15945,15946,15947,15970,15971,15982,15983,15991,16001,16002,16003,16004,16005,16007,16008,16009,16012, +16013,16014,16016,16019,16023,16031,16032,16033,16091,16094,16096,16105,16106,16107,16108,16109,16110,16112,16113,16114,16115,16116,16123,16131,16132,16133,16134,16135,16144,16147,16160,16161,16185, +16186,16187,16189,16191,16192,16197,16213,16217,16220,16221,16222,16224,16227,16231,16237,16241,16242,16251,16252,16253,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268, +16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16283,16285,16287,16288,16289,16291,16293,16295,16362,16366,16367,16371,16376,16381,16396,16397,16432,16442,16443,16444,16458, +16462,16463,16464,16475,16476,16477,16483,16499,16500,16501,16502,16503,16514,16535,16541,16542,16546,16551,16553,16554,16568,16574,16575,16576,16577,16578,16579,16580,16582,16583,16584,16585,16586, +16587,16588,16589,16590,16591,16599,16602,16603,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634, +16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667, +16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16702,16703,16705,16706, +16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739, +16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16761,16762,16763,16764,16765,16766,16767,16768,16770,16771,16773,16774,16780, +16781,16782,16786,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834, +16835,16836,16837,16838,16839,16840,16841,16842,16843,16849,16850,16851,16852,16853,16856,16858,16860,16862,16864,16866,16885,16886,16888,16896,16915,16917,16918,16919,16920,16921,16923,16924,16991, +16993,17002,17004,17005,17006,17015,17029,17046,17052,17056,17062,17068,17070,17071,17076,17079,17080,17089,17091,17092,17093,17094,17095,17097,17098,17099,17100,17101,17103,17104,17105,17106,17109, +17110,17114,17116,17117,17119,17120,17121,17122,17127,17162,17204,17209,17212,17214,17215,17218,17219,17222,17223,17226,17227,17228,17232,17238,17240,17241,17242,17243,17244,17245,17246,17247,17263, +17277,17282,17285,17288,17289,17290,17291,17292,17294,17295,17296,17297,17303,17310,17311,17312,17355,17375,17379,17382,17383,17384,17390,17391,17392,17393,17394,17402,17403,17406,17409,17410,17412, +17421,17422,17423,17424,17425,17426,17431,17432,17433,17434,17437,17439,17440,17441,17442,17443,17444,17445,17446,17449,17450,17468,17479,17480,17482,17483,17484,17485,17486,17487,17488,17489,17490, +17493,17495,17499,17500,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17519,17520,17531,17542,17549,17551,17553,17554,17555,17557,17558,17584,17586,17587,17593,17594,17597,17598, +17599,17600,17601,17614,17627,17628,17629,17630,17631,17632,17633,17634,17635,17637,17642,17647,17649,17655,17656,17657,17666,17667,17676,17681,17682,17684,17686,17703,17712,17717,17718,17765,17766, +17768,17769,17773,17804,17825,17831,17832,17834,17843,17844,17845,17849,17853,17855,17866,17874,17875,17876,17884,17885,17890,17900,17901,17926,17927,17953,17983,17986,17995,17996,18003,18004,18005, +18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18034,18038,18063,18066,18067,18068, +18090,18091,18097,18098,18103,18106,18126,18139,18141,18146,18147,18169,18174,18175,18183,18192,18194,18221,18222,18223,18224,18229,18243,18245,18246,18247,18248,18249,18250,18251,18252,18256,18270, +18273,18277,18292,18293,18295,18300,18301,18302,18347,18348,18349,18350,18353,18369,18383,18384,18385,18386,18387,18389,18390,18407,18408,18414,18415,18416,18426,18427,18428,18443,18445,18447,18459, +18488,18489,18507,18542,18565,18566,18666,18672,18675,18676,18687,18704,18705,18712,18713,18714,18715,18727,18745,18747,18748,18749,18751,18753,18754,18755,18758,18761,18769,18771,18772,18773,18774, +18776,18777,18779,18781,18783,18785,18788,18789,18790,18791,18792,18800,18802,18803,18804,18807,18808,18809,18810,18811,18812,18813,18815,18816,18817,18819,18820,18821,18822,18844,18892,18899,18900, +18901,18902,18903,18905,18906,18907,18908,18909,18910,18913,18914,18915,18916,18917,18918,18919,18921,18922,18924,18926,18927,18929,18937,18938,18939,18942,18943,18947,18951,18953,18954,18957,18959, +18960,18962,18971,18973,18985,18987,18988,18989,18990,18991,18993,18997,18998,18999,19000,19001,19002,19003,19004,19011,19012,19013,19014,19015,19017,19018,19019,19020,19021,19022,19023,19024,19025, +19026,19027,19030,19031,19038,19042,19048,19053,19054,19056,19068,19071,19133,19137,19138,19140,19141,19147,19148,19149,19151,19152,19156,19157,19158,19159,19169,19171,19172,19173,19175,19176,19177, +19178,19181,19185,19227,19241,19254,19255,19256,19257,19258,19265,19273,19274,19293,19294,19296,19308,19309,19310,19314,19315,19316,19317,19319,19324,19332,19333,19339,19341,19342,19343,19344,19345, +19347,19348,19351,19352,19353,19355,19362,19363,19364,19368,19369,19370,19371,19372,19373,19374,19375,19380,19383,19384,19392,19394,19401,19409,19449,19450,19454,19470,19471,19472,19473,19474,19476, +19478,19479,19495,19497,19498,19499,19500,19504,19529,19531,19533,19534,19535,19536,19537,19538,19539,19540,19541,19556,19558,19559,19560,19561,19562,19567,19571,19581,19583,19591,19592,19594,19596, +19597,19601,19602,19603,19604,19605,19606,19613,19614,19647,19669,19670,19671,19672,19673,19674,19675,19676,19679,19682,19683,19694,19702,19722,19736,19774,19775,19777,19778,19828,19835,19836,19837, +19848,19850,19855,19905,19906,19907,19908,19910,19912,19914,20028,20087,20118,20119,20120,20121,20126,20159,20195,20219,20227,20231,20232,20233,20234,20235,20236,20237,20238,20249,20250,20297,20374, +20381,20382,20383,20385,20386,20388,20390,20395,20406,20407,20447,20484,20485,20494,20500,20510,20511,20513,20515,20556,20603,20672,20674,20762,20793,20799,20812,20890,20891,20892,20893,20914,20915, +20916,20917,20977,20980,20981,20985,20986,20989,21006,21007,21019,21027,21066,21081,21082,21083,21084,21085,21086,21087,21088,21103,21105,21106,21107,21110,21111,21112,21113,21114,21115,21117,21118, +21133,21145,21147,21151,21152,21153,21155,21156,21158,21165,21167,21172,21175,21188,21192,21193,21194,21197,21209,21248,21256,21257,21277,21279,21283,21311,21330,21336,21340,21359,21361,21365,21367, +21397,21398,21399,21400,21427,21441,21460,21461,21469,21471,21472,21474,21475,21476,21483,21484,21485,21487,21488,21496,21691,21692,21736,21749,21755,21766,21769,21770,21771,21772,21773,21774,21775, +21777,21789,21790,21824,21829,21858,21895,21896,21968,21969,21970,21971,21984,21986,21998,22004,22007,22010,22013,22015,22020,22053,22059,22107,22110,22127,22149,22150,22151,22152,22206,22216,22225, +22227,22231,22278,22312,22386,22407,22410,22430,22431,22448,22453,22455,22456,22462,22468,22469,22476,22477,22485,22488,22489,22494,22498,22834,22901,22916,22922,22931,22935,22936,22937,22990,22998, +22999,23000,23001,23005,23006,23009,23010,23011,23012,23023,23024,23039,23045,23064,23065,23089,23115,23127,23128,23131,23134,23135,23136,23197,23200,23201,23202,23268,23392,23434,23435,23446,23447, +23452,23453,23479,23480,23481,23482,23504,23510,23511,23521,23522,23525,23532,23533,23534,23535,23536,23540,23546,23547,23548,23549,23550,23551,23552,23558,23560,23565,23566,23599,23603,23604,23605, +23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23627,23628,23635,23681,23683,23684,23685,23696,23698,23704,23713,23721,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738, +23739,23748,23749,23766,23770,23773,23779,23783,23791,23792,23802,23804,23819,23820,23823,23824,23825,23831,23833,23835,23836,23838,23839,23840,23842,23844,23851,23856,23857,23859,23860,23862,23888, +23891,23892,23895,23896,23900,23905,23906,23908,23911,23933,23937,23949,23950,23951,23975,23976,23978,23981,23984,23985,23986,23987,24005,24006,24028,24031,24032,24033,24038,24040,24050,24052,24053, +24054,24055,24056,24057,24058,24061,24062,24066,24067,24075,24077,24081,24086,24088,24089,24090,24091,24096,24097,24099,24103,24106,24122,24123,24124,24125,24127,24129,24131,24135,24139,24141,24142, +24145,24147,24148,24149,24150,24151,24154,24155,24157,24164,24168,24176,24186,24188,24189,24190,24191,24192,24195,24197,24208,24209,24218,24226,24227,24232,24233,24234,24236,24253,24254,24255,24256, +24273,24282,24283,24313,24328,24330,24333,24341,24342,24343,24347,24348,24349,24350,24356,24357,24359,24362,24364,24366,24376,24390,24399,24457,24468,24473,24484,24491,24492,24493,24497,24498,24499, +24501,24510,24520,24522,24527,24528,24531,24532,24534,24535,24545,24631,24632,24634,24667,24668,24670,24671,24672,24702,24703,24706,24709,24710,24711,24717,24718,24719,24720,24730,24733,24734,24735, +24736,24737,24738,24739,24750,24751,24806,24807,24811,24813,24821,24823,24825,24866,24881,24884,24885,24886,24905,24938,24965,24967,24974,24975,24993,25019,25020,25032,25036,25037,25039,25043,25045, +25059,25061,25088,25089,25108,25112,25115,25145,25162,25163,25164,25167,25169,25170,25172,25194,25200,25202,25207,25220,25222,25223,25233,25234,25235,25237,25238,25239,25240,25241,25242,25243,25244, +25245,25246,25247,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25261,25264,25266,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25285,25286,25288, +25289,25298,25299,25300,25301,25302,25306,25307,25311,25312,25313,25317,25326,25327,25328,25329,25334,25335,25336,25337,25338,25339,25340,25341,25361,25374,25379,25380,25381,25385,25394,25414,25420, +25421,25426,25437,25438,25439,25440,25446,25459,25475,25476,25477,25503,25504,25519,25526,25527,25528,25529,25530,25531,25532,25533,25589,25590,25602,25604,25606,25607,25610,25617,25702,25705,25729, +25730,25736,25737,25747,25749,25751,25759,25761,25767,25776,25780,25783,25797,25807,25808,25809,25810,25811,25812,25816,25819,25825,25826,25838,25849,25883,25884,25887,25888,25889,25890,25891,25892, +25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25925,25926, +25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25950,25976,25977,25978,25982,25983,25992,26044,26078,26083,26084,26085, +26089,26090,26091,26092,26104,26109,26112,26123,26124,26155,26156,26157,26158,26159,26160,26170,26179,26180,26181,26182,26184,26185,26186,26187,26194,26205,26212,26217,26220,26226,26228,26229,26233, +26234,26245,26246,26247,26269,26289,26323,26353,26361,26362,26374,26375,26379,26380,26381,26382,26387,26388,26392,26393,26394,26395,26396,26397,26398,26415,26432,26433,26437,26448,26456,26459,26471, +26474,26485,26486,26487,26504,26505,26506,26507,26508,26523,26537,26538,26539,26540,26541,26542,26546,26547,26548,26549,26551,26552,26556,26557,26558,26560,26561,26564,26565,26566,26567,26568,26569, +26572,26574,26580,26581,26584,26585,26595,26596,26597,26598,26599,26600,26601,26602,26603,26617,26618,26619,26634,26645,26649,26652,26654,26664,26666,26673,26680,26697,26707,26709,26718,26720,26721, +26725,26733,26766,26767,26768,26772,26779,26780,26790,26810,26813,26817,26821,26837,26839,26842,26844,26845,26846,26847,26848,26850,26851,26852,26853,26854,26859,26862,26870,26875,26876,26877,26878, +26879,26880,26881,26883,26885,26888,26894,26900,26901,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26931,26932,26934,26935,26936,26938,26939,26941,26944,26945, +26947,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26968,26969,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26984,26985,26986,26987, +26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27010,27011,27012,27014,27015,27019,27021,27022,27023,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034, +27035,27038,27039,27040,27041,27042,27043,27044,27045,27051,27052,27053,27054,27055,27056,27057,27058,27060,27061,27063,27065,27066,27067,27068,27069,27070,27071,27072,27073,27088,27089,27106,27107, +27108,27109,27110,27119,27125,27126,27132,27133,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27155,27156,27157,27158,27159,27160,27161,27162, +27163,27164,27167,27168,27170,27172,27173,27174,27175,27176,27178,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27193,27194,27195,27204,27219,27221,27231,27243,27248,27250,27251,27258, +27266,27267,27271,27277,27282,27291,27293,27295,27298,27299,27300,27301,27302,27314,27315,27316,27317,27318,27319,27320,27336,27337,27341,27345,27347,27348,27350,27351,27359,27361,27364,27365,27368, +27371,27376,27378,27379,27381,27385,27388,27391,27400,27411,27412,27414,27416,27422,27423,27425,27432,27440,27441,27451,27455,27456,27463,27464,27467,27468,27475,27477,27478,27480,27482,27484,27487, +27488,27489,27494,27495,27497,27499,27500,27501,27504,27509,27511,27516,27517,27518,27519,27520,27521,27532,27535,27536,27537,27538,27540,27543,27544,27545,27549,27550,27553,27557,27558,27559,27560, +27562,27563,27564,27565,27566,27567,27571,27573,27576,27577,27581,27582,27584,27587,27588,27602,27606,27646,27661,27662,27665,27666,27671,27673,27677,27678,27692,27695,27703,27704,27705,27708,27711, +27713,27730,27748,27749,27750,27751,27755,27756,27758,27760,27761,27764,27783,27784,27788,27791,27803,27804,27806,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27828,27833,27838, +27841,27842,27843,27844,27846,27850,27857,27858,27872,27873,27881,27883,27886,27887,27894,27904,27906,27917,27918,27919,27920,27928,27930,27935,27938,27940,27943,27946,27948,27950,27952,27953,27954, +27955,28031,28032,28033,28038,28039,28040,28042,28043,28044,28045,28046,28047,28054,28057,28061,28063,28065,28070,28076,28090,28094,28125,28135,28157,28160,28175,28176,28177,28178,28179,28205,28228, +28247,28250,28251,28252,28261,28262,28263,28264,28312,28313,28314,28318,28319,28324,28328,28347,28348,28353,28354,28355,28366,28370,28374,28376,28383,28390,28391,28392,28393,28394,28405,28486,28487, +28488,28489,28490,28491,28507,28545,28566,28568,28569,28571,28572,28573,28593,28596,28613,28615,28618,28621,28623,28624,28638,28650,28651,28674,28675,28676,28677,28678,28679,28680,28682,28685,28686, +28687,28690,28691,28692,28693,28694,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28714,28715,28716,28718,28721,28722,28723,28725,28726,28727,28728,28742,28771,28774, +28776,28781,28790,28791,28792,28794,28796,28797,28798,28799,28800,28801,28806,28807,28809,28810,28811,28812,28813,28818,28827,28828,28829,28830,28831,28832,28857,28863,28865,28866,28867,28868,28869, +28870,28872,28889,28930,28951,28956,28958,28987,28989,28990,28991,28992,28993,28994,28995,28997,29016,29019,29020,29039,29043,29088,29093,29095,29111,29137,29139,29141,29142,29143,29144,29145,29152, +29154,29155,29156,29157,29158,29159,29160,29161,29162,29171,29191,29202,29203,29205,29207,29208,29212,29233,29245,29250,29251,29252,29253,29261,29277,29282,29283,29285,29339,29346,29348,29476,29478, +29480,29491,29493,29494,29495,29496,29497,29499,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29523,29527,29528,29529,29530,29532,29535,29537,29538,29547,29548,29579,29583,29593,29611, +29617,29628,29631,29636,29640,29641,29650,29651,29658,29662,29663,29687,29688,29689,29702,29703,29712,29714,29715,29716,29727,29729,29730,29731,29732,29740,29743,29744,29745,29750,29776,29795,29799, +29855,29910,29921,29922,29923,29924,29925,29926,29942,29948,29953,29965,29966,29973,29996,30039,30058,30059,30067,30072,30073,30076,30077,30104,30107,30116,30117,30155,30166,30182,30189,30217,30231, +30233,30238,30239,30240,30241,30244,30253,30254,30255,30256,30257,30259,30261,30263,30265,30266,30269,30271,30274,30280,30281,30290,30344,30346,30347,30351,30352,30354,30355,30377,30380,30381,30382, +30392,30394,30408,30426,30427,30428,30431,30433,30440,30441,30472,30489,30566,30567,30569,30578,30579,30580,30581,30582,30583,30584,30586,30587,30590,30596,30604,30605,30606,30607,30608,30610,30611, +30618,30619,30671,30672,30678,30706,30709,30710,30711,30713,30715,30716,30717,30721,30722,30723,30724,30726,30727,30729,30730,30731,30732,30733,30734,30735,30737,30739,30740,30752,30753,30754,30755, +30824,30826,30827,30833,30838,30839,30840,30855,30866,30867,31033,31036,31052,31053,31054,31078,31091,31106,31107,31108,31109,31111,31151,31153,31216,31238,31247,31248,31273,31285,31290,31291,31294, +31295,31296,31297,31298,31299,31300,31302,31304,31305,31307,31310,31313,31328,31330,31412,31416,31417,31418,31419,31420,31421,31422,31423,31425,31426,31427,31429,31430,31431,31433,31434,31522,31523, +31545,31549,31551,31552,31557,31563,31564,31578,31579,31580,31581,31582,31639,31649,31701,31737,31739,31784,31785,31804,31805,31806,31808,31810,31832,31833,31834,31841,31842,31882,31891,31916,32150, +32169,32170,32172,32190,32216,32222,32223,32239,32251,32252,32253,32287,32294,32296,32301,32302,32303,32307,32308,32310,32311,32312,32315,32321,32322,32324,32325,32328,32337,32339,32340,32341,32342, +32343,32346,32363,32364,32365,32367,32371,32379,32380,32381,32382,32383,32384,32385,32387,32401,32402,32403,32411,32412,32413,32418,32419,32420,32421,32424,32426,32451,32453,32454,32474,32493,32494, +32509,32510,32514,32515,32516,32533,32538,32564,32565,32566,32573,32596,32597,32598,32599,32600,32601,32602,32604,32615,32626,32627,32629,32632,32657,32658,32659,32660,32668,32669,32675,32676,32677, +32678,32679,32680,32681,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32695,32697,32700,32702,32704,32706,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719, +32720,32721,32723,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32773,32774,32777, +32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32832,32833,32834,32835,32842,32843,32898,33018,33019,33026,33027,33059,33060,33061,33062,33063,33067, +33069,33080,33109,33114,33139,33146,33167,33217,33222,33223,33225,33235,33264,33307,33309,33310,33312,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33335,33361,33372,33373,33379,33403, +33405,33434,33435,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33531,33538,33539,33540,33541,33542, +33543,33544,33545,33547,33548,33549,33553,33554,33555,33556,33557,33560,33563,33565,33566,33579,33580,33581,33583,33586,33587,33588,33589,33590,33591,33592,33593,33594,33596,33597,33598,33599,33600, +33601,33602,33603,33624,33628,33629,33643,33644,33645,33648,33649,33650,33652,33653,33654,33655,33656,33657,33666,33669,33698,33759,33762,33763,33769,33770,33771,33780,33782,33783,33784,33788,33844, +33845,33853,33854,33863,33865,33866,33867,33868,33869,33871,33872,33956,33957,33963,33964,33972,33973,33974,33992,33996,34036,34037,34038,34039,34040,34043,34044,34054,34058,34059,34060,34061,34062, +34063,34064,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34102,34107,34119,34179,34252,34437,34526,34528,34612,34765,34766,34775,34776,34777,34778,34793,34802,34882,34885, +34895,34948,34949,34950,34951,34955,34971,34972,34973,34976,34978,34983,34985,34986,34987,34988,34989,34991,34993,34997,34998,34999,35000,35001,35002,35007,35008,35017,35019,35020,35021,35022,35023, +35024,35025,35026,35027,35068,35069,35070,35073,35085,35086,35087,35088,35090,35091,35093,35094,35098,35099,35100,35101,35102,35131,35132,35133,35135,35273,35281,35290,35291,35299,35322,35335,35336, +35361,35364,35365,35373,35460,35462,35467,35471,35492,35494,35495,35496,35497,35498,35500,35507,35508,35573,35574,35575,35576,35577,35578,35579,35580,35587,35594,35596,35597,35598,35599,35600,35601, +35602,35603,35607,35611,35612,35644,35790,35983,35984,36095,36151,36152,36162,36164,36165,36166,36169,36208,36213,36217,36224,36225,36226,36235,36273,36284,36351,36352,36355,36356,36359,36360,36380, +36390,36431,36479,36481,36506,36517,36557,36558,36559,36644,36648,36656,36657,36970,36971,36991,37063,37072,37074,37100,37101,37172,37182,37183,37510,37596,37687,37688,37689,37693,37696,37699,37700, +37715,37764,37765,37775,37781,37790,37798,37800,37825,37831,37833,37860,37869,37879,37888,37941,37942,37944,38050,38052,38066,38164,38208,38293,38295,38334,38335,38336,38337,38338,38339,38566,38716, +38825,38830,38831,38839,38843,38846,38870,38877,38900,38901,38905,38906,38919,38920,38921,39060,39089,39158,39172,39173,39371,39633,39712,39934,40120,40138,40160,40184,40204,40253,40352,40356,40374, +40388,40405,40413,40435,40436,40438,40443,40481,40606,40607)); diff --git a/sql/updates/world/3.3.5/2024_12_15_00_world.sql b/sql/updates/world/3.3.5/2024_12_15_00_world.sql new file mode 100644 index 00000000000..4c0133e0460 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_15_00_world.sql @@ -0,0 +1,2 @@ +-- Buzzard +UPDATE `creature_template_addon` SET `AnimTier`=3,`PvPFlags`=0 WHERE `entry`=2830; diff --git a/sql/updates/world/3.3.5/2024_12_16_00_world.sql b/sql/updates/world/3.3.5/2024_12_16_00_world.sql new file mode 100644 index 00000000000..ba36e2cd3e1 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_16_00_world.sql @@ -0,0 +1,2 @@ +-- Spirit Healer (Area: Gates of Ironforge - Difficulty: 0) +UPDATE `creature` SET `position_x`=-5156.3134765625, `position_y`=-864.98028564453125, `position_z`=507.67919921875, `orientation`=4.035317420959472656, `VerifiedBuild`=57689 WHERE `guid`=87044 AND `id`=6491; diff --git a/sql/updates/world/3.3.5/2024_12_16_01_world.sql b/sql/updates/world/3.3.5/2024_12_16_01_world.sql new file mode 100644 index 00000000000..6b99efcb09d --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_16_01_world.sql @@ -0,0 +1,2 @@ +-- Shattered Sun Marksman +UPDATE `creature_addon` SET `SheathState`=2 WHERE `guid` IN (96656,96658); diff --git a/sql/updates/world/3.3.5/2024_12_17_00_world.sql b/sql/updates/world/3.3.5/2024_12_17_00_world.sql new file mode 100644 index 00000000000..234470d4125 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_00_world.sql @@ -0,0 +1,71 @@ +-- +SET @OGUID := 79897; -- Need 62 +SET @EVENT := 12; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+61; +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 +(@OGUID+0, 180405, 595, 4100, 4100, 3, 1, 1560.671875, 625.26910400390625, 99.86887359619140625, 2.600535154342651367, 0, 0, 0.963629722595214843, 0.26724100112915039, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 0) CreateObject1 +(@OGUID+1, 180523, 595, 4100, 4100, 3, 1, 1569.0103759765625, 606.97918701171875, 100.1761093139648437, 3.071766138076782226, 0, 0, 0.999390602111816406, 0.034906134009361267, 7200, 255, 1, 56713), -- Apple Bob (Area: The Culling of Stratholme - Difficulty: 0) CreateObject1 +(@OGUID+2, 180407, 595, 4100, 4100, 3, 1, 1587.65625, 667.14410400390625, 103.0442886352539062, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 0) CreateObject1 +(@OGUID+3, 180431, 595, 4100, 4100, 3, 1, 2003.513916015625, 1287.404541015625, 145.7567901611328125, 5.061456203460693359, 0, 0, -0.57357597351074218, 0.819152355194091796, 7200, 255, 1, 56713), -- G_Pumpkin_01 scale 4.0 (Area: The Culling of Stratholme - Difficulty: 0) CreateObject1 +(@OGUID+4, 180405, 595, 4100, 4100, 3, 1, 1564.8853759765625, 586.18927001953125, 100.9324264526367187, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 0) CreateObject1 +(@OGUID+5, 180406, 595, 4100, 4100, 3, 1, 1605.2899169921875, 676.4375, 105.4878463745117187, 3.298687219619750976, 0, 0, -0.99691677093505859, 0.078466430306434631, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 0) CreateObject1 +(@OGUID+6, 180405, 595, 4100, 4100, 3, 1, 1592.717041015625, 681.19793701171875, 104.5380325317382812, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 0) CreateObject1 +(@OGUID+7, 180411, 595, 4100, 4100, 3, 1, 1596.4461669921875, 671.19793701171875, 112.6099319458007812, 1.186823248863220214, 0, 0, 0.559192657470703125, 0.829037725925445556, 7200, 255, 1, 56713), -- G_Ghost_01 (Area: The Culling of Stratholme - Difficulty: 0) CreateObject1 +(@OGUID+8, 180406, 595, 4100, 4100, 3, 1, 1599.9947509765625, 662.05206298828125, 103.3326873779296875, 5.916667938232421875, 0, 0, -0.18223476409912109, 0.98325502872467041, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+9, 180406, 595, 4100, 4100, 3, 1, 1616.7847900390625, 754.013916015625, 115.2821731567382812, 0.855210542678833007, 0, 0, 0.414692878723144531, 0.909961462020874023, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+10, 180411, 595, 4100, 4100, 3, 1, 1549.6754150390625, 594.638916015625, 107.3046875, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 7200, 255, 1, 56713), -- G_Ghost_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+11, 180406, 595, 4100, 4100, 3, 1, 1557.5069580078125, 615.64239501953125, 99.77874755859375, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+12, 180407, 595, 4100, 4100, 3, 1, 1635.720458984375, 816.5399169921875, 120.1334075927734375, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+13, 180405, 595, 4100, 4100, 3, 1, 1916.109375, 1298.60595703125, 142.4672393798828125, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+14, 180405, 595, 4100, 4100, 3, 1, 1936.9791259765625, 1275.8853759765625, 145.9156951904296875, 3.52557229995727539, 0, 0, -0.98162651062011718, 0.190812408924102783, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+15, 180407, 595, 4100, 4100, 3, 1, 2157.3369140625, 1260.6649169921875, 134.7227020263671875, 2.984498262405395507, 0, 0, 0.996916770935058593, 0.078466430306434631, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+16, 180406, 595, 4100, 4100, 3, 1, 2155.27783203125, 1293.34375, 134.35076904296875, 1.047197580337524414, 0, 0, 0.5, 0.866025388240814208, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+17, 180405, 595, 4100, 4100, 3, 1, 2228.895751953125, 1336.8853759765625, 127.61419677734375, 5.288348197937011718, 0, 0, -0.4771585464477539, 0.878817260265350341, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+18, 180411, 595, 4100, 4100, 3, 1, 2196.697998046875, 1223.44970703125, 143.6862335205078125, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 7200, 255, 1, 56713), -- G_Ghost_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+19, 180406, 595, 4100, 4100, 3, 1, 1984.8785400390625, 1332.2708740234375, 143.2194976806640625, 0.872663915157318115, 0, 0, 0.422617912292480468, 0.906307935714721679, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+20, 180405, 595, 4100, 4100, 3, 1, 1980.78125, 1298.75, 146.1199188232421875, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+21, 180407, 595, 4100, 4100, 3, 1, 1958.548583984375, 1276.079833984375, 146.206695556640625, 3.473210096359252929, 0, 0, -0.98628520965576171, 0.165049895644187927, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+22, 180407, 595, 4100, 4100, 3, 1, 1958.78125, 1298.8316650390625, 146.205108642578125, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+23, 180407, 595, 4100, 4100, 3, 1, 2332.64404296875, 1254.0069580078125, 133.479217529296875, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+24, 180405, 595, 4100, 4100, 3, 1, 1984.5035400390625, 1244.8021240234375, 143.2156219482421875, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+25, 180406, 595, 4100, 4100, 3, 1, 1937.171875, 1298.9410400390625, 145.9352874755859375, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+26, 180406, 595, 4100, 4100, 3, 1, 2187.157958984375, 1243.6163330078125, 137.33526611328125, 4.468043327331542968, 0, 0, -0.7880105972290039, 0.615661680698394775, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+27, 180405, 595, 4100, 4100, 3, 1, 1830.954833984375, 1287.44970703125, 143.5936431884765625, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+28, 180407, 595, 4100, 4100, 3, 1, 2178.020751953125, 1233.69970703125, 137.325775146484375, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+29, 180406, 595, 4100, 4100, 3, 1, 1980.1007080078125, 1276.0538330078125, 146.1192779541015625, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+30, 180405, 595, 4100, 4100, 3, 1, 2077.151123046875, 1280.6336669921875, 141.5343017578125, 2.652894020080566406, 0, 0, 0.970294952392578125, 0.241925001144409179, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+31, 180407, 595, 4100, 4100, 3, 1, 2267.9375, 1337.4322509765625, 124.4153900146484375, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+32, 180406, 595, 4100, 4100, 3, 1, 2228.81591796875, 1326.123291015625, 127.8727188110351562, 4.904376029968261718, 0, 0, -0.636077880859375, 0.771624863147735595, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+33, 180407, 595, 4100, 4100, 3, 1, 2232.302001953125, 1145.795166015625, 139.8232421875, 2.984498262405395507, 0, 0, 0.996916770935058593, 0.078466430306434631, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+34, 180406, 595, 4100, 4100, 3, 1, 2205.111083984375, 1203.8958740234375, 136.977691650390625, 1.256635904312133789, 0, 0, 0.587784767150878906, 0.809017360210418701, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+35, 180407, 595, 4100, 4100, 3, 1, 2214.72216796875, 1212.6441650390625, 137.13104248046875, 1.029743075370788574, 0, 0, 0.492423057556152343, 0.870355963706970214, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+36, 180406, 595, 4100, 4100, 3, 1, 2267.947998046875, 1323.4305419921875, 125.920806884765625, 2.007128477096557617, 0, 0, 0.84339141845703125, 0.537299633026123046, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+37, 180407, 595, 4100, 4100, 3, 1, 2076.864501953125, 1294.8211669921875, 141.652618408203125, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+38, 180406, 595, 4100, 4100, 3, 1, 1915.73095703125, 1276.0035400390625, 142.3786163330078125, 4.345870018005371093, 0, 0, -0.82412624359130859, 0.566406130790710449, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+39, 180406, 595, 4100, 4100, 3, 1, 2315.975830078125, 1410.767333984375, 128.2122955322265625, 1.413715124130249023, 0, 0, 0.649447441101074218, 0.760406434535980224, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+40, 180411, 595, 4100, 4100, 3, 1, 2025.5382080078125, 1287.295166015625, 150.1963043212890625, 3.141592741012573242, 0, 0, -1, 0, 7200, 255, 1, 56713), -- G_Ghost_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+41, 180405, 595, 4100, 4100, 3, 1, 2369.345458984375, 1190.0035400390625, 132.0498809814453125, 4.9218292236328125, 0, 0, -0.62932014465332031, 0.77714616060256958, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+42, 180406, 595, 4100, 4100, 3, 1, 2365.678955078125, 1206.09033203125, 131.5900726318359375, 5.410521507263183593, 0, 0, -0.42261791229248046, 0.906307935714721679, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+43, 180405, 595, 4100, 4100, 3, 1, 2338.741455078125, 1423.5347900390625, 128.133087158203125, 0.663223206996917724, 0, 0, 0.325567245483398437, 0.945518851280212402, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+44, 180411, 595, 4100, 4100, 3, 1, 2398.38720703125, 1206.93408203125, 150.74884033203125, 1.902408957481384277, 0, 0, 0.814115524291992187, 0.580702960491180419, 7200, 255, 1, 56713), -- G_Ghost_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+45, 180406, 595, 4100, 4100, 3, 1, 2399.6494140625, 1172.5260009765625, 148.0749053955078125, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+46, 180411, 595, 4100, 4100, 3, 1, 2417.494873046875, 1209.1197509765625, 150.519256591796875, 1.989672422409057617, 0, 0, 0.838669776916503906, 0.544640243053436279, 7200, 255, 1, 56713), -- G_Ghost_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+47, 180407, 595, 4100, 4100, 3, 1, 2411.182373046875, 1174.939208984375, 148.074951171875, 4.101525306701660156, 0, 0, -0.88701057434082031, 0.461749136447906494, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+48, 180411, 595, 4100, 4100, 3, 1, 2435.392333984375, 1214.0364990234375, 150.6657257080078125, 1.867502212524414062, 0, 0, 0.803856849670410156, 0.594822824001312255, 7200, 255, 1, 56713), -- G_Ghost_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+49, 180405, 595, 4100, 4100, 3, 1, 2412.885498046875, 1094.3038330078125, 148.0759124755859375, 2.530723094940185546, 0, 0, 0.953716278076171875, 0.300707906484603881, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+50, 180407, 595, 4100, 4100, 3, 1, 2418.798583984375, 1140.7569580078125, 148.075897216796875, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+51, 180406, 595, 4100, 4100, 3, 1, 2407.296875, 1138.248291015625, 148.0759124755859375, 0.890116631984710693, 0, 0, 0.430510520935058593, 0.902585566043853759, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+52, 180405, 595, 4100, 4100, 3, 1, 2408.685791015625, 1113.015625, 148.0759124755859375, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+53, 180407, 595, 4100, 4100, 3, 1, 2438.479248046875, 1206.1146240234375, 149.1508941650390625, 6.12610626220703125, 0, 0, -0.07845878601074218, 0.996917366981506347, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+54, 180406, 595, 4100, 4100, 3, 1, 2467.420166015625, 1130.220458984375, 158.0266876220703125, 5.794494152069091796, 0, 0, -0.24192142486572265, 0.970295846462249755, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+55, 180407, 595, 4100, 4100, 3, 1, 2472.703125, 1105.9149169921875, 157.9708251953125, 4.817109584808349609, 0, 0, -0.66913032531738281, 0.74314504861831665, 7200, 255, 1, 56713), -- G_Pumpkin_03 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+56, 180405, 595, 4100, 4100, 3, 1, 1664.904541015625, 890.26910400390625, 119.99566650390625, 0.453785061836242675, 0, 0, 0.224950790405273437, 0.974370121955871582, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+57, 180405, 595, 4100, 4100, 3, 1, 1691.451416015625, 954.13714599609375, 120.3690032958984375, 0.453785061836242675, 0, 0, 0.224950790405273437, 0.974370121955871582, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+58, 180406, 595, 4100, 4100, 3, 1, 1669.29345703125, 1017.84722900390625, 125.0198974609375, 0.855210542678833007, 0, 0, 0.414692878723144531, 0.909961462020874023, 7200, 255, 1, 56713), -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+59, 180405, 595, 4100, 4100, 3, 1, 1670.0416259765625, 1097.859375, 127.4366989135742187, 0.750490784645080566, 0, 0, 0.3665008544921875, 0.93041771650314331, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+60, 180405, 595, 4100, 4100, 3, 1, 1688.498291015625, 1185.3211669921875, 132.57257080078125, 0.226892471313476562, 0, 0, 0.113203048706054687, 0.993571877479553222, 7200, 255, 1, 56713), -- G_Pumpkin_01 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+61, 180406, 595, 4100, 4100, 3, 1, 1739.0399169921875, 1249.2760009765625, 137.710540771484375, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 7200, 255, 1, 56713); -- G_Pumpkin_02 (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+61 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+61; diff --git a/sql/updates/world/3.3.5/2024_12_17_01_world.sql b/sql/updates/world/3.3.5/2024_12_17_01_world.sql new file mode 100644 index 00000000000..f2b7da2922d --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_01_world.sql @@ -0,0 +1,82 @@ +-- +SET @OGUID := 93806; -- Need 73 +SET @EVENT := 2; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+72; +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 +(@OGUID+0, 187235, 595, 4100, 4100, 3, 1, 1587.892333984375, 667.3992919921875, 103.0756301879882812, 4.834563255310058593, 0, 0, -0.66261959075927734, 0.748956084251403808, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+1, 187191, 595, 4100, 4100, 3, 1, 1573.171875, 622.828125, 99.63867950439453125, 0.855210542678833007, 0, 0, 0.414692878723144531, 0.909961462020874023, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+2, 187235, 595, 4100, 4100, 3, 1, 1560.3992919921875, 577.02606201171875, 106.6330337524414062, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+3, 187235, 595, 4100, 4100, 3, 1, 1606.8975830078125, 677.27081298828125, 105.852813720703125, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+4, 187235, 595, 4100, 4100, 3, 1, 1593.1632080078125, 681.8524169921875, 104.6160125732421875, 0.541050612926483154, 0, 0, 0.267237663269042968, 0.96363067626953125, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+5, 187235, 595, 4100, 4100, 3, 1, 1555.8038330078125, 601.5711669921875, 99.15207672119140625, 1.012289404869079589, 0, 0, 0.484808921813964843, 0.87462007999420166, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+6, 187235, 595, 4100, 4100, 3, 1, 1616.62158203125, 754.20660400390625, 115.3078079223632812, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+7, 187567, 595, 4100, 4100, 3, 1, 1575.0347900390625, 618.4757080078125, 104.6546630859375, 1.099556446075439453, 0, 0, 0.522498130798339843, 0.852640450000762939, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+8, 187235, 595, 4100, 4100, 3, 1, 1599.44970703125, 661.5625, 103.2282791137695312, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+9, 187567, 595, 4100, 4100, 3, 1, 1569.8316650390625, 597.65277099609375, 103.2068328857421875, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+10, 187235, 595, 4100, 4100, 3, 1, 1635.25, 816.97222900390625, 120.2372894287109375, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+11, 187235, 595, 4100, 4100, 3, 1, 1664.5660400390625, 890.685791015625, 120.117706298828125, 4.782202720642089843, 0, 0, -0.68199825286865234, 0.731353819370269775, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+12, 187235, 595, 4100, 4100, 3, 1, 1691.2239990234375, 954.69964599609375, 120.3922805786132812, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+13, 187235, 595, 4100, 4100, 3, 1, 1669.0660400390625, 1018.2603759765625, 125.0752334594726562, 5.480334281921386718, 0, 0, -0.39073085784912109, 0.920504987239837646, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+14, 187235, 595, 4100, 4100, 3, 1, 1669.842041015625, 1098.0364990234375, 127.4882278442382812, 5.393068790435791015, 0, 0, -0.43051052093505859, 0.902585566043853759, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+15, 187235, 595, 4100, 4100, 3, 1, 1688.30908203125, 1185.3697509765625, 132.57421875, 4.799657344818115234, 0, 0, -0.67558956146240234, 0.737277925014495849, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+16, 187235, 595, 4100, 4100, 3, 1, 1739.0538330078125, 1249.53125, 137.72503662109375, 4.572763919830322265, 0, 0, -0.75470924377441406, 0.656059443950653076, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+17, 187235, 595, 4100, 4100, 3, 1, 1830.8524169921875, 1287.626708984375, 143.58587646484375, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+18, 187235, 595, 4100, 4100, 3, 1, 1916.1285400390625, 1275.9288330078125, 142.4715576171875, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+19, 187235, 595, 4100, 4100, 3, 1, 1915.9947509765625, 1298.732666015625, 142.4404754638671875, 3.874631166458129882, 0, 0, -0.93358039855957031, 0.358368009328842163, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+20, 187235, 595, 4100, 4100, 3, 1, 1937.0538330078125, 1275.6927490234375, 145.923309326171875, 1.588248729705810546, 0, 0, 0.713250160217285156, 0.700909554958343505, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+21, 187235, 595, 4100, 4100, 3, 1, 1937.1944580078125, 1298.96875, 145.9376373291015625, 4.59021615982055664, 0, 0, -0.74895572662353515, 0.662620067596435546, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+22, 187235, 595, 4100, 4100, 3, 1, 1958.6754150390625, 1275.9444580078125, 146.2058258056640625, 1.535889506340026855, 0, 0, 0.694658279418945312, 0.719339847564697265, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+23, 187235, 595, 4100, 4100, 3, 1, 1958.76220703125, 1299.123291015625, 146.205230712890625, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+24, 187235, 595, 4100, 4100, 3, 1, 1984.2742919921875, 1244.0191650390625, 143.217498779296875, 0.453785061836242675, 0, 0, 0.224950790405273437, 0.974370121955871582, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+25, 187235, 595, 4100, 4100, 3, 1, 1980.185791015625, 1276.2708740234375, 146.119354248046875, 1.413715124130249023, 0, 0, 0.649447441101074218, 0.760406434535980224, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+26, 187235, 595, 4100, 4100, 3, 1, 1980.545166015625, 1298.796875, 146.1197052001953125, 4.939284324645996093, 0, 0, -0.6225137710571289, 0.78260880708694458, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+27, 187235, 595, 4100, 4100, 3, 1, 1984.6771240234375, 1332.60595703125, 143.220458984375, 6.03883981704711914, 0, 0, -0.12186908721923828, 0.9925462007522583, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+28, 187235, 595, 4100, 4100, 3, 1, 2017.642333984375, 1261.329833984375, 142.9531097412109375, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+29, 187235, 595, 4100, 4100, 3, 1, 2033.34033203125, 1281.6285400390625, 143.624755859375, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+30, 187235, 595, 4100, 4100, 3, 1, 2033.7569580078125, 1293.685791015625, 143.4059295654296875, 4.834563255310058593, 0, 0, -0.66261959075927734, 0.748956084251403808, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+31, 187235, 595, 4100, 4100, 3, 1, 2017.4617919921875, 1313.5625, 142.949127197265625, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+32, 187235, 595, 4100, 4100, 3, 1, 2067.348876953125, 1293.375, 141.9972686767578125, 5.061456203460693359, 0, 0, -0.57357597351074218, 0.819152355194091796, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+33, 187235, 595, 4100, 4100, 3, 1, 2067.857666015625, 1281.2413330078125, 141.9698333740234375, 1.204277276992797851, 0, 0, 0.56640625, 0.824126183986663818, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+34, 187567, 595, 4100, 4100, 3, 1, 2104.20654296875, 1306.1927490234375, 144.4675750732421875, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+35, 187567, 595, 4100, 4100, 3, 1, 2106.89404296875, 1380.51220703125, 139.30267333984375, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+36, 187235, 595, 4100, 4100, 3, 1, 2154.65625, 1293.204833984375, 134.4106597900390625, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+37, 187235, 595, 4100, 4100, 3, 1, 2194.291748046875, 1288.751708984375, 134.5957794189453125, 2.949595451354980468, 0, 0, 0.995395660400390625, 0.095851235091686248, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+38, 187235, 595, 4100, 4100, 3, 1, 2187.078125, 1243.5625, 137.3231964111328125, 2.583080768585205078, 0, 0, 0.961260795593261718, 0.275640487670898437, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+39, 187235, 595, 4100, 4100, 3, 1, 2177.614501953125, 1234.0035400390625, 137.313629150390625, 2.216565132141113281, 0, 0, 0.894933700561523437, 0.44619917869567871, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+40, 187235, 595, 4100, 4100, 3, 1, 2204.904541015625, 1204.0086669921875, 136.990386962890625, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+41, 187235, 595, 4100, 4100, 3, 1, 2214.890625, 1212.2586669921875, 137.1099395751953125, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+42, 187235, 595, 4100, 4100, 3, 1, 2228.6806640625, 1326.1197509765625, 127.8867874145507812, 2.984498262405395507, 0, 0, 0.996916770935058593, 0.078466430306434631, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+43, 187235, 595, 4100, 4100, 3, 1, 2228.91845703125, 1337.0347900390625, 127.625213623046875, 3.473210096359252929, 0, 0, -0.98628520965576171, 0.165049895644187927, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+44, 187235, 595, 4100, 4100, 3, 1, 2267.93408203125, 1323.55908203125, 125.9082565307617187, 0.296705186367034912, 0, 0, 0.147809028625488281, 0.989015936851501464, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+45, 187235, 595, 4100, 4100, 3, 1, 2231.807373046875, 1145.2222900390625, 139.6356353759765625, 0.959929943084716796, 0, 0, 0.461748123168945312, 0.887011110782623291, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+46, 187235, 595, 4100, 4100, 3, 1, 2267.907958984375, 1337.30908203125, 124.4250564575195312, 6.073746204376220703, 0, 0, -0.10452842712402343, 0.994521915912628173, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+47, 187235, 595, 4100, 4100, 3, 1, 2332.710205078125, 1253.6978759765625, 133.481353759765625, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+48, 187235, 595, 4100, 4100, 3, 1, 2316.064208984375, 1410.5867919921875, 128.1347808837890625, 0, 0, 0, 0, 1, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+49, 187235, 595, 4100, 4100, 3, 1, 2316.713623046875, 1157.361083984375, 135.58953857421875, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+50, 187235, 595, 4100, 4100, 3, 1, 2344.272705078125, 1216.18408203125, 131.106964111328125, 4.991643905639648437, 0, 0, -0.60181427001953125, 0.798636078834533691, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+51, 187235, 595, 4100, 4100, 3, 1, 2369.5087890625, 1189.9566650390625, 132.0734100341796875, 3.298687219619750976, 0, 0, -0.99691677093505859, 0.078466430306434631, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+52, 187235, 595, 4100, 4100, 3, 1, 2338.635498046875, 1423.48095703125, 128.1294097900390625, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+53, 187235, 595, 4100, 4100, 3, 1, 2365.51220703125, 1206.0208740234375, 131.530059814453125, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+54, 187567, 595, 4100, 4100, 3, 1, 2371.5, 1199.4288330078125, 140.5843963623046875, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+55, 187235, 595, 4100, 4100, 3, 1, 2400.90966796875, 1219.62158203125, 134.0390167236328125, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+56, 187194, 595, 4100, 4100, 3, 1, 2395.723876953125, 1194.1319580078125, 142.4735870361328125, 1.745326757431030273, 0, 0, 0.766043663024902343, 0.642788589000701904, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+57, 187235, 595, 4100, 4100, 3, 1, 2389.998291015625, 1194.26220703125, 148.0759124755859375, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+58, 187235, 595, 4100, 4100, 3, 1, 2395.064208984375, 1176.1875, 133.93292236328125, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+59, 187235, 595, 4100, 4100, 3, 1, 2399.833251953125, 1172.3489990234375, 148.0749053955078125, 1.361356139183044433, 0, 0, 0.629320144653320312, 0.77714616060256958, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+60, 187235, 595, 4100, 4100, 3, 1, 2418.4775390625, 1223.9947509765625, 134.0390167236328125, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+61, 187194, 595, 4100, 4100, 3, 1, 2407.859375, 1196.763916015625, 142.53497314453125, 1.815141916275024414, 0, 0, 0.788010597229003906, 0.615661680698394775, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+62, 187194, 595, 4100, 4100, 3, 1, 2421.213623046875, 1200.0069580078125, 142.5443267822265625, 1.797688722610473632, 0, 0, 0.7826080322265625, 0.622514784336090087, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+63, 187235, 595, 4100, 4100, 3, 1, 2411.060791015625, 1175.234375, 148.074920654296875, 2.059488296508789062, 0, 0, 0.857167243957519531, 0.515038192272186279, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+64, 187235, 595, 4100, 4100, 3, 1, 2407.21533203125, 1138.1649169921875, 148.0759124755859375, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+65, 187194, 595, 4100, 4100, 3, 1, 2433.482666015625, 1202.951416015625, 142.5956878662109375, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+66, 187235, 595, 4100, 4100, 3, 1, 2418.864501953125, 1141.2552490234375, 148.075897216796875, 4.45059061050415039, 0, 0, -0.79335308074951171, 0.608761727809906005, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+67, 187235, 595, 4100, 4100, 3, 1, 2408.55029296875, 1113.0538330078125, 148.0759124755859375, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+68, 187194, 595, 4100, 4100, 3, 1, 2412.736083984375, 1103.907958984375, 154.756591796875, 0.209439441561698913, 0, 0, 0.104528427124023437, 0.994521915912628173, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+69, 187235, 595, 4100, 4100, 3, 1, 2412.786376953125, 1094.19970703125, 148.0759124755859375, 0.331610709428787231, 0, 0, 0.16504669189453125, 0.986285746097564697, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+70, 187235, 595, 4100, 4100, 3, 1, 2452.13720703125, 1122.0504150390625, 148.075897216796875, 3.281238555908203125, 0, 0, -0.99756336212158203, 0.069766148924827575, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+71, 187235, 595, 4100, 4100, 3, 1, 2455.65625, 1104.7725830078125, 148.075897216796875, 3.316144466400146484, 0, 0, -0.99619388580322265, 0.087165042757987976, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 +(@OGUID+72, 187235, 595, 4100, 4100, 3, 1, 2520.549560546875, 1138.0416259765625, 132.076507568359375, 4.328419685363769531, 0, 0, -0.82903671264648437, 0.559194147586822509, 7200, 255, 1, 57916); -- Standing, Exterior, Medium - Xmas (Area: The Culling of Stratholme - Difficulty: 1) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+72 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+72; diff --git a/sql/updates/world/3.3.5/2024_12_17_02_world.sql b/sql/updates/world/3.3.5/2024_12_17_02_world.sql new file mode 100644 index 00000000000..3f0df0d756c --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_02_world.sql @@ -0,0 +1,81 @@ +-- +SET @OGUID := 48873; -- SET BY THE TDB TEAM (Need 24) +SET @EVENT := 12; + +-- Cursed Darkhound - No such spawn exists on 1.15.4 (57134) and Wotlk classic (51739) at that location, even after Hallow's End +DELETE FROM `creature` WHERE `guid`=45217; + +-- Wickerman Guardian +UPDATE `creature_template` SET `gossip_menu_id`=6536, `npcflag`=1, `BaseAttackTime`=3000, `RangeAttackTime`=3000, `unit_flags`=32832 WHERE `entry`=15195; + +DELETE FROM `creature_template_addon` WHERE `entry`=15195; +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(15195, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, '12187'); + +DELETE FROM `gossip_menu` WHERE `MenuID`=6536 AND `TextID`=7739; +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(6536, 7739, 0); + +-- Darkcaller Yanka +UPDATE `broadcast_text` SET `Text1`='Welcome to the Wickerman Festival, $c!$B$BOn the observance of Hallow''s End, the Forsaken burn a wickerman in honor of this, the most revered of occasions. It was on this day that the Banshee Queen herself delivered us from the clutches of the Lich King and the Scourge. We have remained free ever since. Those who would have seen us fall are repaid in full... with vengeance!$B$BThe burning of the Wickerman begins at 8:00 PM!', `VerifiedBuild`=0 WHERE `ID`=10671; +UPDATE `npc_text` SET `text0_1`='Welcome to the Wickerman Festival, $c!$B$BOn the observance of Hallow''s End, the Forsaken burn a wickerman in honor of this, the most revered of occasions. It was on this day that the Banshee Queen herself delivered us from the clutches of the Lich King and the Scourge. We have remained free ever since. Those who would have seen us fall are repaid in full... with vengeance!$B$BThe burning of the Wickerman begins at 8:00 PM!', `VerifiedBuild`=0 WHERE `ID`=7740; + +DELETE FROM `creature_template_addon` WHERE `entry`=15197; +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(15197, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, ''); + +DELETE FROM `gossip_menu` WHERE `MenuID`=6537 AND `TextID`=7740; +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(6537, 7740, 0); + +-- Existing spawn updates +UPDATE `creature` SET `zoneId`=85, `areaId`=153, `position_x`=1751.79833984375, `position_y`=512.40234375, `position_z`=37.38980865478515625, `orientation`=1.431169986724853515, `spawntimesecs`=0 WHERE `guid`=85633; -- Instant respawn on Wrath classic +UPDATE `creature` SET `zoneId`=85, `areaId`=153, `position_x`=1728.943603515625, `position_y`=548.496337890625, `position_z`=34.24716949462890625, `orientation`=4.537856101989746093, `spawntimesecs`=0 WHERE `guid`=85634; -- Instant respawn on Wrath classic +UPDATE `creature` SET `zoneId`=85, `areaId`=153, `position_x`=1712.1248779296875, `position_y`=512.95538330078125, `position_z`=36.6183013916015625, `orientation`=1.588249564170837402, `spawntimesecs`=0 WHERE `guid`=85632; -- Instant respawn on Wrath classic +UPDATE `creature` SET `zoneId`=85, `areaId`=153, `position_x`=1731.7572021484375, `position_y`=521.96514892578125, `position_z`=35.98299407958984375, `orientation`=1.588249564170837402 WHERE `guid`=85635; + +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1731.435546875, `position_y`=508.8170166015625, `position_z`=41.35896682739257812, `orientation`=1.500982880592346191, `rotation2`=0.681998252868652343, `rotation3`=0.731353819370269775 WHERE `guid`=17870; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1746.1051025390625, `position_y`=517.218017578125, `position_z`=38.87208938598632812, `orientation`=3.52557229995727539, `rotation2`=-0.98162651062011718, `rotation3`=0.190812408924102783 WHERE `guid`=17879; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1750.8131103515625, `position_y`=509.61712646484375, `position_z`=38.33571243286132812, `orientation`=1.535889506340026855, `rotation2`=0.694658279418945312, `rotation3`=0.719339847564697265 WHERE `guid`=17868; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1759.492431640625, `position_y`=515.94879150390625, `position_z`=35.30905914306640625, `orientation`=5.253442287445068359, `rotation2`=-0.49242305755615234, `rotation3`=0.870355963706970214 WHERE `guid`=17871; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1744.9915771484375, `position_y`=475.503570556640625, `position_z`=61.65636444091796875, `orientation`=5.183629035949707031, `rotation2`=-0.52249813079833984, `rotation3`=0.852640450000762939 WHERE `guid`=17873; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1719.737060546875, `position_y`=523.3734130859375, `position_z`=36.81510162353515625, `orientation`=3.490667104721069335, `rotation2`=-0.98480701446533203, `rotation3`=0.173652306199073791 WHERE `guid`=17881; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1727.8775634765625, `position_y`=475.36956787109375, `position_z`=63.6461334228515625, `orientation`=3.543023586273193359, `rotation2`=-0.97992420196533203, `rotation3`=0.199370384216308593 WHERE `guid`=17880; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1707.3563232421875, `position_y`=519.654052734375, `position_z`=34.97322845458984375, `orientation`=5.654868602752685546, `rotation2`=-0.30901622772216796, `rotation3`=0.95105677843093872 WHERE `guid`=17872; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1709.513916015625, `position_y`=509.67730712890625, `position_z`=36.90455245971679687, `orientation`=1.431168079376220703, `rotation2`=0.656058311462402343, `rotation3`=0.754710197448730468 WHERE `guid`=17869; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1714.2874755859375, `position_y`=473.915802001953125, `position_z`=61.64679718017578125, `orientation`=2.251473426818847656, `rotation2`=0.902585029602050781, `rotation3`=0.430511653423309326 WHERE `guid`=17874; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1741.1187744140625, `position_y`=505.332916259765625, `position_z`=41.39785385131835937, `orientation`=4.642575740814208984, `rotation2`=-0.731353759765625, `rotation3`=0.681998312473297119 WHERE `guid`=17875; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1731.564208984375, `position_y`=514.59552001953125, `position_z`=39.34745407104492187, `orientation`=5.70722818374633789, `rotation2`=-0.28401470184326171, `rotation3`=0.958819925785064697 WHERE `guid`=17876; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1722.21875, `position_y`=512.33160400390625, `position_z`=39.15671920776367187, `orientation`=0.209439441561698913, `rotation2`=0.104528427124023437, `rotation3`=0.994521915912628173 WHERE `guid`=17877; +UPDATE `gameobject` SET `zoneId`=85, `areaId`=153, `position_x`=1731.5814208984375, `position_y`=500.1231689453125, `position_z`=42.50485992431640625, `orientation`=4.502951622009277343, `rotation2`=-0.7771453857421875, `rotation3`=0.629321098327636718 WHERE `guid`=17878; + +-- Missing Spawns +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+23; +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 +(@OGUID+0, 180434, 0, 85, 153, 1, 1, 1735.592041015625, 549.92852783203125, 33.68162918090820312, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 120, 255, 1, 0), -- Bonfire (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+1, 180432, 0, 85, 153, 1, 1, 1731.3472900390625, 474.772796630859375, 61.65636444091796875, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 120, 255, 1, 0), -- Forsaken Banner (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+2, 180426, 0, 85, 153, 1, 1, 1733.6595458984375, 533.2462158203125, 47.54170608520507812, 5.550147056579589843, 0, 0, -0.358367919921875, 0.933580458164215087, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+3, 180426, 0, 85, 153, 1, 1, 1734.2559814453125, 531.1075439453125, 50.04204940795898437, 0.855210542678833007, 0, 0, 0.414692878723144531, 0.909961462020874023, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+4, 180427, 0, 85, 153, 1, 1, 1734.5611572265625, 531.56109619140625, 57.94888687133789062, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+5, 180427, 0, 85, 153, 1, 1, 1734.66015625, 531.1474609375, 54.41878890991210937, 5.969027042388916015, 0, 0, -0.1564340591430664, 0.987688362598419189, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+6, 180426, 0, 85, 153, 1, 1, 1734.4339599609375, 531.14208984375, 47.4670867919921875, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+7, 180427, 0, 85, 153, 1, 1, 1734.4556884765625, 531.4183349609375, 61.71345901489257812, 5.078907966613769531, 0, 0, -0.56640625, 0.824126183986663818, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+8, 180426, 0, 85, 153, 1, 1, 1734.533203125, 531.1978759765625, 46.06215286254882812, 2.391098499298095703, 0, 0, 0.930417060852050781, 0.366502493619918823, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+9, 180426, 0, 85, 153, 1, 1, 1734.3553466796875, 531.16339111328125, 49.0607147216796875, 5.619962215423583984, 0, 0, -0.32556724548339843, 0.945518851280212402, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+10, 180427, 0, 85, 153, 1, 1, 1734.4178466796875, 531.39447021484375, 52.01569366455078125, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+11, 180427, 0, 85, 153, 1, 1, 1734.52392578125, 531.32806396484375, 57.34672164916992187, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+12, 180426, 0, 85, 153, 1, 1, 1734.533203125, 531.1978759765625, 46.79131698608398437, 2.600535154342651367, 0, 0, 0.963629722595214843, 0.26724100112915039, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+13, 180427, 0, 85, 153, 1, 1, 1734.6168212890625, 531.39324951171875, 55.88604736328125, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+14, 180427, 0, 85, 153, 1, 1, 1734.592041015625, 531.23779296875, 58.59108352661132812, 0.069811686873435974, 0, 0, 0.034898757934570312, 0.999390840530395507, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+15, 180426, 0, 85, 153, 1, 1, 1734.533203125, 531.1978759765625, 50.65242767333984375, 5.026549339294433593, 0, 0, -0.5877847671508789, 0.809017360210418701, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+16, 180427, 0, 85, 153, 1, 1, 1734.4432373046875, 531.34063720703125, 57.0312652587890625, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+17, 180426, 0, 85, 153, 1, 1, 1734.533203125, 531.1978759765625, 45.555206298828125, 6.265733242034912109, 0, 0, -0.00872611999511718, 0.999961912631988525, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+18, 180427, 0, 85, 153, 1, 1, 1734.52392578125, 531.32806396484375, 55.53421783447265625, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+19, 180426, 0, 85, 153, 1, 1, 1734.5540771484375, 531.27490234375, 49.49390411376953125, 3.001946926116943359, 0, 0, 0.997563362121582031, 0.069766148924827575, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+20, 180427, 0, 85, 153, 1, 1, 1734.68505859375, 531.302978515625, 54.98458099365234375, 1.117009282112121582, 0, 0, 0.529918670654296875, 0.84804844856262207, 120, 255, 1, 0), -- Bat02 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+21, 180426, 0, 85, 153, 1, 1, 1734.5748291015625, 531.3519287109375, 51.23121261596679687, 0.663223206996917724, 0, 0, 0.325567245483398437, 0.945518851280212402, 120, 255, 1, 0), -- Bat01 (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject1 +(@OGUID+22, 180437, 0, 85, 153, 1, 1, 1738.4254150390625, 512.015625, 39.81720733642578125, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 120, 255, 1, 0), -- Wickerman Ashes (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject2 +(@OGUID+23, 180437, 0, 85, 153, 1, 1, 1721.447265625, 505.14117431640625, 40.88557815551757812, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 120, 255, 1, 0); -- Wickerman Ashes (Area: Ruins of Lordaeron - Difficulty: 0) CreateObject2 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+23 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+23; diff --git a/sql/updates/world/3.3.5/2024_12_17_03_world.sql b/sql/updates/world/3.3.5/2024_12_17_03_world.sql new file mode 100644 index 00000000000..ffe974fbb8e --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_03_world.sql @@ -0,0 +1,13 @@ +-- +SET @OGUID := 12730; -- Need 4 +SET @EVENT := 8; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+3; +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 +(@OGUID+0, 181015, 571, 2817, 4553, 1, 1, 5604.60791015625, 115.6718826293945312, 151.761444091796875, 3.700104713439941406, 0, 0, -0.96126079559326171, 0.275640487670898437, 120, 255, 1, 52237), -- Standing, Large - Val (Area: Forlorn Woods - Difficulty: 0) CreateObject1 +(@OGUID+1, 181015, 571, 2817, 4553, 1, 1, 5604.44091796875, 113.9027786254882812, 151.72705078125, 0, 0, 0, 0, 1, 120, 255, 1, 52237), -- Standing, Large - Val (Area: Forlorn Woods - Difficulty: 0) CreateObject1 +(@OGUID+2, 181015, 571, 2817, 4553, 1, 1, 5569.87744140625, 158.564239501953125, 151.6475677490234375, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 120, 255, 1, 52237), -- Standing, Large - Val (Area: Forlorn Woods - Difficulty: 0) CreateObject1 +(@OGUID+3, 181015, 571, 2817, 4553, 1, 1, 5568.32666015625, 159.4322967529296875, 151.8090362548828125, 4.852017402648925781, 0, 0, -0.65605831146240234, 0.754710197448730468, 120, 255, 1, 52237); -- Standing, Large - Val (Area: Forlorn Woods - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+3 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+3; diff --git a/sql/updates/world/3.3.5/2024_12_17_04_world.sql b/sql/updates/world/3.3.5/2024_12_17_04_world.sql new file mode 100644 index 00000000000..87bd037c975 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_04_world.sql @@ -0,0 +1,21 @@ +-- +SET @OGUID := 13570; -- Need 12 +SET @EVENT := 8; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+11; +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 +(@OGUID+0, 181060, 571, 65, 4161, 1, 1, 3572.83935546875, 265.182342529296875, 45.70560073852539062, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+1, 181060, 571, 65, 4161, 1, 1, 3564.302734375, 294.137481689453125, 45.70593643188476562, 3.996806621551513671, 0, 0, -0.90996074676513671, 0.414694398641586303, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+2, 181060, 571, 65, 4161, 1, 1, 3549.798583984375, 245.620880126953125, 45.7057647705078125, 4.642575740814208984, 0, 0, -0.731353759765625, 0.681998312473297119, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+3, 181019, 571, 65, 4161, 1, 1, 3555.038330078125, 299.092620849609375, 45.70467758178710937, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+4, 181060, 571, 65, 4161, 1, 1, 3522.945068359375, 260.23529052734375, 45.71449661254882812, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+5, 181060, 571, 65, 4161, 1, 1, 3526.265625, 290.728240966796875, 45.74524307250976562, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Wyrmrest Temple - Difficulty: 0) CreateObject1 +(@OGUID+6, 181018, 571, 65, 4158, 1, 1, 3519.55029296875, 2023.3880615234375, 67.93622589111328125, 0.122172988951206207, 0, 0, 0.061048507690429687, 0.998134791851043701, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+7, 181018, 571, 65, 4158, 1, 1, 3505.42236328125, 2014.634521484375, 68.2199554443359375, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+8, 181018, 571, 65, 4158, 1, 1, 3518.782958984375, 1993.7606201171875, 67.3443603515625, 3.682650327682495117, 0, 0, -0.96362972259521484, 0.26724100112915039, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+9, 181060, 571, 65, 4158, 1, 1, 3499.606689453125, 1984.6790771484375, 66.1546783447265625, 3.24634718894958496, 0, 0, -0.99862861633300781, 0.052353221923112869, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+10, 181018, 571, 65, 4158, 1, 1, 3500.45654296875, 1971.029541015625, 67.74578857421875, 2.513273954391479492, 0, 0, 0.951056480407714843, 0.309017121791839599, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Stars' Rest - Difficulty: 0) CreateObject1 +(@OGUID+11, 187575, 571, 65, 65, 1, 1, 3612.02685546875, 1412.470458984375, 92.6059722900390625, 4.852017402648925781, 0, 0, -0.65605831146240234, 0.754710197448730468, 120, 255, 1, 52237); -- Hanging, Square, Small - Val (Area: Dragonblight - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+11 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+11; diff --git a/sql/updates/world/3.3.5/2024_12_17_05_world.sql b/sql/updates/world/3.3.5/2024_12_17_05_world.sql new file mode 100644 index 00000000000..401e0b8b0d6 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_05_world.sql @@ -0,0 +1,32 @@ +-- +SET @OGUID := 49863; -- Need 23 +SET @EVENT := 8; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+22; +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 +(@OGUID+0, 181018, 571, 210, 4504, 1, 1, 6283.17333984375, 71.0634765625, 391.978668212890625, 0.855210542678833007, 0, 0, 0.414692878723144531, 0.909961462020874023, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Valley of Echoes - Difficulty: 0) CreateObject1 +(@OGUID+1, 181018, 571, 210, 4504, 1, 1, 6299.56103515625, 55.87326431274414062, 394.769744873046875, 0.942476630210876464, 0, 0, 0.453989982604980468, 0.891006767749786376, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Valley of Echoes - Difficulty: 0) CreateObject1 +(@OGUID+2, 181018, 571, 210, 4504, 1, 1, 6258.50244140625, 95.34896087646484375, 395.153106689453125, 0.785396754741668701, 0, 0, 0.38268280029296875, 0.923879802227020263, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Valley of Echoes - Difficulty: 0) CreateObject1 +(@OGUID+3, 181018, 571, 210, 4504, 1, 1, 6274.251953125, 79.741973876953125, 391.81329345703125, 0.750490784645080566, 0, 0, 0.3665008544921875, 0.93041771650314331, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Valley of Echoes - Difficulty: 0) CreateObject1 +(@OGUID+4, 181016, 571, 210, 4504, 1, 1, 6251.80712890625, 1.444553017616271972, 409.33984375, 5.35816192626953125, 0, 0, -0.446197509765625, 0.894934535026550292, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Valley of Echoes - Difficulty: 0) CreateObject1 +(@OGUID+5, 181018, 571, 210, 4504, 1, 1, 6197.2724609375, 63.93402862548828125, 381.164825439453125, 1.518436193466186523, 0, 0, 0.6883544921875, 0.725374460220336914, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Valley of Echoes - Difficulty: 0) CreateObject1 +(@OGUID+6, 181016, 571, 210, 4504, 1, 1, 6241.6943359375, 68.83843231201171875, 388.5811767578125, 5.218535900115966796, 0, 0, -0.507537841796875, 0.861629426479339599, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Valley of Echoes - Difficulty: 0) CreateObject1 +(@OGUID+7, 181016, 571, 210, 4501, 1, 1, 6198.2890625, -0.38237801194190979, 409.916168212890625, 5.724681377410888671, 0, 0, -0.27563667297363281, 0.961261868476867675, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+8, 181018, 571, 210, 4501, 1, 1, 6185.263671875, 63.80685806274414062, 381.187469482421875, 1.448621988296508789, 0, 0, 0.662619590759277343, 0.748956084251403808, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+9, 181016, 571, 210, 4501, 1, 1, 6193.05712890625, 28.86382484436035156, 380.5521240234375, 1.762782454490661621, 0, 0, 0.771624565124511718, 0.636078238487243652, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+10, 181016, 571, 210, 4501, 1, 1, 6232.294921875, -5.16493082046508789, 410.164642333984375, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+11, 181060, 571, 210, 4501, 1, 1, 6259.2744140625, -27.9760208129882812, 410.822052001953125, 1.867502212524414062, 0, 0, 0.803856849670410156, 0.594822824001312255, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+12, 181016, 571, 210, 4501, 1, 1, 6212.54052734375, 10.8203134536743164, 410.164093017578125, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+13, 181060, 571, 210, 4501, 1, 1, 6249.42822265625, -27.5517578125, 410.8948974609375, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+14, 181060, 571, 210, 4501, 1, 1, 6242.62060546875, -48.8146705627441406, 422.644927978515625, 0.122172988951206207, 0, 0, 0.061048507690429687, 0.998134791851043701, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+15, 181016, 571, 210, 4501, 1, 1, 6166.5849609375, -67.562286376953125, 388.179901123046875, 1.082102894783020019, 0, 0, 0.51503753662109375, 0.857167601585388183, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+16, 187575, 571, 210, 4501, 1, 1, 6161.72998046875, -60.3888893127441406, 388.70074462890625, 6.248279094696044921, 0, 0, -0.01745223999023437, 0.999847710132598876, 120, 255, 1, 52237), -- Hanging, Square, Small - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+17, 181060, 571, 210, 4501, 1, 1, 6170.07275390625, -68.9854583740234375, 390.381256103515625, 5.323255538940429687, 0, 0, -0.46174812316894531, 0.887011110782623291, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+18, 181016, 571, 210, 4501, 1, 1, 6127.73681640625, -26.387369155883789, 383.51031494140625, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+19, 181018, 571, 210, 4501, 1, 1, 6162.23291015625, -74.4932708740234375, 391.39105224609375, 0.383971005678176879, 0, 0, 0.190808296203613281, 0.981627285480499267, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+20, 181018, 571, 210, 4501, 1, 1, 6150.57958984375, -58.6980247497558593, 390.6942138671875, 3.385940074920654296, 0, 0, -0.99254608154296875, 0.121869951486587524, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+21, 181018, 571, 210, 4501, 1, 1, 6156.791015625, -57.0425338745117187, 390.897674560546875, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 +(@OGUID+22, 181018, 571, 210, 4501, 1, 1, 6156.5029296875, -76.918731689453125, 391.327484130859375, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 120, 255, 1, 52237); -- Hanging, Tall/Thin, Medium - Val (Area: The Argent Vanguard - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+22 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+22; diff --git a/sql/updates/world/3.3.5/2024_12_17_06_world.sql b/sql/updates/world/3.3.5/2024_12_17_06_world.sql new file mode 100644 index 00000000000..e538fc891c4 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_06_world.sql @@ -0,0 +1,37 @@ +-- +SET @OGUID := 52524; -- Need 28 +SET @EVENT := 8; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+27; +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 +(@OGUID+0, 181018, 34, 717, 717, 1, 1, 95.93645477294921875, -4.61641597747802734, -25.1972179412841796, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+1, 181018, 34, 717, 717, 1, 1, 95.9949493408203125, 6.155707836151123046, -25.2080059051513671, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+2, 181018, 34, 717, 717, 1, 1, 140.0503387451171875, 6.163999080657958984, -25.1972179412841796, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+3, 181018, 34, 717, 717, 1, 1, 134.4687347412109375, -8.19999599456787109, -24.9982643127441406, 3.194002151489257812, 0, 0, -0.99965667724609375, 0.026201646775007247, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+4, 181016, 34, 717, 717, 1, 1, 133.368682861328125, 4.94775390625, -25.6062335968017578, 3.769911527633666992, 0, 0, -0.95105648040771484, 0.309017121791839599, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+5, 181018, 34, 717, 717, 1, 1, 118.8793106079101562, -4.63945913314819335, -25.2098541259765625, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+6, 181018, 34, 717, 717, 1, 1, 121.1558685302734375, -53.6179161071777343, -33.5352783203125, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+7, 181018, 34, 717, 717, 1, 1, 117.762359619140625, 6.045464038848876953, -24.9732646942138671, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+8, 181018, 34, 717, 717, 1, 1, 123.7063980102539062, 9.523133277893066406, -25.0326118469238281, 6.265733242034912109, 0, 0, -0.00872611999511718, 0.999961912631988525, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+9, 181016, 34, 717, 717, 1, 1, 124.8732223510742187, -3.53060889244079589, -25.6062335968017578, 0.767943859100341796, 0, 0, 0.374606132507324218, 0.927184045314788818, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+10, 181016, 34, 717, 717, 1, 1, 124.9492034912109375, 5.040185928344726562, -25.6062335968017578, 5.532694816589355468, 0, 0, -0.3665008544921875, 0.93041771650314331, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+11, 181016, 34, 717, 717, 1, 1, 75.0347747802734375, 4.980967998504638671, -25.6062335968017578, 3.874631166458129882, 0, 0, -0.93358039855957031, 0.358368009328842163, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+12, 181018, 34, 717, 717, 1, 1, 126.530853271484375, 56.84122467041015625, -33.4548606872558593, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+13, 181018, 34, 717, 717, 1, 1, 139.4825592041015625, -4.63111400604248046, -25.2104682922363281, 1.605701684951782226, 0, 0, 0.719339370727539062, 0.694658815860748291, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+14, 181016, 34, 717, 717, 1, 1, 75.0807342529296875, -3.46844291687011718, -25.6062335968017578, 2.216565132141113281, 0, 0, 0.894933700561523437, 0.44619917869567871, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+15, 181016, 34, 717, 717, 1, 1, 133.4145050048828125, -3.47149205207824707, -25.6062335968017578, 2.373644113540649414, 0, 0, 0.927183151245117187, 0.37460830807685852, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+16, 181018, 34, 717, 717, 1, 1, 131.7865753173828125, -55.2373390197753906, -33.537628173828125, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+17, 181018, 34, 717, 717, 1, 1, 123.55029296875, -7.77634286880493164, -25.1972160339355468, 0.104719325900077819, 0, 0, 0.052335739135742187, 0.998629570007324218, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+18, 181018, 34, 717, 717, 1, 1, 134.490753173828125, 9.605150222778320312, -25.1972179412841796, 3.194002151489257812, 0, 0, -0.99965667724609375, 0.026201646775007247, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+19, 181018, 34, 717, 717, 1, 1, 115.260986328125, -73.350830078125, -33.5295143127441406, 5.864306926727294921, 0, 0, -0.20791149139404296, 0.978147625923156738, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+20, 181018, 34, 717, 717, 1, 1, 137.0919036865234375, 54.82421493530273437, -33.5295143127441406, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+21, 181016, 34, 717, 717, 1, 1, 111.367950439453125, -88.3172607421875, -33.9395637512207031, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+22, 181018, 34, 717, 717, 1, 1, 125.4581985473632812, -77.0105743408203125, -33.5379219055175781, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+23, 181018, 34, 717, 717, 1, 1, 133.3552703857421875, 79.84642791748046875, -33.4236106872558593, 5.986480236053466796, 0, 0, -0.14780902862548828, 0.989015936851501464, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+24, 181016, 34, 717, 717, 1, 1, 116.36749267578125, -90.6798171997070312, -33.9395637512207031, 1.902408957481384277, 0, 0, 0.814115524291992187, 0.580702960491180419, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+25, 181018, 34, 717, 717, 1, 1, 143.1554107666015625, 75.4530029296875, -33.5304145812988281, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+26, 181016, 34, 717, 717, 1, 1, 141.8401336669921875, 92.261383056640625, -33.9395637512207031, 4.904376029968261718, 0, 0, -0.636077880859375, 0.771624863147735595, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 +(@OGUID+27, 181016, 34, 717, 717, 1, 1, 147.2406158447265625, 89.62396240234375, -33.9395637512207031, 3.560472726821899414, 0, 0, -0.97814750671386718, 0.207912087440490722, 7200, 255, 1, 52237); -- Standing, Exterior, Medium - Val (Area: The Stockade - Difficulty: 1) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+27 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+27; diff --git a/sql/updates/world/3.3.5/2024_12_17_07_world.sql b/sql/updates/world/3.3.5/2024_12_17_07_world.sql new file mode 100644 index 00000000000..dcc928524d9 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_07_world.sql @@ -0,0 +1,43 @@ +-- +SET @OGUID := 60360; -- Need 34 +SET @EVENT := 8; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+33; +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 +(@OGUID+0, 181025, 571, 3537, 4032, 1, 1, 2293.540283203125, 5174.7177734375, 25.11964607238769531, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+1, 181060, 571, 3537, 4032, 1, 1, 2303.144287109375, 5193.45849609375, 18.77863883972167968, 5.89921426773071289, 0, 0, -0.19080829620361328, 0.981627285480499267, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+2, 181060, 571, 3537, 4032, 1, 1, 2304.0087890625, 5195.68896484375, 18.77863693237304687, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+3, 181060, 571, 3537, 4032, 1, 1, 2288.107666015625, 5203.8837890625, 13.63426113128662109, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+4, 181060, 571, 3537, 4032, 1, 1, 2276.773681640625, 5199.5341796875, 24.89459800720214843, 4.258606910705566406, 0, 0, -0.84804725646972656, 0.529920578002929687, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+5, 181060, 571, 3537, 4032, 1, 1, 2290.5908203125, 5201.154296875, 24.89418220520019531, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+6, 181060, 571, 3537, 4032, 1, 1, 2300.87109375, 5202.06591796875, 18.77513504028320312, 5.881760597229003906, 0, 0, -0.19936752319335937, 0.979924798011779785, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+7, 181060, 571, 3537, 4032, 1, 1, 2289.228515625, 5206.75927734375, 13.63449668884277343, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+8, 181060, 571, 3537, 4032, 1, 1, 2291.030517578125, 5196.255859375, 16.54580879211425781, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+9, 181060, 571, 3537, 4032, 1, 1, 2296.923095703125, 5193.869140625, 16.54580879211425781, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+10, 181025, 571, 3537, 4032, 1, 1, 2288.474365234375, 5160.943359375, 25.54812049865722656, 4.345870018005371093, 0, 0, -0.82412624359130859, 0.566406130790710449, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+11, 181060, 571, 3537, 4032, 1, 1, 2289.666259765625, 5198.8798828125, 24.89882850646972656, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+12, 181060, 571, 3537, 4032, 1, 1, 2278.044921875, 5202.72509765625, 24.89858818054199218, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+13, 181025, 571, 3537, 4032, 1, 1, 2330.237060546875, 5169.8720703125, 25.63700103759765625, 1.832594871520996093, 0, 0, 0.793353080749511718, 0.608761727809906005, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+14, 181025, 571, 3537, 4032, 1, 1, 2362.818603515625, 5195.90087890625, 19.76927375793457031, 2.373644113540649414, 0, 0, 0.927183151245117187, 0.37460830807685852, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+15, 181025, 571, 3537, 4032, 1, 1, 2373.8203125, 5235.90185546875, 20.25008392333984375, 3.071766138076782226, 0, 0, 0.999390602111816406, 0.034906134009361267, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+16, 181025, 571, 3537, 4032, 1, 1, 2293.540283203125, 5174.7177734375, 25.11964607238769531, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+17, 181060, 571, 3537, 4032, 1, 1, 2303.144287109375, 5193.45849609375, 18.77863883972167968, 5.89921426773071289, 0, 0, -0.19080829620361328, 0.981627285480499267, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+18, 181060, 571, 3537, 4032, 1, 1, 2304.0087890625, 5195.68896484375, 18.77863693237304687, 5.93412017822265625, 0, 0, -0.17364788055419921, 0.984807789325714111, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+19, 181060, 571, 3537, 4032, 1, 1, 2288.107666015625, 5203.8837890625, 13.63426113128662109, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+20, 181060, 571, 3537, 4032, 1, 1, 2276.773681640625, 5199.5341796875, 24.89459800720214843, 4.258606910705566406, 0, 0, -0.84804725646972656, 0.529920578002929687, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+21, 181060, 571, 3537, 4032, 1, 1, 2290.5908203125, 5201.154296875, 24.89418220520019531, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+22, 181060, 571, 3537, 4032, 1, 1, 2300.87109375, 5202.06591796875, 18.77513504028320312, 5.881760597229003906, 0, 0, -0.19936752319335937, 0.979924798011779785, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+23, 181060, 571, 3537, 4032, 1, 1, 2289.228515625, 5206.75927734375, 13.63449668884277343, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+24, 181060, 571, 3537, 4032, 1, 1, 2291.030517578125, 5196.255859375, 16.54580879211425781, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+25, 181060, 571, 3537, 4032, 1, 1, 2296.923095703125, 5193.869140625, 16.54580879211425781, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+26, 181025, 571, 3537, 4032, 1, 1, 2288.474365234375, 5160.943359375, 25.54812049865722656, 4.345870018005371093, 0, 0, -0.82412624359130859, 0.566406130790710449, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+27, 181060, 571, 3537, 4032, 1, 1, 2289.666259765625, 5198.8798828125, 24.89882850646972656, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+28, 181060, 571, 3537, 4032, 1, 1, 2278.044921875, 5202.72509765625, 24.89858818054199218, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+29, 181025, 571, 3537, 4032, 1, 1, 2330.237060546875, 5169.8720703125, 25.63700103759765625, 1.832594871520996093, 0, 0, 0.793353080749511718, 0.608761727809906005, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+30, 181025, 571, 3537, 4032, 1, 1, 2361.501708984375, 5274.708984375, 25.85167312622070312, 3.52557229995727539, 0, 0, -0.98162651062011718, 0.190812408924102783, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+31, 181025, 571, 3537, 4032, 1, 1, 2373.8203125, 5235.90185546875, 20.25008392333984375, 3.071766138076782226, 0, 0, 0.999390602111816406, 0.034906134009361267, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+32, 181025, 571, 3537, 4032, 1, 1, 2362.818603515625, 5195.90087890625, 19.76927375793457031, 2.373644113540649414, 0, 0, 0.927183151245117187, 0.37460830807685852, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Large - Val (Area: Valiance Keep - Difficulty: 0) CreateObject1 +(@OGUID+33, 181016, 571, 3537, 4114, 1, 1, 3099.8447265625, 3831.98388671875, 23.01079750061035156, 0.506144583225250244, 0, 0, 0.250379562377929687, 0.968147754669189453, 120, 255, 1, 52237); -- Standing, Exterior, Medium - Val (Area: Death's Stand - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+33 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+33; diff --git a/sql/updates/world/3.3.5/2024_12_17_08_world.sql b/sql/updates/world/3.3.5/2024_12_17_08_world.sql new file mode 100644 index 00000000000..a0d85247025 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_08_world.sql @@ -0,0 +1,25 @@ +-- +SET @OGUID := 13684; -- Need 16 +SET @EVENT := 8; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+15; +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 +(@OGUID+0, 181060, 571, 495, 4379, 1, 1, 593.67724609375, -4929.41357421875, 31.07939338684082031, 3.351046562194824218, 0, 0, -0.99452114105224609, 0.104535527527332305, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+1, 181060, 571, 495, 4379, 1, 1, 589.42169189453125, -4926.30126953125, 19.81484222412109375, 3.368495941162109375, 0, 0, -0.99357128143310546, 0.113208353519439697, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+2, 181060, 571, 495, 4379, 1, 1, 588.70184326171875, -4923.255859375, 19.81484222412109375, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+3, 181060, 571, 495, 4379, 1, 1, 582.01080322265625, -4933.2568359375, 31.07901382446289062, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Valgarde - Difficulty: 0) CreateObject1 +(@OGUID+4, 181016, 571, 495, 3997, 1, 1, 493.364593505859375, -5904.35595703125, 308.904937744140625, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+5, 181019, 571, 495, 3997, 1, 1, 491.35296630859375, -5933.67138671875, 310.585845947265625, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 120, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+6, 181019, 571, 495, 3997, 1, 1, 491.8101806640625, -5927.2802734375, 309.67877197265625, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 120, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+7, 181060, 571, 495, 3997, 1, 1, 492.902740478515625, -5928.03076171875, 309.63958740234375, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+8, 181060, 571, 495, 3997, 1, 1, 490.626617431640625, -5934.06298828125, 309.60113525390625, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+9, 181016, 571, 495, 3997, 1, 1, 469.700531005859375, -5927.3427734375, 308.720245361328125, 6.003933906555175781, 0, 0, -0.13917255401611328, 0.990268170833587646, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+10, 181016, 571, 495, 3997, 1, 1, 499.0128173828125, -5932.87744140625, 308.70391845703125, 2.687806606292724609, 0, 0, 0.974370002746582031, 0.224951311945915222, 120, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Explorers' League Outpost - Difficulty: 0) CreateObject1 +(@OGUID+11, 181018, 571, 495, 4532, 1, 1, 1900.7137451171875, -6182.30615234375, 31.16156959533691406, 0.401424884796142578, 0, 0, 0.199367523193359375, 0.979924798011779785, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+12, 181018, 571, 495, 4532, 1, 1, 1892.77783203125, -6183.73583984375, 25.80629158020019531, 4.310965538024902343, 0, 0, -0.83388519287109375, 0.55193793773651123, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+13, 181018, 571, 495, 4532, 1, 1, 1869.909912109375, -6225.537109375, 14.98772907257080078, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Vengeance Landing Inn - Difficulty: 0) CreateObject1 +(@OGUID+14, 181060, 571, 495, 4018, 1, 1, 2688.802001953125, -4390.22998046875, 285.700103759765625, 2.949595451354980468, 0, 0, 0.995395660400390625, 0.095851235091686248, 120, 255, 1, 52237), -- Standing, Interior, Small - Val (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 +(@OGUID+15, 181060, 571, 495, 4018, 1, 1, 2676.61669921875, -4381.39453125, 285.759613037109375, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 120, 255, 1, 52237); -- Standing, Interior, Small - Val (Area: Camp Winterhoof - Difficulty: 0) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+15 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+15; diff --git a/sql/updates/world/3.3.5/2024_12_17_09_world.sql b/sql/updates/world/3.3.5/2024_12_17_09_world.sql new file mode 100644 index 00000000000..dee5ba70c6f --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_09_world.sql @@ -0,0 +1,69 @@ +-- +SET @OGUID := 93879; -- Need 60 +SET @EVENT := 8; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+59; +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 +(@OGUID+0, 181018, 230, 1584, 1584, 1, 1, 813.86322021484375, -161.558303833007812, -45.3045234680175781, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+1, 181019, 230, 1584, 1584, 1, 1, 814.4091796875, -163.350357055664062, -48.8337898254394531, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+2, 181019, 230, 1584, 1584, 1, 1, 830.051025390625, -154.908187866210937, -48.8724784851074218, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+3, 181019, 230, 1584, 1584, 1, 1, 813.79742431640625, -173.237197875976562, -48.8575973510742187, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+4, 181018, 230, 1584, 1584, 1, 1, 831.00372314453125, -151.674484252929687, -45.2715301513671875, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+5, 181019, 230, 1584, 1584, 1, 1, 821.51080322265625, -165.189788818359375, -48.8584213256835937, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+6, 181019, 230, 1584, 1584, 1, 1, 817.587646484375, -180.069839477539062, -48.8832054138183593, 5.811946868896484375, 0, 0, -0.2334451675415039, 0.972369968891143798, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+7, 181019, 230, 1584, 1584, 1, 1, 821.517333984375, -174.794845581054687, -48.8382034301757812, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+8, 181019, 230, 1584, 1584, 1, 1, 830.65447998046875, -163.977706909179687, -48.8799667358398437, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+9, 181019, 230, 1584, 1584, 1, 1, 825.64508056640625, -172.155960083007812, -48.8906478881835937, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+10, 181019, 230, 1584, 1584, 1, 1, 824.186279296875, -181.402633666992187, -48.8682975769042968, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+11, 181018, 230, 1584, 1584, 1, 1, 839.2431640625, -146.911148071289062, -45.1783866882324218, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+12, 181019, 230, 1584, 1584, 1, 1, 838.3072509765625, -151.834442138671875, -48.8711280822753906, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+13, 181016, 230, 1584, 1584, 1, 1, 848.40118408203125, -146.280960083007812, -48.0858535766601562, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+14, 181019, 230, 1584, 1584, 1, 1, 845.77923583984375, -147.699447631835937, -48.8352317810058593, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+15, 181018, 230, 1584, 1584, 1, 1, 825.04437255859375, -196.507476806640625, -45.1789016723632812, 0.488691210746765136, 0, 0, 0.241921424865722656, 0.970295846462249755, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+16, 181019, 230, 1584, 1584, 1, 1, 859.0894775390625, -139.844696044921875, -48.8765220642089843, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+17, 181019, 230, 1584, 1584, 1, 1, 842.66400146484375, -190.0352783203125, -48.9150581359863281, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+18, 181016, 230, 1584, 1584, 1, 1, 855.560791015625, -142.067169189453125, -48.0872077941894531, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+19, 181019, 230, 1584, 1584, 1, 1, 859.877197265625, -164.822097778320312, -48.8167572021484375, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+20, 181019, 230, 1584, 1584, 1, 1, 858.850830078125, -172.606338500976562, -48.8477973937988281, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+21, 181019, 230, 1584, 1584, 1, 1, 852.69146728515625, -206.595291137695312, -42.8749275207519531, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+22, 181018, 230, 1584, 1584, 1, 1, 838.52777099609375, -216.232437133789062, -40.4565963745117187, 1.919861555099487304, 0, 0, 0.819151878356933593, 0.573576688766479492, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+23, 181018, 230, 1584, 1584, 1, 1, 861.327392578125, -134.148818969726562, -45.1275825500488281, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+24, 181018, 230, 1584, 1584, 1, 1, 860.12847900390625, -134.8443603515625, -45.1895942687988281, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+25, 181019, 230, 1584, 1584, 1, 1, 869.12408447265625, -163.900482177734375, -48.863983154296875, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+26, 181018, 230, 1584, 1584, 1, 1, 850.86859130859375, -209.101882934570312, -40.4154052734375, 1.919861555099487304, 0, 0, 0.819151878356933593, 0.573576688766479492, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+27, 181017, 230, 1584, 1584, 1, 1, 838.7147216796875, -222.66021728515625, -37.0061607360839843, 0.575957298278808593, 0, 0, 0.284014701843261718, 0.958819925785064697, 7200, 255, 1, 52237), -- Hanging, Streamer - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+28, 181019, 230, 1584, 1584, 1, 1, 866.95819091796875, -144.804336547851562, -48.8856277465820312, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+29, 181019, 230, 1584, 1584, 1, 1, 857.49957275390625, -201.502288818359375, -42.8255538940429687, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+30, 181019, 230, 1584, 1584, 1, 1, 866.53594970703125, -176.090911865234375, -48.8597908020019531, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+31, 181019, 230, 1584, 1584, 1, 1, 868.82647705078125, -132.47650146484375, -48.8573799133300781, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+32, 181019, 230, 1584, 1584, 1, 1, 863.470703125, -196.907791137695312, -42.7922248840332031, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+33, 181018, 230, 1584, 1584, 1, 1, 867.6173095703125, -130.514495849609375, -45.225494384765625, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+34, 181018, 230, 1584, 1584, 1, 1, 868.75506591796875, -129.855484008789062, -45.1952095031738281, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+35, 181019, 230, 1584, 1584, 1, 1, 874.01025390625, -140.8642578125, -48.8708381652832031, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+36, 181019, 230, 1584, 1584, 1, 1, 876.23687744140625, -144.416824340820312, -48.8697128295898437, 2.932138919830322265, 0, 0, 0.994521141052246093, 0.104535527527332305, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+37, 181016, 230, 1584, 1584, 1, 1, 879.82562255859375, -145.934921264648437, -49.7594146728515625, 4.433136463165283203, 0, 0, -0.79863548278808593, 0.60181504487991333, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+38, 181018, 230, 1584, 1584, 1, 1, 880.23974609375, -144.10186767578125, -45.7563362121582031, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+39, 181019, 230, 1584, 1584, 1, 1, 878.63201904296875, -161.084808349609375, -48.8503570556640625, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+40, 181016, 230, 1584, 1584, 1, 1, 886.7518310546875, -156.676010131835937, -49.7605171203613281, 3.24634718894958496, 0, 0, -0.99862861633300781, 0.052353221923112869, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+41, 181018, 230, 1584, 1584, 1, 1, 888.09454345703125, -157.4302978515625, -45.9000625610351562, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 7200, 255, 1, 52237), -- Hanging, Tall/Thin, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+42, 181019, 230, 1584, 1584, 1, 1, 877.284912109375, -169.196365356445312, -48.8408546447753906, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+43, 181019, 230, 1584, 1584, 1, 1, 884.7393798828125, -164.978225708007812, -48.8521690368652343, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+44, 181016, 230, 1584, 1584, 1, 1, 874.26885986328125, -182.293807983398437, -43.7037086486816406, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+45, 181055, 230, 1584, 1584, 1, 1, 892.45867919921875, -168.13189697265625, -37.2256965637207031, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 7200, 255, 1, 52237), -- Hanging, Streamer x3 - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+46, 181019, 230, 1584, 1584, 1, 1, 891.04571533203125, -170.570388793945312, -42.8331985473632812, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+47, 181055, 230, 1584, 1584, 1, 1, 898.56494140625, -178.46807861328125, -37.0914573669433593, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 7200, 255, 1, 52237), -- Hanging, Streamer x3 - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+48, 181019, 230, 1584, 1584, 1, 1, 893.2525634765625, -198.249710083007812, -42.8702888488769531, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+49, 181019, 230, 1584, 1584, 1, 1, 896.01025390625, -202.805862426757812, -42.86553955078125, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 52237), -- Standing, Interior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+50, 181017, 230, 1584, 1584, 1, 1, 907.94866943359375, -200.629318237304687, -37.4735183715820312, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 52237), -- Hanging, Streamer - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+51, 181055, 230, 1584, 1584, 1, 1, 886.67987060546875, -212.390411376953125, -37.4664421081542968, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 7200, 255, 1, 52237), -- Hanging, Streamer x3 - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+52, 181017, 230, 1584, 1584, 1, 1, 904.153076171875, -202.728240966796875, -37.4635429382324218, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 52237), -- Hanging, Streamer - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+53, 181016, 230, 1584, 1584, 1, 1, 870.17364501953125, -219.478271484375, -43.703704833984375, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 7200, 255, 1, 52237), -- Standing, Exterior, Medium - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+54, 181055, 230, 1584, 1584, 1, 1, 876.1754150390625, -218.1158447265625, -37.5497932434082031, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 52237), -- Hanging, Streamer x3 - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+55, 181055, 230, 1584, 1584, 1, 1, 897.0703125, -206.644729614257812, -37.4958915710449218, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 7200, 255, 1, 52237), -- Hanging, Streamer x3 - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+56, 181017, 230, 1584, 1584, 1, 1, 848.7298583984375, -234.750701904296875, -37.2758712768554687, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 7200, 255, 1, 52237), -- Hanging, Streamer - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+57, 181055, 230, 1584, 1584, 1, 1, 843.09368896484375, -229.72198486328125, -36.9932708740234375, 0.558503925800323486, 0, 0, 0.275636672973632812, 0.961261868476867675, 7200, 255, 1, 52237), -- Hanging, Streamer x3 - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+58, 181055, 230, 1584, 1584, 1, 1, 855.3809814453125, -230.789016723632812, -37.2526893615722656, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 7200, 255, 1, 52237), -- Hanging, Streamer x3 - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+59, 181017, 230, 1584, 1584, 1, 1, 862.14080810546875, -226.75653076171875, -37.2087326049804687, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 7200, 255, 1, 52237); -- Hanging, Streamer - Val (Area: Blackrock Depths - Difficulty: 1) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+59 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+59; diff --git a/sql/updates/world/3.3.5/2024_12_17_10_world.sql b/sql/updates/world/3.3.5/2024_12_17_10_world.sql new file mode 100644 index 00000000000..262c286c35d --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_10_world.sql @@ -0,0 +1,69 @@ +-- +SET @OGUID := 93939; -- Need 60 +SET @EVENT := 1; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+59; +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 +(@OGUID+0, 181388, 230, 1584, 1584, 1, 1, 813.79742431640625, -173.237197875976562, -48.8575973510742187, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+1, 181393, 230, 1584, 1584, 1, 1, 813.86322021484375, -161.558303833007812, -45.3045234680175781, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+2, 181388, 230, 1584, 1584, 1, 1, 814.4091796875, -163.350357055664062, -48.8337898254394531, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+3, 181388, 230, 1584, 1584, 1, 1, 817.587646484375, -180.069839477539062, -48.8832054138183593, 5.811946868896484375, 0, 0, -0.2334451675415039, 0.972369968891143798, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+4, 181388, 230, 1584, 1584, 1, 1, 821.51080322265625, -165.189788818359375, -48.8584213256835937, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+5, 181388, 230, 1584, 1584, 1, 1, 821.517333984375, -174.794845581054687, -48.8382034301757812, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+6, 181388, 230, 1584, 1584, 1, 1, 825.64508056640625, -172.155960083007812, -48.8906478881835937, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+7, 181393, 230, 1584, 1584, 1, 1, 831.00372314453125, -151.674484252929687, -45.2715301513671875, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+8, 181388, 230, 1584, 1584, 1, 1, 830.051025390625, -154.908187866210937, -48.8724784851074218, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+9, 181388, 230, 1584, 1584, 1, 1, 830.65447998046875, -163.977706909179687, -48.8799667358398437, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+10, 181388, 230, 1584, 1584, 1, 1, 824.186279296875, -181.402633666992187, -48.8682975769042968, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+11, 181393, 230, 1584, 1584, 1, 1, 839.2431640625, -146.911148071289062, -45.1783866882324218, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+12, 181388, 230, 1584, 1584, 1, 1, 838.3072509765625, -151.834442138671875, -48.8711280822753906, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+13, 181388, 230, 1584, 1584, 1, 1, 845.77923583984375, -147.699447631835937, -48.8352317810058593, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+14, 181355, 230, 1584, 1584, 1, 1, 848.40118408203125, -146.280960083007812, -48.0858535766601562, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 55262), -- Standing, Exterior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+15, 181393, 230, 1584, 1584, 1, 1, 825.04437255859375, -196.507476806640625, -45.1789016723632812, 0.488691210746765136, 0, 0, 0.241921424865722656, 0.970295846462249755, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+16, 181355, 230, 1584, 1584, 1, 1, 855.560791015625, -142.067169189453125, -48.0872077941894531, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 55262), -- Standing, Exterior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+17, 181393, 230, 1584, 1584, 1, 1, 861.327392578125, -134.148818969726562, -45.1275825500488281, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+18, 181388, 230, 1584, 1584, 1, 1, 859.0894775390625, -139.844696044921875, -48.8765220642089843, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+19, 181393, 230, 1584, 1584, 1, 1, 860.12847900390625, -134.8443603515625, -45.1895942687988281, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+20, 181388, 230, 1584, 1584, 1, 1, 842.66400146484375, -190.0352783203125, -48.9150581359863281, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+21, 181393, 230, 1584, 1584, 1, 1, 868.75506591796875, -129.855484008789062, -45.1952095031738281, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+22, 181393, 230, 1584, 1584, 1, 1, 867.6173095703125, -130.514495849609375, -45.225494384765625, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+23, 181388, 230, 1584, 1584, 1, 1, 866.95819091796875, -144.804336547851562, -48.8856277465820312, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+24, 181388, 230, 1584, 1584, 1, 1, 868.82647705078125, -132.47650146484375, -48.8573799133300781, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+25, 181388, 230, 1584, 1584, 1, 1, 859.877197265625, -164.822097778320312, -48.8167572021484375, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+26, 181388, 230, 1584, 1584, 1, 1, 874.01025390625, -140.8642578125, -48.8708381652832031, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+27, 181388, 230, 1584, 1584, 1, 1, 858.850830078125, -172.606338500976562, -48.8477973937988281, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+28, 181393, 230, 1584, 1584, 1, 1, 838.52777099609375, -216.232437133789062, -40.4565963745117187, 1.919861555099487304, 0, 0, 0.819151878356933593, 0.573576688766479492, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+29, 181388, 230, 1584, 1584, 1, 1, 869.12408447265625, -163.900482177734375, -48.863983154296875, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+30, 181388, 230, 1584, 1584, 1, 1, 876.23687744140625, -144.416824340820312, -48.8697128295898437, 2.932138919830322265, 0, 0, 0.994521141052246093, 0.104535527527332305, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+31, 181355, 230, 1584, 1584, 1, 1, 879.82562255859375, -145.934921264648437, -49.7594146728515625, 4.433136463165283203, 0, 0, -0.79863548278808593, 0.60181504487991333, 7200, 255, 1, 55262), -- Standing, Exterior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+32, 181393, 230, 1584, 1584, 1, 1, 880.23974609375, -144.10186767578125, -45.7563362121582031, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+33, 181393, 230, 1584, 1584, 1, 1, 850.86859130859375, -209.101882934570312, -40.4154052734375, 1.919861555099487304, 0, 0, 0.819151878356933593, 0.573576688766479492, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+34, 181388, 230, 1584, 1584, 1, 1, 866.53594970703125, -176.090911865234375, -48.8597908020019531, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+35, 181388, 230, 1584, 1584, 1, 1, 852.69146728515625, -206.595291137695312, -42.8749275207519531, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+36, 181392, 230, 1584, 1584, 1, 1, 838.7147216796875, -222.66021728515625, -37.0061607360839843, 0.575957298278808593, 0, 0, 0.284014701843261718, 0.958819925785064697, 7200, 255, 1, 55262), -- Hanging, Streamer - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+37, 181388, 230, 1584, 1584, 1, 1, 857.49957275390625, -201.502288818359375, -42.8255538940429687, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+38, 181388, 230, 1584, 1584, 1, 1, 878.63201904296875, -161.084808349609375, -48.8503570556640625, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+39, 181355, 230, 1584, 1584, 1, 1, 886.7518310546875, -156.676010131835937, -49.7605171203613281, 3.24634718894958496, 0, 0, -0.99862861633300781, 0.052353221923112869, 7200, 255, 1, 55262), -- Standing, Exterior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+40, 181355, 230, 1584, 1584, 1, 1, 874.26885986328125, -182.293807983398437, -43.7037086486816406, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 55262), -- Standing, Exterior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+41, 181388, 230, 1584, 1584, 1, 1, 877.284912109375, -169.196365356445312, -48.8408546447753906, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+42, 181388, 230, 1584, 1584, 1, 1, 863.470703125, -196.907791137695312, -42.7922248840332031, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+43, 181388, 230, 1584, 1584, 1, 1, 884.7393798828125, -164.978225708007812, -48.8521690368652343, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+44, 181401, 230, 1584, 1584, 1, 1, 843.09368896484375, -229.72198486328125, -36.9932708740234375, 0.558503925800323486, 0, 0, 0.275636672973632812, 0.961261868476867675, 7200, 255, 1, 55262), -- Hanging, Streamer x3 - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+45, 181392, 230, 1584, 1584, 1, 1, 848.7298583984375, -234.750701904296875, -37.2758712768554687, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 7200, 255, 1, 55262), -- Hanging, Streamer - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+46, 181401, 230, 1584, 1584, 1, 1, 855.3809814453125, -230.789016723632812, -37.2526893615722656, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 7200, 255, 1, 55262), -- Hanging, Streamer x3 - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+47, 181392, 230, 1584, 1584, 1, 1, 862.14080810546875, -226.75653076171875, -37.2087326049804687, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 7200, 255, 1, 55262), -- Hanging, Streamer - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+48, 181393, 230, 1584, 1584, 1, 1, 888.09454345703125, -157.4302978515625, -45.9000625610351562, 3.612837791442871093, 0, 0, -0.97236919403076171, 0.233448356389999389, 7200, 255, 1, 55262), -- Hanging, Tall/Thin, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+49, 181355, 230, 1584, 1584, 1, 1, 870.17364501953125, -219.478271484375, -43.703704833984375, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 7200, 255, 1, 55262), -- Standing, Exterior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+50, 181388, 230, 1584, 1584, 1, 1, 891.04571533203125, -170.570388793945312, -42.8331985473632812, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+51, 181401, 230, 1584, 1584, 1, 1, 892.45867919921875, -168.13189697265625, -37.2256965637207031, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 7200, 255, 1, 55262), -- Hanging, Streamer x3 - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+52, 181401, 230, 1584, 1584, 1, 1, 876.1754150390625, -218.1158447265625, -37.5497932434082031, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 55262), -- Hanging, Streamer x3 - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+53, 181401, 230, 1584, 1584, 1, 1, 886.67987060546875, -212.390411376953125, -37.4664421081542968, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 7200, 255, 1, 55262), -- Hanging, Streamer x3 - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+54, 181388, 230, 1584, 1584, 1, 1, 893.2525634765625, -198.249710083007812, -42.8702888488769531, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+55, 181401, 230, 1584, 1584, 1, 1, 898.56494140625, -178.46807861328125, -37.0914573669433593, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 7200, 255, 1, 55262), -- Hanging, Streamer x3 - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+56, 181388, 230, 1584, 1584, 1, 1, 896.01025390625, -202.805862426757812, -42.86553955078125, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, 55262), -- Standing, Interior, Medium - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+57, 181401, 230, 1584, 1584, 1, 1, 897.0703125, -206.644729614257812, -37.4958915710449218, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 7200, 255, 1, 55262), -- Hanging, Streamer x3 - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+58, 181392, 230, 1584, 1584, 1, 1, 907.94866943359375, -200.629318237304687, -37.4735183715820312, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 55262), -- Hanging, Streamer - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+59, 181392, 230, 1584, 1584, 1, 1, 904.153076171875, -202.728240966796875, -37.4635429382324218, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 55262); -- Hanging, Streamer - MFF (Area: Blackrock Depths - Difficulty: 1) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+59 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+59; diff --git a/sql/updates/world/3.3.5/2024_12_17_11_world.sql b/sql/updates/world/3.3.5/2024_12_17_11_world.sql new file mode 100644 index 00000000000..cc4fc6b1702 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_17_11_world.sql @@ -0,0 +1,27 @@ +-- +SET @OGUID := 18041; -- Need 18 +SET @EVENT := 2; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+17; +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 +(@OGUID+0, 187235, 230, 1584, 1584, 1, 1, 848.40118408203125, -146.280960083007812, -48.0858535766601562, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+1, 187235, 230, 1584, 1584, 1, 1, 855.560791015625, -142.067169189453125, -48.0872077941894531, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+2, 187235, 230, 1584, 1584, 1, 1, 879.82562255859375, -145.934921264648437, -49.7594146728515625, 4.433136463165283203, 0, 0, -0.79863548278808593, 0.60181504487991333, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+3, 187567, 230, 1584, 1584, 1, 1, 838.7147216796875, -222.66021728515625, -37.0061607360839843, 0.575957298278808593, 0, 0, 0.284014701843261718, 0.958819925785064697, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+4, 187194, 230, 1584, 1584, 1, 1, 843.09368896484375, -229.72198486328125, -36.9932708740234375, 0.558503925800323486, 0, 0, 0.275636672973632812, 0.961261868476867675, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+5, 187235, 230, 1584, 1584, 1, 1, 874.26885986328125, -182.293807983398437, -43.7037086486816406, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+6, 187567, 230, 1584, 1584, 1, 1, 848.7298583984375, -234.750701904296875, -37.2758712768554687, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+7, 187567, 230, 1584, 1584, 1, 1, 862.14080810546875, -226.75653076171875, -37.2087326049804687, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+8, 187235, 230, 1584, 1584, 1, 1, 886.7518310546875, -156.676010131835937, -49.7605171203613281, 3.24634718894958496, 0, 0, -0.99862861633300781, 0.052353221923112869, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+9, 187194, 230, 1584, 1584, 1, 1, 855.3809814453125, -230.789016723632812, -37.2526893615722656, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+10, 187235, 230, 1584, 1584, 1, 1, 870.17364501953125, -219.478271484375, -43.703704833984375, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 7200, 255, 1, 57916), -- Standing, Exterior, Medium - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+11, 187194, 230, 1584, 1584, 1, 1, 892.45867919921875, -168.13189697265625, -37.2256965637207031, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+12, 187194, 230, 1584, 1584, 1, 1, 876.1754150390625, -218.1158447265625, -37.5497932434082031, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+13, 187194, 230, 1584, 1584, 1, 1, 886.67987060546875, -212.390411376953125, -37.4664421081542968, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+14, 187194, 230, 1584, 1584, 1, 1, 898.56494140625, -178.46807861328125, -37.0914573669433593, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+15, 187194, 230, 1584, 1584, 1, 1, 897.0703125, -206.644729614257812, -37.4958915710449218, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 7200, 255, 1, 57916), -- Hanging, Streamer x3 - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+16, 187567, 230, 1584, 1584, 1, 1, 904.153076171875, -202.728240966796875, -37.4635429382324218, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 57916), -- Hanging, Streamer - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 +(@OGUID+17, 187567, 230, 1584, 1584, 1, 1, 907.94866943359375, -200.629318237304687, -37.4735183715820312, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 57916); -- Hanging, Streamer - Xmas (Area: Blackrock Depths - Difficulty: 1) CreateObject1 + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+17 AND `eventEntry`=@EVENT; +INSERT INTO `game_event_gameobject` SELECT @EVENT, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+17; diff --git a/sql/updates/world/3.3.5/2024_12_21_00_world.sql b/sql/updates/world/3.3.5/2024_12_21_00_world.sql new file mode 100644 index 00000000000..c87be0ff710 --- /dev/null +++ b/sql/updates/world/3.3.5/2024_12_21_00_world.sql @@ -0,0 +1,2 @@ +-- Remove Cursed Darkhound from spawn_group too +DELETE FROM spawn_group WHERE `spawnType`=0 AND `spawnId`=45217; diff --git a/sql/updates/world/3.3.5/2025_02_01_00_world_2012_08_06_01_world_classlevelstats.sql b/sql/updates/world/3.3.5/2025_02_01_00_world_2012_08_06_01_world_classlevelstats.sql new file mode 100644 index 00000000000..880bde5f2e9 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_01_00_world_2012_08_06_01_world_classlevelstats.sql @@ -0,0 +1,5 @@ +ALTER TABLE `creature_classlevelstats` CHANGE `basehp0` `basehp0` int unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp1` `basehp1` int unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basehp2` `basehp2` int unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basemana` `basemana` int unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `creature_classlevelstats` CHANGE `basearmor` `basearmor` int unsigned NOT NULL DEFAULT '1'; diff --git a/sql/updates/world/3.3.5/2025_02_02_00_world.sql b/sql/updates/world/3.3.5/2025_02_02_00_world.sql new file mode 100644 index 00000000000..9bdbe83e920 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_02_00_world.sql @@ -0,0 +1,215 @@ +-- "Sentinel Shaya", "Guard Roberts", "Mountaineer Dolf", "Grunt Kor'ja" and "Deathguard Kel" script and fixes for Garments of... Quests +-- Remove pointer to old script and add SmartAI to creature template +UPDATE `creature_template` SET `ScriptName`='' WHERE `entry` IN (12423,12427,12428,12429,12430); +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry` IN (12423,12427,12428,12429,12430); + +-- Creature Text +DELETE FROM `creature_text` WHERE `CreatureID` IN (12423,12427,12428,12429,12430) AND `GroupID`=3; +INSERT INTO `creature_text` (`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES + +-- Guard Roberts creature text +(12423,3,0,"Argh, the pain. Will it ever leave me?",12,0,100,0,0,0,7669,0,"Guard Roberts"), + +-- Mountaineer Dolf creature text +(12427,3,0,"Argh, the pain. Will it ever leave me?",12,0,100,0,0,0,7669,0,"Mountaineer Dolf"), + +-- Deathguard Kel creature text +(12428,3,0,"Argh, the pain. Will it ever leave me?",12,0,100,0,0,0,7669,0,"Deathguard Kel"), + +-- Sentinel Shaya creature text +(12429,3,0,"Argh, the pain. Will it ever leave me?",12,0,100,0,0,0,7779,0,"Sentinel Shaya"), + +-- Grunt Kor'ja creature text +(12430,3,0,"Argh, the pain. Will it ever leave me?",12,0,100,0,0,0,7783,0,"Grunt Kor'ja"); + +-- Grunt Kor'ja Missing Emote +UPDATE `creature_text` SET `Emote`=1 WHERE `CreatureID`=12430 AND `GroupID`=0; + +-- Scripts +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (12423,12427,12428,12429,12430); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (1242300,1242301,1242700,1242701,1242800,1242801,1242900,1242901,1243000,1243001) 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES + +-- Guard Roberts Script +(12423,0,0,1,25,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Reset - Set Phase 1"), +(12423,0,1,2,61,1,100,0,0,0,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Link - Set Flag Standstate Kneel (Phase 1)"), +(12423,0,2,0,61,1,100,0,0,0,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Link - Set Health 70% (Phase 1)"), +(12423,0,3,0,40,2,100,0,2,12423,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Waypoint 2 Reached - Despawn (Phase 2)"), +(12423,0,4,5,8,1,100,1,2052,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Spellhit - Set Phase 2 (No Repeat) (Phase 1)"), +(12423,0,5,0,61,2,100,0,0,0,0,0,0,80,1242300,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Link - Run Script (Phase 2)"), +(12423,0,6,0,8,2,100,1,1243,0,0,0,0,80,1242301,0,1,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Spellhit - Run Script (No Repeat) (Phase 2)"), + +-- Guard Roberts Timed List 1 +(1242300,9,0,0,0,0,100,0,500,500,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Remove Flag Standstate 'Kneel'"), +(1242300,9,1,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Set Orientation Invoker"), +(1242300,9,2,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Say Line 2"), +(1242300,9,3,0,0,0,100,0,60000,60000,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Set Health 70%"), +(1242300,9,4,0,0,0,100,0,0,0,0,0,0,5,33,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Guard Roberts - On Script - Play Emote"), +(1242300,9,5,0,0,0,100,0,500,500,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Say Line 3"), +(1242300,9,6,0,0,0,100,0,500,500,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Reset Script"), + +-- Guard Roberts Timed List 2 +(1242301,9,0,0,0,0,100,0,0,0,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Remove Flag Standstate 'Kneel'"), +(1242301,9,1,0,0,0,100,0,0,0,0,0,0,33,12423,0,0,0,0,0,16,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Give Quest Credit"), +(1242301,9,2,0,0,0,100,0,0,0,0,0,0,5,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Guard Roberts - On Script - Play Emote"), +(1242301,9,3,0,0,0,100,0,2500,2500,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Set Orientation Invoker"), +(1242301,9,4,0,0,0,100,0,500,500,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Say Line 0"), +(1242301,9,5,0,0,0,100,0,4000,4000,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Say Line 1"), +(1242301,9,6,0,0,0,100,0,2000,2000,0,0,0,53,1,12423,0,0,0,0,1,0,0,0,0,0,0,0,0,"Guard Roberts - On Script - Start Waypoint"), + +-- Mountaineer Dolf Script +(12427,0,0,1,25,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Reset - Set Phase 1"), +(12427,0,1,2,61,1,100,0,0,0,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Link - Set Flag Standstate Kneel (Phase 1)"), +(12427,0,2,0,61,1,100,0,0,0,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Link - Set Health 70% (Phase 1)"), +(12427,0,3,0,40,2,100,0,2,12427,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Waypoint 2 Reached - Despawn (Phase 2)"), +(12427,0,4,5,8,1,100,1,2052,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Spellhit - Set Phase 2 (No Repeat) (Phase 1)"), +(12427,0,5,0,61,2,100,0,0,0,0,0,0,80,1242700,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Link - Run Script (Phase 2)"), +(12427,0,6,0,8,2,100,1,1243,0,0,0,0,80,1242701,0,1,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Spellhit - Run Script (No Repeat) (Phase 2)"), + +-- Mountaineer Dolf Timed List 1 +(1242700,9,0,0,0,0,100,0,500,500,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Remove Flag Standstate 'Kneel'"), +(1242700,9,1,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Set Orientation Invoker"), +(1242700,9,2,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Say Line 2"), +(1242700,9,3,0,0,0,100,0,60000,60000,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Set Health 70%"), +(1242700,9,4,0,0,0,100,0,0,0,0,0,0,5,33,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Mountaineer Dolf - On Script - Play Emote"), +(1242700,9,5,0,0,0,100,0,500,500,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Say Line 3"), +(1242700,9,6,0,0,0,100,0,500,500,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Reset Script"), + +-- Mountaineer Dolf Timed List 2 +(1242701,9,0,0,0,0,100,0,0,0,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Remove Flag Standstate 'Kneel'"), +(1242701,9,1,0,0,0,100,0,0,0,0,0,0,33,12427,0,0,0,0,0,16,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Give Quest Credit"), +(1242701,9,2,0,0,0,100,0,0,0,0,0,0,5,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Mountaineer Dolf - On Script - Play Emote"), +(1242701,9,3,0,0,0,100,0,3500,3500,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Set Orientation Invoker"), +(1242701,9,4,0,0,0,100,0,500,500,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Say Line 0"), +(1242701,9,5,0,0,0,100,0,4000,4000,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Say Line 1"), +(1242701,9,6,0,0,0,100,0,2000,2000,0,0,0,53,1,12427,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mountaineer Dolf - On Script - Start Waypoint"), + +-- Deathguard Kel Script +(12428,0,0,1,25,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Reset - Set Phase 1"), +(12428,0,1,2,61,1,100,0,0,0,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Link - Set Flag Standstate Kneel (Phase 1)"), +(12428,0,2,0,61,1,100,0,0,0,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Link - Set Health 70% (Phase 1)"), +(12428,0,3,0,40,2,100,0,2,12428,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Waypoint 2 Reached - Despawn (Phase 2)"), +(12428,0,4,5,8,1,100,1,2052,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Spellhit - Set Phase 2 (No Repeat) (Phase 1)"), +(12428,0,5,0,61,2,100,0,0,0,0,0,0,80,1242800,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Link - Run Script (Phase 2)"), +(12428,0,6,0,8,2,100,1,1243,0,0,0,0,80,1242801,0,1,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Spellhit - Run Script (No Repeat) (Phase 2)"), + +-- Deathguard Kel Timed List 1 +(1242800,9,0,0,0,0,100,0,500,500,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Remove Flag Standstate 'Kneel'"), +(1242800,9,1,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Set Orientation Invoker"), +(1242800,9,2,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Say Line 2"), +(1242800,9,3,0,0,0,100,0,60000,60000,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Set Health 70%"), +(1242800,9,4,0,0,0,100,0,0,0,0,0,0,5,33,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Deathguard Kel - On Script - Play Emote"), +(1242800,9,5,0,0,0,100,0,500,500,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Say Line 3"), +(1242800,9,6,0,0,0,100,0,500,500,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Reset Script"), + +-- Deathguard Kel Timed List 2 +(1242801,9,0,0,0,0,100,0,0,0,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Remove Flag Standstate 'Kneel'"), +(1242801,9,1,0,0,0,100,0,0,0,0,0,0,33,12428,0,0,0,0,0,16,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Give Quest Credit"), +(1242801,9,2,0,0,0,100,0,0,0,0,0,0,5,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Deathguard Kel - On Script - Play Emote"), +(1242801,9,3,0,0,0,100,0,2500,2500,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Set Orientation Invoker"), +(1242801,9,4,0,0,0,100,0,500,500,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Say Line 0"), +(1242801,9,5,0,0,0,100,0,4000,4000,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Say Line 1"), +(1242801,9,6,0,0,0,100,0,2000,2000,0,0,0,53,1,12428,0,0,0,0,1,0,0,0,0,0,0,0,0,"Deathguard Kel - On Script - Start Waypoint"), + +-- Sentinel Shaya Script +(12429,0,0,1,25,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Reset - Set Phase 1"), +(12429,0,1,2,61,1,100,0,0,0,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Link - Set Flag Standstate Kneel (Phase 1)"), +(12429,0,2,0,61,1,100,0,0,0,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Link - Set Health 70% (Phase 1)"), +(12429,0,3,0,40,2,100,0,2,12429,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Waypoint 2 Reached - Despawn (Phase 2)"), +(12429,0,4,5,8,1,100,1,2052,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Spellhit - Set Phase 2 (No Repeat) (Phase 1)"), +(12429,0,5,0,61,2,100,0,0,0,0,0,0,80,1242900,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Link - Run Script (Phase 2)"), +(12429,0,6,0,8,2,100,1,1243,0,0,0,0,80,1242901,0,1,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Spellhit - Run Script (No Repeat) (Phase 2)"), + +-- Sentinel Shaya Timed List 1 +(1242900,9,0,0,0,0,100,0,500,500,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Remove Flag Standstate 'Kneel'"), +(1242900,9,1,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Set Orientation Invoker"), +(1242900,9,2,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Say Line 2"), +(1242900,9,3,0,0,0,100,0,60000,60000,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Set Health 70%"), +(1242900,9,4,0,0,0,100,0,0,0,0,0,0,5,33,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Sentinel Shaya - On Script - Play Emote"), +(1242900,9,5,0,0,0,100,0,500,500,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Say Line 3"), +(1242900,9,6,0,0,0,100,0,500,500,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Reset Script"), + +-- Sentinel Shaya Timed List 2 +(1242901,9,0,0,0,0,100,0,0,0,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Remove Flag Standstate 'Kneel'"), +(1242901,9,1,0,0,0,100,0,0,0,0,0,0,33,12429,0,0,0,0,0,16,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Give Quest Credit"), +(1242901,9,2,0,0,0,100,0,0,0,0,0,0,5,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Sentinel Shaya - On Script - Play Emote"), +(1242901,9,3,0,0,0,100,0,2500,2500,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Set Orientation Invoker"), +(1242901,9,4,0,0,0,100,0,1000,1000,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Say Line 0"), +(1242901,9,5,0,0,0,100,0,4000,4000,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Say Line 1"), +(1242901,9,6,0,0,0,100,0,2000,2000,0,0,0,53,1,12429,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Shaya - On Script - Start Waypoint"), + +-- Grunt Kor'ja Script +(12430,0,0,1,25,0,100,0,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Reset - Set Phase 1"), +(12430,0,1,2,61,1,100,0,0,0,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Link - Set Flag Standstate Kneel (Phase 1)"), +(12430,0,2,0,61,1,100,0,0,0,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Link - Set Health 70% (Phase 1)"), +(12430,0,3,0,40,2,100,0,2,12430,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Waypoint 2 Reached - Despawn (Phase 2)"), +(12430,0,4,5,8,1,100,1,2052,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Spellhit - Set Phase 2 (No Repeat) (Phase 1)"), +(12430,0,5,0,61,2,100,0,0,0,0,0,0,80,1243000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Link - Run Script (Phase 2)"), +(12430,0,6,0,8,2,100,1,1243,0,0,0,0,80,1243001,0,1,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Spellhit - Run Script (No Repeat) (Phase 2)"), + +-- Grunt Kor'ja Timed List 1 +(1243000,9,0,0,0,0,100,0,500,500,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Remove Flag Standstate 'Kneel'"), +(1243000,9,1,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Set Orientation Invoker"), +(1243000,9,2,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Say Line 2"), +(1243000,9,3,0,0,0,100,0,60000,60000,0,0,0,142,70,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Set Health 70%"), +(1243000,9,4,0,0,0,100,0,0,0,0,0,0,5,33,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Grunt Kor'ja - On Script - Play Emote"), +(1243000,9,5,0,0,0,100,0,500,500,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Say Line 3"), +(1243000,9,6,0,0,0,100,0,500,500,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Reset Script"), + +-- Grunt Kor'ja Timed List 2 +(1243001,9,0,0,0,0,100,0,0,0,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Remove Flag Standstate 'Kneel'"), +(1243001,9,1,0,0,0,100,0,0,0,0,0,0,33,12430,0,0,0,0,0,16,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Give Quest Credit"), +(1243001,9,2,0,0,0,100,0,0,0,0,0,0,5,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0, "Grunt Kor'ja - On Script - Play Emote"), +(1243001,9,3,0,0,0,100,0,2500,2500,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Set Orientation Invoker"), +(1243001,9,4,0,0,0,100,0,500,500,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Say Line 0"), +(1243001,9,5,0,0,0,100,0,4000,4000,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Say Line 1"), +(1243001,9,6,0,0,0,100,0,2000,2000,0,0,0,53,1,12430,0,0,0,0,1,0,0,0,0,0,0,0,0,"Grunt Kor'ja - On Script - Start Waypoint"); + +-- Remove old waypoints +DELETE FROM `script_waypoint` WHERE `entry` IN (12423,12427,12428,12429,12430); + +-- Waypoints +DELETE FROM `waypoints` WHERE `entry` IN (12423,12427,12428,12429,12430); +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES + +-- Guard Roberts Waypoints +(12423,1,-9509.090,-144.348,58.772,"Guard Roberts"), +(12423,2,-9518.536,-171.302,59.214,"Guard Roberts"), + +-- Mountaineer Dolf Waypoints +(12427,1,-5689.931,-459.725,392.185,"Mountaineer Dolf"), +(12427,2,-5700.382,-450.403,393.179,"Mountaineer Dolf"), + +-- Deathguard Kel Waypoints +(12428,1,2454.314,361.823,31.4958,"Deathguard Kel"), +(12428,2,2475.569,382.817,30.644,"Deathguard Kel"), + +-- Sentinel Shaya Waypoints +(12429,1,9657.482,907.793,1273.894,"Sentinel Shaya"), +(12429,2,9643.783,908.450,1269.255,"Sentinel Shaya"), + +-- Grunt Kor'ja +(12430,1,159.649,-4779.886,14.572,"Grunt Kor'ja"), +(12430,2,140.527,-4812.074,16.830,"Grunt Kor'ja"); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN (12423,12427,12428,12429,12430); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES + +-- Guard Roberts Conditions +(22,5,12423,0,0,47,0,5624,10,0,0,0,0,"","Smart Event 4 for creature Guard Roberts only executes if player has quest 'Garments of the Light' in progress or completed"), + +-- Mountaineer Dolf Conditions +(22,5,12427,0,0,47,0,5625,10,0,0,0,0,"","Smart Event 4 for creature Mountaineer Dolf only executes if player has quest 'Garments of the Light' in progress or completed"), + +-- Deathguard Kel Conditions +(22,5,12428,0,0,47,0,5650,10,0,0,0,0,"","Smart Event 4 for creature Deathguard Kel only executes if player has quest 'Garments of Darkness' in progress or completed"), + +-- Sentinel Shaya Conditions +(22,5,12429,0,0,47,0,5621,10,0,0,0,0,"","Smart Event 4 for creature Sentinel Shaya only executes if player has quest 'Garments of the Moon' in progress or completed"), + +-- Grunt Kor'ja Conditions +(22,5,12430,0,0,47,0,5648,10,0,0,0,0,"","Smart Event 4 for creature Grunt Kor'ja only executes if player has quest 'Garments of Spirituality' in progress or completed"); + +-- Correct respawn time for "Guard Roberts", "Sentinel Shaya", "Mountaineer Dolf", "Deathguard Kel" and "Grunt Kor'ja" (Timed it on WotLK Classic) +UPDATE `creature` SET `spawntimesecs`=30 WHERE `ID` IN (12423,12427,12428,12429,12430); diff --git a/sql/updates/world/3.3.5/2025_02_03_00_world_2012_08_20_00_world_quest_template_434.sql b/sql/updates/world/3.3.5/2025_02_03_00_world_2012_08_20_00_world_quest_template_434.sql new file mode 100644 index 00000000000..84972ceddb4 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_03_00_world_2012_08_20_00_world_quest_template_434.sql @@ -0,0 +1 @@ +ALTER TABLE `quest_template` CHANGE `AllowableRaces` `AllowableRaces` int unsigned NOT NULL DEFAULT '0'; diff --git a/sql/updates/world/3.3.5/2025_02_05_00_world.sql b/sql/updates/world/3.3.5/2025_02_05_00_world.sql new file mode 100644 index 00000000000..54ab9a438f6 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_05_00_world.sql @@ -0,0 +1,105 @@ + +-- Intro for quest "The Binding" (1795) +-- Game objects are spawned by the script +DELETE FROM `gameobject` WHERE `guid` IN (29205,50355); +DELETE FROM `gameobject_addon` WHERE `guid` IN (29205,50355); + +-- Strahad Farsan Text +DELETE FROM `creature_text` WHERE `CreatureID`=6251; +INSERT INTO `creature_text` (`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(6251,0,0,"I hope you're ready, $n. Follow me.",12,0,100,1,0,0,2370,0,"Strahad Farsan"), +(6251,1,0,"Come, my acolytes. Take the rods of channeling and create the greater summoning circle.",12,0,100,1,0,0,2374,0,"Strahad Farsan"); + +-- Script +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry` IN (6251,6252,6253,6254,6268); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN( 6251,6252,6253,6254,6268) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (625100,625101,625102,625103,625200,625300,625400,626800) 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES + +-- Strahad Farsan Script +(6251,0,0,0,19,0,100,0,1795,0,0,0,0,80,625100,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Quest 'The Binding' Taken - Run Script"), +(6251,0,1,0,40,0,100,0,4,0,0,0,0,80,625101,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Waypoint 4 Reached - Run Script"), +(6251,0,2,0,40,0,100,0,6,0,0,0,0,80,625102,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Waypoint 7 Reached - Run Script"), +(6251,0,3,0,38,0,100,0,0,3,0,0,0,65,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Data Set 0 3 - Resume Waypoint"), +(6251,0,4,0,40,0,100,0,9,0,0,0,0,80,625103,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Waypoint 10 Reached - Run Script"), + +-- Acolyte Magaz Script +(6252,0,0,0,38,0,100,0,0,1,0,0,0,80,625200,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Magaz - On Data Set 0 1 - Run Script"), +(6252,0,1,0,38,0,100,0,0,2,0,0,0,5,34,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Magaz - On Data Set 0 2 - Play Emote"), + +-- Acolyte Fenrick Script +(6253,0,0,0,38,0,100,0,0,1,0,0,0,80,625200,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Fenrick - On Data Set 0 1 - Run Script"), +(6253,0,1,0,38,0,100,0,0,2,0,0,0,5,34,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Fenrick - On Data Set 0 2 - Play Emote"), + +-- Acolyte Wytula Script +(6254,0,0,0,38,0,100,0,0,1,0,0,0,80,625200,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Wytula - On Data Set 0 1 - Run Script"), +(6254,0,1,0,38,0,100,0,0,2,0,0,0,5,34,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Wytula - On Data Set 0 2 - Play Emote"), + +-- Summoned Felhunter Script +(6268,0,0,0,0,0,100,0,5000,11000,11000,17000,0,11,2691,0,0,0,0,0,2,0,0,0,0,0,0,0,0,"Summoned Felhunter - In Combat - Cast 'Mana Burn'"), +(6268,0,1,0,54,0,100,0,0,0,0,0,0,80,626800,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Summoned Felhunter - On Just Summoned - Run Script"), +(6268,0,2,0,6,0,100,0,2000,2000,0,0,0,45,0,3,0,0,0,0,19,6251,0,0,0,0,0,0,0,"Summoned Felhunter - On Death - Set Data 0 3 (Strahad Farsan)"), + +-- Strahad Farsan Timed List 1 +(625100,9,0,0,0,0,100,0,0,0,0,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Remove Npc Flag Questgiver+Gossip"), +(625100,9,1,0,0,0,100,0,1000,1000,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Say Line 0"), +(625100,9,2,0,0,0,100,0,2000,2000,0,0,0,53,0,6251,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Start Waypoint"), + +-- Strahad Farsan Timed List 2 +(625101,9,0,0,0,0,100,0,0,0,0,0,0,54,13000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Pause Waypoint"), +(625101,9,1,0,0,0,100,0,1000,1000,0,0,0,11,8677,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Cast 'Summon Effect'"), +(625101,9,2,0,0,0,100,0,6000,6000,0,0,0,50,92252,188,0,0,0,0,8,0,0,0,0,-768.80353,-3721.770,42.0,4.4998,"Strahad Farsan - On Script - Summon Gameobject 'Strahad's Summoning Circle'"), +(625101,9,3,0,0,0,100,0,1000,1000,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Say Line 1"), +(625101,9,4,0,0,0,100,0,0,0,0,0,0,45,0,1,0,0,0,0,19,6252,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Set Data 0 1 (Acolyte Magaz)"), +(625101,9,5,0,0,0,100,0,0,0,0,0,0,45,0,1,0,0,0,0,19,6253,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Set Data 0 1 (Acolyte Fenrick)"), +(625101,9,6,0,0,0,100,0,0,0,0,0,0,45,0,1,0,0,0,0,19,6254,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Set Data 0 1 (Acolyte Wytula)"), + +-- Strahad Farsan Timed List 3 +(625102,9,0,0,0,0,100,0,0,0,0,0,0,54,180000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Pause Waypoint"), +(625102,9,1,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Set Orientation Invoker"), + +-- Strahad Farsan Timed List 4 +(625103,9,0,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0,2.05950,"Strahad Farsan - On Script - Set Orientation"), +(625103,9,1,0,0,0,100,0,1000,1000,0,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Strahad Farsan - On Script - Add Npc Flag Questgiver+Gossip"), + +-- Acolyte Magaz Timed List 1 +(625200,9,0,0,0,0,100,0,1000,1000,0,0,0,5,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Magaz - On Data Set - Play Emote"), +(625200,9,1,0,0,0,100,0,5000,5000,0,0,0,11,8675,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Magaz - On Script - Cast 'Warlock Channeling'"), +(625200,9,2,0,0,0,100,0,7500,7500,0,0,0,50,92388,173,0,0,0,0,8,0,0,0,0,-768.80353,-3721.770,44.10,2.5952,"Acolyte Magaz - On Script - Summon Gameobject 'Summoning Circle'"), + +-- Acolyte Fenrick Timed List 1 +(625300,9,0,0,0,0,100,0,1000,1000,0,0,0,5,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Fenrick - On Data Set - Play Emote"), +(625300,9,1,0,0,0,100,0,5000,5000,0,0,0,11,8675,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Fenrick - On Script - Cast 'Warlock Channeling'"), + +-- Acolyte Wytula Timed List 1 +(625400,9,0,0,0,0,100,0,1000,1000,0,0,0,5,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Wytula - On Data Set - Play Emote"), +(625400,9,1,0,0,0,100,0,5000,5000,0,0,0,11,8675,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Acolyte Wytula - On Script - Cast 'Warlock Channeling'"), + +-- Summoned Felhunter Timed List 1 +(626800,9,0,0,0,0,100,0,0,0,0,0,0,11,52096,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Summoned Felhunter - On Script - Cast 'Teleport Visual Only'"), +(626800,9,1,0,0,0,100,0,1000,1000,0,0,0,45,0,2,0,0,0,0,19,6252,0,0,0,0,0,0,0,"Summoned Felhunter - On Script - Set Data 0 2 (Acolyte Magaz)"), +(626800,9,2,0,0,0,100,0,0,0,0,0,0,45,0,2,0,0,0,0,19,6253,0,0,0,0,0,0,0,"Summoned Felhunter - On Script - Set Data 0 2 (Acolyte Fenrick)"), +(626800,9,3,0,0,0,100,0,0,0,0,0,0,45,0,2,0,0,0,0,19,6254,0,0,0,0,0,0,0,"Summoned Felhunter - On Script - Set Data 0 2 (Acolyte Wytula)"), +(626800,9,4,0,0,0,100,0,0,0,0,0,0,41,2000,0,0,0,0,0,13,92252,0,100,0,0,0,0,0,"Summoned Felhunter - On Script - Despawn Gameobject 'Strahad's Summoning Circle'"), +(626800,9,5,0,0,0,100,0,0,0,0,0,0,41,2000,0,0,0,0,0,13,92388,0,100,0,0,0,0,0,"Summoned Felhunter - On Script - Despawn Gameobject 'Summoning Circle'"), +(626800,9,6,0,0,0,100,0,500,500,0,0,0,49,0,0,0,0,0,0,21,20,0,0,0,0,0,0,0,"Summoned Felhunter - On Script - Start Attacking Closest Player"); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=6251; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES + +-- Condition to prevent script from running when there already is a Felhunter spawned +(22,1,6251,0,0,29,0,6268,100,0,1,0,0,"","Smart Event 0 for creature Strahad Farsan only executes if creature 'Summoned Felhunter' not near"); + +-- Strahad Farsan Waypoints +DELETE FROM `waypoints` WHERE `entry`=6251; +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(6251,1,-786.65186,-3722.0166,40.380207,"Strahad Farsan"), +(6251,2,-784.910,-3717.9514,41.09593,"Strahad Farsan"), +(6251,3,-778.20404,-3718.2446,42.591854,"Strahad Farsan"), +(6251,4,-769.45544,-3721.2717,42.424034,"Strahad Farsan"), -- Summon +(6251,5,-767.81177,-3721.42969,42.37064,"Strahad Farsan"), +(6251,6,-762.8201,-3720.283,42.24128,"Strahad Farsan"), -- Waiting +(6251,7,-768.04926,-3720.5073,42.379726,"Strahad Farsan"), +(6251,8,-781.8862,-3716.743,41.55511,"Strahad Farsan"), +(6251,9,-785.9119,-3723.260,40.515202,"Strahad Farsan"); -- Home diff --git a/sql/updates/world/3.3.5/2025_02_07_00_world.sql b/sql/updates/world/3.3.5/2025_02_07_00_world.sql new file mode 100644 index 00000000000..edcf636fb22 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_07_00_world.sql @@ -0,0 +1,2 @@ +-- Add correct equipment to Witherheart the Stalker +UPDATE `creature_equip_template` SET `ItemID1`=10617, `ItemID2`=5285, `VerifiedBuild`=58797 WHERE `CreatureID`=8218 AND `ID`=1; diff --git a/sql/updates/world/3.3.5/2025_02_07_01_world.sql b/sql/updates/world/3.3.5/2025_02_07_01_world.sql new file mode 100644 index 00000000000..135844efac3 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_07_01_world.sql @@ -0,0 +1,58 @@ +-- Pathing for Mirelow Entry: 14424 +SET @NPC=14424; +SET @GUID=91113; +SET @PATH=@GUID * 10; +DELETE FROM `creature` WHERE `id` = @NPC AND `guid` != (@GUID); +DELETE FROM `pool_template` WHERE `entry`=@NPC; +DELETE FROM `pool_members` WHERE `Type`=0 AND `poolSpawnId`=1072; +UPDATE `creature` SET `position_x`=-2752.9434,`position_y`=-1311.9869,`position_z`=6.144358,`wander_distance`=0,`MovementType`=2 WHERE `id`=@NPC AND `guid`=@GUID; +UPDATE `creature_template` SET `MovementType`=2,`speed_walk`=1 WHERE `entry`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@GUID; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@GUID, @PATH, 0, 0, 0, 0, 0, 1, 0, 0, 0, NULL); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(@PATH, 1, -2752.9434, -1311.9869, 6.144358, NULL, 0, 0, 0, 100, 0), +(@PATH, 2, -2779.3325, -1318.1886, 6.212498, NULL, 0, 0, 0, 100, 0), +(@PATH, 3, -2802.5144, -1327.2316, 6.2124987, NULL, 0, 0, 0, 100, 0), +(@PATH, 4, -2841.5269, -1356.3691, 6.2124963, NULL, 0, 0, 0, 100, 0), +(@PATH, 5, -2868.5942, -1383.6816, 6.2125034, NULL, 0, 0, 0, 100, 0), +(@PATH, 6, -2888.584, -1418.0055, 6.2125034, NULL, 0, 0, 0, 100, 0), +(@PATH, 7, -2915.9563, -1455.4119, 6.2125106, NULL, 0, 0, 0, 100, 0), +(@PATH, 8, -2948.1558, -1477.9122, 6.2125034, NULL, 0, 0, 0, 100, 0), +(@PATH, 9, -2979.6265, -1493.0153, 6.2125106, NULL, 0, 0, 0, 100, 0), +(@PATH, 10, -3007.2742, -1519.1643, 6.1943064, NULL, 0, 0, 0, 100, 0), +(@PATH, 11, -3030.377, -1531.1482, 1.8713083, NULL, 0, 0, 0, 100, 0), +(@PATH, 12, -3050.034, -1538.9908, 2.2948234, NULL, 0, 0, 0, 100, 0), +(@PATH, 13, -3068.111, -1529.2074, 4.6410594, NULL, 0, 0, 0, 100, 0), +(@PATH, 14, -3048.722, -1507.4395, 2.3030105, NULL, 0, 0, 0, 100, 0), +(@PATH, 15, -3045.1477, -1488.9481, 6.1078167, NULL, 0, 0, 0, 100, 0), +(@PATH, 16, -3037.5547, -1465.8003, 6.2125444, NULL, 0, 0, 0, 100, 0), +(@PATH, 17, -3013.2668, -1444.2893, 6.2125444, NULL, 0, 0, 0, 100, 0), +(@PATH, 18, -2992.2075, -1423.2106, 6.2125444, NULL, 0, 0, 0, 100, 0), +(@PATH, 19, -2982.6704, -1384.7448, 6.2125444, NULL, 0, 0, 0, 100, 0), +(@PATH, 20, -2976.297, -1355.0217, 6.1414337, NULL, 0, 0, 0, 100, 0), +(@PATH, 21, -2972.429, -1315.0929, 6.212561, NULL, 0, 0, 0, 100, 0), +(@PATH, 22, -2959.098, -1289.4697, 6.212534, NULL, 0, 0, 0, 100, 0), +(@PATH, 23, -2946.3533, -1262.2607, 6.212534, NULL, 0, 0, 0, 100, 0), +(@PATH, 24, -2940.9849, -1235.0204, 6.212534, NULL, 0, 0, 0, 100, 0), +(@PATH, 25, -2927.3582, -1214.3258, 6.276264, NULL, 0, 0, 0, 100, 0), +(@PATH, 26, -2913.8328, -1184.8007, 6.2125435, NULL, 0, 0, 0, 100, 0), +(@PATH, 27, -2913.718, -1156.6484, 6.380024, NULL, 0, 0, 0, 100, 0), +(@PATH, 28, -2906.6707, -1130.346, 6.3375435, NULL, 0, 0, 0, 100, 0), +(@PATH, 29, -2924.4268, -1129.007, 6.262104, NULL, 0, 0, 0, 100, 0), +(@PATH, 30, -2948.263, -1141.3658, 6.581269, NULL, 0, 0, 0, 100, 0), +(@PATH, 31, -2981.483, -1160.7555, 6.2125306, NULL, 0, 0, 0, 100, 0), +(@PATH, 32, -3008.991, -1189.4165, 6.3375306, NULL, 0, 0, 0, 100, 0), +(@PATH, 33, -3033.5713, -1223.1588, 3.6263075, NULL, 0, 0, 0, 100, 0), +(@PATH, 34, -3058.1658, -1243.8303, 6.385656, NULL, 0, 0, 0, 100, 0), +(@PATH, 35, -3084.6208, -1262.775, 6.2125497, NULL, 0, 0, 0, 100, 0), +(@PATH, 36, -3110.9539, -1251.6007, 5.657193, NULL, 0, 0, 0, 100, 0), +(@PATH, 37, -3127.4268, -1279.7166, 6.2125597, NULL, 0, 0, 0, 100, 0), +(@PATH, 38, -3140.0647, -1310.3094, 6.2125597, NULL, 0, 0, 0, 100, 0), +(@PATH, 39, -3129.7153, -1336.1788, 6.2125444, NULL, 0, 0, 0, 100, 0), +(@PATH, 40, -3135.3235, -1368.5166, 6.2125444, NULL, 0, 0, 0, 100, 0), +(@PATH, 41, -3156.5852, -1393.152, 6.2125444, NULL, 0, 0, 0, 100, 0), +(@PATH, 42, -3176.052, -1410.8157, 6.2125344, NULL, 0, 0, 0, 100, 0), +(@PATH, 43, -3184.6921, -1435.9547, 6.2125344, NULL, 0, 0, 0, 100, 0), +(@PATH, 44, -3201.1177, -1461.5942, 6.2125344, NULL, 0, 0, 0, 100, 0); diff --git a/sql/updates/world/3.3.5/2025_02_10_00_world.sql b/sql/updates/world/3.3.5/2025_02_10_00_world.sql new file mode 100644 index 00000000000..2fb1141b500 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_10_00_world.sql @@ -0,0 +1,10 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( + 'spell_gen_slow_roasted_turkey', + 'spell_gen_cranberry_chutney', + 'spell_gen_spice_bread_stuffing', + 'spell_gen_pumpkin_pie', + 'spell_gen_candied_sweet_potato' +); + +DELETE FROM `spell_linked_spell` WHERE `spell_effect` = 24870; diff --git a/sql/updates/world/3.3.5/2025_02_13_00_world.sql b/sql/updates/world/3.3.5/2025_02_13_00_world.sql new file mode 100644 index 00000000000..bd8b6a68863 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_13_00_world.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_proc` WHERE `SpellId`=70656; +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES +(70656, 0, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0); diff --git a/sql/updates/world/3.3.5/2025_02_13_01_world.sql b/sql/updates/world/3.3.5/2025_02_13_01_world.sql new file mode 100644 index 00000000000..771698389e7 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_13_01_world.sql @@ -0,0 +1,2 @@ +-- DB/Spells: Fix Blade Barrier proc flags +UPDATE `spell_proc` SET `SpellPhaseMask`=1 WHERE `SpellId`=-49182; diff --git a/sql/updates/world/3.3.5/2025_02_13_02_world.sql b/sql/updates/world/3.3.5/2025_02_13_02_world.sql new file mode 100644 index 00000000000..76fc149481c --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_13_02_world.sql @@ -0,0 +1,25 @@ +-- Fix for Orb of Orahil chain, prevent hard locked + +-- Remove prev quest requirements from quests "Shard of a Felhound" (4962) and "Shard of an Infernal" (4963) +UPDATE `quest_template_addon` SET `PrevQuestID`=0 WHERE `ID` IN (4962,4963); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=19 AND `SourceEntry` IN (4962,4963); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(19,0,4962,0,0,47,0,1799,74,0,0,0,0,"","Quest 'Shard of an Infernal' can only be taken if quest 'Fragments of the Orb of Orahil' is in progress, completed and rewarded"), +(19,0,4963,0,0,47,0,1799,74,0,0,0,0,"","Quest 'Shard of a Felhound' can only be taken if quest 'Fragments of the Orb of Orahil' is in progress, completed and rewarded"); + +-- Script updates +-- Spell visual more inline with what can be seen on live servers +UPDATE `smart_scripts` SET `action_param1`=16633, `comment`="Menara - On Script - Cast 'Create Item Visual'" WHERE `entryorguid`=626600 AND `id`=2; + +-- Timers +UPDATE `smart_scripts` SET `event_param1`=7000, `event_param2`=7000 WHERE `entryorguid`=626600 AND `id`=3; + +-- Comments +UPDATE `smart_scripts` SET `comment`="Menara Voidrender - On Script - Remove Npc Flag Questgiver+Gossip" WHERE `entryorguid`=626600 AND `id`=0; +UPDATE `smart_scripts` SET `comment`="Menara Voidrender - On Script - Say Line 1" WHERE `entryorguid`=626600 AND `id`=1; +UPDATE `smart_scripts` SET `comment`="Menara Voidrender - On Script - Say Line 2" WHERE `entryorguid`=626600 AND `id`=3; +UPDATE `smart_scripts` SET `comment`="Menara Voidrender - On Script - Complete Quest 'The Completed Orb of Noh'Orahil'" WHERE `entryorguid`=626600 AND `id`=4; +UPDATE `smart_scripts` SET `comment`="Menara Voidrender - On Script - Complete Quest 'The Completed Orb of Dar'Orahil'" WHERE `entryorguid`=626600 AND `id`=5; +UPDATE `smart_scripts` SET `comment`="Menara Voidrender - On Script - On Script - Add Npc Flag Questgiver+Gossip" WHERE `entryorguid`=626600 AND `id`=6; diff --git a/sql/updates/world/3.3.5/2025_02_13_03_world.sql b/sql/updates/world/3.3.5/2025_02_13_03_world.sql new file mode 100644 index 00000000000..74c5b5473e9 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_13_03_world.sql @@ -0,0 +1,41 @@ +-- Fix for "Cleansing of the Orb of Orahil" quest event +-- Tabetha Script +DELETE FROM `smart_scripts` WHERE `entryorguid`=6546 AND `id`IN (0,11,12,13); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (654600,654607,654608) 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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(6546,0,0,0,19,0,100,0,4961,0,0,0,0,80,654600,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Quest 'Cleansing of the Orb of Orahil' Taken - Run Script"), +(6546,0,11,12,40,0,100,0,4,6546,0,0,0,80,654607,2,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Waypoint 4 Reached - Run Script"), +(6546,0,12,0,61,0,100,0,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Link - Set Run On"), +(6546,0,13,0,40,0,100,0,9,6546,0,0,0,80,654608,2,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Waypoint 9 Reached - Run Script"), + +-- Tabetha Timed List 1 +(654600,9,0,0,0,0,100,0,0,0,0,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Script - Remove Npc Flag Questgiver+Gossip"), +(654600,9,1,0,0,0,100,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Script - Say Line 0"), +(654600,9,2,0,0,0,100,0,0,0,0,0,0,53,0,6546,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tabetha - On Script - Start Waypoint"), + +-- Tabetha Timed List 8 +(654607,9,0,0,0,0,100,0,0,0,0,0,0,54,6000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Script - Pause Waypoint"), +(654607,9,1,0,0,0,100,0,1000,1000,0,0,0,11,9097,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Script - Cast Summon Demon of the Orb"), + +-- Tabetha Timed List 9 +(654608,9,0,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0,2.0822,"Tabetha - On Script - Reset Orientation"), +(654608,9,1,0,0,0,100,0,1000,1000,0,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Tabetha - On Script - Add Npc Flag Questgiver+Gossip"); + +-- Waypoints +DELETE FROM `waypoints` WHERE `entry`=6546; +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(6546,1,-4037.934,-3380.369,37.811,''), +(6546,2,-4036.560,-3377.986,37.762,''), +(6546,3,-4029.500,-3376.984,38.132,''), +(6546,4,-4019.693,-3381.410,38.228,'Tabetha_SUMMON'), +(6546,5,-4029.500,-3376.984,38.132,''), +(6546,6,-4036.560,-3377.986,37.762,''), +(6546,7,-4037.934,-3380.369,37.811,''), +(6546,8,-4034.080,-3388.858,38.997,''), +(6546,9,-4031.560,-3392.970,38.997,'Tabetha_STOP'); + +-- Conditions to prevent Tabetha from stopping and summoning another Demon if one is already present +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=654607 AND `SourceId`=9; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,1,654607,9,0,29,1,6549,100,0,1,0,0,"","Smart Event 1 for creature Tabetha only executes if creature 'Demon of the Orb' not near"), +(22,2,654607,9,0,29,1,6549,100,0,1,0,0,"","Smart Event 2 for creature Tabetha only executes if creature 'Demon of the Orb' not near"); diff --git a/sql/updates/world/3.3.5/2025_02_13_04_world.sql b/sql/updates/world/3.3.5/2025_02_13_04_world.sql new file mode 100644 index 00000000000..589644bcf8f --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_13_04_world.sql @@ -0,0 +1,18 @@ +-- Quest "The Completed Robe" Intro + +-- Quest flag +UPDATE `quest_template_addon` SET `SpecialFlags`=`SpecialFlags`|2 WHERE `ID`=4786; + +-- Menara Voidrender Script +DELETE FROM `smart_scripts` WHERE `entryorguid`=626601 AND `source_type`=9; +DELETE FROM `smart_scripts` WHERE `entryorguid`=6266 AND `id` IN (2,3); +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES + +(6266,0,2,3,19,0,100,0,4786,0,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Menara Voidrender - On Quest 'The Completed Robe' Taken - Store Targetlist"), +(6266,0,3,0,61,0,100,0,0,0,0,0,0,80,626601,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Menara Voidrender - On Link - Run Script"), + +-- Menara Voidrender Timed List 1 +(626601,9,0,0,0,0,100,0,0,0,0,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Menara Voidrender - On Script - Remove Npc Flag Questgiver+Gossip"), +(626601,9,1,0,0,0,100,0,1000,1000,0,0,0,11,16633,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Menara Voidrender - On Script - Cast 'Create Item Visual'"), +(626601,9,2,0,0,0,100,0,7000,7000,0,0,0,15,4786,0,0,0,0,0,12,1,0,0,0,0,0,0,0,"Menara Voidrender - On Script - Complete Quest"), +(626601,9,3,0,0,0,100,0,0,0,0,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Menara Voidrender - On Script - Add Npc Flag Questgiver+Gossip"); diff --git a/sql/updates/world/3.3.5/2025_02_13_05_world.sql b/sql/updates/world/3.3.5/2025_02_13_05_world.sql new file mode 100644 index 00000000000..67757d87139 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_13_05_world.sql @@ -0,0 +1,2 @@ +-- Fix model for creature 6546 (Tabetha) +UPDATE `creature_model_info` SET `DisplayID_Other_Gender`=0 WHERE `DisplayID`=5375; diff --git a/sql/updates/world/3.3.5/2025_02_14_00_world.sql b/sql/updates/world/3.3.5/2025_02_14_00_world.sql new file mode 100644 index 00000000000..6a675eace33 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_14_00_world.sql @@ -0,0 +1,2 @@ +-- Update "Lessons Anew" Completion (RewardText) +UPDATE `quest_offer_reward` SET `RewardText`="Greetings young $c, I'm glad to see you ready and eager to learn about the curing of poisons.$B$BWhile most druids in the past were put through pre-planned trials, your work will involve no such thing. There has been a rash of animal poisonings in Auberdine, and the village there has been unable to cure it. To that end, a representative there has asked Moonglade for aid and we are sending you there to aid them. This is no exercise - the work you'll do is quite real. Bear this in mind." WHERE `ID`=6121; diff --git a/sql/updates/world/3.3.5/2025_02_14_01_world.sql b/sql/updates/world/3.3.5/2025_02_14_01_world.sql new file mode 100644 index 00000000000..779deef8ce8 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_14_01_world.sql @@ -0,0 +1,2 @@ +-- Allow The Multiphase Survey quest for both sides +UPDATE `quest_template` SET `AllowableRaces`=0 WHERE `ID`=11880; diff --git a/sql/updates/world/3.3.5/2025_02_20_00_world.sql b/sql/updates/world/3.3.5/2025_02_20_00_world.sql new file mode 100644 index 00000000000..bd05a2f6379 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_20_00_world.sql @@ -0,0 +1,2 @@ +-- Update Knot Thimblejack spawn coordinates +UPDATE `creature` SET `position_x`=581.0821533203125, `position_y`=523.2933349609375, `position_z`=-25.31939697265625, `orientation`=2.722713708877563476, `VerifiedBuild`=59207 WHERE `guid`=56804 AND `id`=14338; diff --git a/sql/updates/world/3.3.5/2025_02_20_01_world.sql b/sql/updates/world/3.3.5/2025_02_20_01_world.sql new file mode 100644 index 00000000000..9670853d97f --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_20_01_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature` WHERE `id`=16097; diff --git a/sql/updates/world/3.3.5/2025_02_20_02_world.sql b/sql/updates/world/3.3.5/2025_02_20_02_world.sql new file mode 100644 index 00000000000..a11521bfab9 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_20_02_world.sql @@ -0,0 +1,8 @@ +UPDATE `playercreateinfo_action` SET `action`=20154 WHERE `action`=21084; + +DELETE FROM `spell_ranks` WHERE `first_spell_id`=20154; +INSERT INTO `spell_ranks` (`first_spell_id`, `spell_id`, `rank`) VALUES +(20154,20154,1), +(20154,21084,2); + +UPDATE `trainer_spell` SET `SpellId`=10321 WHERE `SpellId`=20271; diff --git a/sql/updates/world/3.3.5/2025_02_20_03_world.sql b/sql/updates/world/3.3.5/2025_02_20_03_world.sql new file mode 100644 index 00000000000..73a45d08d8a --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_20_03_world.sql @@ -0,0 +1,5 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pal_seal_of_righteousness'; +DELETE FROM `spell_script_names` WHERE `spell_id`=21084 AND `ScriptName`='spell_pal_seals'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(-20154,'spell_pal_seal_of_righteousness'), +(-20154,'spell_pal_seals'); diff --git a/sql/updates/world/3.3.5/2025_02_27_00_world.sql b/sql/updates/world/3.3.5/2025_02_27_00_world.sql new file mode 100644 index 00000000000..23e99144549 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_00_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE quest_offer_reward_locale SET RewardText='Ну, ты на славу $gпостарался!:постаралась!; Прямо не терпится поджарить волчатинки...$b$bУ меня есть кое-что интересное для тебя – выбирай!' WHERE ID=33 AND locale='ruRU'; diff --git a/sql/updates/world/3.3.5/2025_02_27_01_world.sql b/sql/updates/world/3.3.5/2025_02_27_01_world.sql new file mode 100644 index 00000000000..a45af102c6e --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_01_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE quest_offer_reward_locale SET RewardText='Меня тревожат сообщения о кобольдах на нашем руднике. К добру это не приведет. Вот, это твоя награда. Когда будешь $gготов:готова;, приходи ко мне. Буду рад, если ты согласишься предпринять еще одну вылазку...' WHERE ID=15 AND locale='ruRU'; diff --git a/sql/updates/world/3.3.5/2025_02_27_02_world.sql b/sql/updates/world/3.3.5/2025_02_27_02_world.sql new file mode 100644 index 00000000000..5508d1c37f2 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_02_world.sql @@ -0,0 +1,2 @@ +DELETE FROM quest_greeting_locale WHERE ID=823 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('823', 'ruRU', 'Привет, $c. Обычно я был бы на посту, присматривая за народом Штормграда, но многие стражники Штормграда сражаются в других землях. Так что я здесь, назначенный и предлагающий награды, хоть я и предпочел бы быть в патруле...', '0'); diff --git a/sql/updates/world/3.3.5/2025_02_27_03_world.sql b/sql/updates/world/3.3.5/2025_02_27_03_world.sql new file mode 100644 index 00000000000..f7a5c63b2fa --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_03_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE quest_offer_reward_locale SET RewardText='Ты снова $gзаслужил:заслужила; мою похвалу и благодарность армии Штормграда. В руднике еще достаточно кобольдов, но я отправлю других новобранцев бороться с ними. Для тебя имеются другие поручения.' WHERE ID=21 AND locale='ruRU'; diff --git a/sql/updates/world/3.3.5/2025_02_27_04_world.sql b/sql/updates/world/3.3.5/2025_02_27_04_world.sql new file mode 100644 index 00000000000..fbdedd03747 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_04_world.sql @@ -0,0 +1,3 @@ +-- +UPDATE page_text_locale SET Text='РАПОРТ: Кобольды\r\n\r\nРядом с Долиной Североземья наблюдается повышенная активность кобольдов. Огромное количество этих существ было замечено к северу от аббатства и на Руднике Горного Эха. Я нашел добровольцев среди паладинов, воинов и всех, кто был готов помочь нам в борьбе с этой напастью.\r\n\r\nПока дела идут хорошо. Желающих помочь предостаточно.' WHERE ID=209 AND locale='ruRU'; +UPDATE page_text_locale SET Text='ОТЧЕТ: Воры\r\n\r\nБолее тревожит то, что не только кобольды, но и банды людей-воров появились в долине. Они носят красные повязки и называют себя братством. Такой уровень организованности может доставить неприятности и здесь, и во всем Элвиннском лесу.\r\n\r\nМы идентифицировали одного из их лидеров – это Гаррик Тихокрад – и надеемся вскоре предать его правосудию.' WHERE ID=210 AND locale='ruRU'; diff --git a/sql/updates/world/3.3.5/2025_02_27_05_world.sql b/sql/updates/world/3.3.5/2025_02_27_05_world.sql new file mode 100644 index 00000000000..7056cf6656a --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_05_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE quest_template_locale SET Details='Надеюсь, ты $gготов:готова; к подвигам, |3-6($c), поскольку для тебя есть дело здесь, в Североземье. И я имею в виду не мирные сельские заботы.$B$BСтража Штормграда с трудом поддерживает здесь мир: слишком многие из нас находятся в дальних краях, а тревожных вестей меньше не становится. И потому мы надеемся на помощь всех, кто готов защитить свой дом и своих близких.$B$BЕсли ты $gготов:готова; откликнуться на призыв, то поговори с моим командиром, маршалом Макбрайдом. Он здесь, в аббатстве у меня за спиной.' WHERE ID=783 AND locale='ruRU'; diff --git a/sql/updates/world/3.3.5/2025_02_27_06_world.sql b/sql/updates/world/3.3.5/2025_02_27_06_world.sql new file mode 100644 index 00000000000..487f842f781 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_06_world.sql @@ -0,0 +1,4 @@ +-- Add missing movement flags to The Lich King +DELETE FROM `creature_template_movement` WHERE `CreatureId`=29110; +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(29110, 0, 0, 0, 1, 0, 0, NULL); diff --git a/sql/updates/world/3.3.5/2025_02_27_07_world.sql b/sql/updates/world/3.3.5/2025_02_27_07_world.sql new file mode 100644 index 00000000000..cc38377a231 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_07_world.sql @@ -0,0 +1,8 @@ +-- Update Spitelash Serpent Guard +SET @NPC=6194; +UPDATE `creature_equip_template` SET `ItemID2`=0, `VerifiedBuild`=58797 WHERE `CreatureID`=@NPC; +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry`=@NPC; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `id` IN (4,5) AND `entryorguid`=@NPC; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@NPC, 0, 4, 0, 0, 0, 100, 0, 2000, 4000, 20000, 25000, 0, 11, 12548, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, "Spitelash Serpent Guard - In Combat - Cast 'Frost Shock'"), +(@NPC, 0, 5, 0, 0, 0, 100, 0, 4000, 9000, 30000, 35000, 0, 11, 12545, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, "Spitelash Serpent Guard - In Combat - Cast 'Spitelash'"); diff --git a/sql/updates/world/3.3.5/2025_02_27_08_world.sql b/sql/updates/world/3.3.5/2025_02_27_08_world.sql new file mode 100644 index 00000000000..4f0e4ac3fa2 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_02_27_08_world.sql @@ -0,0 +1,2 @@ +DELETE FROM `spell_proc` WHERE `SpellId` = 37604; +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES (37604, 0, 6, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0); diff --git a/sql/updates/world/3.3.5/2025_03_06_00_world.sql b/sql/updates/world/3.3.5/2025_03_06_00_world.sql new file mode 100644 index 00000000000..c3ee6e8604e --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_06_00_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `smart_scripts` SET `action_param2`=2 WHERE `entryorguid`=25342 AND `source_type`=0 AND `id`=0; diff --git a/sql/updates/world/3.3.5/2025_03_08_00_world.sql b/sql/updates/world/3.3.5/2025_03_08_00_world.sql new file mode 100644 index 00000000000..4eb40ff2d69 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_08_00_world.sql @@ -0,0 +1,12 @@ +-- Breadcrumb quest Fix +UPDATE `quest_template_addon` SET `PrevQuestID`=0 WHERE `ID`=6341; +DELETE FROM `quest_template_addon` WHERE `ID`=6344; +INSERT INTO `quest_template_addon` (`ID`, `BreadcrumbForQuestId`) VALUES +(6344,6341); + +-- Breadcrumb quest Fix +UPDATE `quest_template_addon` SET `PrevQuestID`=0 WHERE `ID`=5621; +UPDATE `quest_template_addon` SET `BreadcrumbForQuestId`=5621 WHERE `ID`=5622; + +-- Breadcrumb quest Fix +UPDATE `quest_template_addon` SET `BreadcrumbForQuestId`=5921 WHERE `ID` IN (5923,5924,5925); diff --git a/sql/updates/world/3.3.5/2025_03_08_01_world.sql b/sql/updates/world/3.3.5/2025_03_08_01_world.sql new file mode 100644 index 00000000000..9f77db971cb --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_08_01_world.sql @@ -0,0 +1,24 @@ +-- Elanaria Quest Greeting +DELETE FROM `quest_greeting` WHERE `ID`=4088; +INSERT INTO `quest_greeting` (`ID`,`Type`,`GreetEmoteType`,`GreetEmoteDelay`,`Greeting`,`VerifiedBuild`) VALUES +(4088,0,1,0,"A warrior's path is one of determination, $gbrother:sister;. It may begin with strength of arms, but it endures through force of will.",0); + +-- Syral Bladeleaf Quest Greeting +DELETE FROM `quest_greeting` WHERE `ID`=2083; +INSERT INTO `quest_greeting` (`ID`,`Type`,`GreetEmoteType`,`GreetEmoteDelay`,`Greeting`,`VerifiedBuild`) VALUES +(2083,0,0,0,"Like Teldrassil itself, Dolanaar embraces those who embrace the land.",0); + +-- Mathiel Quest Greeting +DELETE FROM `quest_greeting` WHERE `ID`=6142; +INSERT INTO `quest_greeting` (`ID`,`Type`,`GreetEmoteType`,`GreetEmoteDelay`,`Greeting`,`VerifiedBuild`) VALUES +(6142,0,1,0,"The craft of the night elves ranges beyond the woods and its denizens. We know much of the earth below, and of the metals within it.",0); + +-- Daryn Lightwind Quest Greeting +DELETE FROM `quest_greeting` WHERE `ID`=7907; +INSERT INTO `quest_greeting` (`ID`,`Type`,`GreetEmoteType`,`GreetEmoteDelay`,`Greeting`,`VerifiedBuild`) VALUES +(7907,0,0,0,"",0); + +-- Gracina Spiritmight Quest Greeting +DELETE FROM `quest_greeting` WHERE `ID`=7740; +INSERT INTO `quest_greeting` (`ID`,`Type`,`GreetEmoteType`,`GreetEmoteDelay`,`Greeting`,`VerifiedBuild`) VALUES +(7740,0,0,0,"",0); diff --git a/sql/updates/world/3.3.5/2025_03_08_02_world.sql b/sql/updates/world/3.3.5/2025_03_08_02_world.sql new file mode 100644 index 00000000000..150c8f5a607 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_08_02_world.sql @@ -0,0 +1,178 @@ +-- The Super Snapper FX +UPDATE `quest_offer_reward` SET `Emote1`=5,`Emote2`=1 WHERE `ID`=2944; + +-- Trouble In Darkshore? +UPDATE `quest_details` SET `Emote1`=2,`Emote2`=1,`Emote3`=1,`Emote4`=25 WHERE `ID`=730; + +-- Sathrah's Sacrifice +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=2520; +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=2520; + +-- The Temple of the Moon +UPDATE `quest_offer_reward` SET `Emote1`=6 WHERE `ID`=2519; + +-- The Hunter's Charm +UPDATE `quest_details` SET `Emote1`=396 WHERE `ID`=8151; + +-- The Hunter's Path +DELETE FROM `quest_details` WHERE `ID`=6071; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6071,396,0,0,0,0,0,0,0,0); + +-- A Lesson to Learn +DELETE FROM `quest_details` WHERE `ID`=26; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(26,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=26; + +-- Lessons Anew +DELETE FROM `quest_details` WHERE `ID`=6121; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6121,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=2,`Emote2`=1 WHERE `ID`=6121; + +-- Heeding the Call +DELETE FROM `quest_details` WHERE `ID`IN (5923,5925); +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(5923,1,0,0,0,0,0,0,0,0), +(5925,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID` IN (5923,5925); + +-- The Shade of Elura +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=1686; + +-- The Barrens Port +UPDATE `quest_offer_reward` SET `Emote2`=1,`Emote3`=1 WHERE `ID`=1039; + +-- Velinde's Effects +UPDATE `quest_offer_reward` SET `Emote2`=1,`Emote3`=1 WHERE `ID`=1038; + +-- Weapons of Elunite +UPDATE `quest_offer_reward` SET `Emote1`=1,`Emote2`=2 WHERE `ID`=1693; + +-- Smith Mathiel +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=1692; + +-- Vorlus Vilehoof +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=1683; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=1683; + +-- Elanaria +DELETE FROM `quest_details` WHERE `ID`=1684; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(1684,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=1684; + +-- Taming the Beast +DELETE FROM `quest_details` WHERE `ID`=6102; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6102,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=273,`Emote2`=2 WHERE `ID`=6102; + +-- Taming the Beast +DELETE FROM `quest_details` WHERE `ID`=6101; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6101,1,1,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=273,`Emote2`=2 WHERE `ID`=6101; + +-- Taming the Beast +DELETE FROM `quest_details` WHERE `ID`=6063; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6063,1,1,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=273,`Emote2`=2 WHERE `ID`=6063; + +-- Garments of the Moon +DELETE FROM `quest_details` WHERE `ID`=5621; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(5621,1,1,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=5621; +UPDATE `quest_offer_reward` SET `Emote1`=1,`Emote2`=1 WHERE `ID`=5621; + +-- In Favor of Elune +DELETE FROM `quest_details` WHERE `ID`=5622; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(5622,1,1,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=2,`Emote2`=1 WHERE `ID`=5622; + +-- Body and Heart +DELETE FROM `quest_details` WHERE `ID`=6001; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6001,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=4 WHERE `ID`=6001; + +-- Moonglade +DELETE FROM `quest_details` WHERE `ID`=5921; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(5921,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=5921; + +-- Mortality Wanes +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6,`EmoteOncomplete`=6 WHERE `ID`=1142; +UPDATE `quest_offer_reward` SET `Emote1`=15,`Emote2`=18,`Emote3`=18 WHERE `ID`=1142; + +-- Blackfathom Villainy +UPDATE `quest_offer_reward` SET `Emote3`=5,`Emote4`=66 WHERE `ID`=1200; + +-- Return to Nessa +DELETE FROM `quest_details` WHERE `ID`=6343; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6343,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=6343; +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6,`EmoteOnComplete`=6 WHERE `ID`=6343; + +-- Flight to Auberdine +DELETE FROM `quest_details` WHERE `ID`=6342; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6342,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=6342; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=6342; + +-- The Bounty of Teldrassil +DELETE FROM `quest_details` WHERE `ID`=6341; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6341,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=6341; + +-- Nessa Shadowsong +DELETE FROM `quest_details` WHERE `ID`=6344; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6344,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=6344; + +-- Destiny Calls +UPDATE `quest_offer_reward` SET `Emote1`=1, `Emote2`=66 WHERE `ID`=2242; + +-- In Search of Thaelrid +UPDATE `quest_details` SET `Emote3`=1 WHERE `ID`=1198; + +-- Crown of the Earth +UPDATE `quest_request_items` SET `EmoteOnComplete`=1,`EmoteOnIncomplete`=1 WHERE `ID`=935; + +-- The Apple Falls +DELETE FROM `quest_details` WHERE `ID`=2241; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(2241,5,1,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=14 WHERE `ID`=2241; + +-- Ursal the Mauler +UPDATE `quest_request_items` SET `EmoteOnComplete`=5,`EmoteOnIncomplete`=5 WHERE `ID`=486; + +-- Rellian Greenspyre +DELETE FROM `quest_details` WHERE `ID`=922; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(922,1,2,0,0,0,0,0,0,0); + +-- A Friend in Need +DELETE FROM `quest_details` WHERE `ID`=3519; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(3519,34,0,0,0,0,0,0,0,0); + +-- Crown of the Earth +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=933; + +-- The Relics of Wakening +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=483; + +-- Twisted Hatred +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=6,`EmoteOnComplete`=6 WHERE `ID`=932; +UPDATE `quest_offer_reward` SET `Emote1`=2 WHERE `ID`=932; diff --git a/sql/updates/world/3.3.5/2025_03_08_03_world.sql b/sql/updates/world/3.3.5/2025_03_08_03_world.sql new file mode 100644 index 00000000000..f3133e29c44 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_08_03_world.sql @@ -0,0 +1,2 @@ +-- Correct respawn time for dwarves in the Lyceum +UPDATE `creature` SET `spawntimesecs`=30 WHERE `id` IN (8901,9956); diff --git a/sql/updates/world/3.3.5/2025_03_08_04_world.sql b/sql/updates/world/3.3.5/2025_03_08_04_world.sql new file mode 100644 index 00000000000..e4e74e8d9d0 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_08_04_world.sql @@ -0,0 +1,124 @@ +-- Marshal Dughan - Missing greeting +-- https://www.wowhead.com/classic/npc=240/marshal-dughan +DELETE FROM quest_greeting_locale WHERE ID=240 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('240', 'ruRU', 'Ох, тут и так сложно поддерживать порядок, а тут еще и новые неприятности вылезают! Надеюсь, у тебя хорошие новости, $n...', '0'); + +-- Goldtooth - Incorrect quest description: now it says that Goldtooth hid in his lair ABOVE the mine, but on the wowhead it says that he hid IN the mine. +-- https://www.wowhead.com/classic/quest=87/goldtooth +UPDATE quest_template_locale SET Details='Я играл около рудника Подземных глубин и, похоже, уронил... М-м... В смысле, я там видел ожерелье этой самой дамы. Представления не имею, как оно туда попало; я тут ни при чем!\r\n\r\nВ общем, короче, я видел, как здоровенный кобольд с золотыми зубами схватил ожерелье и скрылся в руднике. Если отыщешь этого кобольда, найдешь и ожерелье, точно тебе говорю!' WHERE ID=87 AND locale='ruRU'; + +-- William Pestle - Missing greeting +-- https://www.wowhead.com/classic/npc=253/william-pestle +DELETE FROM quest_greeting_locale WHERE ID=253 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('253', 'ruRU', 'Ага! Добрый день, добрый день, Мастер $C! Присаживайтесь и выпейте. У вас предприимчивый взгляд, и я думаю, вы найдете разговор со мной стоящим вашего времени...', '0'); + +-- Further Concerns - Incorrect quest description. Marshal Dughan offers to use his mount, but he doesn’t give you any mount, and the wowhead doesn’t mention a mount. +-- https://www.wowhead.com/classic/quest=35/further-concerns +UPDATE quest_template_locale SET Details='Если ты думаешь, что слухи о мурлоках могут оказаться правдой, отправляйся к восточному мосту Элвиннского леса и поговори со стражником Томасом. Он уже неделю несет стражу у моста и должен знать, что там происходит на самом деле.\r\n\r\nПринеси мне его отчет.' WHERE ID=35 AND locale='ruRU'; + +-- Rema Schneider - Missing greeting +-- https://www.wowhead.com/classic/npc=1428/rema-schneider +DELETE FROM quest_greeting_locale WHERE ID=1428 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('1428', 'ruRU', 'Приветствую, $n.', '0'); + +-- Guard Thomas - Missing greeting +-- https://www.wowhead.com/classic/npc=261/guard-thomas +DELETE FROM quest_greeting_locale WHERE ID=261 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('261', 'ruRU', 'Привет, гражданин. Выглядишь как $gмужчина:женщина; с целью - у тебя есть дело к армии Штормграда?', '0'); + +-- Surena Caledon - Missing ruRU localisation text +-- https://www.wowhead.com/classic/quest=1688/surena-caledon +UPDATE quest_template_locale SET Details='У меня была ученица по имени Сурена Каледон. Помню, она стояла как раз там, где сейчас стоишь ты… Просила меня научить ее искусству чернокнижия, а у самой даже капли таланта к этому не было. Хм, зато она была молода и довольно миловидна. Если бы я видел тогда, что это за вероломная дрянь!\r\n\r\nРаспутная девка сбежала с одним из членов Братства Справедливости по имени Эрлан Драджмур. Об этой потере я нисколько не сожалею, однако колье Кровавого камня, которое я подарил ей, мне все еще нужно.\r\n\r\nЕе жизнь для меня больше ничего не значит. Ты найдешь девку на тыквенной ферме Бреквеллов. Верни мне мое имущество!' WHERE ID=1688 AND locale='ruRU'; + +-- Grelin Whitebeard - Missing greeting +-- https://www.wowhead.com/classic/npc=786/grelin-whitebeard +DELETE FROM quest_greeting_locale WHERE ID=786 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('786', 'ruRU', 'Приветствую, $Gпарень:девчёнка;. Я Грелин Белобород. Я здесь, чтобы изучить угрозу, которую представляет растущее число троллей в Холодной долине. Что я обнаружил? Это немного тревожно...', '0'); + +-- Mountaineer Stormpike - Missing greeting +-- https://www.wowhead.com/classic/npc=1343/mountaineer-stormpike +DELETE FROM quest_greeting_locale WHERE ID=1343 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('1343', 'ruRU', 'Так, молодой, ощетинившийся $c, несомненно, привлечённый сюда разговорами о моих подвигах на полях сражений!$B$BСейчас не время для историй, ибо есть великие, важные дела, которые нужно совершить! Так что если вы ищете славы, то удача вам сегодня улыбнётся...', '0'); + +-- Woo Ping - Missing title +-- https://www.wowhead.com/classic/npc=11867/woo-ping +UPDATE creature_template_locale SET Title='Эксперт по оружию' WHERE entry=11867 AND locale='ruRU'; + +-- The Collector - Incorrect quest text +-- https://www.wowhead.com/classic/quest=123/the-collector +UPDATE quest_template_locale SET Details='На этом листке – расписание поставок золота из рудников в Элвиннском лесу. Поставки расписаны по дням и часам, а в качестве получателя указан некий "Вымогатель".\r\n\r\nСудя по всему, Вымогатель обосновался неподалеку от тыквенного поля Бреквеллов в восточной части Элвиннского леса.\r\n\r\nПохоже, это важные сведения. Было бы неплохо сообщить их маршалу Дугхану: он сейчас в Златоземье.', Objectives='Пойдите в Златоземье к маршалу Дугхану и отдайте ему расписание Вымогателя.' WHERE ID=123 AND locale='ruRU'; + +-- The Collector's Ring - There is no description of the item +-- https://www.wowhead.com/classic/item=2239/the-collectors-ring +UPDATE item_template_locale SET Description='На кольце выгравировано: "За долгую верную службу - ЭВК"' WHERE ID=2239 AND locale='ruRU'; + +-- Farmer Furlbrow - Missing greeting +-- https://www.wowhead.com/classic/npc=237/farmer-furlbrow +DELETE FROM quest_greeting_locale WHERE ID=237 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('237', 'ruRU', 'В этих краях одни неприятности. Я пытался сказать этому дураку Сальдену, чтобы он убирался, пока он ещё может, но он и слышать об этом не хочет. Но я не дурак. Мы с Верной уедем отсюда, как только починим эту повозку.', '0'); + +-- Verna Furlbrow - Missing greeting +-- https://www.wowhead.com/classic/npc=238/verna-furlbrow +DELETE FROM quest_greeting_locale WHERE ID=238 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('238', 'ruRU', 'Иногда мне кажется, что на небе большая серая туча, которая просто обрушивает на нас несчастья. Сначала нас прогнали с нашей земли, а теперь мы даже не можем выбраться из Западного Края. Кругом бардак. Что-то нужно делать.', '0'); + +-- Salma Saldean - Missing greeting +-- https://www.wowhead.com/classic/npc=235/salma-saldean +DELETE FROM quest_greeting_locale WHERE ID=235 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('235', 'ruRU', 'Добро пожаловать в нашу скромную обитель! Всегда приятно видеть дружелюбное лицо. И какие у вас сильные руки. Мы с мужем всегда ищем помощь на ферме. Теперь, когда большинство хороших людей уехали, трудно найти способного человека, который мог бы помочь.', '0'); + +-- Gryan Stoutmantle - Missing greeting +-- https://www.wowhead.com/classic/npc=234/gryan-stoutmantle +DELETE FROM quest_greeting_locale WHERE ID=234 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('234', 'ruRU', 'Западный Край погряз в отвратительной коррупции. Пока я исполнял свой долг на полях сражений Лордерона, эти честные фермы были захвачены и превращены в убежища для головорезов и убийц. Народному ополчению нужна ваша помощь.', '0'); + +-- Magistrate Solomon - Missing greeting +-- https://www.wowhead.com/classic/npc=344/magistrate-solomon +DELETE FROM quest_greeting_locale WHERE ID=344 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('344', 'ruRU', 'Красногорье охвачено хаосом!', '0'); + +-- Kimberly Hiett - Incorrect title +-- https://www.wowhead.com/classic/npc=789/kimberly-hiett +UPDATE creature_template_locale SET Title='Торговец стрелами' WHERE entry=789 AND locale='ruRU'; + +-- Darcy - Missing title +-- https://www.wowhead.com/classic/npc=379/darcy +UPDATE creature_template_locale SET Title='Официантка' WHERE entry=379 AND locale='ruRU'; + +-- Turalyon's Monument in Stormwind - Incorrect title of Uter +UPDATE page_text_locale SET Text='Генерал Туралион\r\n\r\nБывший наместник лорда Андуина Лотара. Рыцарь Серебряной Длани. Верховный генерал экспедиции Альянса, которая отправилась в Дренор, родной мир орков. Предположительно погиб.\r\n\r\nЭзарус тар-но Дарадор – Кровью и честью мы служим.\r\nТы был правой рукой справедливости и добродетели, старый друг. Твое имя всегда будет почитаться в наших залах.\r\n\r\n- Лорд Утер Светоносный, рыцарь Серебряной Длани' WHERE ID=290 AND locale='ruRU'; + +-- Protector of the People - Missing title +-- https://www.wowhead.com/classic/npc=8096/protector-of-the-people +UPDATE creature_template_locale SET Title='Народное ополчение' WHERE entry=8096 AND locale='ruRU'; + +-- Wilder Thistlenettle - Missing greeting +-- https://www.wowhead.com/classic/npc=656/wilder-thistlenettle +DELETE FROM quest_greeting_locale WHERE ID=656 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('656', 'ruRU', 'Везде были воры! $b$bЭто было ужасно. Пещера обрушилась на нас. Я думаю, что все шахтёры мертвы, включая моего брата, бригадира.', '0'); + +-- Postponing the Inevitable - Archmage Berinand https://wow.66wan.net/wotlk/en/?npc=25314 speaks about himself in feminine gender +-- https://www.wowhead.com/wotlk/quest=11905/postponing-the-inevitable +UPDATE quest_template_locale SET Details='Я определил причину нестабильности!\r\n\r\nСиловые линии Азерота перенаправлены на Нексус. Потрясающе! Если бы я мог провести остаток своих дней, исследуя эту аномалию…\r\n\r\nУвы, придется заняться текущими проблемами. Поток магической энергии расширяет разлом между измерениями.\r\n\r\nВ глубине Нексуса творится то, из-за чего ткань нашей вселенной истончается. Остановить это я не могу, однако нашел способ замедлить это.\r\n\r\nОтнеси это в Нексус и активируй поблизости от формирующегося разлома.' WHERE ID=11905 AND locale='ruRU'; + +-- Quickening - Archmage Berinand https://www.wowhead.com/wotlk/npc=25314/archmage-berinand speaks about himself in feminine gender, and incorrect questgiver in objectives +-- https://www.wowhead.com/wotlk/quest=11911/quickening +UPDATE quest_template_locale SET Details='Хотя мы, может быть, стоим на пороге прекращения нашего существования, я не перестаю изумляться. За короткое время, проведенное здесь, я узнал больше, чем за десятилетия исследований.\r\n\r\nЭти древа постоянно находятся под воздействием магической энергии. Она буквально на глазах превращает их в нечто... иное.\r\n\r\nЯ уверен, что это ещё одна ступень их трансформации. Я хочу, чтобы ты $Gотправился:отправилась; прямо в Нексус и $Gнашёл:нашла; какие-нибудь свидетельства об их конечном состоянии.\r\n\r\nПожалуйста, будь осторожнее...' WHERE ID=11911 AND locale='ruRU'; +UPDATE quest_template_locale SET Objectives='Верховный маг Беринард в Нексусе хочет, чтобы вы собрали 5 магических обломков кристаллических заступников.' WHERE ID=11911 AND locale='ruRU'; + +-- Have They No Shame? (Alliance) - Incorrect questgiver in objectives +-- https://www.wowhead.com/wotlk/quest=13094/have-they-no-shame +UPDATE quest_template_locale SET Objectives='Библиотекарь Серра просит вас зайти в Нексус и найти книгу с исследованиями Беринарда.' WHERE ID=13094 AND locale='ruRU'; + +-- Have They No Shame? (Horde) - Incorrect questgiver in objectives +-- https://www.wowhead.com/wotlk/quest=13095/have-they-no-shame +UPDATE quest_template_locale SET Objectives='Библиотекарь Серра просит вас зайти в Нексус и найти книгу с исследованиями Беринарда.' WHERE ID=13095 AND locale='ruRU'; + +-- Count Remington Ridgewell - Missing greeting +-- https://www.wowhead.com/wotlk/npc=2285/count-remington-ridgewell +DELETE FROM quest_greeting_locale WHERE ID=2285 AND locale='ruRU'; +INSERT INTO quest_greeting_locale (ID, locale, Greeting, VerifiedBuild) VALUES ('2285', 'ruRU', 'Моя семья может похвастаться лучшей коллекцией ювелирных изделий и предметов изящного искусства среди всех дворян Штормграда!$b$bИ мы всегда хотим увеличить размер нашей коллекции...', '0'); + +-- Collection of Goods - Just a quick clarification that it's not "Stratholme Water" but "Water FROM Stratholme" +-- https://www.wowhead.com/wotlk/quest=7642/collection-of-goods +UPDATE quest_template_locale SET Details='Для чепрака тебе понадобятся четыре вещи: руническая ткань для подкладки, арканитовые слитки для покрытия, цветки слезы Артаса для настройки на призрачный мир и святая вода из Стратхольма для духовного укрепления. На самом деле, вещей понадобится пять... если считать золото для меня. Эта плата – за весь мой труд, а также седло и стремена ручной работы.$b$bКогда наберешь все это, я смогу изготовить твой чепрак. А пока ты ищешь необходимое, я приступлю к работе.' WHERE ID=7642 AND locale='ruRU'; diff --git a/sql/updates/world/3.3.5/2025_03_12_00_world.sql b/sql/updates/world/3.3.5/2025_03_12_00_world.sql new file mode 100644 index 00000000000..64277d278fe --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_12_00_world.sql @@ -0,0 +1,2 @@ +-- Cell Door Lever (Area: The Blood Furnace - Difficulty: 1) CreateObject1 +UPDATE `gameobject` SET `position_x`=456.08551025390625, `position_y`=60.34891510009765625, `position_z`=9.478329658508300781, `orientation`=3.141592741012573242, `rotation2`=-1, `rotation3`=0, `spawntimesecs`=7200, `animprogress`=255, `VerifiedBuild`=59570 WHERE `id`=181982 AND `guid`=150441; diff --git a/sql/updates/world/3.3.5/2025_03_12_01_world.sql b/sql/updates/world/3.3.5/2025_03_12_01_world.sql new file mode 100644 index 00000000000..6d5baf75113 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_12_01_world.sql @@ -0,0 +1,11 @@ +-- Add correct equipment to Darkspear Dragon Hunter +SET @NPC=26870; +DELETE FROM `creature_equip_template` WHERE `CreatureID`=@NPC; +INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`, `VerifiedBuild`) VALUES +(@NPC, 1, 36790, 0, 0, 59570), +(@NPC, 2, 36791, 0, 0, 59570), +(@NPC, 3, 36792, 0, 0, 59570); + +UPDATE `creature` SET `equipment_id`=-1 WHERE `id`=@NPC; +UPDATE `creature_addon` SET `emote`=425 WHERE `guid`=203379; +UPDATE `creature_addon` SET `PvpFlags`=0 WHERE `guid` BETWEEN 203380 AND 203385; diff --git a/sql/updates/world/3.3.5/2025_03_16_00_world.sql b/sql/updates/world/3.3.5/2025_03_16_00_world.sql new file mode 100644 index 00000000000..51c93235fd4 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_16_00_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gameobject` SET `phaseMask`=257 WHERE `guid` IN (151102,151103,151104,151105,151106) AND `id` IN (202184,202347,202348,202349,202350); diff --git a/sql/updates/world/3.3.5/2025_03_16_01_world.sql b/sql/updates/world/3.3.5/2025_03_16_01_world.sql new file mode 100644 index 00000000000..e200befc8be --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_16_01_world.sql @@ -0,0 +1,2 @@ +-- Update one more Stormwind Guard spawn position +UPDATE `creature` SET `position_x`=-9740.4169921875, `position_y`=557.6878662109375, `position_z`=35.44633865356445312, `orientation`=4.634763240814208984 WHERE `id`=1423 AND `guid`=80466; diff --git a/sql/updates/world/3.3.5/2025_03_16_02_world.sql b/sql/updates/world/3.3.5/2025_03_16_02_world.sql new file mode 100644 index 00000000000..ed4019dd432 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_16_02_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template_addon` SET `mount`=0, `PvPFlags`=1 WHERE `entry`=1068; diff --git a/sql/updates/world/3.3.5/2025_03_18_00_world.sql b/sql/updates/world/3.3.5/2025_03_18_00_world.sql new file mode 100644 index 00000000000..8949194248a --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_18_00_world.sql @@ -0,0 +1,6 @@ +-- Spirit Healer (Area: Northwind Cleft - Difficulty: 0) +UPDATE `creature` SET `position_x`=-1087.59423828125, `position_y`=8066.376953125, `position_z`=-41.4149932861328125, `orientation`=0.01745329238474369, `spawntimesecs`=120, `VerifiedBuild`=59679 WHERE `guid`=87076 and `id`=6491; +-- Spirit Healer (Area: Halaa - Difficulty: 0) +UPDATE `creature` SET `position_x`=-1666.7645263671875, `position_y`=7934.5869140625, `position_z`=-48.9577140808105468, `orientation`=0.261799395084381103, `spawntimesecs`=120, `VerifiedBuild`=59679 WHERE `guid`=31741 and `id`=6491; +-- Spirit Healer (Area: Nagrand - Difficulty: 0) +UPDATE `creature` SET `position_x`=-2504.346923828125, `position_y`=6788.3125, `position_z`=23.53533744812011718, `orientation`=1.308996915817260742, `spawntimesecs`=120, `VerifiedBuild`=59679 WHERE `guid`=31742 and `id`=6491; diff --git a/sql/updates/world/3.3.5/2025_03_18_01_world.sql b/sql/updates/world/3.3.5/2025_03_18_01_world.sql new file mode 100644 index 00000000000..28eda42ac62 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_18_01_world.sql @@ -0,0 +1,32 @@ +-- Add forced despawn in 3 seconds after death to all Ring of Blood npc. +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (18398,18399,18400,18401,18402,18069); + +-- Brokentoe +DELETE FROM `smart_scripts` WHERE `entryorguid`=18398 AND `source_type`=0 AND `id`=3; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18398, 0, 3, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Brokentoe - On Just Died - Force Despawn in 5 sec"); + +-- Murkblood Twin +DELETE FROM `smart_scripts` WHERE `entryorguid`=18399 AND `source_type`=0 AND `id`=13; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18399, 0, 13, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Murkblood Twin - On Just Died - Force Despawn in 5 sec"); + +-- Rokdar the Sundered Lord +DELETE FROM `smart_scripts` WHERE `entryorguid`=18400 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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18400, 0, 7, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Rokdar the Sundered Lord - On Just Died - Force Despawn in 5 sec"); + +-- Skra'gath +DELETE FROM `smart_scripts` WHERE `entryorguid`=18401 AND `source_type`=0 AND `id`=5; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18401, 0, 5, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Skra'gath - On Just Died - Force Despawn in 5 sec"); + +-- Warmaul Champion +DELETE FROM `smart_scripts` WHERE `entryorguid`=18402 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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18402, 0, 7, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Warmaul Champion - On Just Died - Force Despawn in 5 sec"); + +-- Mogor +DELETE FROM `smart_scripts` WHERE `entryorguid`=18069 AND `source_type`=0 AND `id`=28; +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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18069, 0, 28, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "Mogor - On Just Died - Force Despawn in 5 sec"); diff --git a/sql/updates/world/3.3.5/2025_03_20_00_world.sql b/sql/updates/world/3.3.5/2025_03_20_00_world.sql new file mode 100644 index 00000000000..42b381fa311 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_20_00_world.sql @@ -0,0 +1,11 @@ +-- Add missing Gurthock gossip_menu +UPDATE `gossip_menu` SET `VerifiedBuild`=59679 WHERE `MenuID`=7699 AND `TextID`=9394; + +DELETE FROM `gossip_menu` WHERE `MenuID`=7699 AND `TextID`=9403; +INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES +(7699, 9403, 59679); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7699 AND `SourceEntry` IN (9394,9403); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14, 7699, 9394, 0, 0, 47, 0, 9977, 64, 0, 1, 0, 0, '', "Show gossip menu if player does not have quest 'The Ring of Blood: The Final Challenge' rewarded"), +(14, 7699, 9403, 0, 0, 47, 0, 9977, 64, 0, 0, 0, 0, '', "Show gossip menu if player has quest 'The Ring of Blood: The Final Challenge' rewarded"); diff --git a/sql/updates/world/3.3.5/2025_03_20_01_world.sql b/sql/updates/world/3.3.5/2025_03_20_01_world.sql new file mode 100644 index 00000000000..42b3b3a5328 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_20_01_world.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=6491); +UPDATE `creature_template_addon` SET `auras`='9036 10848' WHERE `entry` IN (6491,29259); -- Spirit Healer - 9036 - Ghost, 10848 - Shroud of Death diff --git a/sql/updates/world/3.3.5/2025_03_22_00_world.sql b/sql/updates/world/3.3.5/2025_03_22_00_world.sql new file mode 100644 index 00000000000..665e5f96a8b --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_22_00_world.sql @@ -0,0 +1,13 @@ +-- Mathrengyl Bearwalker outro emote when "Moonglade" (5921) is rewarded. + +-- Add SmartAI to creature template +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=4217; + +-- Mathrengyl Bearwalker Scripts +DELETE FROM `smart_scripts` WHERE `entryorguid`=4217 AND `source_type`=0 AND `id`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=421700 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(4217,0,0,0,19,0,100,0,5921,0,0,0,0,80,421700,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Quest 'Moonglade' Taken - Run Script"), +(421700,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Invoker"), +(421700,9,1,0,0,0,100,0,0,0,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Play Emote"), +(421700,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Home Position"); diff --git a/sql/updates/world/3.3.5/2025_03_22_01_world.sql b/sql/updates/world/3.3.5/2025_03_22_01_world.sql new file mode 100644 index 00000000000..d99736ef86d --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_22_01_world.sql @@ -0,0 +1,27 @@ +-- Mathrengyl Bearwalker missing outro emotes. + +-- Add SmartAI to creature template +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=4217; + +-- Scripts +DELETE FROM `smart_scripts` WHERE `entryorguid`=4217 AND `source_type`=0 AND `id`IN (0,1,2,3); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (421700,421701,421702,421703) 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(4217,0,1,0,20,0,100,0,6001,0,0,0,0,80,421701,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Quest 'Body and Heart' Rewarded - Run Script"), +(4217,0,2,0,20,0,100,0,5061,0,0,0,0,80,421702,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Quest 'Aquatic Form' Rewarded - Run Script"), +(4217,0,3,0,20,0,100,0,6125,0,0,0,0,80,421703,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Quest 'Power over Poison' Rewarded - Run Script"), + +-- "Body and Heart" +(421701,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Invoker"), +(421701,9,1,0,0,0,100,0,0,0,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Play Emote"), +(421701,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Home Position"), + +-- "Aquatic Form" +(421702,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Invoker"), +(421702,9,1,0,0,0,100,0,0,0,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Play Emote"), +(421702,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Home Position"), + +-- "Power over Poison" +(421703,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Invoker"), +(421703,9,1,0,0,0,100,0,0,0,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Play Emote"), +(421703,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Home Position"); diff --git a/sql/updates/world/3.3.5/2025_03_22_02_world.sql b/sql/updates/world/3.3.5/2025_03_22_02_world.sql new file mode 100644 index 00000000000..9b7cc2357a2 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_22_02_world.sql @@ -0,0 +1,30 @@ +-- Brokentoe (Area: The Ring of Blood - Difficulty: 0) +UPDATE `creature_template` SET `speed_walk`=2.5/2.5, `speed_run`=16/7 WHERE `entry`=18398; +UPDATE `smart_scripts` SET `target_x`=-709.04571533203125, `target_y`=7882.44091796875, `target_z`=46.05423355102539062, `target_o`=1.989675283432006835 WHERE `entryorguid`=1847100 AND `source_type`=9 AND `id`=1; +-- Murkblood Twin (Area: The Ring of Blood - Difficulty: 0) +UPDATE `creature_template` SET `speed_walk`=2.5/2.5, `speed_run`=12/7 WHERE `entry`=18399; +UPDATE `smart_scripts` SET `target_x`=-718.0357666015625, `target_y`=7871.61962890625, `target_z`=45.28351593017578125, `target_o`=1.570796370506286621 WHERE `entryorguid`=1847101 AND `source_type`=9 AND `id`=1; +UPDATE `smart_scripts` SET `target_x`=-696.43133544921875, `target_y`=7883.2587890625, `target_z`=47.42765426635742187, `target_o`=2.478367567062377929 WHERE `entryorguid`=1847101 AND `source_type`=9 AND `id`=2; +-- Rokdar the Sundered Lord (Area: The Ring of Blood - Difficulty: 0) +UPDATE `creature_template` SET `speed_walk`=2.5/2.5, `speed_run`=8/7 WHERE `entry`=18400; +UPDATE `smart_scripts` SET `target_x`=-709.5670166015625, `target_y`=7882.85595703125, `target_z`=46.10964584350585937, `target_o`=1.902408838272094726 WHERE `entryorguid`=1847102 AND `source_type`=9 AND `id`=1; +-- Skra'gath (Area: The Ring of Blood - Difficulty: 0) +UPDATE `creature_template` SET `speed_walk`=2.5/2.5, `speed_run`=12/7 WHERE `entry`=18401; +UPDATE `smart_scripts` SET `target_x`=-708.91363525390625, `target_y`=7883.25634765625, `target_z`=46.19994354248046875, `target_o`=1.832595705986022949 WHERE `entryorguid`=1847103 AND `source_type`=9 AND `id`=1; +-- Warmaul Champion (Area: The Ring of Blood - Difficulty: 0) +UPDATE `creature_template` SET `speed_walk`=2.5/2.5, `speed_run`=14/7 WHERE `entry`=18402; +UPDATE `smart_scripts` SET `target_x`=-705.9747314453125, `target_y`=7866.71630859375, `target_z`=45.06111907958984375, `target_o`=1.570796370506286621 WHERE `entryorguid`=1847104 AND `source_type`=9 AND `id`=1; + +-- Mogor (Area: Laughing Skull Ruins - Difficulty: 0) +UPDATE `creature_template` SET `speed_walk`=2.5/2.5, `speed_run`=14/7 WHERE `entry`=18069; +UPDATE `creature` SET `position_x`=-713.90032958984375, `position_y`=7929.8349609375, `position_z`=59.13791656494140625, `orientation`=4.607669353485107421, `VerifiedBuild`=59679 WHERE `guid`=48191 and `id`=18069; + +UPDATE `waypoints` SET `position_x`=-713.90032958984375, `position_y`=7929.8349609375, `position_z`=59.13791656494140625 WHERE `entry`=1806900 AND `pointid`=1; +UPDATE `smart_scripts` SET `target_o`=4.607669353485107421 WHERE `entryorguid`=18069 AND `source_type`=0 AND `id`=23; + +UPDATE `smart_scripts` SET `event_param1`=3, `comment`="Mogor - On Waypoint 3 Reached - Run Script" WHERE `entryorguid`=18069 AND `source_type`=0 AND `id`=10; +DELETE FROM `waypoints` WHERE `entry`=18069; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `point_comment`) VALUES +(18069, 1, -720.218, 7914.135, 55.22982, NULL, 0, 'Mogor'), +(18069, 2, -720.4691, 7905.346, 50.42057, NULL, 0, 'Mogor'), +(18069, 3, -715.9375, 7896.43, 48.30074, NULL, 0, 'Mogor'); diff --git a/sql/updates/world/3.3.5/2025_03_22_03_world.sql b/sql/updates/world/3.3.5/2025_03_22_03_world.sql new file mode 100644 index 00000000000..1e76c24f66a --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_22_03_world.sql @@ -0,0 +1,20 @@ +-- "Webwood Egg" (917) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=920 WHERE `Id`=917; + +-- "Crown of the Earth" (921) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=928 WHERE `Id`=921; + +-- "Tumors" (923) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=2498 WHERE `Id`=923; + +-- "Crown of the Earth" (928) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=929 WHERE `Id`=928; + +-- "The Enchanted Glade" (937) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=940 WHERE `Id`=937; + +-- "Iverron's Antidote" (3521) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=3522 WHERE `Id`=3521; + +-- "A Good Friend" (4495) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=3519 WHERE `Id`=4495; diff --git a/sql/updates/world/3.3.5/2025_03_30_00_world.sql b/sql/updates/world/3.3.5/2025_03_30_00_world.sql new file mode 100644 index 00000000000..a36d57bab9b --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_30_00_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=2649 AND `source_type`=0 AND `id` IN (0,1); diff --git a/sql/updates/world/3.3.5/2025_03_30_01_world.sql b/sql/updates/world/3.3.5/2025_03_30_01_world.sql new file mode 100644 index 00000000000..e4723633849 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_30_01_world.sql @@ -0,0 +1,5 @@ +-- Object 'Wanted Poster' (142122) has same quests as 'Wanted Poster' (150075) +DELETE FROM `gameobject_queststarter` WHERE `id`=142122; +INSERT INTO `gameobject_queststarter` (`id`, `quest`) VALUES +(142122, 2781), -- WANTED: Caliph Scorpidsting +(142122, 2875); -- WANTED: Andre Firebeard diff --git a/sql/updates/world/3.3.5/2025_03_30_02_world.sql b/sql/updates/world/3.3.5/2025_03_30_02_world.sql new file mode 100644 index 00000000000..28aeb752e64 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_30_02_world.sql @@ -0,0 +1,17 @@ +-- Sunscorched Shells Outro +DELETE FROM `smart_scripts` WHERE `entryorguid`=6142 AND `source_type`=0 AND `id`=1; +DELETE FROM `smart_scripts` WHERE `entryorguid`=614201 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(6142,0,1,0,20,0,100,0,1710,0,0,0,0,80,614201,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Quest 'Sunscorched Shells' Finished - Run Script"), +(614201,9,0,0,0,0,100,0,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Remove Npc Flag Questgiver"), +(614201,9,1,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0,3.3613,"Mathiel - On Script - Set Orientation"), +(614201,9,2,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Say Line 2"), +(614201,9,3,0,0,0,100,0,0,0,0,0,0,17,69,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Set Emote State 69"), +(614201,9,4,0,0,0,100,0,12000,12000,0,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Set Emote State 0"), +(614201,9,5,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0.166394,"Mathiel - On Script - Set Orientation"), +(614201,9,6,0,0,0,100,0,0,0,0,0,0,17,233,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Set Emote State 233"), +(614201,9,7,0,0,0,100,0,10000,10000,0,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Set Emote State 0"), +(614201,9,8,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Mathiel - On Script - Set Orientation Invoker"), +(614201,9,9,0,0,0,100,0,0,0,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Say Line 3"), +(614201,9,10,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Set Orientation Home Position"), +(614201,9,11,0,0,0,100,0,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathiel - On Script - Add Npc Flag Questgiver"); diff --git a/sql/updates/world/3.3.5/2025_03_30_03_world.sql b/sql/updates/world/3.3.5/2025_03_30_03_world.sql new file mode 100644 index 00000000000..51f8caa042a --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_30_03_world.sql @@ -0,0 +1,9 @@ +-- Jocaste outro emote when "Training the Beast" (6103) is rewarded. +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=4146; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4146; +DELETE FROM `smart_scripts` WHERE `entryorguid`=414600 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(4146,0,0,0,20,0,100,0,6103,0,0,0,0,80,414600,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Jocaste - On Quest 'Training the Beast' Rewarded - Run Script"), +(414600,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Jocaste - On Script - Set Orientation Invoker"), +(414600,9,1,0,0,0,100,0,10,10,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Jocaste - On Script - Play Emote"), +(414600,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Jocaste - On Script - Set Orientation Home Position"); diff --git a/sql/updates/world/3.3.5/2025_03_30_04_world.sql b/sql/updates/world/3.3.5/2025_03_30_04_world.sql new file mode 100644 index 00000000000..b603b1c5068 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_30_04_world.sql @@ -0,0 +1,9 @@ +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=4088; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4088; +DELETE FROM `smart_scripts` WHERE `entryorguid`=408800 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(4088,0,0,1,20,0,100,0,1683,0,0,0,0,80,408800,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Elanaria - On Quest 'Vorlus Vilehoof' Rewarded - Run Script"), +(4088,0,1,0,61,0,100,0,0,0,0,0,0,5,66,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Elanaria - On Link - Play Emote (Player)"), +(408800,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Elanaria - On Script - Set Orientation Invoker"), +(408800,9,1,0,0,0,100,0,0,0,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Elanaria - On Script - Play Emote"), +(408800,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Elanaria - On Script - Set Orientation Home Position"); diff --git a/sql/updates/world/3.3.5/2025_03_30_05_world.sql b/sql/updates/world/3.3.5/2025_03_30_05_world.sql new file mode 100644 index 00000000000..2dc08c66aa8 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_30_05_world.sql @@ -0,0 +1,9 @@ +-- Dazalar outro emote when "Taming the Beast" (6102) is rewarded. +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=3601; +DELETE FROM `smart_scripts` WHERE `entryorguid`=3601; +DELETE FROM `smart_scripts` WHERE `entryorguid`=360100 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(3601,0,0,0,20,0,100,0,6102,0,0,0,0,80,360100,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Dazalar - On Quest 'Taming the Beast' Rewarded - Run Script"), +(360100,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Dazalar - On Script - Set Orientation Invoker"), +(360100,9,1,0,0,0,100,0,0,0,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Dazalar - On Script - Play Emote"), +(360100,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Dazalar - On Script - Set Orientation Home Position"); diff --git a/sql/updates/world/3.3.5/2025_03_31_00_world.sql b/sql/updates/world/3.3.5/2025_03_31_00_world.sql new file mode 100644 index 00000000000..31a72e76cbc --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_31_00_world.sql @@ -0,0 +1,8 @@ +-- Mathrengyl Bearwalker Scripts when quest "Moonglade" (5921) is accepted +DELETE FROM `smart_scripts` WHERE `entryorguid`=4217 AND `source_type`=0 AND `id`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=421700 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(4217,0,0,0,19,0,100,0,5921,0,0,0,0,80,421700,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Quest 'Moonglade' Taken - Run Script"), +(421700,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Invoker"), +(421700,9,1,0,0,0,100,0,0,0,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Play Emote"), +(421700,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mathrengyl Bearwalker - On Script - Set Orientation Home Position"); diff --git a/sql/updates/world/3.3.5/2025_03_31_01_world.sql b/sql/updates/world/3.3.5/2025_03_31_01_world.sql new file mode 100644 index 00000000000..0981d264130 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_31_01_world.sql @@ -0,0 +1,2 @@ +-- These quests should not be available until "Timberling Seeds" is rewarded +UPDATE `quest_template_addon` SET `PrevQuestID`=918 WHERE `ID` IN (930,931); diff --git a/sql/updates/world/3.3.5/2025_03_31_02_world.sql b/sql/updates/world/3.3.5/2025_03_31_02_world.sql new file mode 100644 index 00000000000..b2681a3446d --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_31_02_world.sql @@ -0,0 +1,215 @@ +-- "The Balance of Nature" (456) - Completion Text, missing double spacing +UPDATE `quest_request_items` SET `CompletionText`="There is still work to be done, $N. Return to me once you have thinned the nightsaber and thistle boar populations." WHERE `ID`=456; + +-- "The Balance of Nature" (457) - Completion Text, missing double spacing +UPDATE `quest_request_items` SET `CompletionText`="Your task is not yet complete, $N. Return to me once 5 mangy nightsabers and 5 thistle boars have been killed." WHERE `ID`=457; + +-- "The Balance of Nature" (457) - Reward Text, missing double spacing and should have $c instead of $C +UPDATE `quest_offer_reward` SET `RewardText`="You have proven your dedication to nature well, $N. A young $c like yourself has a promising future." WHERE `ID`=457; + +-- "The Woodland Protector" (458) - Reward Text, should have $r instead of $R +UPDATE `quest_offer_reward` SET `RewardText`="I see you found me, young $r. Melithar is a wise druid to have sent you." WHERE `ID`=458; + +-- "The Woodland Protector" (459) - Quest Description, fixed incorrect usage of $b. +UPDATE `quest_template` SET `QuestDescription`="Something evil is brewing in the forests of Teldrassil. Look long the hills to where the peaceful furbolgs used to dwell. They have deserted their homes and are amassing under the name of the Gnarlpine tribe.$b$bOnly the corruption of wicked Fel Moss could cause such a transformation. The grells and grellkin have infested the area and are threatening the residents of Shadowglen.$b$bEngage these grells and grellkin, $N, and see if they are indeed caught under the enchantment of the wicked Fel Moss." WHERE `Id`=459; + +-- "The Woodland Protector" (459) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Satisfy my suspicions, $N. Bring to me 8 Fel Moss." WHERE `ID`=459; + +-- "The Woodland Protector" (459) - Reward Text, missing double spacing +UPDATE `quest_offer_reward` SET `RewardText`="Your service to the creatures of Shadowglen is worthy of reward, $N.$b$bYou confirmed my fears, however. If the grells have become tainted by the Fel Moss, one can only imagine what has become of the Gnarlpine tribe of furbolgs who once lived here.$b$bShould you find yourself in Dolanaar, able $C, seek out the knowledgeable druid, Athridas Bearmantle. He shares our concern for the well being of the forest." WHERE `ID`=459; + +-- "A Troubling Breeze" - Reward Text, missing double spacing +UPDATE `quest_offer_reward` SET `RewardText`="Thank the forest spirits you are here! I knew Athridas would sense trouble and send help." WHERE `ID`=475; + +-- "Gnarlpine Corruption" (476) - Reward Text, missing double spacing +UPDATE `quest_offer_reward` SET `RewardText`="By the stars! This is quite disturbing indeed!" WHERE `ID`=476; + +-- "The Relics of Wakening" (483) - Reward Text, missing double spacing and should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="You have succeeded, young $c! Well done. And just in time I might add." WHERE `ID`=483; + +-- "Ursal the Mauler" (486) - Reward Text, missing double spacing, should have $c instead of $C and $r instead of $R. +UPDATE `quest_offer_reward` SET `RewardText`="$N you have proven yourself a most worthy and able $c. A $r who follows the path of honor as sure as you do is certain to find great glory in this world.$b$bMay the forest spirits protect you wherever your travels may take you." WHERE `ID`=486; + +-- "The Road to Darnassus" (487) - Reward Text, missing double spacing and should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="You have served the good people of Dolanaar and Darnassus well, brave $c. As a member of the Sentinel force of Teldrassil I salute your efforts." WHERE `ID`=487; + +-- "Zenn's Bidding" (488) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Have you been a busy little bee, $N? I've been waiting for you to bring me what I need." WHERE `ID`=488; + +-- "Zenn's Bidding" (488) - Reward Text, missing double spacing and should have $r instead of $R. +UPDATE `quest_offer_reward` SET `RewardText`="Ha ha! Well, done indeed.$b$bWho would have ever guessed that I, Zenn Foulhoof, would have a $r to do my bidding? Certainly not me! But so it goes... this beloved world of ours is full of surprises.$b$bThree cheers for the naive and gullible!" WHERE `ID`=488; + +-- "Seek Redemption!" (489) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="What do you have for me, $N? A lovely snack I presume?" WHERE `ID`=489; + +-- "Seek Redemption!" (489) - Reward Text, missing double spacing and should have $r instead of $R. +UPDATE `quest_offer_reward` SET `RewardText`="Ah, what a sweet $r! I knew you would come in handy!" WHERE `ID`=489; + +-- "Webwood Venom" (916) - Reward Text, missing double spacing +UPDATE `quest_offer_reward` SET `RewardText`="Thank you, $N. When I return to Darnassus I will compare the venom within these sacs with the venom of other spiders. It is my belief that it will have properties linked to the recent growth of our new world tree." WHERE `ID`=916; + +-- "Webwood Egg" (917) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Have you been inside the Shadowthread Cave, $N? Did you find a spider egg?" WHERE `ID`=917; + +-- "Webwood Egg" (917) - Reward Text, missing double spacing +UPDATE `quest_offer_reward` SET `RewardText`="Ah, very good. I will have this egg and the venom transported to Darnassus, then return there when my studies are done here. I expect to find out a great deal from these specimens, $N. You have been a great help to me." WHERE `ID`=917; + +-- "Timberling Seeds" (918) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Do you have the seeds? I am eager to plant them." WHERE `ID`=918; + +-- "Timberling Seeds" (918) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="You got them. This is good!$b$bI will plant these seeds in special soil I have prepared. I believe the seeds will sprout into timberlings who are much more docile. Perhaps later you can see the results!" WHERE `ID`=918; + +-- "Timberling Sprouts" (919) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Hello, $N. Have you found any sprouts near the waters?" WHERE `ID`=919; + +-- "Timberling Sprouts" (919) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="That's a lot! I'm afraid they're spreading at a dangerous rate. I hope I can solve the riddle of what is tainting them.$b$bThank you for your help, $N. The land is a cleaner place from your efforts." WHERE `ID`=919; + +-- "Rellian Greenspyre" (922) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Ah, a timberling seed? I wanted to try growing one of these to help Denalan with his studies.$b$bBut I'm afraid I've discovered that a corruption has grown in many of the timberlings, and seeds from such creatures carry their parent's taint. They are beyond my talents to repair.$b$bDenalan is very skilled with things that grow. He may find a cure for future timberlings. He may be their only hope." WHERE `ID`=922; + +-- "Tumors" (923) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Have you been to Wellspring Lake, $N? Have you been hunting the timberlings there?" WHERE `ID`=923; + +-- "Tumors" (923) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Well done! These tumors are the symptom of the timberling's disease. They are filled with a poison that we must cleanse from our new land.$b$bI will dispose of these tumors. Thank you, $N." WHERE `ID`=923; + +-- "The Moss-twined Heart" (927) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="$N! You have something for me?" WHERE `ID`=927; + +-- "The Moss-twined Heart" (927) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="...What is this? A timberling heart?? It's covered with a foul moss!$b$bThank you for bringing this to me, $N. I will examine the heart and, if fortune shines, determine the nature of the moss about it." WHERE `ID`=927; + +-- "Crown of the Earth" (928) - Completion Text, should have $c instead of $C. +UPDATE `quest_request_items` SET `CompletionText`="Greetings, $c. For what purpose do I owe the pleasure of our meeting?" WHERE `ID`=928; + +-- "The Glowing Fruit" (930) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="$N, you look like you have something to tell me. Do you have news concerning the timberlings?" WHERE `ID`=930; + +-- "The Glowing Fruit" (930) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="You found this on Teldrassil? Intriguing... this fruit is exotic. Perhaps its seeds were brought here from far off. Perhaps even as far as Azeroth! And there's something about this fruit... it seems to have reacted very strangely with the soil of Teldrassil.$b$bThank you, $N. Now if you'll excuse me, I must study this further..." WHERE `ID`=930; + +-- "The Shimmering Frond" (931) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Where did you get this? I haven't seen a plant like this since a sojourn I made to the Swamp of Sorrows... decades ago! It's amazing that a specimen made its way to Teldrassil. And it's grown to such a size!$b$bThank you, $N. Forgive my shortness of words, but there is a test I would like to perform on this frond..." WHERE `ID`=931; + +-- "Teldrassil" (940) - Completion Text, should have $c instead of $C. +UPDATE `quest_request_items` SET `CompletionText`="Hmm... You come with the spirit of the forest strongly within you, $c. What business do you have with the Arch Druid of the Kaldorei?" WHERE `ID`=940; + +-- "Planting the Heart" (941) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="You place the heart within the planter, and it quickly digs itself in!$b$bA few seconds later it wriggles back out, cleansed. It pulses slightly... beckoning for you to take it." WHERE `ID`=941; + +-- "Denalan's Earth" (997) - Reward Text, missing double spacing and should have $r instead of $R. +UPDATE `quest_offer_reward` SET `RewardText`="Ah, it's here! I have waited for this rare earth for quite some time. I hope it's still fresh...$b$bThank you for bringing it to me, $N. You are a $r who is generous with $Ghis:her; time." WHERE `ID`=997; + +-- "The New Frontier" (1047) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="What makes you think I wish to be pestered by the likes of you, $c? Wait - let me stop the important duties I attend to on a daily basis so I can help you locate a doodad somewhere. By all means, the welfare of Darnassus - nay, all of Teldrassil - should come second to the acquisition of a bauble for your collection.$b$bThe fools in Moonglade waste my time with their call for assistance, and now I must endure this?" WHERE `ID`=1047; + +-- "Vorlus Vilehoof" (1683) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Do you have the horn, $N? Is our moonwell free of the fiend Vorlus?" WHERE `ID`=1683; + +-- "Vorlus Vilehoof" (1683) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Well done, $N. It is good to know Vorlus is defeated and our moonwell cleansed, and it is good to see young warriors eager to keep our beloved Teldrassil free of corruption.$B$BNow let us begin your training..." WHERE ID=1683; + +-- "Elanaria" (1684) - Reward Text, missing double spacing and should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="I bid you greetings, $N. Your name rings loudly in Darnassus, for you show promise. But we shall soon see if you possess the strength of will to follow the path of the $c." WHERE ID=1684; + +-- "The Shade of Elura" (1686) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Have you defeated the Shade of Elura, $N? And do you have the lost elunite ore?" WHERE `ID`=1686; + +-- "Smith Mathiel" (1692) - Completion Text, missing double spacing and should have $c instead of $C. +UPDATE `quest_request_items` SET `CompletionText`="Greetings, young $c. How might my skills serve you?" WHERE `ID`=1692; + +-- "Smith Mathiel" (1692) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Ah, elunite ore. This is a fine metal to work with, for it is blessed by the goddess Elune herself. It would be an honor to craft weapons with it.$B$BPlease wait while I work..." WHERE ID=1692; + +-- "Weapons of Elunite" (1693) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="$N, I have crafted these weapons with the elunite you brought to me. Please, take whichever most suits you.$B$BAnd I must thank you. Working with elunite is both an honor and a pleasure." WHERE ID=1693; + +-- "The Apple Falls" (2241) - Reward Text, should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="Had I saved every flower that dolt, Jannok, had sent me, I would have had the means to open a shop. Regardless, it seems as if Jannok's latest courier may prove to be useful.$b$bInterested in some work, $c?" WHERE `ID`=2241; + +-- "Erion Shadewhisper" (2259) - Reward Text, should have $r instead of $R. +UPDATE `quest_offer_reward` SET `RewardText`="It is time to branch out, $r - the world awaits." WHERE `ID`=2259; + +-- "Ferocitas the Dream Eater" (2459) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Ferocitas and the Gnarlpine Mystics must return what is mine. Please retrieve the emerald so that I may repair my emerald dreamcatcher." WHERE `ID`=2459; + +-- "Ferocitas the Dream Eater" (2459) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Now I can repair my dreamcatcher. Thank you, $N." WHERE `ID`=2459; + +-- "Oakenscowl" (2499) - Completion Text, should have $r instead of $R. +UPDATE `quest_request_items` SET `CompletionText`="Have you located Oakenscowl yet, $r?" WHERE `ID`=2499; + +-- Druid of the Claw (2561) - Reward Text, should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="I am finally free of the control of the Gnarlpine. Thank you, $N.$b$bMy spirit may now rest peacefully forever in the Emerald Dream.$b$bPerhaps one day we may meet again, young $c. But, for now, please accept this reward as a symbol of my gratitude." WHERE `ID`=2561; + +-- "Simple Sigil" (3116) - Reward Text, should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="Soon you will see others from different races in the boughs of our home--do not let it cause any prejudice within you. They are welcome. They will aid us when they can. Not all of them will be altruistic, but they should be granted some amount of trust.$b$bBut none of this matters now. Now we must focus on you, and how you can aid our people. I am here for that very purpose. I will train you in the ways of a $c as you become stronger. Return to me whenever you wish and I will do what I can to aid you." WHERE `ID`=3116; + +-- "Etched Sigil" (3117) - Completion Text, should have $c instead of $C. +UPDATE `quest_request_items` SET `CompletionText`="You've arrived, and none too soon, $N. Welcome to Shadowglen.$B$BI trust my sigil found you in good spirits and health?$B$BAs I said previously, I am here to train you as a $c; to tame beasts to aid you in battle; to use a bow with unerring accuracy; to respect the lands which we call home and also the lands beyond." WHERE `ID`=3117; + +-- "Etched Sigil" (3117) - Reward Text, should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="As you experience what Shadowglen has to teach you, come see me--I will be able to help you understand more about your role as a $c and what you are capable of.$B$BThese are dangerous times, $N, do not take for granted the skill of your pets--there are things in this world more dangerous than you can imagine. Go with Elune and return to me again." WHERE `ID`=3117; + +-- "Verdant Sigil" (3120) - Completion Text, should have $c instead of $C. +UPDATE `quest_request_items` SET `CompletionText`="Ah, young $c. I see you're eager to continue your studies. Good.$b$bI wonder, have you spent much time in the Emerald Dream already? Perhaps you're not prepared for that yet... In time, I'm sure.$b$bBut until then, we should discuss other matters." WHERE `ID`=3120; + +-- "Un'Goro Soil" (3764) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Ah yes, the dirt. The Arch Druid wants twenty loads per adventurer, and twenty loads he shall get. Let those who conspire against us fall to the wayside!" WHERE `ID`=3764; + +-- "Un'Goro Soil" (3764) - Reward Text, missing double spacing and should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="Unload your precious cargo here, noble $c. It must have been quite the burden... not unlike the burden I carry being a visionary. Here is an honorarium for your work, as dictated by the Arch Druid himself.$B$BArch Druid Staghelm wants to speak with you again $N, but for his next task you will be aided if you have a journeyman's understanding of Herbalism. If you don't know it though, you will still be able to aid the Circle!" WHERE `ID`=3764; + +-- "Morrowgrain Research" (3781) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Peace and serenity be yours, friend. You are here on business from the Arch Druid himself, yes?" WHERE `ID`=3781; + +-- "Morrowgrain Research" (3781) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Yes, this voucher is good for twenty packets of seeds. If you run out, we have more that can be provided. Unfortunately though, Tharlendris seeds are quite costly to produce in significant numbers. This is why the Cenarion Circle asks that those who are assisting us help out by offsetting some of the cost.$B$BThose who return with morrowgrain find that the reward the Arch Druid offers far makes up for the cost." WHERE ID=3781; + +-- "Calm Before the Storm" (4510) - Completion Text, should have $c instead of $C. +UPDATE `quest_request_items` SET `CompletionText`="Elune'adore, $c. What may I do for you today?" WHERE `ID`=4510; + +-- "Aquatic Form" (5061) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Very impressive, $N. You are ready to learn your aquatic form, and it is my pleasure to teach it to you.$B$BAlso, in recognition of your achievement during the two trials, I give you this item. I hope you'll find it to be a welcome addition to your gear as a protector of nature and a keeper of the balance." WHERE `ID`=5061; + +-- "Heeding the Call" (5923,5924,5925) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="I am glad you found your way here today, young $c. The time has come for you to take a large step into a much larger world.$B$BInside each of Cenarius' children is the call to serve nature. Animals and plants are our friends as well as our charges. We choose to devote our lives as preservers of balance for their sakes as well as our own. Your first step into this world will be to learn of the ways of the bear, and to learn strength of body and heart.$B$BReady yourself!" WHERE `ID` IN (5923,5924,5925); + +-- "Back to Darnassus" (5931) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Welcome back, $N. I sense that your first meeting with the Great Bear Spirit is the same as it is with all druids when they first start down the path of the Claw... a little bewildering, but very intense. I know it was that way with me.$B$BThe Great Bear Spirit has been a part of Azeroth as long as Azeroth has existed in the heavens. We have come to rely on its wisdom and its power to fuel our purpose. The time has now come for your first test of this purpose. Listen closely..." WHERE `ID`=5931; + +-- "Body and Heart" (6001) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="When you have faced the challenge that lies before you, your understanding of strenght of body and strenght of heart will be fully realized. Until that time, I cannot help you further." WHERE `ID`=6001; + +-- "Body and Heart" (6001) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="You have finally taken your large step into a much larger world, $N. I sense the teaching of the Great Bear Spirit within you, and I sense that you have received the strength that Lunaclaw possessed.$B$BThere are no further obstacles in your way... let me now teach you what it means to be a $C of the Claw!" WHERE `ID`=6001; + +-- "Taming the Beast" (6063) - Completion Text, should have $c instead of $C. +UPDATE `quest_request_items` SET `CompletionText`="You will learn, $N, and one day you will be a great $c." WHERE `ID`=6063; + +-- "Taming the Beast" (6101) - Completion Text, should have $r instead of $R. +UPDATE `quest_request_items` SET `CompletionText`="Understanding the balance between nature and oneself is a way of life for every $r." WHERE `ID`=6101; + +-- "Training the Beast" (6103) - Reward Text, should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="A fledgling $c. I see. Yes. I can bestow you with the skills you need to train and guide your pet. Not only will you be able to teach your pet new abilities, you will now be able to feed your pet, as well as revive it, should it fall in battle.$B$BRemember, $N, always respect the balance and live in awe of nature around you. Now, go forth. We shall speak again, at a later date." WHERE ID=6103; + +-- "The Bounty of Teldrassil" (6341) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="How may I help you? Are you in need of transport?" WHERE `ID`=6341; + +-- "The Bounty of Teldrassil" (6341) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Ah, you wish to get this to Auberdine? Very well..." WHERE `ID`=6341; + +-- "Return to Nessa" (6343) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="$N, you're back from Auberdine? Did you speak with Laird?" WHERE `ID`=6343; + +-- "Return to Nessa" (6343) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="This is very interesting. The fish here are large, but I didn't think the difference in bounties between here and the mainland was so great. There must be a reason for this...$B$BWell thank you, $N. I will discuss with the villagers the news you brought. Perhaps, one day, we will find the root of this oddity. But until then, we shall reap its benefits!" WHERE `ID`=6343; + +-- "Nessa Shadowsong" (6344) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Yes, I have need of a courier who will take a package to Darkshore. Will you help me?" WHERE `ID`=6344; + +-- "The New Frontier" (6761) - Reward Text, missing double spacing AND should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="Yes $c, thank you for coming. I apologize about the misunderstanding... the air is thick with mistrust between the Arch Druid here and Keeper Remulos in Moonglade. Each suspect the other of chicanery, and the fact that strange corruptions of Teldrassil continue unabated are still an issue here. It does little to quell mistrust.$B$BRegardless, our duty to the Cenarion Circle remains... even if those who lead it may disagree with one another." WHERE `ID`=6761; diff --git a/sql/updates/world/3.3.5/2025_03_31_03_world.sql b/sql/updates/world/3.3.5/2025_03_31_03_world.sql new file mode 100644 index 00000000000..8b9dea37a06 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_31_03_world.sql @@ -0,0 +1,57 @@ +-- Script +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (208000,208001,208002); +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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES + +-- Timed List 1, for the quest "Denalan's Earth" (997) +(208000,9,0,0,0,0,100,0,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Remove Npc Flag Questgiver"), +(208000,9,1,0,0,0,100,0,1000,1000,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Denalan - On Script - Say Line 0"), +(208000,9,2,0,0,0,100,0,3000,3000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9508.02,715.749,1255.89,0,"Denalan - On Script - Move To Position"), +(208000,9,3,0,0,0,100,0,1000,1000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9507.66,718.009,1255.89,0,"Denalan - On Script - Move To Position"), +(208000,9,4,0,0,0,100,0,1000,1000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9505.56,719.088,1256.2,0,"Denalan - On Script - Move To Position"), +(208000,9,5,0,0,0,100,0,2000,2000,0,0,0,5,16,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Play Emote 16"), +(208000,9,6,0,0,0,100,0,5000,5000,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Denalan - On Script - Set Orientation To Invoker"), +(208000,9,7,0,0,0,100,0,1000,1000,0,0,0,1,1,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Denalan - On Script - Say Line 1"), +(208000,9,8,0,0,0,100,0,2000,2000,0,0,0,59,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,"Denalan - On Script - Set Run On"), +(208000,9,9,0,0,0,100,0,4000,4000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9506.9199,713.7660,1255.89,0,"Denalan - On Script - Move"), +(208000,9,10,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Reset Orientation"), +(208000,9,11,0,0,0,100,0,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Add Npc Flag Questgiver"), + +-- Timed List 2, for the quest "The Shimmering Frond" (931) +(208001,9,0,0,0,0,100,0,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Remove Npc Flag Questgiver"), +(208001,9,1,0,0,0,100,0,1000,1000,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Say Line 2"), +(208001,9,2,0,0,0,100,0,0,0,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9508.02,715.749,1255.89,0,"Denalan - On Script - Move To Position"), +(208001,9,3,0,0,0,100,0,1000,1000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9507.66,718.009,1255.89,0,"Denalan - On Script - Move To Position"), +(208001,9,4,0,0,0,100,0,1000,1000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9505.56,719.088,1256.2,0,"Denalan - On Script - Move To Position"), +(208001,9,5,0,0,0,100,0,2000,2000,0,0,0,5,16,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Play Emote 16"), +(208001,9,6,0,0,0,100,0,3500,3500,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Say Line 3"), +(208001,9,7,0,0,0,100,0,0,0,0,0,0,59,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,"Denalan - On Script - Set Run On"), +(208001,9,8,0,0,0,100,0,3000,3000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9506.9199,713.7660,1255.89,0,"Denalan - On Script - Move"), +(208001,9,9,0,0,0,100,0,500,500,0,0,0,70,60,0,0,0,0,0,14,67984,7510,0,0,0,0,0,0,"Denalan - On Script - Respawn Closest Gameobject 'Sprouted Frond'"), +(208001,9,10,0,0,0,100,0,0,0,0,0,0,70,60,0,0,0,0,0,14,42936,7510,0,0,0,0,0,0,"Denalan - On Script - Respawn Closest Gameobject 'Sprouted Frond'"), +(208001,9,11,0,0,0,100,0,0,0,0,0,0,70,60,0,0,0,0,0,14,30276,7510,0,0,0,0,0,0,"Denalan - On Script - Respawn ClosestGameobject 'Sprouted Frond'"), +(208001,9,12,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Reset Orientation"), +(208001,9,13,0,0,0,100,0,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Add Npc Flag Questgiver"), + +-- Timed List 3, for the quest "The Glowing Fruit" (930) +(208002,9,0,0,0,0,100,0,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Remove Npc Flag Questgiver"), +(208002,9,1,0,0,0,100,0,1000,1000,0,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Say Line 4"), +(208002,9,2,0,0,0,100,0,4000,4000,0,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Say Line 5"), +(208002,9,3,0,0,0,100,0,0,0,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9508.02,715.749,1255.89,0,"Denalan - On Script - Move To Position"), +(208002,9,4,0,0,0,100,0,1000,1000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9507.66,718.009,1255.89,0,"Denalan - On Script - Move To Position"), +(208002,9,5,0,0,0,100,0,1000,1000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9505.56,719.088,1256.2,0,"Denalan - On Script - Move To Position"), +(208002,9,6,0,0,0,100,0,2000,2000,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Set Flag Standstate 'Kneel'"), +(208002,9,7,0,0,0,100,0,2000,2000,0,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Say Line 6"), +(208002,9,8,0,0,0,100,0,2000,2000,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Remove Flag Standstate 'Kneel'"), +(208002,9,9,0,0,0,100,0,0,0,0,0,0,59,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,"Denalan - On Script - Set Run On"), +(208002,9,10,0,0,0,100,0,3000,3000,0,0,0,69,0,0,0,0,0,0,8,0,0,0,0,9506.9199,713.7660,1255.89,0,"Denalan - On Script - Move"), +(208002,9,11,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Reset Orientation"), +(208002,9,12,0,0,0,100,0,1000,1000,0,0,0,107,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Summon Creature Group 0"), +(208002,9,13,0,0,0,100,0,0,0,0,0,0,1,1,0,0,0,0,0,19,3569,0,0,0,0,0,0,0,"Denalan - On Script - Say Line 1 (Bogling)"), +(208002,9,14,0,0,0,100,0,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Denalan - On Script - Add Npc Flag Questgiver"); + +-- "Bogling" (3569) summon group +DELETE FROM `creature_summon_groups` WHERE `summonerId`=2080 AND `summonerType`=0; +INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`) VALUES +(2080,0,0,3569,9504.4580,721.7338,1255.9418,5.7422,3,300000), +(2080,0,0,3569,9503.4727,719.9250,1255.9418,5.781,3,300000), +(2080,0,0,3569,9502.4785,718.0815,1255.9418,5.757,3,300000); diff --git a/sql/updates/world/3.3.5/2025_03_31_04_world.sql b/sql/updates/world/3.3.5/2025_03_31_04_world.sql new file mode 100644 index 00000000000..50b12fff558 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_03_31_04_world.sql @@ -0,0 +1,10 @@ +-- +SET @POOL=594; +DELETE FROM `pool_template` WHERE `entry`=@POOL; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(@POOL, 1, "Water Barrel and Food Crate7"); + +DELETE FROM `pool_members` WHERE `type`=1 AND `poolSpawnId`=@POOL; +INSERT INTO `pool_members` (`type`, `spawnId`, `poolSpawnId`, `chance`, `description`) VALUES +(1, 32287, @POOL, 0, "Water Barrel and Food Crate - Spawn 7"), +(1, 32742, @POOL, 0, "Water Barrel and Food Crate - Spawn 7"); diff --git a/sql/updates/world/3.3.5/2025_04_03_00_world.sql b/sql/updates/world/3.3.5/2025_04_03_00_world.sql new file mode 100644 index 00000000000..1155785bd84 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_03_00_world.sql @@ -0,0 +1,2 @@ +-- Lower the spawn point height for trigger "Pools of Arlithrien Moonwell" (19551) to just under the ground. +UPDATE `gameobject` SET `position_z`=1298.41640 WHERE `guid`=50359 AND `id`=19551; diff --git a/sql/updates/world/3.3.5/2025_04_03_01_world.sql b/sql/updates/world/3.3.5/2025_04_03_01_world.sql new file mode 100644 index 00000000000..cbf679f4775 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_03_01_world.sql @@ -0,0 +1,5 @@ +-- Waypoint fix for "Spirit of Sathrah" (7411) +UPDATE `waypoints` SET `position_x`=9627.15,`position_y`=2517.89,`position_z`=1331.76 WHERE `entry`=7411 AND `pointid`=5; + +-- Set despawn time for "Spirit of Sathrah" to 0 +UPDATE `smart_scripts` SET `action_param1`=0,`comment`="Spirit of Sathrah - On Waypoint 9 Reached - Despawn" WHERE `entryorguid`=7411 AND `id`=1; diff --git a/sql/updates/world/3.3.5/2025_04_08_00_world.sql b/sql/updates/world/3.3.5/2025_04_08_00_world.sql new file mode 100644 index 00000000000..3040cdc5846 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_08_00_world.sql @@ -0,0 +1,2 @@ +-- Fix Gahz'rilla random movement on wp 2 end +UPDATE `smart_scripts` SET `event_type`=58, `comment`="Gahz'rilla - On Waypoint 2 Ended - Start Random Movement" WHERE `entryorguid`=7273 AND `source_type`=0 AND `id`=6; diff --git a/sql/updates/world/3.3.5/2025_04_08_01_world.sql b/sql/updates/world/3.3.5/2025_04_08_01_world.sql new file mode 100644 index 00000000000..ee04a15ec96 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_08_01_world.sql @@ -0,0 +1,12 @@ +-- Remove bleed immunity from some npc +UPDATE `creature_template` SET `mechanic_immune_mask`=`mechanic_immune_mask`&~16384 WHERE `entry` IN ( +36, -- Harvest Golem +114, -- Harvest Watcher +32471, -- Griegen +32495, -- Hildana Deathstealer +32501, -- High Thane Jorfus +19166, -- Tempest-Forge Patroller +20040, -- Crystalcore Devastator +20041, -- Crystalcore Sentinel +4952, -- Theramore Combat Dummy +4957); -- Theramore Combat Dummy 4 diff --git a/sql/updates/world/3.3.5/2025_04_08_02_world.sql b/sql/updates/world/3.3.5/2025_04_08_02_world.sql new file mode 100644 index 00000000000..8dd0a3a84be --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_08_02_world.sql @@ -0,0 +1,6 @@ +-- Add AnimTier Hover +UPDATE `creature_addon` SET `AnimTier`=2 WHERE `guid`=105234; + +DELETE FROM `creature_template_movement` WHERE `CreatureId`=31848; +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(31848, 0, 0, 1, 0, 0, 0, NULL); diff --git a/sql/updates/world/3.3.5/2025_04_08_03_world.sql b/sql/updates/world/3.3.5/2025_04_08_03_world.sql new file mode 100644 index 00000000000..26edfcc0652 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_08_03_world.sql @@ -0,0 +1,2 @@ +-- Warmage Kath'leen +UPDATE `creature_equip_template` SET `ItemID1`=0, `VerifiedBuild`=59185 WHERE `CreatureID`=32723 AND `ID`=1; diff --git a/sql/updates/world/3.3.5/2025_04_08_04_world.sql b/sql/updates/world/3.3.5/2025_04_08_04_world.sql new file mode 100644 index 00000000000..b7ea06fd7f7 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_08_04_world.sql @@ -0,0 +1,4 @@ +-- Boglings should have random movement when they spawn +DELETE FROM `smart_scripts` WHERE `entryorguid`=3569 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`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(3569,0,1,0,54,0,100,0,0,0,0,0,0,89,10,0,1,0,0,0,1,0,0,0,0,0,0,0,0,"Bogling - On Just Summoned - Set Random Movement"); diff --git a/sql/updates/world/3.3.5/2025_04_08_05_world.sql b/sql/updates/world/3.3.5/2025_04_08_05_world.sql new file mode 100644 index 00000000000..db2a41dcef8 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_08_05_world.sql @@ -0,0 +1,2 @@ +-- Westfall Woodworkers are only humans +UPDATE `creature_model_info` SET `DisplayID_Other_Gender`=0 WHERE `DisplayID`=3264; diff --git a/sql/updates/world/3.3.5/2025_04_08_06_world.sql b/sql/updates/world/3.3.5/2025_04_08_06_world.sql new file mode 100644 index 00000000000..597a43e6518 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_08_06_world.sql @@ -0,0 +1,46 @@ +-- "Mist" more blizzlike script + +-- Mist respawn time, time is from classic server +UPDATE `creature` SET `spawntimesecs`=30 WHERE `guid`=49625; + +-- Mist Waypoints +DELETE FROM `waypoints` WHERE `entry`=3568; +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(3568,1,10657.489,1849.751,1321.866,"Mist"), +(3568,2,10647.716,1808.649,1326.796,"Mist"), +(3568,3,10661.571,1771.858,1322.714,"Mist"), +(3568,4,10726.747,1753.344,1314.693,"Mist"); + +-- Sentinel Arynia Cloudsbreak missing text emote +UPDATE `creature_text` SET `Emote`=1 WHERE `CreatureID`=3519 AND `ID`=0; + +-- Mist's contact sensitivity distance to Sentinel Arynia Cloudsbreak +UPDATE `smart_scripts` SET `event_param3`=5 WHERE `entryorguid`=3568 AND `id`=1; + +-- Script +DELETE FROM `smart_scripts` WHERE `entryorguid`=3568 AND `source_type`=0 AND `id`=4; +DELETE FROM `smart_scripts` WHERE `entryorguid`IN (351900,356801) 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES + +-- Mist Script +(3568,0,4,0,40,0,100,0,4,3568,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mist - On Waypoint 4 Reached - Despawn"), + +-- Sentinel Arynia Cloudsbreak Timed list +(351900,9,0,0,0,0,100,0,1000,1000,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Arynia Cloudsbreak - On Script - Remove Quest Giver npc flag"), +(351900,9,1,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,19,3568,0,0,0,0,0,0,0,"Sentinel Arynia Cloudsbreak - On Script - Set Orientation"), +(351900,9,2,0,0,0,100,0,2000,2000,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Arynia Cloudsbreak - On Script - Set Flag Standstate 'Kneel'"), +(351900,9,3,0,0,0,100,0,3000,3000,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Arynia Cloudsbreak - On Script - Say Line 0"), +(351900,9,4,0,0,0,100,0,7000,7000,0,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Arynia Cloudsbreak - On Script - Remove Flag Standstate 'Kneel'"), +(351900,9,5,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Arynia Cloudsbreak - On Script - Set Orientation"), +(351900,9,6,0,0,0,100,0,500,500,0,0,0,81,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Sentinel Arynia Cloudsbreak - On Script - Add Quest Giver npc flag"), + +-- Mist Timed list +(356801,9,0,0,0,0,100,0,0,0,0,0,0,103,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mist - On Script - Set Root On"), +(356801,9,1,0,0,0,100,0,0,0,0,0,0,45,1,1,0,0,0,0,19,3519,0,0,0,0,0,0,0,"Mist - On Script - Set Data to 'Sentinel Arynia Cloudsbreak'"), +(356801,9,2,0,0,0,100,0,2000,2000,0,0,0,103,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mist - On Script - Set Root Off"), +(356801,9,3,0,0,0,100,0,0,0,0,0,0,15,938,0,0,0,0,0,12,1,0,0,0,0,0,0,0,"Mist - On Script - Complete Quest 'Mist'"), +(356801,9,4,0,0,0,100,0,0,0,0,0,0,59,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mist - On Script - Set Run Off"), +(356801,9,5,0,0,0,100,0,0,0,0,0,0,69,0,0,0,1,0,0,19,3519,0,0,0,0,0,0,0,"Mist - On Script - Move to 'Sentinel Arynia Cloudsbreak'"), +(356801,9,6,0,0,0,100,0,9000,9000,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mist - On Script - Say Line 0"), +(356801,9,7,0,0,0,100,0,0,0,0,0,0,145,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mist - On Script - Set Immune to NPC's"), +(356801,9,8,0,0,0,100,0,3000,3000,0,0,0,53,1,3568,0,0,0,0,1,0,0,0,0,0,0,0,0,"Mist - On Script - Start Waypoints"); diff --git a/sql/updates/world/3.3.5/2025_04_12_00_world.sql b/sql/updates/world/3.3.5/2025_04_12_00_world.sql new file mode 100644 index 00000000000..c66d07da284 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_00_world.sql @@ -0,0 +1,6 @@ +-- Spirit Healer (Area: Temple of Telhamat - Difficulty: 0) +UPDATE `creature` SET `position_x`=178.4677276611328125, `position_y`=4362.45654296875, `position_z`=116.72283935546875, `orientation`=5.969026088714599609, `spawntimesecs`=120, `VerifiedBuild`=59185 WHERE `guid`=40596 and `id`=6491; +-- Spirit Healer (Area: Honor Hold - Difficulty: 0) +UPDATE `creature` SET `position_x`=-806.8321533203125, `position_y`=2704.613525390625, `position_z`=107.5483627319335937, `orientation`=5.759586334228515625, `spawntimesecs`=120, `VerifiedBuild`=59185 WHERE `guid`=29932 and `id`=6491; +-- Spirit Healer (Area: Dustwallow Marsh - Difficulty: 0) +UPDATE `creature` SET `position_x`=-3540.335205078125, `position_y`=-4313.30126953125, `position_z`=7.212794303894042968, `orientation`=6.091198921203613281, `spawntimesecs`=120, `VerifiedBuild`=59185 WHERE `guid`=84656 and `id`=6491; diff --git a/sql/updates/world/3.3.5/2025_04_12_01_world.sql b/sql/updates/world/3.3.5/2025_04_12_01_world.sql new file mode 100644 index 00000000000..0798595dadb --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_01_world.sql @@ -0,0 +1,2 @@ +-- Fix Impsy random movement on wp 11 end +UPDATE `smart_scripts` SET `event_type`=58, `comment`="Impsy - On Waypoint 11 Ended - Start Random Movement" WHERE `entryorguid`=14470 AND `source_type`=0 AND `id`=3; diff --git a/sql/updates/world/3.3.5/2025_04_12_02_world.sql b/sql/updates/world/3.3.5/2025_04_12_02_world.sql new file mode 100644 index 00000000000..4b9bb6689a0 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_02_world.sql @@ -0,0 +1,22 @@ +-- Honor Hold Defender +SET @NPC=16842; +DELETE FROM `creature_equip_template` WHERE `CreatureID`=@NPC; +INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`, `VerifiedBuild`) VALUES +(@NPC, 1, 12944, 143, 0, 59185), +(@NPC, 2, 1903, 143, 0, 59185); +UPDATE `creature` SET `equipment_id`=2 WHERE `guid`=57933 AND `id`=@NPC; +UPDATE `creature` SET `equipment_id`=0,`npcflag`=`npcflag`|1 WHERE `guid`=57942 AND `id`=@NPC; +UPDATE `creature_template` SET `gossip_menu_id`=7300 WHERE `entry`=@NPC; +UPDATE `creature_template_addon` SET `PvpFlags`=1 WHERE `entry`=@NPC; +UPDATE `creature_addon` SET `PvpFlags`=1 WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=@NPC); +UPDATE `gossip_menu` SET `VerifiedBuild`=59185 WHERE `MenuID`=7300 AND `TextID`=8656; +-- Stormwind Infantry +UPDATE `creature` SET `equipment_id`=0 WHERE `guid` IN (58143,58148,58146,58152,58145,58150,58144,58147,58141,58151) AND `id`=16864; +UPDATE `creature_template_addon` SET `PvpFlags`=1 WHERE `entry`=16864; +UPDATE `creature_addon` SET `PvpFlags`=1 WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=16864); +-- Supply Officer Shandria +UPDATE `creature_template_addon` SET `PvpFlags`=1 WHERE `entry`=19314; +UPDATE `creature_template` SET `gossip_menu_id`=7957 WHERE `entry`=19314; +UPDATE `gossip_menu_option` SET `OptionBroadcastTextID`=10182, `VerifiedBuild`=59185 WHERE `MenuID`=7957 AND `OptionID`=0; +-- Corporal Ironridge +UPDATE `creature_template_addon` SET `PvpFlags`=1, `emote`=0 WHERE `entry`=21133; diff --git a/sql/updates/world/3.3.5/2025_04_12_03_world.sql b/sql/updates/world/3.3.5/2025_04_12_03_world.sql new file mode 100644 index 00000000000..2b35b17f114 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_03_world.sql @@ -0,0 +1,94 @@ +-- Half-Buried Bottles +SET @OID=2560; +SET @OGUID=73440; -- 38 free guid required +SET @POOL=595; -- 2 free id required +DELETE FROM `pool_template` WHERE `entry` IN (@POOL, @POOL+1); +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(@POOL, 6, "Half-Buried Bottle Wild Shore"), +(@POOL+1, 3, "Half-Buried Bottle Jaguero Isle"); + +DELETE FROM `pool_members` WHERE `type`=1 AND `poolSpawnId` IN (@POOL, @POOL+1); +INSERT INTO `pool_members` (`type`, `spawnId`, `poolSpawnId`, `chance`, `description`) VALUES +-- We don't add underground spawns to the pool +-- (1, @OGUID, @POOL, 0, "Half-Buried Bottle Wild Shore"), +(1, @OGUID+1, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+2, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +-- (1, @OGUID+3, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+4, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+5, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+6, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+7, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+8, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+9, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+10, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+11, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+12, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+13, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+14, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+15, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+16, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+17, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+18, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+19, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+20, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+21, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+22, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+23, @POOL, 0, "Half-Buried Bottle - Wild Shore"), +(1, @OGUID+24, @POOL, 0, "Half-Buried Bottle - Wild Shore"), + +(1, @OGUID+25, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+26, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+27, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+28, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+29, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+30, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+31, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+32, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+33, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+34, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +-- (1, @OGUID+35, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+36, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"), +(1, @OGUID+37, @POOL+1, 0, "Half-Buried Bottle - Jaguero Isle"); + +DELETE FROM `gameobject_addon` WHERE `guid` IN (SELECT `guid` FROM `gameobject` WHERE `id`=@OID); +DELETE FROM `gameobject` WHERE `id`=@OID; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES +(@OGUID, @OID, 0, 0, 0, 1, 1, -13734.783203125, -255.342697143554687, 0.004720000084489583, 0.523597896099090576, 0, 0, 0.258818626403808593, 0.965925931930541992, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+1, @OID, 0, 0, 0, 1, 1, -13722.708984375, -295.261688232421875, 0.379433989524841308, 1.117009282112121582, 0, 0, 0.529918670654296875, 0.84804844856262207, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+2, @OID, 0, 0, 0, 1, 1, -13870.6669921875, -211.541671752929687, -1.20754802227020263, 3.996806621551513671, 0, 0, -0.90996074676513671, 0.414694398641586303, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+3, @OID, 0, 0, 0, 1, 1, -13912.5556640625, -166.436141967773437, 0.534211993217468261, 5.986480236053466796, 0, 0, -0.14780902862548828, 0.989015936851501464, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+4, @OID, 0, 0, 0, 1, 1, -14096.0693359375, -142.105911254882812, 2.257411003112792968, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+5, @OID, 0, 0, 0, 1, 1, -14193.1533203125, -78.2309036254882812, 0.308180987834930419, 5.183629035949707031, 0, 0, -0.52249813079833984, 0.852640450000762939, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+6, @OID, 0, 0, 0, 1, 1, -14307.3056640625, 32.82291793823242187, 0.141596004366874694, 0.069811686873435974, 0, 0, 0.034898757934570312, 0.999390840530395507, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+7, @OID, 0, 0, 0, 1, 1, -14400.1552734375, 58.31494140625, 0.486712008714675903, 1.658061861991882324, 0, 0, 0.737277030944824218, 0.67559051513671875, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+8, @OID, 0, 0, 0, 1, 1, -14473.447265625, 64.72260284423828125, -0.96794402599334716, 5.585053920745849609, 0, 0, -0.34202003479003906, 0.939692676067352294, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+9, @OID, 0, 0, 0, 1, 1, -14048.232421875, -144.146926879882812, -0.19740000367164611, 5.35816192626953125, 0, 0, -0.446197509765625, 0.894934535026550292, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+10, @OID, 0, 0, 0, 1, 1, -14279.017578125, 56.4061431884765625, 0.707728028297424316, 3.857182979583740234, 0, 0, -0.93667125701904296, 0.350209832191467285, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+11, @OID, 0, 0, 0, 1, 1, -14331.06640625, 60.69097137451171875, 0.171187996864318847, 2.234017848968505859, 0, 0, 0.898793220520019531, 0.438372820615768432, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+12, @OID, 0, 0, 0, 1, 1, -14483.568359375, 104.4371719360351562, 1.572831034660339355, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+13, @OID, 0, 0, 0, 1, 1, -14456.267578125, 37.46300125122070312, 0.395052999258041381, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+14, @OID, 0, 0, 0, 1, 1, -14274.146484375, 12.35845279693603515, 0.687386989593505859, 1.134462952613830566, 0, 0, 0.537299156188964843, 0.843391716480255126, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+15, @OID, 0, 0, 0, 1, 1, -14170.59765625, -93.0607681274414062, -0.45957198739051818, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+16, @OID, 0, 0, 0, 1, 1, -13704.9306640625, -327.592010498046875, -0.07900399714708328, 3.211419343948364257, 0, 0, -0.9993906021118164, 0.034906134009361267, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+17, @OID, 0, 0, 0, 1, 1, -14434.8505859375, 54.3836822509765625, 0.178829997777938842, 4.537858963012695312, 0, 0, -0.76604366302490234, 0.642788589000701904, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+18, @OID, 0, 0, 0, 1, 1, -14516.8740234375, 126.1961517333984375, 0.021186999976634979, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+19, @OID, 0, 0, 0, 1, 1, -13729.6220703125, -342.87152099609375, 0.453314989805221557, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+20, @OID, 0, 0, 0, 1, 1, -14217.486328125, -54.140625, 0.399392008781433105, 3.211419343948364257, 0, 0, -0.9993906021118164, 0.034906134009361267, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+21, @OID, 0, 0, 0, 1, 1, -13747.55859375, -353.41943359375, 0.344130992889404296, 5.183629035949707031, 0, 0, -0.52249813079833984, 0.852640450000762939, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+22, @OID, 0, 0, 0, 1, 1, -14358.390625, 66.97043609619140625, 0.586006999015808105, 1.989672422409057617, 0, 0, 0.838669776916503906, 0.544640243053436279, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+23, @OID, 0, 0, 0, 1, 1, -14270.0634765625, -17.1996536254882812, 0.675433993339538574, 2.181660413742065429, 0, 0, 0.887010574340820312, 0.461749136447906494, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 +(@OGUID+24, @OID, 0, 0, 0, 1, 1, -14078.486328125, -152.603958129882812, 0.542116999626159667, 3.769911527633666992, 0, 0, -0.95105648040771484, 0.309017121791839599, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Wild Shore- - Difficulty: 0) CreateObject1 + +(@OGUID+25, @OID, 0, 0, 0, 1, 1, -14532.646484375, -100.203132629394531, -0.20425699651241302, 1.710421562194824218, 0, 0, 0.754709243774414062, 0.656059443950653076, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+26, @OID, 0, 0, 0, 1, 1, -14448.06640625, -112.28125, -1.23729205131530761, 4.97418975830078125, 0, 0, -0.60876083374023437, 0.793353796005249023, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+27, @OID, 0, 0, 0, 1, 1, -14439.646484375, -190.588546752929687, -0.70320802927017211, 4.136432647705078125, 0, 0, -0.87881660461425781, 0.477159708738327026, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+28, @OID, 0, 0, 0, 1, 1, -14418.638671875, -323.416656494140625, -0.06788700073957443, 1.762782454490661621, 0, 0, 0.771624565124511718, 0.636078238487243652, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+29, @OID, 0, 0, 0, 1, 1, -14427.072265625, -422.2598876953125, 1.238023996353149414, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+30, @OID, 0, 0, 0, 1, 1, -14554.96875, -86.4878463745117187, 0.37993699312210083, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+31, @OID, 0, 0, 0, 1, 1, -14449.521484375, -169.776046752929687, 0.403385013341903686, 2.844882726669311523, 0, 0, 0.989015579223632812, 0.147811368107795715, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+32, @OID, 0, 0, 0, 1, 1, -14419.326171875, -385.6475830078125, 1.123703956604003906, 5.270895957946777343, 0, 0, -0.48480892181396484, 0.87462007999420166, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+33, @OID, 0, 0, 0, 1, 1, -14459.576171875, -437.711822509765625, 0.913416028022766113, 0.733038187026977539, 0, 0, 0.358367919921875, 0.933580458164215087, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+34, @OID, 0, 0, 0, 1, 1, -14616.53515625, -88.2083358764648437, 0.587144970893859863, 4.468043327331542968, 0, 0, -0.7880105972290039, 0.615661680698394775, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+35, @OID, 0, 0, 0, 1, 1, -14592.0849609375, -83.6837539672851562, 0.382618993520736694, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+36, @OID, 0, 0, 0, 1, 1, -14503.5595703125, -316.2413330078125, 0.920786976814270019, 5.602506637573242187, 0, 0, -0.33380699157714843, 0.942641437053680419, 120, 255, 1, '', NULL, 60141), -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject1 +(@OGUID+37, @OID, 0, 0, 0, 1, 1, -14462.361328125, -314.703125, 1.220939040184020996, 0.139624491333961486, 0, 0, 0.06975555419921875, 0.997564136981964111, 120, 255, 1, '', NULL, 60141); -- Half-Buried Bottle (Area: -Jaguero Isle- - Difficulty: 0) CreateObject2 diff --git a/sql/updates/world/3.3.5/2025_04_12_04_world.sql b/sql/updates/world/3.3.5/2025_04_12_04_world.sql new file mode 100644 index 00000000000..4d03bfc1276 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_04_world.sql @@ -0,0 +1,4 @@ +-- King Mukla (Area: -Jaguero Isle- - Difficulty: 0) +UPDATE `creature` SET `position_x`=-14721.4853515625, `position_y`=-389.7718505859375, `position_z`=8.1319427490234375, `orientation`=3.83042454719543457, `wander_distance`=30, `MovementType`=1, `VerifiedBuild`=60141 WHERE `guid`=823 and `id`=1559; +UPDATE `creature_template_addon` SET `PvpFlags`=0 WHERE `entry`=1559; +UPDATE `creature_template` SET `speed_walk`=4/2.5, `speed_run`=7.5/7 WHERE `entry`=1559; diff --git a/sql/updates/world/3.3.5/2025_04_12_05_world.sql b/sql/updates/world/3.3.5/2025_04_12_05_world.sql new file mode 100644 index 00000000000..3e4835a4e6c --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_05_world.sql @@ -0,0 +1,4 @@ +-- Vesprystus, remove gossip menu option when players have the quest "The Bounty of Teldrassil" in progress or completed +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=4302; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,4302,0,0,0,47,0,6341,10,0,1,0,0,"","Do not show gossip menu 4302 option id 0 if player has quest 'The Bounty of Teldrassil' in progress or completed"); diff --git a/sql/updates/world/3.3.5/2025_04_12_06_world.sql b/sql/updates/world/3.3.5/2025_04_12_06_world.sql new file mode 100644 index 00000000000..8e99f2a70c6 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_06_world.sql @@ -0,0 +1,5 @@ +-- Arch Druid Fandral Staghelm, gossip menu option requires the quest "Un' Goro Soil" rewarded and player to have herbalism skill below 75 +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=1630; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,1630,0,0,1,8,0,3764,0,0,0,0,0,"","Gossip option 0 requires players have quest Un'Goro Soil rewarded AND"), +(15,1630,0,0,1,7,0,182,75,0,1,0,0,"","Requires player skill in herbalism lower than 75"); diff --git a/sql/updates/world/3.3.5/2025_04_12_07_world.sql b/sql/updates/world/3.3.5/2025_04_12_07_world.sql new file mode 100644 index 00000000000..9a6989ee2a6 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_07_world.sql @@ -0,0 +1,2 @@ +-- "The Sprouted Fronds" quest is missing flag "Autocomplete" +UPDATE `quest_template` SET `Flags`=`Flags`| 65536 WHERE `ID`=2399; diff --git a/sql/updates/world/3.3.5/2025_04_12_08_world.sql b/sql/updates/world/3.3.5/2025_04_12_08_world.sql new file mode 100644 index 00000000000..d69450e68d0 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_12_08_world.sql @@ -0,0 +1,4 @@ +-- Update William broken waypoints +UPDATE `waypoint_data` SET `position_x`=-8521.601, `position_y`=668.9489, `position_z`=102.8348 WHERE `id`=797200 AND `point`=26; +UPDATE `waypoint_data` SET `position_x`=-8537.578, `position_y`=688.1958, `position_z`=97.74829 WHERE `id`=797200 AND `point`=27; +UPDATE `waypoint_data` SET `wpguid`=0 WHERE `id`=797200; diff --git a/sql/updates/world/3.3.5/2025_04_19_00_world.sql b/sql/updates/world/3.3.5/2025_04_19_00_world.sql new file mode 100644 index 00000000000..eabc5c90f77 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_19_00_world.sql @@ -0,0 +1,2 @@ +-- Remove Neophyte Guardian +DELETE FROM `creature` WHERE `id`=21312 AND `guid`=85563; diff --git a/sql/updates/world/3.3.5/2025_04_19_01_world.sql b/sql/updates/world/3.3.5/2025_04_19_01_world.sql new file mode 100644 index 00000000000..b1ab7a5a411 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_19_01_world.sql @@ -0,0 +1,3 @@ +-- 15652 (Elder Springpaw) / 20749 (Scalewing Serpent) / 21723 (Blackwind Sabercat) / 22100 (Scorpid Bonecrawler) +UPDATE `creature_template_addon` SET `PvpFlags`=0 WHERE `entry` IN (15652,20749,21723,22100); +UPDATE `creature_addon` SET `SheathState`=1, `PvpFlags`=0, `auras`=NULL WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` IN (15652,20749,21723,22100)); diff --git a/sql/updates/world/3.3.5/2025_04_28_00_world.sql b/sql/updates/world/3.3.5/2025_04_28_00_world.sql new file mode 100644 index 00000000000..44855b984e5 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_28_00_world.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=18899 AND `SourceId`=1; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 1, 18899, 1, 0, 13, 1, 4, 3, 0, 1, 0, 0, '', 'Execute SAI only if Wolf Master Nandos is not done'); diff --git a/sql/updates/world/3.3.5/2025_04_29_00_world.sql b/sql/updates/world/3.3.5/2025_04_29_00_world.sql new file mode 100644 index 00000000000..97c812f2009 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_29_00_world.sql @@ -0,0 +1,5 @@ +-- The quest "The Absent Minded Prospector" (729) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=731 WHERE `Id`=729; + +-- The quest "The Cliffspring River" (4762) is missing Reward Next Quest +UPDATE `quest_template` SET `RewardNextQuest`=4763 WHERE `Id`=4762; diff --git a/sql/updates/world/3.3.5/2025_04_29_01_world.sql b/sql/updates/world/3.3.5/2025_04_29_01_world.sql new file mode 100644 index 00000000000..a2b99368114 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_29_01_world.sql @@ -0,0 +1,15 @@ +-- Thundris Windweaver should give players a "Mark of the Wild" buff when "Tools of the Highborne" is rewarded. + +-- Add SmartAI to creature template +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=3649; + +-- Thundris Windweaver Scripts +DELETE FROM `smart_scripts` WHERE `entryorguid`=3649 AND `event_type`=20; +DELETE FROM `smart_scripts` WHERE `entryorguid`=364900 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(3649,0,0,0,20,0,100,0,958,0,0,0,0,80,364900,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Thundris Windweaver - On Quest 'Tools of the Highborne' Completed - Run Script"), + +-- Timed List 1 +(364900,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Thundris Windweaver - On Script - Set Orientation Invoker"), +(364900,9,1,0,0,0,100,0,0,0,0,0,0,11,1126,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Thundris Windweaver - On Script - Cast 'Mark of the Wild'"), +(364900,9,2,0,0,0,100,0,2000,2000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Thundris Windweaver - On Script - Set Orientation Home Position"); diff --git a/sql/updates/world/3.3.5/2025_04_29_02_world.sql b/sql/updates/world/3.3.5/2025_04_29_02_world.sql new file mode 100644 index 00000000000..cd8f780b70c --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_29_02_world.sql @@ -0,0 +1,40 @@ +-- Gubber Blump, add missing gossip menu text. +DELETE FROM `gossip_menu` WHERE `MenuID`=2562 AND `TextID`=3253; +INSERT INTO `gossip_menu` (`MenuID`,`TextID`,`VerifiedBuild`) VALUES +(2562,3253,0); + +-- Gubber Blump script. +DELETE FROM `smart_scripts` WHERE `entryorguid`=10216 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (1021600,1021601) 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(10216,0,0,0,62,0,100,0,2562,1,0,0,0,80,1021600,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Gubber Blump - On Gossip Option 1 Select - Run Script"), +(10216,0,1,0,62,0,100,0,2562,1,0,0,0,80,1021601,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Gubber Blump - On Gossip Option 1 Select - Run Script"), +(10216,0,2,0,62,0,100,0,2562,2,0,0,0,1,1,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Gubber Blump - On Gossip Option 2 Selected - Say Line 1"), + +-- Timed List 1 +(1021600,9,0,0,0,0,100,0,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Close gossip"), +(1021600,9,1,0,0,0,100,0,0,0,0,0,0,85,7733,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Cast spell 'Apprentice Fishing'"), +(1021600,9,2,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Set Orientation Invoker"), +(1021600,9,3,0,0,0,100,0,0,0,0,0,0,5,469,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Play Emote"), +(1021600,9,4,0,0,0,100,0,2000,2000,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Say Line 0"), +(1021600,9,5,0,0,0,100,0,4000,4000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Set Orientation Home Position"), + +-- Timed List 2 +(1021601,9,0,0,0,0,100,0,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Close gossip"), +(1021601,9,1,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Set Orientation Invoker"), +(1021601,9,2,0,0,0,100,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Say Line 0"), +(1021601,9,3,0,0,0,100,0,4000,4000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Gubber Blump - On Script - Set Orientation Home Position"); + +-- Gubber Blump, conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=2562 AND `SourceEntry` IN (3234,3253); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=2562 AND `SourceEntry` IN (1,2); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`IN (1,2) AND `SourceEntry`=10216; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(14,2562,3234,0,0,47,0,1138,10,0,1,0,0,"","Show gossip dialog text 3234 if Quest 'Fruit of the Sea' is NOT in progress or completed"), +(14,2562,3253,0,0,47,0,1138,10,0,0,0,0,"","Show gossip dialog text 3253 if Quest 'Fruit of the Sea' is in progress or completed"), + +(15,2562,2,0,0,7,0,356,1,0,0,0,0,"","Show gossip option 2 if player has fishing profession"), +(15,2562,1,0,0,47,0,1141,74,0,0,0,0,"","Show gossip option 1 if player has quest 'The Family and the Fishing Pole' in progress, completed or rewarded"), + +(22,1,10216,0,0,7,0,356,1,0,1,0,0,"","Smart Event 0 for creature Gubber Blumps execute if player do not have fishing skill"), +(22,2,10216,0,0,7,0,356,1,0,0,0,0,"","Smart Event 1 for creature Gubber Blumps execute if player have fishing skill"); diff --git a/sql/updates/world/3.3.5/2025_04_29_03_world.sql b/sql/updates/world/3.3.5/2025_04_29_03_world.sql new file mode 100644 index 00000000000..ed2011664b7 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_29_03_world.sql @@ -0,0 +1,14 @@ +-- More Blizz like intro for quest "Cave Mushrooms". + +-- Correct emote +UPDATE `creature_text` SET `Emote`=25 WHERE `CreatureID`=3583 AND `GroupID`=0; + +DELETE FROM `smart_scripts` WHERE `entryorguid`=358300 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES + +-- Barithras Moonshade Timed Scripts +(358300,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Barithras Moonshade - On Script - Set Orientation Invoker"), +(358300,9,1,0,0,0,100,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Barithras Moonshade - On Script - Say Line 1"), +(358300,9,2,0,0,0,100,0,5000,5000,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0,5.25,"Barithras Moonshade - On Script - Set Orientation"), +(358300,9,3,0,0,0,100,0,500,500,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Barithras Moonshade - On Script - Say Line 0"), +(358300,9,4,0,0,0,100,0,5000,5000,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Barithras Moonshade - On Script - Set Orientation Home Position"); diff --git a/sql/updates/world/3.3.5/2025_04_29_04_world.sql b/sql/updates/world/3.3.5/2025_04_29_04_world.sql new file mode 100644 index 00000000000..840b304c9e8 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_29_04_world.sql @@ -0,0 +1,162 @@ +-- The Absent Minded Prospector (729) +UPDATE `quest_details` SET `Emote3`=5,`Emote4`=20 WHERE `ID`=729; +UPDATE `quest_offer_reward` SET `Emote2`=1,`Emote3`=6,`Emote4`=6 WHERE `ID`=729; + +-- The Absent Minded Prospector (731) +UPDATE `quest_details` SET `Emote2`=6 WHERE `ID`=731; +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=731; + +-- The Absent Minded Prospector (741) +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=741; + +-- The Absent Minded Prospector (942) +UPDATE `quest_details` SET `Emote2`=1 WHERE `ID`=942; +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=942; +UPDATE `quest_offer_reward` SET `Emote1`=5,`Emote2`=1 WHERE `ID`=942; + +-- The Fall of Ameth'Aran (953) +UPDATE `quest_request_items` SET `EmoteOnInComplete`=1 WHERE `ID`=953; + +-- Bashal'Aran (954) +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=954; + +-- Bashal'Aran (955) +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=955; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=955; + +-- Bashal'Aran (956) +UPDATE `quest_request_items` SET `EmoteOnInComplete`=1,`EmoteOnComplete`=1 WHERE `ID`=956; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=956; + +-- Bashal'Aran (957) +UPDATE `quest_request_items` SET `EmoteOnInComplete`=1 WHERE `ID`=957; + +-- The Tower of Althalaxx (965) +UPDATE `quest_offer_reward` SET `Emote2`=1 WHERE `ID`=965; + +-- The Tower of Althalaxx (967) +UPDATE `quest_details` SET `Emote3`=2 WHERE `ID`=967; +UPDATE `quest_request_items` SET `EmoteOnInComplete`=6 WHERE `ID`=967; + +-- Deep Ocean, Vast Sea (982) +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=982; + +-- How Big a Threat? (984) +UPDATE `quest_details` SET `Emote2`=1,`Emote3`=6 WHERE `ID`=984; +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=984; +UPDATE `quest_offer_reward` SET `Emote2`=1,`Emote3`=2 WHERE `ID`=984; + +-- How Big a Threat? (985) +UPDATE `quest_details` SET `Emote2`=1,`Emote3`=1 WHERE `ID`=985; +UPDATE `quest_offer_reward` SET `Emote2`=1 WHERE `ID`=985; + +-- A Lost Master (986) +UPDATE `quest_request_items` SET `EmoteOnInComplete`=1 WHERE `ID`=986; +UPDATE `quest_offer_reward` SET `Emote1`=21,`Emote2`=1,`Emote3`=1 WHERE `ID`=986; + +-- Trek to Ashenvale (990) +UPDATE `quest_details` SET `Emote1`=2,`Emote2`=1 WHERE `ID`=990; + +-- A Lost Master (993) +UPDATE `quest_details` SET `Emote2`=1,`Emote3`=1 WHERE `ID`=993; +UPDATE `quest_offer_reward` SET `Emote1`=1,`Emote2`=1 WHERE `ID`=993; + +-- Escape Through Force (994) +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=994; +UPDATE `quest_offer_reward` SET `Emote2`=1 WHERE `ID`=994; + +-- Escape Through Stealth (995) +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=995; +UPDATE `quest_offer_reward` SET `Emote2`=1 WHERE `ID`=995; + +-- Fruit of the Sea (1138) +UPDATE `quest_details` SET `Emote1`=4,`Emote2`=3 WHERE `ID`=1138; +UPDATE `quest_request_items` SET `EmoteOnInComplete`=1,`EmoteOnComplete`=1 WHERE `ID`=1138; +UPDATE `quest_offer_reward` SET `Emote1`=4,`Emote2`=1 WHERE `ID`=1138; + +-- Researching the Corruption (1275) +UPDATE `quest_details` SET `Emote1`=396,`Emote2`=396,`Emote3`=396,`Emote4`=396,`EmoteDelay1`=10 WHERE `ID`=1275; +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=1275; +UPDATE `quest_offer_reward` SET `Emote1`=396,`Emote2`=396,`Emote3`=2,`EmoteDelay1`=10,`EmoteDelay2`=10 WHERE `ID`=1275; + + +-- Seeking the Kor Gem (1442) +DELETE FROM `quest_details` WHERE `ID`=1442; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(1442,2,1,1,1,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnIncomplete`=1 WHERE `ID`=1442; +UPDATE `quest_offer_reward` SET `Emote1`=1,`Emote2`=1,`Emote3`=1 WHERE `ID`=1442; + +-- Gaffer Jacks (1579) +UPDATE `quest_offer_reward` SET `Emote1`=4,`Emote2`=5 WHERE `ID`=1579; + +-- Plagued Lands (2118) +UPDATE `quest_offer_reward` SET `Emote2`=6 WHERE `ID`=2118; + +-- Cleansing of the Infected (2138) +UPDATE `quest_details` SET `Emote2`=1; +UPDATE `quest_request_items` SET `EmoteOnInComplete`=6 WHERE `ID`=2138; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=2138; + +-- Tharnariun's Hope (2139) +UPDATE `quest_details` SET `Emote2`=1 WHERE `ID`=2139; + +-- Gyromast's Revenge (2078) +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=2078; + +-- Gyromast's Retrieval (2098) +UPDATE `quest_details` SET `Emote1`=5,`Emote2`=1 WHERE `ID`=2098; +UPDATE `quest_offer_reward` SET `Emote1`=15 WHERE `ID`=2098; + +-- Washed Ashore (3524) +UPDATE `quest_request_items` SET `EmoteOnInComplete`=1 WHERE `ID`=3524; + +-- Beached Sea Turtle (4722) +UPDATE `quest_request_items` SET `EmoteOnComplete`=6,`EmoteOnIncomplete`=6 WHERE `ID`=4722; + +-- Beached Sea Creature (4723) +UPDATE `quest_request_items` SET `EmoteOnComplete`=1,`EmoteOnIncomplete`=1 WHERE `ID`=4723; + +-- Beached Sea Turtle (4725) +UPDATE `quest_request_items` SET `EmoteOnComplete`=2,`EmoteOnIncomplete`=2 WHERE `ID`=4725; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=4725; + +-- Beached Sea Turtle (4727) +UPDATE `quest_request_items` SET `EmoteOnComplete`=2,`EmoteOnIncomplete`=2 WHERE `ID`=4727; + +-- Beached Sea Turtle (4731) +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=4731; + +-- WANTED: Murkdeep! (4740) +UPDATE `quest_request_items` SET `EmoteOnInComplete`=66,`EmoteOnComplete`=66 WHERE `ID`=4740; + +-- The Blackwood Corrupted (4763) +UPDATE `quest_request_items` SET `EmoteOnInComplete`=1,`EmoteOnComplete`=1 WHERE `ID`=4763; +UPDATE `quest_offer_reward` SET `Emote2`=2 WHERE `ID`=4763; + +-- The Red Crystal (4811) +UPDATE `quest_request_items` SET `EmoteOnComplete`=6 WHERE `ID`=4811; + +-- The Sleeper Has Awakened (5321) +UPDATE `quest_offer_reward` SET `Emote1`=21,`Emote2`=1,`Emote3`=2 WHERE `ID`=5321; + +-- Gathering the Cure (6123) +DELETE FROM `quest_details` WHERE `ID`=6123; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6123,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnInComplete`=6,`EmoteOnComplete`=6 WHERE `ID`=6123; +UPDATE `quest_offer_reward` SET `Emote1`=4,`Emote2`=1 WHERE `ID`=6123; + + +-- Curing the Sick (6124) +DELETE FROM `quest_details` WHERE `ID`=6124; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6124,1,0,0,0,0,0,0,0,0); +UPDATE `quest_request_items` SET `EmoteOnInComplete`=6,`EmoteOnComplete`=6 WHERE `ID`=6124; +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=6124; + +-- Power over Poison (6125) +DELETE FROM `quest_details` WHERE `ID`=6125; +INSERT INTO `quest_details` (`ID`,`Emote1`,`Emote2`,`Emote3`,`Emote4`,`EmoteDelay1`,`EmoteDelay2`,`EmoteDelay3`,`EmoteDelay4`,`VerifiedBuild`) VALUES +(6125,1,0,0,0,0,0,0,0,0); +UPDATE `quest_offer_reward` SET `Emote1`=1 WHERE `ID`=6125; diff --git a/sql/updates/world/3.3.5/2025_04_29_05_world.sql b/sql/updates/world/3.3.5/2025_04_29_05_world.sql new file mode 100644 index 00000000000..fa567001c45 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_29_05_world.sql @@ -0,0 +1,137 @@ +-- "The Absent Minded Prospector" (741) - Completion Text, should have $r instead of $R. +UPDATE `quest_request_items` SET `CompletionText`="What can I do for you, $r?" WHERE `ID`=741; + +-- "Therylune's Escape" (945) - Completion Text, missing text entirely. +UPDATE `quest_request_items` SET `CompletionText`="My sister likes to wander, but she's been gone for a long time now..." WHERE `ID`=945; + +-- "Therylune's Escape" (945) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="My sister was where?? Therylune doesn't mind getting herself dirty, but still! That's a long way to wander, and the Master's Glaive is an unwholesome place...$B$BWell thank you, $N. It was very nice of you to let me know she's all right." WHERE `ID`=945; + +-- "Cave Mushrooms" (947) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Do you have my mushrooms, $N? Have you been to the cave?" WHERE `ID`=947; + +-- "Cave Mushrooms" (947) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Many thanks, $N. These mushrooms are fine specimens!$b$bAnd when you were at Cliffspring Falls, did you find anything to confirm the warnings of the Ancients?$b$bThe Ancients are wise, but I had hoped that, this time, they were wrong." WHERE `ID`=947; + +-- "Onu" (948) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="$N. You are here.$b$bGood.$b$bWe have matters...to discuss. You and I." WHERE `ID`=948; + +-- "Return to Onu" (950) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="$N. You return." WHERE `ID`=950; + +-- "Return to Onu" (950) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="A chaotic, primal magic surrounds this parchment of scribbles. I sense the work of the old ones in it.$b$bLet us hope it reveals the purpose of the Twilight's Hammer in Darkshore..." WHERE `ID`=950; + +-- "Mathystra Relics" (951) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="$N. Has your rooting through the Ruins of Mathystra been fruitful?" WHERE `ID`=951; + +-- "Mathystra Relics" (951) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Thank you. These relics are from a time when Mathystra shone. That once great bastion of the elves has faded, but shards of its magic remain. Let us hope we can unlock the secrets of that place before our enemies...$b$bBe vigilant, $N." WHERE `ID`=951; + +-- "The Tower of Althalaxx" (967) - Completion Text, should have $c instead of $C. +UPDATE `quest_request_items` SET `CompletionText`="You have some business with me, $c?" WHERE `ID`=967; + +-- "Deep Ocean, Vast Sea" (982) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="The captains of those ships were good night elves, and they deserve a better fate than they were given. Perhaps tending to their personal effects will be the best way to put their spirits to rest." WHERE `ID`=982; + +-- "Deep Ocean, Vast Sea" (982) - Reward Text, missing double spacing and gender discrepancy. +UPDATE `quest_offer_reward` SET `RewardText`="You've done us here in Auberdine a great service, $glad:lass;. We'll make sure that their effects are properly taken care of.$b$bAs for you, please have this. It is the least I can do for someone with the bravery to set things right." WHERE `ID`=982; + +-- "Trek to Ashenvale" (990) - Reward Text, should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="Ah, a $c from Darkshore. Selarin has done well to send you here so quickly, $N. I wish your trip here wasn't under such dire stress. Perhaps with your help we can improve matters.$B$BI would start my visit by speaking to the other citizens of Astranaar. Some could surely use your aid." WHERE `ID`=990; + +-- "Gaffer Jacks" (1579) - Reward Text, should have $r instead of $R. +UPDATE `quest_offer_reward` SET `RewardText`="I can't believe you found them! You must be the luckiest $r in Kalimdor!" WHERE `ID`=1579; + +-- "Electropellers" (1580) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Did you find any electropellers? I'll need them if I'm to continue my research on duck decoys..." WHERE `ID`=1580; + +-- "Electropellers" (1580) - Reward Text, missing double spacing and gender discrepancy. +UPDATE `quest_offer_reward` SET `RewardText`="I can't believe it! You found them! You are the best fisherman I've ever seen!$b$bThank you, $N. And here, take these. Although you're so good and you probably don't need them, they will help you with your fishing." WHERE `ID`=1580; + +-- "Cleansing of the Infected" (2138) - Reward Text, partial text is missing. +UPDATE `quest_offer_reward` SET `RewardText`="You have done Auberdine a great service, $N, but your task is not yet complete.$b$bReturn to me once you have rested.$b$b...and $N, prepare your mind and soul for more bloodshed." WHERE `ID`=2138; + +-- "Washed Ashore" (3524) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="It is only recently that these creatures started landing on the coast of Darkshore in such alarming numbers. I can't help but think that this is an ill omen of some sort. Recovering a sample of that creature's bones to the south would help us in Darnassus assess this situation!" WHERE `ID`=3524; + +-- "Washed Ashore" (3524) - Reward Text, partial text is missing. +UPDATE `quest_offer_reward` SET `RewardText`="I hope the murloc did not give you much trouble in collecting this for us! I will be sure to get this on the next hippogryph to Darnassus. The Temple of the Moon has given me some funds to hand out for assistance; please have some with our thanks.$B$BYour success here emboldens me to offer you a chance to aid the Temple of the Moon further, if you are interested..." WHERE `ID`=3524; + +-- "Washed Ashore" (4681) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Once you have investigated the creature's remains in the water to the west of here, I should be able to file a proper report with the Temple of the Moon in Darnassus. Perhaps then we will be closer to discovering the reason why these unfortunate creatures choose to end their lives beached on the coast of Darkshore." WHERE `ID`=4681; + +-- "Washed Ashore" (4681) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="You've been a tremendous help here today; we now have a solid chance at unlocking the mystery of why these creatures choose to beach themselves on the cost of Darkshore. The idea that they might be fleeing the area around Teldrassil is disturbing. Should you come across others in your travels, please let me know. Our research here is but in its infancy.$B$BOn behalf of the Temple of the Moon, please accept this as thanks for the effort you have given. Thank you, $N!" WHERE `ID`=4681; + +-- "Beached Sea Creature" (4723) - Completion Text, correct text. +UPDATE `quest_request_items` SET `CompletionText`="Perhaps one day we'll find a means to prevent these poor creatures from ending their lives needlessly on the coast of Darkshore. Until then, we must continue our research!$b$bGreetings $N - what news do you bring?" WHERE `ID`=4723; + +-- "Beached Sea Creature" (4723) - Reward Text, correct text. +UPDATE `quest_offer_reward` SET `RewardText`="Another discovery - well done $N! These remains will be properly studied once they get to Darnassus. Please accept this small honorarium in exchange for the remains you have provided for our study." WHERE `ID`=4723; + +-- "Beached Sea Turtle" (4725) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="It is a pleasure to see you again, $N. We are making great strives in uncovering the mystery of why majestic sea creatures beach themselves on the Darkshore coastline, but with every question answered, two more are raised it seems.$b$bAre you here to offer us more aid in our research?" WHERE `ID`=4725; + +-- "Beached Sea Turtle" (4725) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="I have heard of the kinds of carriages found on the back of the turtle you found. Those I do believe are naga carriages, used both in battle and in transportation of their supplies on to land. The markings on the box you found are of the naga; this would explain their invasive presence in far-northern Darkshore.$b$bI will send this box to Darnassus along with the rest of your discoveries. This is for you - thank you again for your assistance." WHERE `ID`=4725; + +-- "Beached Sea Turtle" (4727) - Completion Text, correct text. +UPDATE `quest_request_items` SET `CompletionText`="Hello once again $N - have you found any more beached creatures that the Temple of the Moon should know about?" WHERE `ID`=4727; + +-- "Beached Sea Turtle" (4727) - Reward Text, correct text. +UPDATE `quest_offer_reward` SET `RewardText`="It is interesting that the murlocs were not present at this site; we will keep this in mind as we study this creature's remains! Thank you for your effort, $N; the Temple of the Moon would like for me to give you this, as compensation for your time." WHERE `ID`=4727; + +-- "WANTED: Murkdeep!" (4740) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Greetings $c - what may the Sentinels assist you with today? Perhaps you are here to inquire about the bounty on Murkdeep?" WHERE `ID`=4740; + +-- "WANTED: Murkdeep!" (4740) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Well, looks like you're here to more than just inquire! The citizens will be delighted to know that tonight they will sleep a little bit more soundly and safer.$b$bYou've acted as the executioner of justice for the people of Auberdine today, $N. For that, I would like to offer you this as a suitable reward... for a true hero of the Auberdine people." WHERE `ID`=4740; + +-- "The Cliffspring River" (4762) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="It's no surprise how tainted this water is, but just look at how putrid it is becoming! It would seem that action is needed sooner than later, eh $N?$b$bTo our east is Felwood; it is the real source of this corruption, one that I have seen in times past. I predict this sample will confirm this. We might be able to enact a cure for it here, but in order to even try we will need assistance. When that time comes $N, I hope you will be able to give the aid we need." WHERE `ID`=4762; + +-- "The Blackwood Corrupted" (4763) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="The Talisman of Corruption is a sinister device that only serves to pervert the balance of nature. When you obtain this item from whatever satyr is tormenting the furbolgs and bring it to me for disposal, we will have won a great victory this day!" WHERE `ID`=4763; + +-- "The Blackwood Corrupted" (4763) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="We have just begun this war to reclaim our forest from the forces of corruption, but a battle this day has been won! $N, the people of Auberdine owe you a debt of gratitude that will never be easily repaid. Please accept this along with our thanks. What we have learned here today may one day free our furbolg friends from the shackles of torment permanently." WHERE `ID`=4763; + +-- "The Red Crystal" (4811) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="What do you have to report on that red crystal? Does it even really exist?" WHERE `ID`=4811; + +-- "The Red Crystal" (4811) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="So the crystal exists, $N? Fascinating... anyway, your task has been well executed; good work!$B$BWhat exactly is this crystal? This is but a single question in a sea of questions. Another question that comes to mind is why the moonkin would be drawn to this object? Is the crystal benign in nature, or does it hold a more sinister purpose?$B$BI have many more questions, but we're going to need to examine that crystal closely to get some answers." WHERE `ID`=4811; + +-- "As Water Cascades" (4812) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="The crystal looks very alien against the wooded scenery of Darkshore. You think you hear a very slight humming coming from deep within it." WHERE `ID`=4812; + +-- "As Water Cascades" (4812) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="You have made it once more to the mysterious crystal. Removing the stopper on the tube of moonwell water, you gingerly pour the contents out over the top of the crystal. As the water cascades down its lattices, you see the opaque surface turn transparent..." WHERE `ID`=4812; + +-- "The Fragments Within" (4813) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="Well, it would seem that even though we know more about this crystal, more unanswered questions are the result!$B$BI'll take the information you've uncovered to the council here in Auberdine. Perhaps they'll know a course of action to follow on this crystal. Well, that is if there is one to be taken; for now, the threat remains far enough to our east to be out of harm's way.$B$BAs for you, please have this. Consider it a reward for a job well done, $N." WHERE `ID`=4813; + +-- "One Shot. One Kill." (5713) - Reward Text, should have $c instead of $C. +UPDATE `quest_offer_reward` SET `RewardText`="You bring most welcome news $c. It is good to hear that Aynasha is alive and well thanks to you. I would hope that you might accept a reward for your valor. May Elune watch over you and light your path." WHERE `ID`=5713; + +-- "The Principal Source" (6122) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="You're the one that the Cenarion Circle in Moonglade sent? That's wonderful! We've quite the crisis our hands here regarding the poor deer, and we're happy for all the help we can get.$B$BDo you have the sample of water that Dendrite Starblaze said you'd have? He notified me that you'd draw one so we could work on a cure together..." WHERE `ID`=6122; + +-- "The Principal Source" (6122) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="By Elune, this water is disgusting! No wonder the deer are sick.$B$BSomething is polluting the water, and in turn corrupting Darkshore's entire water table. Sick deer have been seen all over area, and not just by the river. While this water is most likely a primary source of the sickness spreading, there's something else at work here.$B$BThis water, believe it or not, will help us formulate a cure. While I research this water, I have need of some items to formulate a cure..." WHERE `ID`=6122; + +-- "Gathering the Cure" (6123) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Have you got the reagents I need to make the salve? The deer aren't getting any better on their own, so we better hurry to help them out!" WHERE `ID`=6123; + +-- "Gathering the Cure" (6123) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="This is good, $N, so much so that it should be enough to make some ample doses of the salve - at least enough to start to make a difference.$B$BMaking a cure for poisons can be quite difficult at times because each one often requires a very specific antidote to counteract it. Imagine being able to cure a poison at will without having to worry about the exact ingredients of what the antidote must be!$B$BNow, let me get to work on this!" WHERE `ID`=6123; + +-- "Curing the Sick" (6124) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Have you completed what was asked of you by Alanndarian Nightsong of Auberdine? Your work is not complete unless it is." WHERE `ID`=6124; + +-- "Flight to Auberdine" (6342) - Completion Text, missing double spacing. +UPDATE `quest_request_items` SET `CompletionText`="Have you come from Teldrassil? Tell me, how is the fishing there?" WHERE `ID`=6342; + +-- "Flight to Auberdine" (6342) - Reward Text, missing double spacing. +UPDATE `quest_offer_reward` SET `RewardText`="A package from Nessa? Thank you, $N! She told me she would send me samples of the fish caught near Rut'theran village. She thinks they may be very different from the fish caught here...$b$bMy! This jawbone is nearly twice the size of the same fish found here. And these scales are as big as a closed fist! Amazing!" WHERE `ID`=6342; diff --git a/sql/updates/world/3.3.5/2025_04_30_00_world.sql b/sql/updates/world/3.3.5/2025_04_30_00_world.sql new file mode 100644 index 00000000000..363b5aff673 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_30_00_world.sql @@ -0,0 +1,95 @@ +DELETE FROM `creature_template_locale` WHERE `locale`='ruRU' AND `entry` IN (5927, 7424, 7425, 15487, 31169, 31170, 6012, 7423, 10557, 15485, 31132, 31158, 31133, 7412, 7413, 15486, 31171, 31172, 3906, 3907, 3908, 3909, 15488, 31181, 31182, 31185, 7464, 7465, 7466, 15484, 31166, 31167, 7414, 7415, 7416, 15489, 31186, 31189, 31190, 7468, 7469, 15490, 31173, 31174, 3902, 3903, 3904, 7400, 7402, 15480, 31162, 31164, 31165, 3911, 3912, 3913, 7398, 7399, 15478, 31120, 31121, 31122, 5919, 5920, 7366, 7367, 7368, 15470, 15474, 31175, 31176, 5921, 5922, 7403, 15464, 15479, 30647, 31129, 7483, 7484, 15496, 15497, 11100, 11101, 17061, 7486, 7487, 15463, 30654, 9687, 9688, 9689, 15492); +INSERT INTO `creature_template_locale` (`entry`, `locale`, `Name`, `Title`, `VerifiedBuild`) VALUES +(5927, 'ruRU', 'Тотем сопротивления огню', '', 0), +(7424, 'ruRU', 'Тотем сопротивления огню II', '', 0), +(7425, 'ruRU', 'Тотем сопротивления огню III', '', 0), +(15487, 'ruRU', 'Тотем сопротивления огню IV', '', 0), +(31169, 'ruRU', 'Тотем сопротивления огню V', '', 0), +(31170, 'ruRU', 'Тотем сопротивления огню VI', '', 0), +(6012, 'ruRU', 'Тотем языка пламени II', '', 0), +(7423, 'ruRU', 'Тотем языка пламени III', '', 0), +(10557, 'ruRU', 'Тотем языка пламени IV', '', 0), +(15485, 'ruRU', 'Тотем языка пламени V', '', 0), +(31132, 'ruRU', 'Тотем языка пламени VI', '', 0), +(31158, 'ruRU', 'Тотем языка пламени VII', '', 0), +(31133, 'ruRU', 'Тотем языка пламени VIII', '', 0), +(7412, 'ruRU', 'Тотем сопротивления льду II', '', 0), +(7413, 'ruRU', 'Тотем сопротивления льду III', '', 0), +(15486, 'ruRU', 'Тотем сопротивления льду IV', '', 0), +(31171, 'ruRU', 'Тотем сопротивления льду V', '', 0), +(31172, 'ruRU', 'Тотем сопротивления льду VI', '', 0), +(3906, 'ruRU', 'Тотем исцеляющего потока II', '', 0), +(3907, 'ruRU', 'Тотем исцеляющего потока III', '', 0), +(3908, 'ruRU', 'Тотем исцеляющего потока IV', '', 0), +(3909, 'ruRU', 'Тотем исцеляющего потока V', '', 0), +(15488, 'ruRU', 'Тотем исцеляющего потока VI', '', 0), +(31181, 'ruRU', 'Тотем исцеляющего потока VII', '', 0), +(31182, 'ruRU', 'Тотем исцеляющего потока VIII', '', 0), +(31185, 'ruRU', 'Тотем исцеляющего потока IX', '', 0), +(7464, 'ruRU', 'Тотем магмы II', '', 0), +(7465, 'ruRU', 'Тотем магмы III', '', 0), +(7466, 'ruRU', 'Тотем магмы IV', '', 0), +(15484, 'ruRU', 'Тотем магмы V', '', 0), +(31166, 'ruRU', 'Тотем магмы VI', '', 0), +(31167, 'ruRU', 'Тотем магмы VII', '', 0), +(7414, 'ruRU', 'Тотем источника маны II', '', 0), +(7415, 'ruRU', 'Тотем источника маны III', '', 0), +(7416, 'ruRU', 'Тотем источника маны IV', '', 0), +(15489, 'ruRU', 'Тотем источника маны V', '', 0), +(31186, 'ruRU', 'Тотем источника маны VI', '', 0), +(31189, 'ruRU', 'Тотем источника маны VII', '', 0), +(31190, 'ruRU', 'Тотем источника маны VIII', '', 0), +(7468, 'ruRU', 'Тотем сопротивления силам природы II', '', 0), +(7469, 'ruRU', 'Тотем сопротивления силам природы III', '', 0), +(15490, 'ruRU', 'Тотем сопротивления силам природы IV', '', 0), +(31173, 'ruRU', 'Тотем сопротивления силам природы V', '', 0), +(31174, 'ruRU', 'Тотем сопротивления силам природы VI', '', 0), +(3902, 'ruRU', 'Опаляющий тотем II', '', 0), +(3903, 'ruRU', 'Опаляющий тотем III', '', 0), +(3904, 'ruRU', 'Опаляющий тотем IV', '', 0), +(7400, 'ruRU', 'Опаляющий тотем V', '', 0), +(7402, 'ruRU', 'Опаляющий тотем VI', '', 0), +(15480, 'ruRU', 'Опаляющий тотем VII', '', 0), +(31162, 'ruRU', 'Опаляющий тотем VIII', '', 0), +(31164, 'ruRU', 'Опаляющий тотем IX', '', 0), +(31165, 'ruRU', 'Опаляющий тотем X', '', 0), +(3911, 'ruRU', 'Тотем каменного когтя II', '', 0), +(3912, 'ruRU', 'Тотем каменного когтя III', '', 0), +(3913, 'ruRU', 'Тотем каменного когтя IV', '', 0), +(7398, 'ruRU', 'Тотем каменного когтя V', '', 0), +(7399, 'ruRU', 'Тотем каменного когтя VI', '', 0), +(15478, 'ruRU', 'Тотем каменного когтя VII', '', 0), +(31120, 'ruRU', 'Тотем каменного когтя VIII', '', 0), +(31121, 'ruRU', 'Тотем каменного когтя IX', '', 0), +(31122, 'ruRU', 'Тотем каменного когтя X', '', 0), +(5919, 'ruRU', 'Тотем каменной кожи II', '', 0), +(5920, 'ruRU', 'Тотем каменной кожи III', '', 0), +(7366, 'ruRU', 'Тотем каменной кожи IV', '', 0), +(7367, 'ruRU', 'Тотем каменной кожи V', '', 0), +(7368, 'ruRU', 'Тотем каменной кожи VI', '', 0), +(15470, 'ruRU', 'Тотем каменной кожи VII', '', 0), +(15474, 'ruRU', 'Тотем каменной кожи VIII', '', 0), +(31175, 'ruRU', 'Тотем каменной кожи IX', '', 0), +(31176, 'ruRU', 'Тотем каменной кожи X', '', 0), +(5921, 'ruRU', 'Тотем силы земли II', '', 0), +(5922, 'ruRU', 'Тотем силы земли III', '', 0), +(7403, 'ruRU', 'Тотем силы земли IV', '', 0), +(15464, 'ruRU', 'Тотем силы земли V', '', 0), +(15479, 'ruRU', 'Тотем силы земли VI', '', 0), +(30647, 'ruRU', 'Тотем силы земли VII', '', 0), +(31129, 'ruRU', 'Тотем силы земли VIII', '', 0), +(7483, 'ruRU', 'Тотем неистовства ветра II', '', 0), +(7484, 'ruRU', 'Тотем неистовства ветра III', '', 0), +(15496, 'ruRU', 'Тотем неистовства ветра IV', '', 0), +(15497, 'ruRU', 'Тотем неистовства ветра V', '', 0), +(11100, 'ruRU', 'Тотем прилива маны II', '', 0), +(11101, 'ruRU', 'Тотем прилива маны III', '', 0), +(17061, 'ruRU', 'Тотем прилива маны IV', '', 0), +(7486, 'ruRU', 'Тотем легкости воздуха', '', 0), +(7487, 'ruRU', 'Тотем легкости воздуха II', '', 0), +(15463, 'ruRU', 'Тотем легкости воздуха III', '', 0), +(30654, 'ruRU', 'Тотем гнева IV', '', 0), +(9687, 'ruRU', 'Тотем стены ветра', '', 0), +(9688, 'ruRU', 'Тотем стены ветра II', '', 0), +(9689, 'ruRU', 'Тотем стены ветра III', '', 0), +(15492, 'ruRU', 'Тотем стены ветра IV', '', 0); diff --git a/sql/updates/world/3.3.5/2025_04_30_01_world.sql b/sql/updates/world/3.3.5/2025_04_30_01_world.sql new file mode 100644 index 00000000000..38f9c644923 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_04_30_01_world.sql @@ -0,0 +1,3 @@ +-- +UPDATE `gameobject_template` SET `AIName`='' WHERE `entry`=101812; +DELETE FROM `smart_scripts` WHERE `source_type`=1 AND `entryorguid`=101812; diff --git a/sql/updates/world/3.3.5/2025_05_08_00_world.sql b/sql/updates/world/3.3.5/2025_05_08_00_world.sql new file mode 100644 index 00000000000..d5cf7fc10f3 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_08_00_world.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hungarfen_putrid_mushroom_primer'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(31693, 'spell_hungarfen_putrid_mushroom_primer'); diff --git a/sql/updates/world/3.3.5/2025_05_08_01_world.sql b/sql/updates/world/3.3.5/2025_05_08_01_world.sql new file mode 100644 index 00000000000..5f0de54a08f --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_08_01_world.sql @@ -0,0 +1,225 @@ +-- +DELETE FROM `spell_scripts` WHERE `id` = 37013; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_despawn_target' AND `spell_id` = 37013; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(37013, 'spell_gen_despawn_target'); + +DELETE FROM `spell_scripts` WHERE `id` = 32348; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_mana_tombs_summon_arcane_fiends'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(32348, 'spell_mana_tombs_summon_arcane_fiends'); + +DELETE FROM `spell_scripts` WHERE `id` IN (29126,29137,29135,29136,29138,29139,46672,46671); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_midsummer_cleansing_flames_darnassus', +'spell_midsummer_cleansing_flames_stormwind', +'spell_midsummer_cleansing_flames_ironforge', +'spell_midsummer_cleansing_flames_orgrimmar', +'spell_midsummer_cleansing_flames_thunder_bluff', +'spell_midsummer_cleansing_flames_the_undercity', +'spell_midsummer_cleansing_flames_silvermoon', +'spell_midsummer_cleansing_flames_the_exodar'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(29126, 'spell_midsummer_cleansing_flames_darnassus'), +(29137, 'spell_midsummer_cleansing_flames_stormwind'), +(29135, 'spell_midsummer_cleansing_flames_ironforge'), +(29136, 'spell_midsummer_cleansing_flames_orgrimmar'), +(29138, 'spell_midsummer_cleansing_flames_thunder_bluff'), +(29139, 'spell_midsummer_cleansing_flames_the_undercity'), +(46672, 'spell_midsummer_cleansing_flames_silvermoon'), +(46671, 'spell_midsummer_cleansing_flames_the_exodar'); + +DELETE FROM `spell_scripts` WHERE `id` = 52933; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_zuldrak_rampage_summon_zulaman_gods_master'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(52933, 'spell_zuldrak_rampage_summon_zulaman_gods_master'); + +DELETE FROM `spell_scripts` WHERE `id` = 51862; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_zuldrak_breaking_through_summon_zulaman_gods_master'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(51862, 'spell_zuldrak_breaking_through_summon_zulaman_gods_master'); + +DELETE FROM `spell_scripts` WHERE `id` IN (29182,29188); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_temple_of_ahnqiraj_teleport_to_twin_emperors', +'spell_temple_of_ahnqiraj_teleport_to_final_chamber'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(29182, 'spell_temple_of_ahnqiraj_teleport_to_twin_emperors'), +(29188, 'spell_temple_of_ahnqiraj_teleport_to_final_chamber'); + +DELETE FROM `spell_scripts` WHERE `id` IN (51864,51889); +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_zuldrak_summon_nass'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(51864, 'spell_zuldrak_summon_nass'), +(51889, 'spell_zuldrak_summon_nass'); + +DELETE FROM `spell_scripts` WHERE `id` = 36327; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 21186 AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE `entryorguid` = -79409 AND `source_type` = 0 AND `id` = 2; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(21186,0,0,0,8,0,100,0,36327,0,0,0,0,11,36521,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Arcane Warder Target - On Spellhit 'Shoot Arcane Explosion Arrow' - Cast 'Summon Arcane Explosion'"), +(-79409,0,2,0,8,0,100,0,36327,0,0,0,0,11,36521,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Arcane Warder Target - On Spellhit 'Shoot Arcane Explosion Arrow' - Cast 'Summon Arcane Explosion'"); + +DELETE FROM `spell_scripts` WHERE `id` = 45030; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 25003 AND `source_type` = 0 AND `id` = 3; +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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(25003,0,3,0,8,0,100,0,45030,0,0,0,0,11,45088,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Emissary of Hate - On Spellhit 'Impale Emissary' - Cast 'Emissary of Hate Credit'"); + +DELETE FROM `spell_scripts` WHERE `id` = 53010; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_zuldrak_remove_akalis_stun'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(53010, 'spell_zuldrak_remove_akalis_stun'); + +DELETE FROM `spell_scripts` WHERE `id` IN (47117,47149,47316,47405,50439); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_grizzly_hills_script_cast_summon_image_of_drakuru_01', +'spell_grizzly_hills_script_cast_summon_image_of_drakuru_02', +'spell_grizzly_hills_script_cast_summon_image_of_drakuru_03', +'spell_grizzly_hills_script_cast_summon_image_of_drakuru_04', +'spell_grizzly_hills_script_cast_summon_image_of_drakuru_05'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(47117, 'spell_grizzly_hills_script_cast_summon_image_of_drakuru_01'), +(47149, 'spell_grizzly_hills_script_cast_summon_image_of_drakuru_02'), +(47316, 'spell_grizzly_hills_script_cast_summon_image_of_drakuru_03'), +(47405, 'spell_grizzly_hills_script_cast_summon_image_of_drakuru_04'), +(50439, 'spell_grizzly_hills_script_cast_summon_image_of_drakuru_05'); + +DELETE FROM `spell_scripts` WHERE `id` IN (58916,58917); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_icecrown_gift_of_the_lich_king', +'spell_icecrown_consume_minions'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(58916, 'spell_icecrown_gift_of_the_lich_king'), +(58917, 'spell_icecrown_consume_minions'); + +DELETE FROM `spell_scripts` WHERE `id` = 37028; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_bem_dispelling_analysis'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(37028, 'spell_bem_dispelling_analysis'); + +DELETE FROM `spell_scripts` WHERE `id` = 37834; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_shadowmoon_unbanish_azaloth'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(37834, 'spell_shadowmoon_unbanish_azaloth'); + +DELETE FROM `spell_scripts` WHERE `id` = 46550; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_borean_tundra_weakness_to_lightning_on_quest_complete'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(46550, 'spell_borean_tundra_weakness_to_lightning_on_quest_complete'); + +DELETE FROM `spell_scripts` WHERE `id` IN (37867,37892,37894); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_shadowmoon_arcano_scorp_control_01', +'spell_shadowmoon_arcano_scorp_control_02', +'spell_shadowmoon_arcano_scorp_control_03'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(37867, 'spell_shadowmoon_arcano_scorp_control_01'), +(37892, 'spell_shadowmoon_arcano_scorp_control_02'), +(37894, 'spell_shadowmoon_arcano_scorp_control_03'); + +DELETE FROM `spell_scripts` WHERE `id` IN (25143,29128,29129,25140); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_terokkar_translocation_firewing_point_building_down', +'spell_terokkar_translocation_firewing_point_building_up', +'spell_terokkar_translocation_firewing_point_tower_down', +'spell_terokkar_translocation_firewing_point_tower_up'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(25143, 'spell_terokkar_translocation_firewing_point_building_down'), +(29128, 'spell_terokkar_translocation_firewing_point_building_up'), +(29129, 'spell_terokkar_translocation_firewing_point_tower_down'), +(25140, 'spell_terokkar_translocation_firewing_point_tower_up'); + +DELETE FROM `spell_scripts` WHERE `id` IN (25650,25652); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_hellfire_peninsula_translocation_falcon_watch_tower_down', +'spell_hellfire_peninsula_translocation_falcon_watch_tower_up'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(25650, 'spell_hellfire_peninsula_translocation_falcon_watch_tower_down'), +(25652, 'spell_hellfire_peninsula_translocation_falcon_watch_tower_up'); + +DELETE FROM `spell_scripts` WHERE `id` IN (34448,34452,35376,35727); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_eastern_kingdoms_duskwither_spire_up', +'spell_eastern_kingdoms_duskwither_spire_down', +'spell_eastern_kingdoms_silvermoon_to_undercity', +'spell_eastern_kingdoms_undercity_to_silvermoon'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(34448, 'spell_eastern_kingdoms_duskwither_spire_up'), +(34452, 'spell_eastern_kingdoms_duskwither_spire_down'), +(35376, 'spell_eastern_kingdoms_silvermoon_to_undercity'), +(35727, 'spell_eastern_kingdoms_undercity_to_silvermoon'); + +DELETE FROM `spell_scripts` WHERE `id` IN (47393,47615,47638); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_dragonblight_focus_on_the_beach_quest_completion_script', +'spell_dragonblight_atop_the_woodlands_quest_completion_script', +'spell_dragonblight_end_of_the_line_quest_completion_script'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(47393, 'spell_dragonblight_focus_on_the_beach_quest_completion_script'), +(47615, 'spell_dragonblight_atop_the_woodlands_quest_completion_script'), +(47638, 'spell_dragonblight_end_of_the_line_quest_completion_script'); + +DELETE FROM `spell_scripts` WHERE `id` = 24320; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_zulgurub_poisonous_blood'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(24320, 'spell_zulgurub_poisonous_blood'); + +DELETE FROM `spell_scripts` WHERE `id` = 45071; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_eastern_kingdoms_dead_scar_bombing_run'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(45071, 'spell_eastern_kingdoms_dead_scar_bombing_run'); + +DELETE FROM `spell_scripts` WHERE `id` = 57753; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 30681 AND `source_type` = 0 AND `id` = 5; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(30681,0,5,0,8,0,100,0,57753,0,0,0,0,11,57752,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Onyx Blaze Mistress - On Spellhit 'Conjure Flame Orb' - Cast 'Flame Orb Summon'"); + +DELETE FROM `spell_scripts` WHERE `id` = 46237; +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 25861; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 25861 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(25861,0,0,0,8,0,100,0,46237,0,0,0,0,41,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Orphaned Mammoth Calf - On Spellhit 'Dismiss Orphaned Mammoth' - Delayed Despawn"), +(25861,0,1,0,8,0,100,0,46237,0,0,0,0,28,46233,0,0,0,0,0,23,0,0,0,0,0,0,0,0,"Orphaned Mammoth Calf - On Spellhit 'Dismiss Orphaned Mammoth' - Remove Aura 'Call Mammoth Orphan'"); + +DELETE FROM `spell_scripts` WHERE `id` = 23301; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_icecrown_ebon_blade_banner'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(23301, 'spell_icecrown_ebon_blade_banner'); + +DELETE FROM `spell_scripts` WHERE `id` IN (54620,58622); +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_dalaran_teleport_to_dalaran', +'spell_dalaran_teleport_to_lake_wintergrasp'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(54620, 'spell_dalaran_teleport_to_dalaran'), +(58622, 'spell_dalaran_teleport_to_lake_wintergrasp'); + +DELETE FROM `spell_scripts` WHERE `id` = 52124; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_chapter1_sky_darkener_assault'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(52124, 'spell_chapter1_sky_darkener_assault'); + +DELETE FROM `spell_scripts` WHERE `id` = 45188; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_eastern_kingdoms_dawnblade_attack'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(45188, 'spell_eastern_kingdoms_dawnblade_attack'); + +DELETE FROM `spell_scripts` WHERE `id` = 45958; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_borean_tundra_signal_alliance'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(45958, 'spell_borean_tundra_signal_alliance'); + +DELETE FROM `spell_scripts` WHERE `id` = 46289; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_muru_negative_energy'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(46289, 'spell_muru_negative_energy'); + +DELETE FROM `spell_scripts` WHERE `id` = 26393; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_lunar_festival_elunes_blessing'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(26393, 'spell_lunar_festival_elunes_blessing'); + +DELETE FROM `spell_scripts` WHERE `id` = 49466; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_brewfest_mole_machine_portal_schedule'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(49466, 'spell_brewfest_mole_machine_portal_schedule'); diff --git a/sql/updates/world/3.3.5/2025_05_09_00_world.sql b/sql/updates/world/3.3.5/2025_05_09_00_world.sql new file mode 100644 index 00000000000..9daa49f9c42 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_09_00_world.sql @@ -0,0 +1,15 @@ +-- +UPDATE `spell_script_names` SET `ScriptName` = 'spell_gen_cancel_aura' WHERE `ScriptName` = 'spell_love_is_in_the_air_fragrant_air_analysis'; -- 70192 +UPDATE `spell_script_names` SET `ScriptName` = 'spell_gen_cancel_aura' WHERE `ScriptName` = 'spell_storm_peaks_remove_collapsing_cave_aura'; -- 55693 +UPDATE `spell_script_names` SET `ScriptName` = 'spell_gen_cancel_aura' WHERE `ScriptName` = 'spell_deathbringer_remove_marks'; -- 72257 + +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_cancel_aura' AND `spell_id` IN (45604,56923,59556,60654,69171,69298,70079,69098); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(45604, 'spell_gen_cancel_aura'), +(56923, 'spell_gen_cancel_aura'), +(59556, 'spell_gen_cancel_aura'), +(60654, 'spell_gen_cancel_aura'), +(69171, 'spell_gen_cancel_aura'), +(69298, 'spell_gen_cancel_aura'), +(70079, 'spell_gen_cancel_aura'), +(69098, 'spell_gen_cancel_aura'); diff --git a/sql/updates/world/3.3.5/2025_05_17_00_world.sql b/sql/updates/world/3.3.5/2025_05_17_00_world.sql new file mode 100644 index 00000000000..e2287bb182d --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_00_world.sql @@ -0,0 +1,12 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_mekgineer_steamrigger_summon_gnomes'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(31531, 'spell_mekgineer_steamrigger_summon_gnomes'); + +DELETE FROM `spell_target_position` WHERE `ID` IN (31528,31529,31530); +INSERT INTO `spell_target_position` (`ID`,`EffectIndex`,`MapID`,`PositionX`,`PositionY`,`PositionZ`,`Orientation`,`VerifiedBuild`) VALUES +(31528,0,545,-315.56015,-164.80557,-7.7555575,1.251415848731994628,0), +(31529,0,545,-347.00745,-160.84607,-7.7555575,0.530080020427703857,0), +(31530,0,545,-329.94170,-113.43509,-7.7555575,5.497043132781982421,0); + +UPDATE `creature_text` SET `Text` = "Tune 'em up good, boys!", `BroadcastTextId` = 14602 WHERE `CreatureID` = 17796 AND `GroupID` = 0 AND `ID` = 0; diff --git a/sql/updates/world/3.3.5/2025_05_17_01_world.sql b/sql/updates/world/3.3.5/2025_05_17_01_world.sql new file mode 100644 index 00000000000..e24e7ddf354 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_01_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_harbinger_skyriss_health'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(36928, 'spell_harbinger_skyriss_health'), +(36930, 'spell_harbinger_skyriss_health'); diff --git a/sql/updates/world/3.3.5/2025_05_17_02_world.sql b/sql/updates/world/3.3.5/2025_05_17_02_world.sql new file mode 100644 index 00000000000..1bf341b5dca --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_02_world.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `creature_text` WHERE `CreatureID` = 17978 AND `GroupID` = 8; +INSERT INTO `creature_text` (`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(17978,8,0,"Welcome my brothers! Bask in the glory of my power!",14,0,100,53,0,0,16961,0,"Thorngrin the Tender - Intro"); + +UPDATE `creature_template` SET `ScriptName` = 'boss_thorngrin_the_tender' WHERE `ScriptName` = 'thorngrin_the_tender'; diff --git a/sql/updates/world/3.3.5/2025_05_17_03_world.sql b/sql/updates/world/3.3.5/2025_05_17_03_world.sql new file mode 100644 index 00000000000..02e836d3144 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_03_world.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_darkweaver_syth_summon_elementals'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(33595, 'spell_darkweaver_syth_summon_elementals'); diff --git a/sql/updates/world/3.3.5/2025_05_17_04_world.sql b/sql/updates/world/3.3.5/2025_05_17_04_world.sql new file mode 100644 index 00000000000..4ca457286a2 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_04_world.sql @@ -0,0 +1,7 @@ +-- +UPDATE `spell_script_names` SET `ScriptName` = 'spell_ahune_summoning_rhyme_aura' WHERE `ScriptName` = 'spell_summoning_rhyme_aura'; +UPDATE `spell_script_names` SET `ScriptName` = 'spell_ahune_summon_ice_spear_delayer' WHERE `ScriptName` = 'spell_summon_ice_spear_delayer'; +UPDATE `spell_script_names` SET `ScriptName` = 'spell_ahune_ice_spear_control_aura' WHERE `ScriptName` = 'spell_ice_spear_control_aura'; +UPDATE `spell_script_names` SET `ScriptName` = 'spell_ahune_ice_spear_target_picker' WHERE `ScriptName` = 'spell_ice_spear_target_picker'; +UPDATE `spell_script_names` SET `ScriptName` = 'spell_ahune_slippery_floor_periodic' WHERE `ScriptName` = 'spell_slippery_floor_periodic'; +UPDATE `spell_script_names` SET `ScriptName` = 'spell_ahune_ice_bombardment_dest_picker' WHERE `ScriptName` = 'spell_ice_bombardment_dest_picker'; diff --git a/sql/updates/world/3.3.5/2025_05_17_05_world.sql b/sql/updates/world/3.3.5/2025_05_17_05_world.sql new file mode 100644 index 00000000000..6aef90e9b0f --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_05_world.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_pathaleon_summon_nether_wraiths'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(35284, 'spell_pathaleon_summon_nether_wraiths'); diff --git a/sql/updates/world/3.3.5/2025_05_17_06_world.sql b/sql/updates/world/3.3.5/2025_05_17_06_world.sql new file mode 100644 index 00000000000..f6acdd50f24 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_06_world.sql @@ -0,0 +1,11 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 32301; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,32301,0,0,31,0,3,18371,0,0,0,0,"","Group 0: Spell 'Ping Shirrak' (Effect 0) targets creature 'Shirrak the Dead Watcher'"); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN('spell_shirrak_ping_shirrak', 'spell_shirrak_inhibit_magic'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(32301, 'spell_shirrak_ping_shirrak'), +(32264, 'spell_shirrak_inhibit_magic'); + +UPDATE `creature_template` SET `flags_extra` = `flags_extra` | 128 WHERE `entry` IN (18374,20308); diff --git a/sql/updates/world/3.3.5/2025_05_17_07_world.sql b/sql/updates/world/3.3.5/2025_05_17_07_world.sql new file mode 100644 index 00000000000..c99711a29c2 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_07_world.sql @@ -0,0 +1,22 @@ +-- Fixes for outro to quest "How Big a Threat?" (985) + +-- Grimclaw's waypoints +DELETE FROM `waypoints` WHERE `entry`=3695; +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(3695,1,6409.01,381.597,13.7997,"Grimclaw"), +(3695,2,6422.38,398.542,11.1623,"Grimclaw"), +(3695,3,6425.87,399.465,10.927,"Grimclaw"), +(3695,4,6427.87,397.483,11.078,"Grimclaw"), +(3695,5,6429.45,392.999,12.467,"Grimclaw"), +(3695,6,6435.15,376.543,13.940,"Grimclaw"), +(3695,7,6437.69,369.887,13.940,"Grimclaw"), +(3695,8,6436.29,366.529,13.942,"Grimclaw"), +(3695,9,6436.94,373.378,13.940,"Grimclaw"), +(3695,10,6431.37,388.937,13.693,"Grimclaw"), +(3695,11,6426.25,398.279,11.016,"Grimclaw"), +(3695,12,6421.10,397.351,11.287,"Grimclaw"), +(3695,13,6406.53,381.324,14.168,"Grimclaw"); + +-- Updating Smart Scripts to work with new waypoints +UPDATE `smart_scripts` SET `event_param1`=8,`comment`='Grimclaw - On WP 8 Reached (Path 3695) - Run Actionlist' WHERE `entryorguid`=3695 AND `id`=2; +UPDATE `smart_scripts` SET `event_param1`=13,`comment`='Grimclaw - On WP 13 Reached (Path 3695) - Despawn' WHERE `entryorguid`=3695 AND `id`=3; diff --git a/sql/updates/world/3.3.5/2025_05_17_08_world.sql b/sql/updates/world/3.3.5/2025_05_17_08_world.sql new file mode 100644 index 00000000000..ef179e1efd2 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_08_world.sql @@ -0,0 +1,55 @@ +-- More Blizzlike fixes for quest "Therylune's Escape" (945) + +-- Therylune's script +DELETE FROM `smart_scripts` WHERE `entryorguid`=3584 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (358400,358401) 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`,`event_param5`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_param4`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(3584,0,0,0,11,0,100,0,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Spawn - Say Line 2"), +(3584,0,1,0,2,0,100,1,0,15,0,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Therylune - Between 0-15% Health - Flee For Assist"), +(3584,0,2,0,19,0,100,0,945,0,0,0,0,80,358400,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Quest Accept - Run Script"), +(3584,0,3,0,40,0,100,0,12,3584,0,0,0,80,358401,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On WP 12 Reached - Run Script"), +(3584,0,4,0,40,0,100,0,16,3584,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On WP 16 - Say Line 3"), +(3584,0,5,0,40,0,100,0,16,3584,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On WP 16 - Forced Despawn"), +(3584,0,6,0,6,0,100,0,0,0,0,0,0,6,945,0,0,0,0,0,12,1,0,0,0,0,0,0,0,"Therylune - On Death - Fail quest"), + +-- Timed List 1 +(358400,9,1,0,0,0,100,0,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Script - Remove Npc Flag Questgiver"), +(358400,9,2,0,0,0,100,0,0,0,0,0,0,64,1,0,0,0,0,0,16,0,0,0,0,0,0,0,0,"Therylune - On Script - Store Target"), +(358400,9,3,0,0,0,100,0,0,0,0,0,0,145,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Script - Remove Flag Immune to NPC"), +(358400,9,4,0,0,0,100,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Scrip - Say Line 0"), +(358400,9,5,0,0,0,100,0,0,0,0,0,0,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Scrip - Set Faction 250"), +(358400,9,6,0,0,0,100,0,0,0,0,0,0,8,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Scrip - Set React State 1"), +(358400,9,7,0,0,0,100,0,0,0,0,0,0,53,0,3584,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Scrip - Start WP"), + +-- Timed List 2 +(358401,9,0,0,0,0,100,0,0,0,0,0,0,54,5000,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Script - Pause Waypoint"), +(358401,9,1,0,0,0,100,0,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Script - Set Run On"), +(358401,9,2,0,0,0,100,0,1000,1000,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Therylune - On Script - Set Orientation Invoker"), +(358401,9,3,0,0,0,100,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,"Therylune - On Script - Say Line 1"), +(358401,9,4,0,0,0,100,0,0,0,0,0,0,15,945,0,0,0,0,0,7,0,0,0,0,0,0,0,0,"Therylune - On Script - Quest Credit"); + +-- Therylune's creature text +DELETE FROM `creature_text` WHERE `CreatureID`=3584 AND `GroupID` IN (2,3); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(3584,2,0,"%s hides among the bushes.",16,7,100,0,0,0,1186,0,"Therylune"), +(3584,3,0,"%s disappears into the woods.",16,7,100,0,0,0,1190,0,"Therylune"); + +-- Therylune's waypoints +DELETE FROM `waypoints` WHERE `entry`=3584; +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(3584,1,4504.28,389.60,31.9814,"Therylune"), +(3584,2,4512.16,374.68,33.2877,"Therylune"), +(3584,3,4532.26,369.353,31.5946,"Therylune"), +(3584,4,4575.78,372.10,31.4839,"Therylune"), +(3584,5,4599.76,365.036,31.5225,"Therylune"), +(3584,6,4598.63,350.758,33.6244,"Therylune"), +(3584,7,4573.25,343.515,42.1702,"Therylune"), +(3584,8,4557.85,341.514,47.2117,"Therylune"), +(3584,9,4555.56,335.148,48.7235,"Therylune"), +(3584,10,4563.15,312.387,53.6122,"Therylune"), +(3584,11,4557.81,305.154,57.5486,"Therylune"), +(3584,12,4528.66,287.463,56.2182,"Therylune"), +(3584,13,4479.74,265.108,59.2870,"Therylune"), +(3584,14,4397.44,249.499,58.3769,"Therylune"), +(3584,15,4347.50,260.826,54.2498,"Therylune"), +(3584,16,4328.62,250.360,58.0594,"Therylune"); diff --git a/sql/updates/world/3.3.5/2025_05_17_09_world.sql b/sql/updates/world/3.3.5/2025_05_17_09_world.sql new file mode 100644 index 00000000000..6d8e60df832 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_09_world.sql @@ -0,0 +1,478 @@ +-- +-- Search by Light Leather item (2318) +UPDATE `creature_template` SET `skinloot` = 60079 WHERE `entry` IN +(5053,3619,1224,3721,17589,17588,3257,3424,4008,3236,2187,213,4129,2165,3247,2323,5829,3245,17527,17348,547,16349,3475,3466,565,2237,3256,1923,3426,16355,2172,3239, +3463,4011,1189,3416,3816,3240,6788,1192,2071,3823,4009,3722 /* guessed */,17661,3398); +UPDATE `creature_template` SET `skinloot` = 60080 WHERE `entry` IN +(3653,3861,3862,5058,3853,3851,3854,3865,3855,3914,3864,3652 /* guessed */); +UPDATE `creature_template` SET `skinloot` = 60081 WHERE `entry` IN +(4887,4279,4827,1225 /* guessed */,3859,4824,3866,4514,3868,5842 /* guessed */,4511,2529,3857,3886,17592 /* guessed */); +UPDATE `creature_template` SET `skinloot` = 60082 WHERE `entry` IN +(521,4015,3237,5832,3774,4044,1017,2354,3472,4067,3238,4042,3824,12940,4018,4117,2089,3809,3235,345,12678,923,4013,2356,3817,1020,4128,3250,1258,4032,2384,4012,2476, +2351,4019,4126,3473,3252,3474); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (3619,3722,3652,17592,5832,5842); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60079,60080,60081,60082); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60079,783,0,5,0,1,1,1,1,'Light Hide'), +(60079,2318,0,73,0,1,1,1,2,'Light Leather'), +(60079,2319,0,20,0,1,1,1,1,'Medium Leather'), +(60079,4232,0,2,0,1,1,1,1,'Medium Hide'), + +(60080,783,0,7,0,1,1,1,1,'Light Hide'), +(60080,2318,0,65,0,1,1,1,2,'Light Leather'), +(60080,2319,0,25,0,1,1,1,2,'Medium Leather'), +(60080,4232,0,3,0,1,1,1,1,'Medium Hide'), + +(60081,783,0,4,0,1,1,1,1,'Light Hide'), +(60081,2318,0,35,0,1,1,1,2,'Light Leather'), +(60081,2319,0,55,0,1,1,1,2,'Medium Leather'), +(60081,4232,0,6,0,1,1,1,1,'Medium Hide'), + +(60082,783,0,3,0,1,1,1,1,'Light Hide'), +(60082,2318,0,42,0,1,1,1,2,'Light Leather'), +(60082,2319,0,50,0,1,1,1,1,'Medium Leather'), +(60082,4232,0,5,0,1,1,1,1,'Medium Hide'); + +-- +-- Search by Thick Wolfhide item (8368) +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (14282); +-- Different difficulties apparently should have different loot, but we have no data +UPDATE `creature_template` SET `skinloot` = 60083 WHERE `entry` IN (14282,22738,31977); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60083); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +-- Unique. No enough data for better values, guessed +-- I think it's wrong to put here all of that at once. Knothide leather is from different difficulty +(60083,21887,0,48,0,1,1,1,1,'Knothide Leather'), +(60083,25649,0,23,0,1,1,2,3,'Knothide Leather Scraps'), +(60083,8170,0,15,0,1,1,1,1,'Rugged Leather'), +(60083,4304,0,11,0,1,1,1,1,'Thick Leather'), +(60083,8368,0,1,0,1,1,1,1,'Thick Wolfhide'), +(60083,8169,0,1,0,1,1,1,1,'Thick Hide'), +(60083,8171,0,1,0,1,1,1,1,'Rugged Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (12121,12122); +-- Different difficulties apparently should have different loot, but we have no data +UPDATE `creature_template` SET `skinloot` = 60084 WHERE `entry` IN (12121,22540,31964,12122,22546,31970); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60084); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +-- No enough data for better values, guessed +(60084,21887,0,42,0,1,1,1,1,'Knothide Leather'), +(60084,25649,0,30,0,1,1,2,3,'Knothide Leather Scraps'), +(60084,8170,0,22,0,1,1,1,2,'Rugged Leather'), +(60084,4304,0,3,0,1,1,1,2,'Thick Leather'), +(60084,8368,0,2,0,1,1,1,1,'Thick Wolfhide'), +(60084,8171,0,1,0,1,1,1,1,'Rugged Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (2681); + +UPDATE `creature_template` SET `skinloot` = 60085 WHERE `entry` IN (2681); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60085); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60085,4304,0,73,0,1,1,1,2,'Thick Leather'), +(60085,8170,0,20,0,1,1,1,2,'Rugged Leather'), +(60085,8169,0,5,0,1,1,1,1,'Thick Hide'), +(60085,8368,0,2,0,1,1,1,1,'Thick Wolfhide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (10147,8921,10981,2925,2680,5984,2926,5985,5288); + +UPDATE `creature_template` SET `skinloot` = 60086 WHERE `entry` IN +(10147 /* copied, is he really skinnable? */,14339,8921,10981,22737,31975,2925,2680,5984,2926,5985,5288); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60086); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60086,4304,0,73,0,1,1,1,1,'Thick Leather'), +(60086,8170,0,20,0,1,1,1,1,'Rugged Leather'), +(60086,8169,0,5,0,1,1,1,1,'Thick Hide'), +(60086,8368,0,2,0,1,1,1,1,'Thick Wolfhide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (9696,13036,8718); + +UPDATE `creature_template` SET `skinloot` = 60087 WHERE `entry` IN +(9696,11885,13036,8718); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60087); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60087,8170,0,83,0,1,1,1,2,'Rugged Leather'), +(60087,4304,0,10,0,1,1,1,2,'Thick Leather'), +(60087,8171,0,5,0,1,1,1,1,'Rugged Hide'), +(60087,8368,0,2,0,1,1,1,1,'Thick Wolfhide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (9042,9416,10221); + +UPDATE `creature_template` SET `skinloot` = 60088 WHERE `entry` IN +(9042,9416,10221); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60088); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60088,8170,0,50,0,1,1,1,2,'Rugged Leather'), +(60088,4304,0,41,0,1,1,1,2,'Thick Leather'), +(60088,8171,0,4,0,1,1,1,1,'Rugged Hide'), +(60088,8169,0,3,0,1,1,1,1,'Thick Hide'), +(60088,8368,0,2,0,1,1,1,1,'Thick Wolfhide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (7055,9690,9694,12418,8922,10156,1817,9697); + +UPDATE `creature_template` SET `skinloot` = 60089 WHERE `entry` IN +(7055,9690,9694,12418,8922,10077,1817,9697); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60089); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60089,8170,0,50,0,1,1,1,1,'Rugged Leather'), +(60089,4304,0,41,0,1,1,1,1,'Thick Leather'), +(60089,8171,0,4,0,1,1,1,1,'Rugged Hide'), +(60089,8169,0,3,0,1,1,1,1,'Thick Hide'), +(60089,8368,0,2,0,1,1,1,1,'Thick Wolfhide'); + +-- Shouldn't be skinnable +UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` IN (5438); -- Tamed Cat +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (10150); + +-- +-- Search by Patch of Tainted Skin (11512) +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (7126,8961,8958,8960,7125,8956,8959); + +UPDATE `creature_template` SET `skinloot` = 60090 WHERE `entry` IN +(7126,8961,8958,8960,7125,8956,8959); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60090); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60090,8170,0,50,0,1,1,1,1,'Rugged Leather'), +(60090,4304,0,43,0,1,1,1,1,'Thick Leather'), +(60090,11512,0,35,0,1,0,1,1,'Patch of Tainted Skin'), +(60090,8171,0,4,0,1,1,1,1,'Rugged Hide'), +(60090,8169,0,3,0,1,1,1,1,'Thick Hide'); + +-- Fix wrong chance +UPDATE `skinning_loot_template` SET `Chance` = 35 WHERE `Entry` = 60059 AND `Item` = 11512; + +-- +-- Search by Thick Yeti Fur item (12366) +-- Actually skinnable only from Rogue Ice Thistle and Ice Thistle Yeti, NOT from all yetis +-- And the chance is quite low +-- Weirdly enough we have 3 template here for 4 NPC and not 2 because the chance is a bit different for unknown reason +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (7457,7458,7459,7460); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60091,60092,60093); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60091,4304,0,43,0,1,1,1,1,'Thick Leather'), +(60091,8169,0,3,0,1,1,1,1,'Thick Hide'), +(60091,8170,0,50,0,1,1,1,1,'Rugged Leather'), +(60091,8171,0,4,0,1,1,1,1,'Rugged Hide'), +(60091,12366,0,10,1,1,0,1,1,'Thick Yeti Fur'), + +(60092,4304,0,43,0,1,1,1,1,'Thick Leather'), +(60092,8169,0,3,0,1,1,1,1,'Thick Hide'), +(60092,8170,0,50,0,1,1,1,1,'Rugged Leather'), +(60092,8171,0,4,0,1,1,1,1,'Rugged Hide'), +(60092,12366,0,4,1,1,0,1,1,'Thick Yeti Fur'), + +(60093,4304,0,15,0,1,1,1,1,'Thick Leather'), +(60093,8170,0,80,0,1,1,1,1,'Rugged Leather'), +(60093,8171,0,5,0,1,1,1,1,'Rugged Hide'); + +UPDATE `creature_template` SET `skinloot` = 60091 WHERE `entry` IN (7457); +UPDATE `creature_template` SET `skinloot` = 60092 WHERE `entry` IN (7458); +UPDATE `creature_template` SET `skinloot` = 60093 WHERE `entry` IN (7459,7460); + +-- +-- Not skinnable, birds +UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` IN (5982,5983); +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (5982); + + +-- +-- Search by Thick Leather item, in DB, ordered by chance +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (11368); + +UPDATE `creature_template` SET `skinloot` = 60094 WHERE `entry` IN (11368); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60094); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60094,8170,0,70,0,1,1,1,1,'Rugged Leather'), +(60094,4304,0,15,0,1,1,1,1,'Thick Leather'), +(60094,19767,0,10,0,1,1,1,1,'Primal Bat Leather'), +(60094,8171,0,5,0,1,1,1,1,'Rugged Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (11360,11361); + +UPDATE `creature_template` SET `skinloot` = 60095 WHERE `entry` IN (11360,11361); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60095); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60095,8170,0,60,0,1,1,1,2,'Rugged Leather'), +(60095,19768,0,20,0,1,1,1,1,'Primal Tiger Leather'), +(60095,4304,0,15,0,1,1,1,2,'Thick Leather'), +(60095,8171,0,5,0,1,1,1,1,'Rugged Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (16117,8598,10200,11373,8602,9684,10741,7462); + +UPDATE `creature_template` SET `skinloot` = 60096 WHERE `entry` IN (16117,8598,10200,11373,8602,9684,10741,7462); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60096); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60096,8170,0,80,0,1,1,1,1,'Rugged Leather'), +(60096,4304,0,15,0,1,1,1,1,'Thick Leather'), +(60096,8171,0,5,0,1,1,1,1,'Rugged Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (11372,11357,14821,12800,11371,2759,11365,12801,15043,2757,10737,4374); + +UPDATE `creature_template` SET `skinloot` = 60097 WHERE `entry` IN (11372,11357,14821,12800,11371,2759,11365,12801,15043,2757,10737,4374); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60097); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60097,8170,0,80,0,1,1,1,2,'Rugged Leather'), +(60097,4304,0,15,0,1,1,1,2,'Thick Leather'), +(60097,8171,0,5,0,1,1,1,1,'Rugged Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(6581,5291,5349,6507,9318,8675,731,2659,8760,9683,6506,6508,5274,6505,6375,6378,9166,5990,5992,10990,22726,31921,6377,5306,9162,5421,5427,5262,8660,8759,9165,5346,8280); + +UPDATE `creature_template` SET `skinloot` = 60098 WHERE `entry` IN +(6581,5291,5349,6507,9318,8675,731,2659,8760,9683,6506,6508,5274,6505,6375,6378,9166,5990,5992,10990,22726,31921,6377,5306,9162,5421,5427,5262,8660,8759,9165,5346,8280); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60098); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60098,4304,0,77,0,1,1,1,1,'Thick Leather'), +(60098,8170,0,20,0,1,1,1,1,'Rugged Leather'), +(60098,8169,0,3,0,1,1,1,1,'Thick Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(13596,8438,8927,8928,5225,8336,8095,13323,7273,5226,8120,12207); + +UPDATE `creature_template` SET `skinloot` = 60099 WHERE `entry` IN +(13596,8438,8927,8928,5225,8336,8095,13323,7273,5226,8120,12207); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60099); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60099,4304,0,70,0,1,1,1,2,'Thick Leather'), +(60099,8170,0,25,0,1,1,1,2,'Rugged Leather'), +(60099,8169,0,5,0,1,1,1,1,'Thick Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(6140,9622,6503,10197,6379,6380,6513,8761,6516,8600,9163,9167,14502,5993,6349,5991,6502,8596,8601,6514,6010,9164,8597,6348,6501,6347,6585,6504,8300); + +UPDATE `creature_template` SET `skinloot` = 60100 WHERE `entry` IN +(6140,9622,6503,10197,6379,6380,6513,8761,6516,8600,9163,9167,14502,5993,6349,5991,6502,8596,8601,6514,6010,9164,8597,6348,6501,6347,6585,6504,8300); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60100); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60100,8170,0,50,0,1,1,1,1,'Rugged Leather'), +(60100,4304,0,43,0,1,1,1,1,'Thick Leather'), +(60100,8171,0,4,0,1,1,1,1,'Rugged Hide'), +(60100,8169,0,3,0,1,1,1,1,'Thick Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(5708,9029); + +UPDATE `creature_template` SET `skinloot` = 60101 WHERE `entry` IN +(5708,9029); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60101); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60101,8170,0,50,0,1,1,1,2,'Rugged Leather'), +(60101,4304,0,43,0,1,1,1,2,'Thick Leather'), +(60101,8171,0,4,0,1,1,1,1,'Rugged Hide'), +(60101,8169,0,3,0,1,1,1,1,'Thick Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(2521,2522); + +UPDATE `creature_template` SET `skinloot` = 60102 WHERE `entry` IN +(2521,2522); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60102); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60102,4304,0,65,0,1,1,1,1,'Thick Leather'), +(60102,4234,0,20,0,1,1,1,1,'Heavy Leather'), +(60102,8170,0,10,0,1,1,1,1,'Rugged Leather'), +(60102,8169,0,4,0,1,1,1,1,'Thick Hide'), +(60102,4235,0,1,0,1,1,1,1,'Heavy Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(5833); + +UPDATE `creature_template` SET `skinloot` = 60103 WHERE `entry` IN +(5833); +-- Guessed values, from above, the only difference is count +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60103); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60103,4304,0,65,0,1,1,1,2,'Thick Leather'), +(60103,4234,0,20,0,1,1,1,1,'Heavy Leather'), +(60103,8170,0,10,0,1,1,1,2,'Rugged Leather'), +(60103,8169,0,4,0,1,1,1,1,'Thick Hide'), +(60103,4235,0,1,0,1,1,1,1,'Heavy Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(1559); + +UPDATE `creature_template` SET `skinloot` = 60104 WHERE `entry` IN +(1559); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60104); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60104,4304,0,50,0,1,1,1,2,'Thick Leather'), +(60104,4234,0,30,0,1,1,1,1,'Heavy Leather'), +(60104,8170,0,12,0,1,1,1,2,'Rugged Leather'), +(60104,8169,0,4,0,1,1,1,1,'Thick Hide'), +(60104,4235,0,3,0,1,1,1,1,'Heavy Hide'), +(60104,8171,0,1,0,1,1,1,1,'Rugged Hide'); + +-- +-- Fix errors +UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` IN (11871); -- Is it really skinnable? +-- Comments say it's not required to have Cenarion Beacon in inventory to loot Patch of Tainted Skin +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 11 AND `SourceEntry` = 11512; + +-- +-- Not skinnable +UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` IN (14750); +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (14750); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(11673,11982); + +UPDATE `creature_template` SET `skinloot` = 60105 WHERE `entry` IN +(11673,11982); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60105); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60105,17012,0,100,0,1,1,1,1,'Core Leather'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(10184); + +UPDATE `creature_template` SET `skinloot` = 60106 WHERE `entry` IN +(10184,36538); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60106); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60106,15410,0,100,0,1,1,2,4,'Scale of Onyxia'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(3674); + +UPDATE `creature_template` SET `skinloot` = 60107 WHERE `entry` IN +(3674); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60107); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60107,2319,0,100,0,1,0,3,5,'Medium Leather'), +(60107,4232,0,50,0,1,0,1,1,'Medium Hide'); + +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(4539); + +UPDATE `creature_template` SET `skinloot` = 60108 WHERE `entry` IN +(4539); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60108); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60108,2319,0,60,0,1,1,1,2,'Medium Leather'), +(60108,4234,0,30,0,1,1,1,2,'Heavy Leather'), +(60108,4232,0,7,0,1,1,1,1,'Medium Hide'), +(60108,4235,0,3,0,1,1,1,1,'Heavy Hide'); + +-- Zulian Stalker, Zulian Guardian, Zulian Prowler +-- No info, removing +DELETE FROM `skinning_loot_template` WHERE `Entry` IN +(10257); + +UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` IN +(15067,15068,15101); + +-- Swiftmane +UPDATE `creature_template` SET `skinloot` = 60081 WHERE `entry` IN (5831); +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (5831); + +-- Azzere the Skyblade +UPDATE `creature_template` SET `skinloot` = 60082 WHERE `entry` IN (5834); +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (5834); + +-- Halycon & Gizrul the Slavener +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (10220,10268); + +UPDATE `creature_template` SET `skinloot` = 60110 WHERE `entry` IN (10220,10268); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60110); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60110,8170,0,90,0,1,1,3,5,'Rugged Leather'), +(60110,8171,0,10,0,1,1,1,1,'Rugged Hide'); + +-- The Beast +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (10430); + +UPDATE `creature_template` SET `skinloot` = 60111 WHERE `entry` IN (10430); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60111); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60111,8170,0,82,0,1,1,4,6,'Rugged Leather'), +(60111,8171,0,15,0,1,1,1,2,'Rugged Hide'), +(60111,12731,0,3,0,1,1,1,1,'Pristine Hide of the Beast'); + +-- Soulflayer & Chimaerok Devourer +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (11359,12802); + +UPDATE `creature_template` SET `skinloot` = 60112 WHERE `entry` IN (11359,12802); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60112); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60112,8170,0,95,0,1,1,1,3,'Rugged Leather'), +(60112,8171,0,5,0,1,1,1,1,'Rugged Hide'); + +-- A couple more +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (11496,15554); + +UPDATE `creature_template` SET `skinloot` = 60113 WHERE `entry` IN (11496,15554); + +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (60113); +INSERT INTO `skinning_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(60113,8170,0,97,0,1,1,1,1,'Rugged Leather'), +(60113,8171,0,3,0,1,1,1,1,'Rugged Hide'); + +-- No data at all \ good data for 1984, 1985, 3098, 3124, 16095 but skinnable + +-- +-- +DELETE FROM `skinning_loot_template` WHERE `Entry` IN (100007,100006,100004,100003,100005); + +UPDATE `creature_template` SET `skinloot` = 60098 WHERE `entry` = 5347; +UPDATE `creature_template` SET `skinloot` = 60098 WHERE `entry` = 6648; +UPDATE `creature_template` SET `skinloot` = 60098 WHERE `entry` = 8302; +UPDATE `creature_template` SET `skinloot` = 60098 WHERE `entry` = 8303; +UPDATE `creature_template` SET `skinloot` = 60098 WHERE `entry` = 14344; +UPDATE `creature_template` SET `skinloot` = 60098 WHERE `entry` = 3581; +UPDATE `creature_template` SET `skinloot` = 60081 WHERE `entry` = 14357; +UPDATE `creature_template` SET `skinloot` = 60079 WHERE `entry` = 2188; -- Guessed, from 1224 +UPDATE `creature_template` SET `skinloot` = 60112 WHERE `entry` = 12803; +UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` = 4950; -- Easier to remove it completely, no data at all +UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` = 14237; -- Easier to remove it completely, no data at all +UPDATE `creature_template` SET `skinloot` = 60082 WHERE `entry` = 10644; +UPDATE `creature_template` SET `skinloot` = 60096 WHERE `entry` = 6583; +UPDATE `creature_template` SET `skinloot` = 60054 WHERE `entry` = 14280; +UPDATE `creature_template` SET `skinloot` = 60081 WHERE `entry` IN (335,5828); +UPDATE `creature_template` SET `skinloot` = 60082 WHERE `entry` IN (628,819,1015,1016,1021,1022,1400,1417,2275,3249,3810,4014,4016,4031,4250); diff --git a/sql/updates/world/3.3.5/2025_05_17_10_world.sql b/sql/updates/world/3.3.5/2025_05_17_10_world.sql new file mode 100644 index 00000000000..08037a6e753 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_17_10_world.sql @@ -0,0 +1,30 @@ +-- This is not a math session to calculate it every time +UPDATE `skinning_loot_template` SET `Chance` = 90 WHERE `Entry` = 70060 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 70 WHERE `Entry` = 70061 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 80 WHERE `Entry` = 70062 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 50 WHERE `Entry` = 70063 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 50 WHERE `Entry` = 70063 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 80 WHERE `Entry` = 70064 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 50 WHERE `Entry` = 70065 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 50 WHERE `Entry` = 70065 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 70 WHERE `Entry` = 70066 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 100 WHERE `Entry` = 70067 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 70 WHERE `Entry` = 70160 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 45 WHERE `Entry` = 70161 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 45 WHERE `Entry` = 70162 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 55 WHERE `Entry` = 70163 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 30 WHERE `Entry` = 70164 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 30 WHERE `Entry` = 70164 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 28.5 WHERE `Entry` = 70165 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 28.5 WHERE `Entry` = 70165 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 65 WHERE `Entry` = 70166 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 40 WHERE `Entry` = 70167 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 45 WHERE `Entry` = 70168 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 45 WHERE `Entry` = 70168 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 40 WHERE `Entry` = 70169 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 40 WHERE `Entry` = 70169 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 75 WHERE `Entry` = 70170 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 35 WHERE `Entry` = 70171 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 35 WHERE `Entry` = 70171 AND `Item` = 25649; +UPDATE `skinning_loot_template` SET `Chance` = 30 WHERE `Entry` = 70172 AND `Item` = 21887; +UPDATE `skinning_loot_template` SET `Chance` = 30 WHERE `Entry` = 70172 AND `Item` = 25649; diff --git a/src/common/Asio/DeadlineTimer.h b/src/common/Asio/DeadlineTimer.h index 94531a28511..c1b2306b257 100644 --- a/src/common/Asio/DeadlineTimer.h +++ b/src/common/Asio/DeadlineTimer.h @@ -18,18 +18,17 @@ #ifndef DeadlineTimer_h__ #define DeadlineTimer_h__ -#include +#include "Duration.h" +#include +#include -namespace Trinity +namespace Trinity::Asio { - namespace Asio - { - class DeadlineTimer : public boost::asio::basic_deadline_timer, boost::asio::io_context::executor_type> - { - public: - using basic_deadline_timer::basic_deadline_timer; - }; - } +class DeadlineTimer : public boost::asio::basic_waitable_timer, boost::asio::io_context::executor_type> +{ +public: + using basic_waitable_timer::basic_waitable_timer; +}; } #endif // DeadlineTimer_h__ diff --git a/src/common/Banner.cpp b/src/common/Banner.cpp index 7d96504eabe..9220a1b8fcd 100644 --- a/src/common/Banner.cpp +++ b/src/common/Banner.cpp @@ -31,7 +31,7 @@ void Trinity::Banner::Show(char const* applicationName, void(*log)(char const* t log(R"( \ \_\ \_\ \ \_\ \_\ \_\ \_\ \__\\/`____ \)"); log(R"( \/_/\/_/ \/_/\/_/\/_/\/_/\/__/ `/___/> \)"); log(R"( C O R E /\___/)"); - log(R"(http://TrinityCore.org \/__/)" "\n"); + log(R"(https://TrinityCore.org \/__/)" "\n"); if (logExtraInfo) logExtraInfo(); diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 67d0d663c73..1270519d087 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -29,21 +29,10 @@ endif(USE_COREPCH) GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) -add_definitions(-DTRINITY_API_EXPORT_COMMON) - add_library(common ${PRIVATE_SOURCES} ) -# Do NOT add any extra include directory here, as we don't want the common -# library to depend on anything else than TC deps, and itself. -# This way we ensure that if either a PR does that without modifying this file, -# a compile error will be generated, either this file will be modified so it -# is detected more easily. -# While it is OK to include files from other libs as long as they don't require -# linkage (enums, defines...) it is discouraged to do so unless necessary, as it will pullute -# include_directories leading to further unnoticed dependency aditions -# Linker Depencency requirements: none CollectIncludeDirectories( ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC_INCLUDES @@ -58,6 +47,10 @@ target_include_directories(common PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +set_target_properties(common + PROPERTIES + DEFINE_SYMBOL TRINITY_API_EXPORT_COMMON) + target_link_libraries(common PRIVATE trinity-core-interface diff --git a/src/common/Collision/BoundingIntervalHierarchy.h b/src/common/Collision/BoundingIntervalHierarchy.h index a5717637a38..66bb7c61c6a 100644 --- a/src/common/Collision/BoundingIntervalHierarchy.h +++ b/src/common/Collision/BoundingIntervalHierarchy.h @@ -113,6 +113,7 @@ class TC_COMMON_API BIH delete[] dat.indices; } uint32 primCount() const { return uint32(objects.size()); } + G3D::AABox const& bound() const { return bounds; } template void intersectRay(const G3D::Ray &r, RayCallback& intersectCallback, float &maxDist, bool stopAtFirst = false) const diff --git a/src/common/Collision/DynamicTree.cpp b/src/common/Collision/DynamicTree.cpp index 34c38d98fa7..ceddd740613 100644 --- a/src/common/Collision/DynamicTree.cpp +++ b/src/common/Collision/DynamicTree.cpp @@ -150,22 +150,6 @@ struct DynamicTreeIntersectionCallback bool didHit() const { return did_hit;} }; -struct DynamicTreeAreaInfoCallback -{ - DynamicTreeAreaInfoCallback(uint32 phaseMask) : _phaseMask(phaseMask) {} - - void operator()(G3D::Vector3 const& p, GameObjectModel const& obj) - { - obj.intersectPoint(p, _areaInfo, _phaseMask); - } - - VMAP::AreaInfo const& GetAreaInfo() const { return _areaInfo; } - -private: - uint32 _phaseMask; - VMAP::AreaInfo _areaInfo; -}; - struct DynamicTreeLocationInfoCallback { DynamicTreeLocationInfoCallback(uint32 phaseMask) : _phaseMask(phaseMask), _hitModel(nullptr) {} @@ -265,24 +249,7 @@ float DynamicMapTree::getHeight(float x, float y, float z, float maxSearchDist, return -G3D::finf(); } -bool DynamicMapTree::getAreaInfo(float x, float y, float& z, uint32 phasemask, uint32& flags, int32& adtId, int32& rootId, int32& groupId) const -{ - G3D::Vector3 v(x, y, z + 0.5f); - DynamicTreeAreaInfoCallback intersectionCallBack(phasemask); - impl->intersectPoint(v, intersectionCallBack); - if (intersectionCallBack.GetAreaInfo().result) - { - flags = intersectionCallBack.GetAreaInfo().flags; - adtId = intersectionCallBack.GetAreaInfo().adtId; - rootId = intersectionCallBack.GetAreaInfo().rootId; - groupId = intersectionCallBack.GetAreaInfo().groupId; - z = intersectionCallBack.GetAreaInfo().ground_Z; - return true; - } - return false; -} - -void DynamicMapTree::getAreaAndLiquidData(float x, float y, float z, uint32 phasemask, uint8 reqLiquidType, VMAP::AreaAndLiquidData& data) const +bool DynamicMapTree::getAreaAndLiquidData(float x, float y, float z, uint32 phasemask, Optional reqLiquidType, VMAP::AreaAndLiquidData& data) const { G3D::Vector3 v(x, y, z + 0.5f); DynamicTreeLocationInfoCallback intersectionCallBack(phasemask); @@ -292,13 +259,16 @@ void DynamicMapTree::getAreaAndLiquidData(float x, float y, float z, uint32 phas data.floorZ = intersectionCallBack.GetLocationInfo().ground_Z; uint32 liquidType = intersectionCallBack.GetLocationInfo().hitModel->GetLiquidType(); float liquidLevel; - if (!reqLiquidType || VMAP::VMapFactory::createOrGetVMapManager()->GetLiquidFlagsPtr(liquidType) & reqLiquidType) + if (!reqLiquidType || VMAP::VMapFactory::createOrGetVMapManager()->GetLiquidFlagsPtr(liquidType) & *reqLiquidType) if (intersectionCallBack.GetHitModel()->GetLiquidLevel(v, intersectionCallBack.GetLocationInfo(), liquidLevel)) data.liquidInfo.emplace(liquidType, liquidLevel); - data.areaInfo.emplace(0, + data.areaInfo.emplace(intersectionCallBack.GetLocationInfo().hitModel->GetWmoID(), + 0, intersectionCallBack.GetLocationInfo().rootId, - intersectionCallBack.GetLocationInfo().hitModel->GetWmoID(), - intersectionCallBack.GetLocationInfo().hitModel->GetMogpFlags()); + intersectionCallBack.GetLocationInfo().hitModel->GetMogpFlags(), + 0); + return true; } + return false; } diff --git a/src/common/Collision/DynamicTree.h b/src/common/Collision/DynamicTree.h index b62044b9544..0bcdbed4236 100644 --- a/src/common/Collision/DynamicTree.h +++ b/src/common/Collision/DynamicTree.h @@ -19,6 +19,7 @@ #define _DYNTREE_H #include "Define.h" +#include "Optional.h" namespace G3D { @@ -48,8 +49,7 @@ class TC_COMMON_API DynamicMapTree bool getIntersectionTime(uint32 phasemask, const G3D::Ray& ray, const G3D::Vector3& endPos, float& maxDist) const; - bool getAreaInfo(float x, float y, float& z, uint32 phasemask, uint32& flags, int32& adtId, int32& rootId, int32& groupId) const; - void getAreaAndLiquidData(float x, float y, float z, uint32 phasemask, uint8 reqLiquidType, VMAP::AreaAndLiquidData& data) const; + bool getAreaAndLiquidData(float x, float y, float z, uint32 phasemask, Optional reqLiquidType, VMAP::AreaAndLiquidData& data) const; bool getObjectHitPos(uint32 phasemask, const G3D::Vector3& pPos1, const G3D::Vector3& pPos2, G3D::Vector3& pResultHitPos, diff --git a/src/common/Collision/Management/IVMapManager.h b/src/common/Collision/Management/IVMapManager.h index b25d93bd9b4..e48b4f38b75 100644 --- a/src/common/Collision/Management/IVMapManager.h +++ b/src/common/Collision/Management/IVMapManager.h @@ -53,17 +53,21 @@ namespace VMAP { struct AreaInfo { - AreaInfo(int32 _adtId, int32 _rootId, int32 _groupId, uint32 _flags) : adtId(_adtId), rootId(_rootId), groupId(_groupId), mogpFlags(_flags) { } - int32 const adtId; - int32 const rootId; - int32 const groupId; - uint32 const mogpFlags; + AreaInfo() = default; + AreaInfo(int32 _groupId, int32 _adtId, int32 _rootId, uint32 _mogpFlags, uint32 _uniqueId) + : groupId(_groupId), adtId(_adtId), rootId(_rootId), mogpFlags(_mogpFlags), uniqueId(_uniqueId) { } + int32 groupId = 0; + int32 adtId = 0; + int32 rootId = 0; + uint32 mogpFlags = 0; + uint32 uniqueId = 0; }; struct LiquidInfo { + LiquidInfo() = default; LiquidInfo(uint32 _type, float _level) : type(_type), level(_level) { } - uint32 const type; - float const level; + uint32 type = 0; + float level = 0.0f; }; float floorZ = VMAP_INVALID_HEIGHT; @@ -117,14 +121,12 @@ namespace VMAP bool isMapLoadingEnabled() const { return(iEnableLineOfSightCalc || iEnableHeightCalc ); } virtual std::string getDirFileName(unsigned int pMapId, int x, int y) const =0; + /** Query world model area info. \param z gets adjusted to the ground height for which this are info is valid */ - virtual bool getAreaInfo(uint32 mapId, float x, float y, float &z, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const=0; - virtual bool GetLiquidLevel(uint32 mapId, float x, float y, float z, uint8 reqLiquidType, float& level, float& floor, uint32& type, uint32& mogpFlags) const=0; - // get both area + liquid data in a single vmap lookup - virtual void getAreaAndLiquidData(unsigned int mapId, float x, float y, float z, uint8 reqLiquidType, AreaAndLiquidData& data) const=0; + virtual bool getAreaAndLiquidData(unsigned int mapId, float x, float y, float z, Optional reqLiquidType, AreaAndLiquidData& data) const = 0; }; } diff --git a/src/common/Collision/Management/VMapManager2.cpp b/src/common/Collision/Management/VMapManager2.cpp index 9ee1d5a0b3f..4fed17787de 100644 --- a/src/common/Collision/Management/VMapManager2.cpp +++ b/src/common/Collision/Management/VMapManager2.cpp @@ -233,63 +233,8 @@ namespace VMAP return VMAP_INVALID_HEIGHT_VALUE; } - bool VMapManager2::getAreaInfo(uint32 mapId, float x, float y, float& z, uint32& flags, int32& adtId, int32& rootId, int32& groupId) const + bool VMapManager2::getAreaAndLiquidData(unsigned int mapId, float x, float y, float z, Optional reqLiquidType, AreaAndLiquidData& data) const { - if (!IsVMAPDisabledForPtr(mapId, VMAP_DISABLE_AREAFLAG)) - { - InstanceTreeMap::const_iterator instanceTree = GetMapTree(mapId); - if (instanceTree != iInstanceMapTrees.end()) - { - Vector3 pos = convertPositionToInternalRep(x, y, z); - bool result = instanceTree->second->getAreaInfo(pos, flags, adtId, rootId, groupId); - // z is not touched by convertPositionToInternalRep(), so just copy - z = pos.z; - return result; - } - } - - return false; - } - - bool VMapManager2::GetLiquidLevel(uint32 mapId, float x, float y, float z, uint8 reqLiquidType, float& level, float& floor, uint32& type, uint32& mogpFlags) const - { - if (!IsVMAPDisabledForPtr(mapId, VMAP_DISABLE_LIQUIDSTATUS)) - { - InstanceTreeMap::const_iterator instanceTree = GetMapTree(mapId); - if (instanceTree != iInstanceMapTrees.end()) - { - LocationInfo info; - Vector3 pos = convertPositionToInternalRep(x, y, z); - if (instanceTree->second->GetLocationInfo(pos, info)) - { - floor = info.ground_Z; - ASSERT(floor < std::numeric_limits::max()); - ASSERT(info.hitModel); - type = info.hitModel->GetLiquidType(); // entry from LiquidType.dbc - mogpFlags = info.hitModel->GetMogpFlags(); - if (reqLiquidType && !(GetLiquidFlagsPtr(type) & reqLiquidType)) - return false; - ASSERT(info.hitInstance); - if (info.hitInstance->GetLiquidLevel(pos, info, level)) - return true; - } - } - } - - return false; - } - - void VMapManager2::getAreaAndLiquidData(unsigned int mapId, float x, float y, float z, uint8 reqLiquidType, AreaAndLiquidData& data) const - { - if (IsVMAPDisabledForPtr(mapId, VMAP_DISABLE_LIQUIDSTATUS)) - { - data.floorZ = z; - int32 adtId, rootId, groupId; - uint32 flags; - if (getAreaInfo(mapId, x, y, data.floorZ, flags, adtId, rootId, groupId)) - data.areaInfo.emplace(adtId, rootId, groupId, flags); - return; - } InstanceTreeMap::const_iterator instanceTree = GetMapTree(mapId); if (instanceTree != iInstanceMapTrees.end()) { @@ -300,16 +245,23 @@ namespace VMAP ASSERT(info.hitModel); ASSERT(info.hitInstance); data.floorZ = info.ground_Z; - uint32 liquidType = info.hitModel->GetLiquidType(); - float liquidLevel; - if (!reqLiquidType || (GetLiquidFlagsPtr(liquidType) & reqLiquidType)) - if (info.hitInstance->GetLiquidLevel(pos, info, liquidLevel)) - data.liquidInfo.emplace(liquidType, liquidLevel); + if (!IsVMAPDisabledForPtr(mapId, VMAP_DISABLE_LIQUIDSTATUS)) + { + uint32 liquidType = info.hitModel->GetLiquidType(); // entry from LiquidType.dbc + float liquidLevel; + if (!reqLiquidType || (GetLiquidFlagsPtr(liquidType) & *reqLiquidType)) + if (info.hitInstance->GetLiquidLevel(pos, info, liquidLevel)) + data.liquidInfo.emplace(liquidType, liquidLevel); + } if (!IsVMAPDisabledForPtr(mapId, VMAP_DISABLE_AREAFLAG)) - data.areaInfo.emplace(info.hitInstance->adtId, info.rootId, info.hitModel->GetWmoID(), info.hitModel->GetMogpFlags()); + data.areaInfo.emplace(info.hitModel->GetWmoID(), info.hitInstance->adtId, info.rootId, info.hitModel->GetMogpFlags(), info.hitInstance->ID); + + return true; } } + + return false; } WorldModel* VMapManager2::acquireModelInstance(const std::string& basepath, const std::string& filename, uint32 flags/* Only used when creating the model */) diff --git a/src/common/Collision/Management/VMapManager2.h b/src/common/Collision/Management/VMapManager2.h index 10a357318ab..25f4257997f 100644 --- a/src/common/Collision/Management/VMapManager2.h +++ b/src/common/Collision/Management/VMapManager2.h @@ -115,9 +115,7 @@ namespace VMAP bool processCommand(char* /*command*/) override { return false; } // for debug and extensions - bool getAreaInfo(uint32 mapId, float x, float y, float& z, uint32& flags, int32& adtId, int32& rootId, int32& groupId) const override; - bool GetLiquidLevel(uint32 mapId, float x, float y, float z, uint8 reqLiquidType, float& level, float& floor, uint32& type, uint32& mogpFlags) const override; - void getAreaAndLiquidData(uint32 mapId, float x, float y, float z, uint8 reqLiquidType, AreaAndLiquidData& data) const override; + bool getAreaAndLiquidData(uint32 mapId, float x, float y, float z, Optional reqLiquidType, AreaAndLiquidData& data) const override; WorldModel* acquireModelInstance(const std::string& basepath, const std::string& filename, uint32 flags = 0); void releaseModelInstance(const std::string& filename); diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h index 6e7aa4410e5..1877d3eec1c 100644 --- a/src/common/Collision/Maps/MapDefines.h +++ b/src/common/Collision/Maps/MapDefines.h @@ -19,7 +19,8 @@ #define _MAPDEFINES_H #include "Define.h" -#include "DetourNavMesh.h" +#include "Optional.h" +#include const uint32 MMAP_MAGIC = 0x4d4d4150; // 'MMAP' #define MMAP_VERSION 15 @@ -69,4 +70,47 @@ enum NavTerrainFlag NAV_MAGMA_SLIME = 1 << (NAV_AREA_MAX_VALUE - NAV_AREA_MAGMA_SLIME) }; -#endif /* _MAPDEFINES_H */ +enum ZLiquidStatus : uint32 +{ + LIQUID_MAP_NO_WATER = 0x00000000, + LIQUID_MAP_ABOVE_WATER = 0x00000001, + LIQUID_MAP_WATER_WALK = 0x00000002, + LIQUID_MAP_IN_WATER = 0x00000004, + LIQUID_MAP_UNDER_WATER = 0x00000008, +}; + +#define MAP_LIQUID_STATUS_SWIMMING (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER) +#define MAP_LIQUID_STATUS_IN_CONTACT (MAP_LIQUID_STATUS_SWIMMING | LIQUID_MAP_WATER_WALK) + +struct LiquidData +{ + uint32 type_flags; + uint32 entry; + float level; + float depth_level; +}; + +struct WmoLocation +{ + WmoLocation() = default; + WmoLocation(int32 groupId, int32 nameSetId, int32 rootId, uint32 uniqueId) + : GroupId(groupId), NameSetId(nameSetId), RootId(rootId), UniqueId(uniqueId) { } + + int32 GroupId = 0; + int32 NameSetId = 0; + int32 RootId = 0; + uint32 UniqueId = 0; +}; + +struct PositionFullTerrainStatus +{ + PositionFullTerrainStatus() : areaId(0), floorZ(0.0f), outdoors(true), liquidStatus(LIQUID_MAP_NO_WATER) { } + uint32 areaId; + float floorZ; + bool outdoors; + ZLiquidStatus liquidStatus; + Optional wmoLocation; + Optional liquidInfo; +}; + +#endif // _MAPDEFINES_H diff --git a/src/common/Collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp index b023e134cd3..55d33e7ee6c 100644 --- a/src/common/Collision/Maps/MapTree.cpp +++ b/src/common/Collision/Maps/MapTree.cpp @@ -50,22 +50,6 @@ namespace VMAP ModelIgnoreFlags flags; }; - class AreaInfoCallback - { - public: - AreaInfoCallback(ModelInstance* val): prims(val) { } - void operator()(Vector3 const& point, uint32 entry) - { -#ifdef VMAP_DEBUG - TC_LOG_DEBUG("maps", "AreaInfoCallback: trying to intersect '{}'", prims[entry].name); -#endif - prims[entry].intersectPoint(point, aInfo); - } - - ModelInstance* prims; - AreaInfo aInfo; - }; - class LocationInfoCallback { public: @@ -96,22 +80,6 @@ namespace VMAP return tilefilename.str(); } - bool StaticMapTree::getAreaInfo(Vector3 &pos, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const - { - AreaInfoCallback intersectionCallBack(iTreeValues); - iTree.intersectPoint(pos, intersectionCallBack); - if (intersectionCallBack.aInfo.result) - { - flags = intersectionCallBack.aInfo.flags; - adtId = intersectionCallBack.aInfo.adtId; - rootId = intersectionCallBack.aInfo.rootId; - groupId = intersectionCallBack.aInfo.groupId; - pos.z = intersectionCallBack.aInfo.ground_Z; - return true; - } - return false; - } - bool StaticMapTree::GetLocationInfo(Vector3 const& pos, LocationInfo &info) const { LocationInfoCallback intersectionCallBack(iTreeValues, info); diff --git a/src/common/Collision/Maps/MapTree.h b/src/common/Collision/Maps/MapTree.h index bcb24f58709..9fed79314b4 100644 --- a/src/common/Collision/Maps/MapTree.h +++ b/src/common/Collision/Maps/MapTree.h @@ -30,6 +30,12 @@ namespace VMAP enum class LoadResult : uint8; enum class ModelIgnoreFlags : uint32; + struct GroupLocationInfo + { + const GroupModel* hitModel = nullptr; + int32 rootId = -1; + }; + struct TC_COMMON_API LocationInfo { LocationInfo(): rootId(-1), hitInstance(nullptr), hitModel(nullptr), ground_Z(-G3D::finf()) { } @@ -73,7 +79,6 @@ namespace VMAP bool isInLineOfSight(const G3D::Vector3& pos1, const G3D::Vector3& pos2, ModelIgnoreFlags ignoreFlags) const; bool getObjectHitPos(const G3D::Vector3& pos1, const G3D::Vector3& pos2, G3D::Vector3& pResultHitPos, float pModifyDist) const; float getHeight(const G3D::Vector3& pPos, float maxSearchDist) const; - bool getAreaInfo(G3D::Vector3 &pos, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const; bool GetLocationInfo(const G3D::Vector3 &pos, LocationInfo &info) const; bool InitMap(const std::string &fname, VMapManager2* vm); diff --git a/src/common/Collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp index 23735f2d8e5..1b3bb2ff092 100644 --- a/src/common/Collision/Models/GameObjectModel.cpp +++ b/src/common/Collision/Models/GameObjectModel.cpp @@ -183,27 +183,6 @@ bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool Sto return hit; } -void GameObjectModel::intersectPoint(G3D::Vector3 const& point, VMAP::AreaInfo& info, uint32 ph_mask) const -{ - if (!(phasemask & ph_mask) || !owner->IsSpawned() || !isMapObject()) - return; - - if (!iBound.contains(point)) - return; - - // child bounds are defined in object space: - Vector3 pModel = iInvRot * (point - iPos) * iInvScale; - Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f); - float zDist; - if (iModel->IntersectPoint(pModel, zDirModel, zDist, info)) - { - Vector3 modelGround = pModel + zDist * zDirModel; - float world_Z = ((modelGround * iInvRot) * iScale + iPos).z; - if (info.ground_Z < world_Z) - info.ground_Z = world_Z; - } -} - bool GameObjectModel::GetLocationInfo(G3D::Vector3 const& point, VMAP::LocationInfo& info, uint32 ph_mask) const { if (!(phasemask & ph_mask) || !owner->IsSpawned() || !isMapObject()) @@ -216,7 +195,9 @@ bool GameObjectModel::GetLocationInfo(G3D::Vector3 const& point, VMAP::LocationI Vector3 pModel = iInvRot * (point - iPos) * iInvScale; Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f); float zDist; - if (iModel->GetLocationInfo(pModel, zDirModel, zDist, info)) + + VMAP::GroupLocationInfo groupInfo; + if (iModel->GetLocationInfo(pModel, zDirModel, zDist, groupInfo)) { Vector3 modelGround = pModel + zDist * zDirModel; float world_Z = ((modelGround * iInvRot) * iScale + iPos).z; diff --git a/src/common/Collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h index 78f17b75391..46de9bec4c3 100644 --- a/src/common/Collision/Models/GameObjectModel.h +++ b/src/common/Collision/Models/GameObjectModel.h @@ -71,7 +71,6 @@ class TC_COMMON_API GameObjectModel /*, public Intersectable*/ bool isMapObject() const { return isWmo; } bool intersectRay(const G3D::Ray& Ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask, VMAP::ModelIgnoreFlags ignoreFlags) const; - void intersectPoint(G3D::Vector3 const& point, VMAP::AreaInfo& info, uint32 ph_mask) const; bool GetLocationInfo(G3D::Vector3 const& point, VMAP::LocationInfo& info, uint32 ph_mask) const; bool GetLiquidLevel(G3D::Vector3 const& point, VMAP::LocationInfo& info, float& liqHeight) const; diff --git a/src/common/Collision/Models/ModelInstance.cpp b/src/common/Collision/Models/ModelInstance.cpp index db0bc491a0d..5ed144f12c1 100644 --- a/src/common/Collision/Models/ModelInstance.cpp +++ b/src/common/Collision/Models/ModelInstance.cpp @@ -63,40 +63,6 @@ namespace VMAP return hit; } - void ModelInstance::intersectPoint(const G3D::Vector3& p, AreaInfo &info) const - { - if (!iModel) - { -#ifdef VMAP_DEBUG - std::cout << "\n"; -#endif - return; - } - - // M2 files don't contain area info, only WMO files - if (flags & MOD_M2) - return; - if (!iBound.contains(p)) - return; - // child bounds are defined in object space: - Vector3 pModel = iInvRot * (p - iPos) * iInvScale; - Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f); - float zDist; - if (iModel->IntersectPoint(pModel, zDirModel, zDist, info)) - { - Vector3 modelGround = pModel + zDist * zDirModel; - // Transform back to world space. Note that: - // Mat * vec == vec * Mat.transpose() - // and for rotation matrices: Mat.inverse() == Mat.transpose() - float world_Z = ((modelGround * iInvRot) * iScale + iPos).z; - if (info.ground_Z < world_Z) - { - info.ground_Z = world_Z; - info.adtId = adtId; - } - } - } - bool ModelInstance::GetLocationInfo(const G3D::Vector3& p, LocationInfo &info) const { if (!iModel) @@ -116,7 +82,9 @@ namespace VMAP Vector3 pModel = iInvRot * (p - iPos) * iInvScale; Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f); float zDist; - if (iModel->GetLocationInfo(pModel, zDirModel, zDist, info)) + + GroupLocationInfo groupInfo; + if (iModel->GetLocationInfo(pModel, zDirModel, zDist, groupInfo)) { Vector3 modelGround = pModel + zDist * zDirModel; // Transform back to world space. Note that: @@ -125,6 +93,8 @@ namespace VMAP float world_Z = ((modelGround * iInvRot) * iScale + iPos).z; if (info.ground_Z < world_Z) // hm...could it be handled automatically with zDist at intersection? { + info.rootId = groupInfo.rootId; + info.hitModel = groupInfo.hitModel; info.ground_Z = world_Z; info.hitInstance = this; return true; @@ -142,8 +112,7 @@ namespace VMAP if (info.hitModel->GetLiquidLevel(pModel, zDist)) { // calculate world height (zDist in model coords): - // assume WMO not tilted (wouldn't make much sense anyway) - liqHeight = zDist * iScale + iPos.z; + liqHeight = (Vector3(pModel.x, pModel.y, zDist) * iInvRot * iScale + iPos).z; return true; } return false; diff --git a/src/common/Collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h index e984aa1065a..366f1eee97b 100644 --- a/src/common/Collision/Models/ModelInstance.h +++ b/src/common/Collision/Models/ModelInstance.h @@ -67,7 +67,6 @@ namespace VMAP ModelInstance(ModelSpawn const& spawn, WorldModel* model); void setUnloaded() { iModel = nullptr; } bool intersectRay(G3D::Ray const& pRay, float& pMaxDist, bool pStopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; - void intersectPoint(G3D::Vector3 const& p, AreaInfo &info) const; bool GetLocationInfo(G3D::Vector3 const& p, LocationInfo &info) const; bool GetLiquidLevel(G3D::Vector3 const& p, LocationInfo &info, float &liqHeight) const; WorldModel* getWorldModel() { return iModel; } diff --git a/src/common/Collision/Models/WorldModel.cpp b/src/common/Collision/Models/WorldModel.cpp index 59bc304ca7e..a68651d5e3d 100644 --- a/src/common/Collision/Models/WorldModel.cpp +++ b/src/common/Collision/Models/WorldModel.cpp @@ -20,9 +20,9 @@ #include "MapTree.h" #include "ModelInstance.h" #include "ModelIgnoreFlags.h" +#include using G3D::Vector3; -using G3D::Ray; template<> struct BoundsTrait { @@ -416,17 +416,46 @@ namespace VMAP return callback.hit; } - bool GroupModel::IsInsideObject(Vector3 const& pos, Vector3 const& down, float& z_dist) const + inline bool IsInsideOrAboveBound(G3D::AABox const& bounds, const G3D::Point3& point) { - if (triangles.empty() || !iBound.contains(pos)) - return false; - Vector3 rPos = pos - 0.1f * down; - float dist = G3D::finf(); - G3D::Ray ray(rPos, down); - bool hit = IntersectRay(ray, dist, false); - if (hit) - z_dist = dist - 0.1f; - return hit; + return point.x >= bounds.low().x + && point.y >= bounds.low().y + && point.z >= bounds.low().z + && point.x <= bounds.high().x + && point.y <= bounds.high().y; + } + + GroupModel::InsideResult GroupModel::IsInsideObject(G3D::Ray const& ray, float& z_dist) const + { + if (triangles.empty() || !IsInsideOrAboveBound(iBound, ray.origin())) + return OUT_OF_BOUNDS; + + if (meshTree.bound().high().z >= ray.origin().z) + { + float dist = G3D::finf(); + if (IntersectRay(ray, dist, false)) + { + z_dist = dist - 0.1f; + return INSIDE; + } + if (meshTree.bound().contains(ray.origin())) + return MAYBE_INSIDE; + } + else + { + // some group models don't have any floor to intersect with + // so we should attempt to intersect with a model part below this group + // then find back where we originated from (in WorldModel::GetLocationInfo) + float dist = G3D::finf(); + float delta = ray.origin().z - meshTree.bound().high().z; + if (IntersectRay(ray.bumpedRay(delta), dist, false)) + { + z_dist = dist - 0.1f + delta; + return ABOVE; + } + } + + return OUT_OF_BOUNDS; } bool GroupModel::GetLiquidLevel(Vector3 const& pos, float& liqHeight) const @@ -492,74 +521,60 @@ namespace VMAP return isc.hit; } - class WModelAreaCallback { - public: - WModelAreaCallback(std::vector const& vals, Vector3 const& down) : - prims(vals.begin()), hit(vals.end()), minVol(G3D::finf()), zDist(G3D::finf()), zVec(down) { } - std::vector::const_iterator prims; - std::vector::const_iterator hit; - float minVol; - float zDist; - Vector3 zVec; - void operator()(Vector3 const& point, uint32 entry) + class WModelAreaCallback + { + public: + WModelAreaCallback(std::vector const& vals) : + prims(vals), hit() { } + std::vector const& prims; + std::array hit; + + bool operator()(G3D::Ray const& ray, uint32 entry, float& distance, bool /*stopAtFirstHit*/) + { + float group_Z; + if (GroupModel::InsideResult result = prims[entry].IsInsideObject(ray, group_Z); result != GroupModel::OUT_OF_BOUNDS) { - float group_Z; - //float pVol = prims[entry].GetBound().volume(); - //if (pVol < minVol) - //{ - /* if (prims[entry].iBound.contains(point)) */ - if (prims[entry].IsInsideObject(point, zVec, group_Z)) + if (result != GroupModel::MAYBE_INSIDE) + { + if (group_Z < distance) { - //minVol = pVol; - //hit = prims + entry; - if (group_Z < zDist) - { - zDist = group_Z; - hit = prims + entry; - } -#ifdef VMAP_DEBUG - GroupModel const& gm = prims[entry]; - printf("%10u %8X %7.3f, %7.3f, %7.3f | %7.3f, %7.3f, %7.3f | z=%f, p_z=%f\n", gm.GetWmoID(), gm.GetMogpFlags(), - gm.GetBound().low().x, gm.GetBound().low().y, gm.GetBound().low().z, - gm.GetBound().high().x, gm.GetBound().high().y, gm.GetBound().high().z, group_Z, point.z); -#endif + distance = group_Z; + hit[result] = &prims[entry]; + return true; } - //} - //std::cout << "trying to intersect '" << prims[entry].name << "'\n"; + } + else + hit[result] = &prims[entry]; } + return false; + } }; - bool WorldModel::IntersectPoint(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, AreaInfo &info) const + bool WorldModel::GetLocationInfo(const G3D::Vector3& p, const G3D::Vector3& down, float& dist, GroupLocationInfo& info) const { if (groupModels.empty()) return false; - WModelAreaCallback callback(groupModels, down); - groupTree.intersectPoint(p, callback); - if (callback.hit != groupModels.end()) + WModelAreaCallback callback(groupModels); + G3D::Ray r(p - down * 0.1f, down); + float zDist = groupTree.bound().extent().length(); + groupTree.intersectRay(r, callback, zDist, false); + if (callback.hit[GroupModel::INSIDE]) { info.rootId = RootWMOID; - info.groupId = callback.hit->GetWmoID(); - info.flags = callback.hit->GetMogpFlags(); - info.result = true; - dist = callback.zDist; + info.hitModel = callback.hit[GroupModel::INSIDE]; + dist = zDist; return true; } - return false; - } - - bool WorldModel::GetLocationInfo(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, LocationInfo &info) const - { - if (groupModels.empty()) - return false; - WModelAreaCallback callback(groupModels, down); - groupTree.intersectPoint(p, callback); - if (callback.hit != groupModels.end()) + // some group models don't have any floor to intersect with + // so we should attempt to intersect with a model part below the group `p` is in (stored in GroupModel::ABOVE) + // then find back where we originated from (GroupModel::MAYBE_INSIDE) + if (callback.hit[GroupModel::MAYBE_INSIDE] && callback.hit[GroupModel::ABOVE]) { info.rootId = RootWMOID; - info.hitModel = &(*callback.hit); - dist = callback.zDist; + info.hitModel = callback.hit[GroupModel::MAYBE_INSIDE]; + dist = zDist; return true; } return false; diff --git a/src/common/Collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h index 093a4ea84ed..e06807687df 100644 --- a/src/common/Collision/Models/WorldModel.h +++ b/src/common/Collision/Models/WorldModel.h @@ -31,6 +31,7 @@ namespace VMAP class TreeNode; struct AreaInfo; struct LocationInfo; + struct GroupLocationInfo; enum class ModelIgnoreFlags : uint32; class TC_COMMON_API MeshTriangle @@ -83,12 +84,14 @@ namespace VMAP void setMeshData(std::vector &vert, std::vector &tri); void setLiquidData(WmoLiquid*& liquid) { iLiquid = liquid; liquid = nullptr; } bool IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit) const; - bool IsInsideObject(const G3D::Vector3 &pos, const G3D::Vector3 &down, float &z_dist) const; + enum InsideResult { INSIDE = 0, MAYBE_INSIDE = 1, ABOVE = 2, OUT_OF_BOUNDS = -1 }; + InsideResult IsInsideObject(G3D::Ray const& ray, float& z_dist) const; bool GetLiquidLevel(const G3D::Vector3 &pos, float &liqHeight) const; uint32 GetLiquidType() const; bool writeToFile(FILE* wf); bool readFromFile(FILE* rf); - const G3D::AABox& GetBound() const { return iBound; } + G3D::AABox const& GetBound() const { return iBound; } + G3D::AABox const& GetMeshTreeBound() const { return meshTree.bound(); } uint32 GetMogpFlags() const { return iMogpFlags; } uint32 GetWmoID() const { return iGroupWMOID; } void getMeshData(std::vector& outVertices, std::vector& outTriangles, WmoLiquid*& liquid); @@ -112,8 +115,7 @@ namespace VMAP void setGroupModels(std::vector &models); void setRootWmoID(uint32 id) { RootWMOID = id; } bool IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; - bool IntersectPoint(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, AreaInfo &info) const; - bool GetLocationInfo(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, LocationInfo &info) const; + bool GetLocationInfo(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, GroupLocationInfo& info) const; bool writeFile(const std::string &filename); bool readFile(const std::string &filename); void getGroupModels(std::vector& outGroupModels); diff --git a/src/common/Cryptography/Argon2.cpp b/src/common/Cryptography/Argon2Hash.cpp similarity index 98% rename from src/common/Cryptography/Argon2.cpp rename to src/common/Cryptography/Argon2Hash.cpp index 225d92c3994..3113ea39108 100644 --- a/src/common/Cryptography/Argon2.cpp +++ b/src/common/Cryptography/Argon2Hash.cpp @@ -15,7 +15,7 @@ * with this program. If not, see . */ -#include "Argon2.h" +#include "Argon2Hash.h" #include /*static*/ Optional Trinity::Crypto::Argon2::Hash(std::string const& password, BigNumber const& salt, uint32 nIterations, uint32 kibMemoryCost) diff --git a/src/common/Cryptography/Argon2.h b/src/common/Cryptography/Argon2Hash.h similarity index 100% rename from src/common/Cryptography/Argon2.h rename to src/common/Cryptography/Argon2Hash.h diff --git a/src/common/Metric/Metric.cpp b/src/common/Metric/Metric.cpp index 06c084a3c2c..08dff35eb98 100644 --- a/src/common/Metric/Metric.cpp +++ b/src/common/Metric/Metric.cpp @@ -220,7 +220,7 @@ void Metric::ScheduleSend() { if (_enabled) { - _batchTimer->expires_from_now(boost::posix_time::seconds(_updateInterval)); + _batchTimer->expires_after(std::chrono::seconds(_updateInterval)); _batchTimer->async_wait(std::bind(&Metric::SendBatch, this)); } else @@ -250,7 +250,7 @@ void Metric::ScheduleOverallStatusLog() { if (_enabled) { - _overallStatusTimer->expires_from_now(boost::posix_time::seconds(_overallStatusTimerInterval)); + _overallStatusTimer->expires_after(std::chrono::seconds(_overallStatusTimerInterval)); _overallStatusTimer->async_wait([this](const boost::system::error_code&) { _overallStatusTimerTriggered = true; diff --git a/src/common/Utilities/Duration.h b/src/common/Utilities/Duration.h index b4c3f17cb3e..f506467abda 100644 --- a/src/common/Utilities/Duration.h +++ b/src/common/Utilities/Duration.h @@ -18,12 +18,7 @@ #ifndef _DURATION_H_ #define _DURATION_H_ -// HACKS TERRITORY -#if __has_include(<__msvc_chrono.hpp>) -#include <__msvc_chrono.hpp> // skip all the formatting/istream/locale/mutex bloat -#else #include -#endif /// Milliseconds shorthand typedef. typedef std::chrono::milliseconds Milliseconds; diff --git a/src/common/Utilities/StartProcess.cpp b/src/common/Utilities/StartProcess.cpp index 37c41f73a95..c5aa2d8c024 100644 --- a/src/common/Utilities/StartProcess.cpp +++ b/src/common/Utilities/StartProcess.cpp @@ -15,71 +15,65 @@ * with this program. If not, see . */ +// compatibility for booost 1.74 (no boost/process/v1/) and 1.88 (no boost/process/) +#if __has_include() +#define BOOST_PROCESS_V1_HEADER(header) +#define BOOST_PROCESS_VERSION 1 +#else +#define BOOST_PROCESS_V1_HEADER(header) +#endif + #include "StartProcess.h" #include "Errors.h" #include "Log.h" #include "Optional.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::process; -using namespace boost::iostreams; +#include BOOST_PROCESS_V1_HEADER(args.hpp) +#include BOOST_PROCESS_V1_HEADER(child.hpp) +#include BOOST_PROCESS_V1_HEADER(env.hpp) +#include BOOST_PROCESS_V1_HEADER(error.hpp) +#include BOOST_PROCESS_V1_HEADER(exe.hpp) +#include BOOST_PROCESS_V1_HEADER(io.hpp) +#include BOOST_PROCESS_V1_HEADER(pipe.hpp) +#include BOOST_PROCESS_V1_HEADER(search_path.hpp) +#include + +namespace bp = boost::process; namespace Trinity { - -template -class TCLogSink +class AsyncProcessResultImplementation + : public AsyncProcessResult { - T callback_; + std::string const executable; + std::vector const args; + std::string const logger; + std::string const input_file; + bool const is_secure; -public: - typedef char char_type; - typedef sink_tag category; + std::atomic was_terminated; - // Requires a callback type which has a void(std::string) signature - TCLogSink(T callback) - : callback_(std::move(callback)) { } + Optional> futureResult; + Optional my_child; - std::streamsize write(char const* str, std::streamsize size) - { - std::string_view consoleStr(str, size); - size_t lineEnd = consoleStr.find_first_of("\r\n"); - std::streamsize processedCharacters = size; - if (lineEnd != std::string_view::npos) - { - consoleStr = consoleStr.substr(0, lineEnd); - processedCharacters = lineEnd + 1; - } +public: + explicit AsyncProcessResultImplementation(std::string executable_, std::vector args_, + std::string logger_, std::string input_file_, + bool secure) + : executable(std::move(executable_)), args(std::move(args_)), + logger(std::move(logger_)), input_file(std::move(input_file_)), + is_secure(secure), was_terminated(false) { } - if (!consoleStr.empty()) - callback_(consoleStr); + AsyncProcessResultImplementation(AsyncProcessResultImplementation const&) = delete; + AsyncProcessResultImplementation& operator= (AsyncProcessResultImplementation const&) = delete; + AsyncProcessResultImplementation(AsyncProcessResultImplementation&&) = delete; + AsyncProcessResultImplementation& operator= (AsyncProcessResultImplementation&&) = delete; - return processedCharacters; - } -}; + ~AsyncProcessResultImplementation() = default; -template -auto MakeTCLogSink(T&& callback) - -> TCLogSink::type> -{ - return { std::forward(callback) }; -} + int32 StartProcess() + { + ASSERT(!my_child, "Process started already!"); -template -static int CreateChildProcess(T waiter, std::string const& executable, - std::vector const& argsVector, - std::string const& logger, std::string const& input, - bool secure) -{ #if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT #pragma warning(push) #pragma warning(disable:4297) @@ -92,161 +86,106 @@ static int CreateChildProcess(T waiter, std::string const& executable, boost/process/pipe.hpp(304,42): message : see reference to class template instantiation 'boost::process::basic_pipebuf>' being compiled */ #endif - ipstream outStream; - ipstream errStream; + bp::ipstream outStream; + bp::ipstream errStream; #if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT #pragma warning(pop) #endif - if (!secure) - { - TC_LOG_TRACE(logger, "Starting process \"{}\" with arguments: \"{}\".", - executable, boost::algorithm::join(argsVector, " ")); - } - - // prepare file with only read permission (boost process opens with read_write) - std::shared_ptr inputFile(!input.empty() ? fopen(input.c_str(), "rb") : nullptr, [](FILE* ptr) - { - if (ptr != nullptr) - fclose(ptr); - }); - - // Start the child process - child c = [&]() - { - if (inputFile) + if (is_secure) { - // With binding stdin - return child{ - exe = boost::filesystem::absolute(executable).string(), - args = argsVector, - env = environment(boost::this_process::environment()), - std_in = inputFile.get(), - std_out = outStream, - std_err = errStream - }; + TC_LOG_TRACE(logger, R"(Starting process "{}".)", + executable); } else { - // Without binding stdin - return child{ - exe = boost::filesystem::absolute(executable).string(), - args = argsVector, - env = environment(boost::this_process::environment()), - std_in = boost::process::close, - std_out = outStream, - std_err = errStream - }; + TC_LOG_TRACE(logger, R"(Starting process "{}" with arguments: "{}".)", + executable, fmt::join(args, " ")); } - }(); - - auto outInfo = MakeTCLogSink([&](std::string_view msg) - { - TC_LOG_INFO(logger, "{}", msg); - }); - - auto outError = MakeTCLogSink([&](std::string_view msg) - { - TC_LOG_ERROR(logger, "{}", msg); - }); - - copy(outStream, outInfo); - copy(errStream, outError); - - // Call the waiter in the current scope to prevent - // the streams from closing too early on leaving the scope. - int const result = waiter(c); - if (!secure) - { - TC_LOG_TRACE(logger, ">> Process \"{}\" finished with return value {}.", - executable, result); - } + // prepare file with only read permission (boost process opens with read_write) + auto inputFile = std::shared_ptr(!input_file.empty() ? fopen(input_file.c_str(), "rb") : nullptr, [](FILE* f) { if (f) fclose(f); }); - return result; -} + std::error_code ec; -int StartProcess(std::string const& executable, std::vector const& args, - std::string const& logger, std::string input_file, bool secure) -{ - return CreateChildProcess([](child& c) -> int - { - try + // Start the child process + if (inputFile) { - c.wait(); - return c.exit_code(); + my_child.emplace( + bp::exe = boost::filesystem::absolute(executable).string(), + bp::args = args, + bp::env = bp::environment(boost::this_process::environment()), + bp::std_in = inputFile.get(), + bp::std_out = outStream, + bp::std_err = errStream, + bp::error = ec + ); } - catch (...) + else { - return EXIT_FAILURE; + my_child.emplace( + bp::exe = boost::filesystem::absolute(executable).string(), + bp::args = args, + bp::env = bp::environment(boost::this_process::environment()), + bp::std_in = bp::close, + bp::std_out = outStream, + bp::std_err = errStream, + bp::error = ec + ); } - }, executable, args, logger, input_file, secure); -} - -class AsyncProcessResultImplementation - : public AsyncProcessResult -{ - std::string const executable; - std::vector const args; - std::string const logger; - std::string const input_file; - bool const is_secure; - - std::atomic was_terminated; - - // Workaround for missing move support in boost < 1.57 - Optional>> result; - Optional> my_child; - -public: - explicit AsyncProcessResultImplementation(std::string executable_, std::vector args_, - std::string logger_, std::string input_file_, - bool secure) - : executable(std::move(executable_)), args(std::move(args_)), - logger(std::move(logger_)), input_file(input_file_), - is_secure(secure), was_terminated(false) { } - AsyncProcessResultImplementation(AsyncProcessResultImplementation const&) = delete; - AsyncProcessResultImplementation& operator= (AsyncProcessResultImplementation const&) = delete; - AsyncProcessResultImplementation(AsyncProcessResultImplementation&&) = delete; - AsyncProcessResultImplementation& operator= (AsyncProcessResultImplementation&&) = delete; - - int StartProcess() - { - ASSERT(!my_child, "Process started already!"); - - return CreateChildProcess([&](child& c) -> int + if (ec) { - int result; - my_child = std::reference_wrapper(c); + TC_LOG_ERROR(logger, R"(>> Failed to start process "{}": {})", executable, ec.message()); + return EXIT_FAILURE; + } - try + std::future stdOutReader = std::async(std::launch::async, [&] + { + std::string line; + while (std::getline(outStream, line, '\n')) { - c.wait(); - result = c.exit_code(); + std::erase(line, '\r'); + if (!line.empty()) + TC_LOG_INFO(logger, "{}", line); } - catch (...) + }); + + std::future stdErrReader = std::async(std::launch::async, [&] + { + std::string line; + while (std::getline(errStream, line, '\n')) { - result = EXIT_FAILURE; + std::erase(line, '\r'); + if (!line.empty()) + TC_LOG_ERROR(logger, "{}", line); } + }); + + my_child->wait(ec); + int32 const result = !ec && !was_terminated ? my_child->exit_code() : EXIT_FAILURE; + my_child.reset(); + + stdOutReader.wait(); + stdErrReader.wait(); - my_child.reset(); - return was_terminated ? EXIT_FAILURE : result; + TC_LOG_TRACE(logger, R"(>> Process "{}" finished with return value {}.)", + executable, result); - }, executable, args, logger, input_file, is_secure); + return result; } - void SetFuture(std::future result_) + void SetFuture(std::future result_) { - result = std::make_shared>(std::move(result_)); + futureResult.emplace(std::move(result_)); } /// Returns the future which contains the result of the process /// as soon it is finished. - std::future& GetFutureResult() override + std::future& GetFutureResult() override { - ASSERT(*result, "The process wasn't started!"); - return **result; + ASSERT(futureResult.has_value(), "The process wasn't started!"); + return *futureResult; } /// Tries to terminate the process @@ -255,23 +194,25 @@ class AsyncProcessResultImplementation if (my_child) { was_terminated = true; - try - { - my_child->get().terminate(); - } - catch(...) - { - // Do nothing - } + std::error_code ec; + my_child->terminate(ec); } } }; -std::shared_ptr - StartAsyncProcess(std::string executable, std::vector args, - std::string logger, std::string input_file, bool secure) +int32 StartProcess(std::string executable, std::vector args, + std::string logger, std::string input_file, bool secure) +{ + AsyncProcessResultImplementation handle( + std::move(executable), std::move(args), std::move(logger), std::move(input_file), secure); + + return handle.StartProcess(); +} + +std::shared_ptr StartAsyncProcess(std::string executable, std::vector args, + std::string logger, std::string input_file, bool secure) { - auto handle = std::make_shared( + std::shared_ptr handle = std::make_shared( std::move(executable), std::move(args), std::move(logger), std::move(input_file), secure); handle->SetFuture(std::async(std::launch::async, [handle] { return handle->StartProcess(); })); @@ -282,7 +223,7 @@ std::string SearchExecutableInPath(std::string const& filename) { try { - return search_path(filename).string(); + return bp::search_path(filename).string(); } catch (...) { diff --git a/src/common/Utilities/StartProcess.h b/src/common/Utilities/StartProcess.h index 71452315e77..b99a24a9f55 100644 --- a/src/common/Utilities/StartProcess.h +++ b/src/common/Utilities/StartProcess.h @@ -15,8 +15,8 @@ * with this program. If not, see . */ -#ifndef Process_h__ -#define Process_h__ +#ifndef TRINITYCORE_START_PROCESS_H +#define TRINITYCORE_START_PROCESS_H #include "Define.h" #include @@ -32,8 +32,8 @@ namespace Trinity /// When an input path is given, the file will be routed to the processes stdin. /// When the process is marked as secure no arguments are leaked to logs. /// Note that most executables expect it's name as the first argument. -TC_COMMON_API int StartProcess(std::string const& executable, std::vector const& args, - std::string const& logger, std::string input_file = "", +TC_COMMON_API int32 StartProcess(std::string executable, std::vector args, + std::string logger, std::string input_file = "", bool secure = false); /// Platform and library independent representation @@ -45,7 +45,7 @@ class AsyncProcessResult /// Returns the future which contains the result of the process /// as soon it is finished. - virtual std::future& GetFutureResult() = 0; + virtual std::future& GetFutureResult() = 0; /// Tries to terminate the process virtual void Terminate() = 0; @@ -67,4 +67,4 @@ TC_COMMON_API std::string SearchExecutableInPath(std::string const& filename); } // namespace Trinity -#endif // Process_h__ +#endif // TRINITYCORE_START_PROCESS_H diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 78852a64b4e..e4e795ba8a1 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -8,14 +8,6 @@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# Enforce compileparameters for corebuilds under GCC -# This to stop a few silly crashes that could have been avoided IF people -# weren't doing some -O3 psychooptimizations etc. - -if(CMAKE_COMPILER_IS_GNUCXX AND NOT MINGW) - add_definitions(-fno-delete-null-pointer-checks) -endif() - if(WIN32) list(APPEND sources_windows ${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.cpp diff --git a/src/server/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt index 9a275efb840..9536ae2578a 100644 --- a/src/server/authserver/CMakeLists.txt +++ b/src/server/authserver/CMakeLists.txt @@ -64,28 +64,22 @@ set_target_properties(authserver FOLDER "server") -if(COPY_CONF AND WIN32) - if("${CMAKE_MAKE_PROGRAM}" MATCHES "MSBuild") - add_custom_command(TARGET authserver - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/authserver.conf.dist ${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/ - ) - elseif(MINGW) - add_custom_command(TARGET authserver - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/authserver.conf.dist ${CMAKE_BINARY_DIR}/bin/ - ) - endif() -endif() - if(UNIX) install(TARGETS authserver DESTINATION bin) if(COPY_CONF) + add_custom_command(TARGET authserver + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/authserver.conf.dist ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/../etc/authserver.conf.dist + ) install(FILES authserver.conf.dist DESTINATION ${CONF_DIR}) endif() elseif(WIN32) install(TARGETS authserver DESTINATION "${CMAKE_INSTALL_PREFIX}") if(COPY_CONF) + add_custom_command(TARGET authserver + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/authserver.conf.dist ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/authserver.conf.dist + ) install(FILES authserver.conf.dist DESTINATION "${CMAKE_INSTALL_PREFIX}") endif() endif() diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index d58c7a0c0c0..b254e9c28fe 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -192,12 +192,6 @@ int main(int argc, char** argv) std::shared_ptr sRealmListHandle(nullptr, [](void*) { sRealmList->Close(); }); - if (sRealmList->GetRealms().empty()) - { - TC_LOG_ERROR("server.authserver", "No valid realms specified."); - return 1; - } - // Start the listening port (acceptor) for auth connections int32 port = sConfigMgr->GetIntDefault("RealmServerPort", 3724); if (port < 0 || port > 0xFFFF) @@ -229,12 +223,12 @@ int main(int argc, char** argv) // Enabled a timed callback for handling the database keep alive ping int32 dbPingInterval = sConfigMgr->GetIntDefault("MaxPingTime", 30); std::shared_ptr dbPingTimer = std::make_shared(*ioContext); - dbPingTimer->expires_from_now(boost::posix_time::minutes(dbPingInterval)); + dbPingTimer->expires_after(std::chrono::minutes(dbPingInterval)); dbPingTimer->async_wait(std::bind(&KeepDatabaseAliveHandler, std::weak_ptr(dbPingTimer), dbPingInterval, std::placeholders::_1)); int32 banExpiryCheckInterval = sConfigMgr->GetIntDefault("BanExpiryCheckInterval", 60); std::shared_ptr banExpiryCheckTimer = std::make_shared(*ioContext); - banExpiryCheckTimer->expires_from_now(boost::posix_time::seconds(banExpiryCheckInterval)); + banExpiryCheckTimer->expires_after(std::chrono::seconds(banExpiryCheckInterval)); banExpiryCheckTimer->async_wait(std::bind(&BanExpiryHandler, std::weak_ptr(banExpiryCheckTimer), banExpiryCheckInterval, std::placeholders::_1)); #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS @@ -242,7 +236,7 @@ int main(int argc, char** argv) if (m_ServiceStatus != -1) { serviceStatusWatchTimer = std::make_shared(*ioContext); - serviceStatusWatchTimer->expires_from_now(boost::posix_time::seconds(1)); + serviceStatusWatchTimer->expires_after(1s); serviceStatusWatchTimer->async_wait(std::bind(&ServiceStatusWatcher, std::weak_ptr(serviceStatusWatchTimer), std::weak_ptr(ioContext), @@ -303,10 +297,10 @@ void KeepDatabaseAliveHandler(std::weak_ptr dbPing { if (std::shared_ptr dbPingTimer = dbPingTimerRef.lock()) { - TC_LOG_INFO("server.authserver", "Ping MySQL to keep connection alive"); + TC_LOG_DEBUG("sql.driver", "Ping MySQL to keep connection alive"); LoginDatabase.KeepAlive(); - dbPingTimer->expires_from_now(boost::posix_time::minutes(dbPingInterval)); + dbPingTimer->expires_after(std::chrono::minutes(dbPingInterval)); dbPingTimer->async_wait(std::bind(&KeepDatabaseAliveHandler, dbPingTimerRef, dbPingInterval, std::placeholders::_1)); } } @@ -321,7 +315,7 @@ void BanExpiryHandler(std::weak_ptr banExpiryCheck LoginDatabase.Execute(LoginDatabase.GetPreparedStatement(LOGIN_DEL_EXPIRED_IP_BANS)); LoginDatabase.Execute(LoginDatabase.GetPreparedStatement(LOGIN_UPD_EXPIRED_ACCOUNT_BANS)); - banExpiryCheckTimer->expires_from_now(boost::posix_time::seconds(banExpiryCheckInterval)); + banExpiryCheckTimer->expires_after(std::chrono::seconds(banExpiryCheckInterval)); banExpiryCheckTimer->async_wait(std::bind(&BanExpiryHandler, banExpiryCheckTimerRef, banExpiryCheckInterval, std::placeholders::_1)); } } @@ -338,7 +332,7 @@ void ServiceStatusWatcher(std::weak_ptr serviceSta ioContext->stop(); else if (std::shared_ptr serviceStatusWatchTimer = serviceStatusWatchTimerRef.lock()) { - serviceStatusWatchTimer->expires_from_now(boost::posix_time::seconds(1)); + serviceStatusWatchTimer->expires_after(1s); serviceStatusWatchTimer->async_wait(std::bind(&ServiceStatusWatcher, serviceStatusWatchTimerRef, ioContextRef, std::placeholders::_1)); } } diff --git a/src/server/database/CMakeLists.txt b/src/server/database/CMakeLists.txt index b652e7f3ffc..6d1dd4daa91 100644 --- a/src/server/database/CMakeLists.txt +++ b/src/server/database/CMakeLists.txt @@ -24,15 +24,6 @@ add_library(database ${PRIVATE_SOURCES} ) -# Do NOT add any extra include directory unless it does not create unneeded extra dependencies, -# and specially, not add any dependency to neither of these: shared, game, scripts -# This way we ensure that if either a PR does that without modifying this file, -# a compile error will be generated, either this file will be modified so it -# is detected more easily. -# While it is OK to include files from other libs as long as they don't require -# linkage (enums, defines...) it is discouraged to do so unless necessary, as it will pullute -# include_directories leading to further unnoticed dependency aditions -# Linker Depencency requirements: common CollectIncludeDirectories( ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC_INCLUDES @@ -45,7 +36,9 @@ target_include_directories(database PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -add_definitions(-DTRINITY_API_EXPORT_DATABASE) +set_target_properties(database + PROPERTIES + DEFINE_SYMBOL TRINITY_API_EXPORT_DATABASE) target_link_libraries(database PRIVATE diff --git a/src/server/database/Database/DatabaseLoader.cpp b/src/server/database/Database/DatabaseLoader.cpp index bc66fb32591..416370d6dd2 100644 --- a/src/server/database/Database/DatabaseLoader.cpp +++ b/src/server/database/Database/DatabaseLoader.cpp @@ -68,7 +68,7 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool& pool, std::st if (error) { TC_LOG_ERROR("sql.driver", "\nDatabasePool {} NOT opened. There were errors opening the MySQL connections. Check your SQLDriverLogFile " - "for specific errors. Read wiki at http://www.trinitycore.info/display/tc/TrinityCore+Home", name); + "for specific errors. Read wiki at https://www.trinitycore.info", name); return false; } diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 35c9d4d5537..776eb7dbe87 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -176,7 +176,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() // 0: uint32, 1: uint8, 3: string, 4: uint32, 5: uint32 PrepareStatement(CHAR_INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights, BankMoneyPerDay) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32 - PrepareStatement(CHAR_DEL_GUILD_LOWEST_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid >= ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8 + PrepareStatement(CHAR_DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8 PrepareStatement(CHAR_INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)", CONNECTION_ASYNC); // 0: uint32, 1: uint8 PrepareStatement(CHAR_DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8 PrepareStatement(CHAR_DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32 @@ -373,7 +373,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_ALL_GM_TICKETS, "TRUNCATE TABLE gm_ticket", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_SPELL_TALENTS, "DELETE FROM character_talent WHERE spell = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_SPELL_SPELLS, "DELETE FROM character_spell WHERE spell = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_DELETE_INFO, "UPDATE characters SET deleteInfos_Name = name, deleteInfos_Account = account, deleteDate = UNIX_TIMESTAMP(), name = '', account = 0 WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_DELETE_INFO, "UPDATE characters SET deleteInfos_Name = name, deleteInfos_Account = account, deleteDate = UNIX_TIMESTAMP(), name = NULL, account = 0 WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_RESTORE_DELETE_INFO, "UPDATE characters SET name = ?, account = ?, deleteDate = NULL, deleteInfos_Name = NULL, deleteInfos_Account = NULL WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ZONE, "UPDATE characters SET zone = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_LEVEL, "UPDATE characters SET level = ?, xp = 0 WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 7404a615c61..4258d1b5788 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -155,7 +155,7 @@ enum CharacterDatabaseStatements : uint32 CHAR_DEL_GUILD_MEMBERS, CHAR_INS_GUILD_RANK, CHAR_DEL_GUILD_RANKS, - CHAR_DEL_GUILD_LOWEST_RANK, + CHAR_DEL_GUILD_RANK, CHAR_INS_GUILD_BANK_TAB, CHAR_DEL_GUILD_BANK_TAB, CHAR_DEL_GUILD_BANK_TABS, diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp index 372f64a273c..b28abd0e7fc 100644 --- a/src/server/database/Database/Implementation/WorldDatabase.cpp +++ b/src/server/database/Database/Implementation/WorldDatabase.cpp @@ -77,7 +77,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, type, type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, type, type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName, StringId FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); diff --git a/src/server/database/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp index 9460892256f..ff541281036 100644 --- a/src/server/database/Database/MySQLConnection.cpp +++ b/src/server/database/Database/MySQLConnection.cpp @@ -213,6 +213,25 @@ bool MySQLConnection::Execute(char const* sql) return true; } +static auto mysql_bind_param_no_deprecated(MYSQL_STMT* stmt, MYSQL_BIND* bnd) +{ +#if TRINITY_COMPILER == TRINITY_COMPILER_GNU +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#else +#pragma warning(push) +#pragma warning(disable: 4996) +#endif + + return mysql_stmt_bind_param(stmt, bnd); + +#if TRINITY_COMPILER == TRINITY_COMPILER_GNU +#pragma GCC diagnostic pop +#else +#pragma warning(pop) +#endif +} + bool MySQLConnection::Execute(PreparedStatementBase* stmt) { if (!m_Mysql) @@ -230,7 +249,7 @@ bool MySQLConnection::Execute(PreparedStatementBase* stmt) uint32 _s = getMSTime(); - if (mysql_stmt_bind_param(msql_STMT, msql_BIND)) + if (mysql_bind_param_no_deprecated(msql_STMT, msql_BIND)) { uint32 lErrno = mysql_errno(m_Mysql); TC_LOG_ERROR("sql.sql", "SQL(p): {}\n [ERROR]: [{}] {}", m_mStmt->getQueryString(), lErrno, mysql_stmt_error(msql_STMT)); @@ -278,7 +297,7 @@ bool MySQLConnection::_Query(PreparedStatementBase* stmt, MySQLPreparedStatement uint32 _s = getMSTime(); - if (mysql_stmt_bind_param(msql_STMT, msql_BIND)) + if (mysql_bind_param_no_deprecated(msql_STMT, msql_BIND)) { uint32 lErrno = mysql_errno(m_Mysql); TC_LOG_ERROR("sql.sql", "SQL(p): {}\n [ERROR]: [{}] {}", m_mStmt->getQueryString(), lErrno, mysql_stmt_error(msql_STMT)); diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index 465120dd3bf..92325ea4b5e 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -391,7 +391,7 @@ void DBUpdater::ApplyFile(DatabaseWorkerPool& pool, std::string const& hos args.emplace_back(database); // Invokes a mysql process which doesn't leak credentials to logs - int const ret = Trinity::StartProcess(DBUpdaterUtil::GetCorrectedMySQLExecutable(), args, + int32 const ret = Trinity::StartProcess(DBUpdaterUtil::GetCorrectedMySQLExecutable(), std::move(args), "sql.updates", "", true); if (ret != EXIT_SUCCESS) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 1616d3e5787..48cd8e63888 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -385,6 +385,11 @@ inline Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, return source->FindNearestCreature(entry, maxSearchRange, alive); } +inline Creature* GetClosestCreatureWithOptions(WorldObject* source, float maxSearchRange, FindCreatureOptions const& options) +{ + return source->FindNearestCreatureWithOptions(maxSearchRange, options); +} + inline GameObject* GetClosestGameObjectWithEntry(WorldObject* source, uint32 entry, float maxSearchRange, bool spawnedOnly = true) { return source->FindNearestGameObject(entry, maxSearchRange, spawnedOnly); @@ -396,6 +401,12 @@ inline void GetCreatureListWithEntryInGrid(Container& container, WorldObject* so source->GetCreatureListWithEntryInGrid(container, entry, maxSearchRange); } +template +inline void GetCreatureListWithOptionsInGrid(Container& container, WorldObject* source, float maxSearchRange, FindCreatureOptions const& options) +{ + source->GetCreatureListWithOptionsInGrid(container, maxSearchRange, options); +} + template inline void GetGameObjectListWithEntryInGrid(Container& container, WorldObject* source, uint32 entry, float maxSearchRange) { diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 0cfea7c0c30..ce1e8053f57 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1216,7 +1216,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!summoner) break; - bool personalSpawn = flags.HasFlag(SmartActionSummonCreatureFlags::PersonalSpawn); + ObjectGuid privateObjectOwner; + if (flags.HasFlag(SmartActionSummonCreatureFlags::PersonalSpawn)) + privateObjectOwner = summoner->IsPrivateObject() ? summoner->GetPrivateObjectOwner() : summoner->GetGUID(); uint32 spawnsCount = std::max(e.action.summonCreature.count, 1u); float x, y, z, o; @@ -1229,7 +1231,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u o += e.target.o; for (uint32 counter = 0; counter < spawnsCount; counter++) { - if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, Milliseconds(e.action.summonCreature.duration), personalSpawn)) + if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, Milliseconds(e.action.summonCreature.duration), privateObjectOwner)) if (e.action.summonCreature.attackInvoker) summon->AI()->AttackStart(target->ToUnit()); } @@ -1240,7 +1242,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u for (uint32 counter = 0; counter < spawnsCount; counter++) { - if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, e.target.x, e.target.y, e.target.z, e.target.o, (TempSummonType)e.action.summonCreature.type, Milliseconds(e.action.summonCreature.duration), personalSpawn)) + if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, e.target.x, e.target.y, e.target.z, e.target.o, (TempSummonType)e.action.summonCreature.type, Milliseconds(e.action.summonCreature.duration), privateObjectOwner)) if (unit && e.action.summonCreature.attackInvoker) summon->AI()->AttackStart(unit); } diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 3b6437c1bfe..5fdc0fe7c1d 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -97,7 +97,7 @@ enum RBACPermissions RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE = 44, RBAC_PERM_SILENTLY_JOIN_CHANNEL = 45, RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR = 46, - RBAC_PERM_CHECK_FOR_LOWER_SECURITY = 47, + RBAC_PERM_CAN_IGNORE_LOWER_SECURITY_CHECK = 47, RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA = 48, RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE = 49, RBAC_PERM_MAY_CHECK_OWN_EMAIL = 50, diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 8219d4ab05c..1fc0b8bf304 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -294,7 +294,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) } } -bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, WorldObject const* target, uint32 miscvalue1 /*= 0*/, uint32 miscvalue2 /* = 0*/) const +bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, WorldObject const* target, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /* = 0*/) const { switch (dataType) { @@ -350,7 +350,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo return unitTarget->HasAuraEffect(aura.spell_id, aura.effect_idx); } case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE: - return CompareValues(ComparisionType(value.compType), miscvalue1, value.value); + return CompareValues(ComparisionType(value.compType), miscValue1, value.value); case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL: { if (!target) @@ -422,13 +422,13 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo Unit const* unitTarget = nullptr; if (target) unitTarget = target->ToUnit(); - return instance->CheckAchievementCriteriaMeet(criteria_id, source, unitTarget, miscvalue1); + return instance->CheckAchievementCriteriaMeet(criteria_id, source, unitTarget, miscValue1); } case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM: { - AchievementCriteriaEntry const* entry = ASSERT_NOTNULL(sAchievementMgr->GetAchievementCriteria(criteria_id)); + AchievementCriteriaEntry const* entry = sAchievementCriteriaStore.AssertEntry(criteria_id); - uint32 itemId = (entry->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscvalue2 : miscvalue1); + uint32 itemId = (entry->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscValue2 : miscValue1); ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); if (!itemTemplate) return false; @@ -457,7 +457,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo } case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY: { - ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscvalue1); + ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscValue1); if (!pProto) return false; return pProto->Quality == item.item_quality; @@ -468,18 +468,17 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo return false; } -bool AchievementCriteriaDataSet::Meets(Player const* source, WorldObject const* target, uint32 miscvalue1 /*= 0*/, uint32 miscvalue2 /* = 0*/) const +bool AchievementCriteriaDataSet::Meets(Player const* source, WorldObject const* target, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /* = 0*/) const { for (AchievementCriteriaData const& criteriadata : storage) - if (!criteriadata.Meets(criteria_id, source, target, miscvalue1, miscvalue2)) + if (!criteriadata.Meets(criteria_id, source, target, miscValue1, miscValue2)) return false; return true; } -AchievementMgr::AchievementMgr(Player* player) +AchievementMgr::AchievementMgr(Player* player) : m_player(player), m_achievementPoints(0) { - m_player = player; } AchievementMgr::~AchievementMgr() { } @@ -501,6 +500,7 @@ void AchievementMgr::Reset() } m_completedAchievements.clear(); + m_achievementPoints = 0; m_criteriaProgress.clear(); DeleteFromDB(m_player->GetGUID()); @@ -522,7 +522,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaCondition condi for (AchievementCriteriaEntry const* achievementCriteria : *achievementCriteriaList) { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->AchievementID); if (!achievement) continue; @@ -610,7 +610,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ uint32 achievementid = fields[0].GetUInt16(); // must not happen: cleanup at server startup in sAchievementMgr->LoadCompletedAchievements() - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementid); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementid); if (!achievement) continue; @@ -618,6 +618,8 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ ca.date = time_t(fields[1].GetUInt32()); ca.changed = false; + m_achievementPoints += achievement->Points; + // title achievement rewards are retroactive if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement)) if (uint32 titleId = reward->TitleId[Player::TeamForRace(GetPlayer()->GetRace()) == ALLIANCE ? 0 : 1]) @@ -636,7 +638,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ uint32 counter = fields[1].GetUInt32(); time_t date = time_t(fields[2].GetUInt32()); - AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(id); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id); if (!criteria) { // Removing non-existing criteria data for all characters @@ -784,7 +786,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type, miscValue1); for (AchievementCriteriaEntry const* achievementCriteria : achievementCriteriaList) { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->AchievementID); if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, ref)) continue; @@ -845,7 +847,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS: SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; - // std case: increment at miscvalue1 + // std case: increment at miscValue1 case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS: @@ -861,7 +863,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); break; - // std case: increment at miscvalue2 + // std case: increment at miscValue2 case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM: @@ -869,7 +871,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE); break; - // std case: high value at miscvalue1 + // std case: high value at miscValue1 case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: /* FIXME: for online player only currently */ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: @@ -949,7 +951,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; } case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: - // miscvalue1 is the ingame fallheight*100 as stored in dbc + // miscValue1 is the ingame fallheight*100 as stored in dbc SetCriteriaProgress(achievementCriteria, miscValue1); break; case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: @@ -1051,13 +1053,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS: if (!miscValue1) - { - uint32 points = 0; - for (std::pair const& completedAchievement : m_completedAchievements) - if (AchievementEntry const* completedAchievements = sAchievementMgr->GetAchievement(completedAchievement.first)) - points += completedAchievements->Points; - SetCriteriaProgress(achievementCriteria, points, PROGRESS_SET); - } + SetCriteriaProgress(achievementCriteria, m_achievementPoints, PROGRESS_SET); else SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE); break; @@ -1174,7 +1170,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve if (!progress) return false; - switch (achievementCriteria->Type) + switch (AchievementCriteriaTypes(achievementCriteria->Type)) { case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: @@ -1274,6 +1270,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve default: break; } + return false; } @@ -1415,7 +1412,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, if (entry->StartTimer) { // has to exist, otherwise we wouldn't be here - timedCompleted = IsCompletedCriteria(entry, sAchievementMgr->GetAchievement(entry->AchievementID)); + timedCompleted = IsCompletedCriteria(entry, sAchievementStore.LookupEntry(entry->AchievementID)); // Client expects this in packet timeElapsed = entry->StartTimer - (timedIter->second/IN_MILLISECONDS); @@ -1452,7 +1449,7 @@ void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) // Time is up, remove timer and reset progress if (itr->second <= timeDiff) { - AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteria(itr->first); + AchievementCriteriaEntry const* entry = sAchievementCriteriaStore.LookupEntry(itr->first); RemoveCriteriaProgress(entry); m_timedAchievements.erase(itr++); } @@ -1472,7 +1469,7 @@ void AchievementMgr::StartTimedAchievement(AchievementCriteriaTimedTypes type, u if (criteria->StartAsset != entry) continue; - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID); if (m_timedAchievements.find(criteria->ID) == m_timedAchievements.end() && !IsCompletedCriteria(criteria, achievement)) { // Start the timer @@ -1527,6 +1524,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) if (achievement->Flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) sAchievementMgr->SetRealmCompleted(achievement); + m_achievementPoints += achievement->Points; + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, achievement->ID); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->Points); @@ -1610,7 +1609,7 @@ void AchievementMgr::BuildAllDataPacket(Player const* receiver, WorldPacket* dat for (std::pair const& completedAchievement : m_completedAchievements) { // Skip hidden achievements - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(completedAchievement.first); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(completedAchievement.first); if (!achievement || achievement->Flags & ACHIEVEMENT_FLAG_HIDDEN) continue; @@ -1871,8 +1870,8 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achie return false; break; case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: - // miscvalue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored) - // miscvalue2=count of item loot + // miscValue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored) + // miscValue2=count of item loot if (!miscValue1 || !miscValue2) return false; if (miscValue1 != achievementCriteria->Asset.LootType) @@ -1924,8 +1923,8 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achie return false; break; case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: - // miscvalue1 = itemSlot - // miscvalue2 = itemid + // miscValue1 = itemSlot + // miscValue2 = itemid if (!miscValue2) return false; if (miscValue1 != achievementCriteria->Asset.ItemSlot) @@ -1933,15 +1932,15 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achie break; case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT: - // miscvalue1 = itemid - // miscvalue2 = diced value + // miscValue1 = itemid + // miscValue2 = diced value if (!miscValue1) return false; if (miscValue2 != achievementCriteria->Asset.RollValue) return false; break; case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: - // miscvalue1 = emote + // miscValue1 = emote if (!miscValue1) return false; if (miscValue1 != achievementCriteria->Asset.EmoteID) @@ -2333,11 +2332,11 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() uint32 loaded = 0; for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId) { - AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(entryId); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId); if (!criteria) continue; - if (!GetAchievement(criteria->AchievementID)) + if (!sAchievementStore.LookupEntry(criteria->AchievementID)) { TC_LOG_DEBUG("server.loading", "Achievement {} referenced by criteria {} doesn't exist, criteria not loaded.", criteria->AchievementID, criteria->ID); continue; @@ -2415,7 +2414,7 @@ void AchievementGlobalMgr::LoadAchievementReferenceList() for (uint32 entryId = 0; entryId < sAchievementStore.GetNumRows(); ++entryId) { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(entryId); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(entryId); if (!achievement || !achievement->SharesCriteria) continue; @@ -2424,7 +2423,7 @@ void AchievementGlobalMgr::LoadAchievementReferenceList() } // Once Bitten, Twice Shy (10 player) - Icecrown Citadel - if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(4539)) + if (AchievementEntry const* achievement = sAchievementStore.LookupEntry(4539)) const_cast(achievement)->InstanceID = 631; // Correct map requirement (currently has Ulduar) TC_LOG_INFO("server.loading", ">> Loaded {} achievement references in {} ms.", count, GetMSTimeDiffToNow(oldMSTime)); @@ -2451,7 +2450,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() Field* fields = result->Fetch(); uint32 criteria_id = fields[0].GetUInt32(); - AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(criteria_id); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(criteria_id); if (!criteria) { @@ -2491,7 +2490,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() // post loading checks for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId) { - AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(entryId); + AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId); if (!criteria) continue; @@ -2517,7 +2516,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() break; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID); if (!achievement) continue; @@ -2546,7 +2545,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // only Children's Week achievements { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID); if (!achievement) continue; if (achievement->Category != CATEGORY_CHILDRENS_WEEK && achievement->ID != 1785) @@ -2589,7 +2588,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements() Field* fields = result->Fetch(); uint16 achievementId = fields[0].GetUInt16(); - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementId); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementId); if (!achievement) { // Remove non-existing achievements from all characters @@ -2628,7 +2627,7 @@ void AchievementGlobalMgr::LoadRewards() { Field* fields = result->Fetch(); uint32 id = fields[0].GetUInt32(); - AchievementEntry const* achievement = GetAchievement(id); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(id); if (!achievement) { TC_LOG_ERROR("sql.sql", "Table `achievement_reward` contains a wrong achievement ID ({}), ignored.", id); @@ -2763,13 +2762,3 @@ void AchievementGlobalMgr::LoadRewardLocales() TC_LOG_INFO("server.loading", ">> Loaded {} achievement reward locale strings in {} ms.", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime)); } - -AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementId) const -{ - return sAchievementStore.LookupEntry(achievementId); -} - -AchievementCriteriaEntry const* AchievementGlobalMgr::GetAchievementCriteria(uint32 criteriaId) const -{ - return sAchievementCriteriaStore.LookupEntry(criteriaId); -} diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 28041c35e77..0299add217a 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -292,6 +292,7 @@ class TC_GAME_API AchievementMgr void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed achievements + uint32 GetAchievementPoints() const { return m_achievementPoints; } private: void SendAchievementEarned(AchievementEntry const* achievement) const; void SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const; @@ -312,6 +313,7 @@ class TC_GAME_API AchievementMgr CompletedAchievementMap m_completedAchievements; typedef std::map TimedAchievementMap; TimedAchievementMap m_timedAchievements; // Criteria id/time left in MS + uint32 m_achievementPoints; }; class TC_GAME_API AchievementGlobalMgr @@ -377,8 +379,6 @@ class TC_GAME_API AchievementGlobalMgr void LoadCompletedAchievements(); void LoadRewards(); void LoadRewardLocales(); - AchievementEntry const* GetAchievement(uint32 achievementId) const; - AchievementCriteriaEntry const* GetAchievementCriteria(uint32 achievementId) const; private: AchievementCriteriaDataMap m_criteriaDataMap; diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 1139d34bb22..62a7ed1c61c 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -283,7 +283,7 @@ void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 new } //this function sends mail, when auction is cancelled to old bidder -void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans) +void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans, Item* item) { ObjectGuid bidder_guid = ObjectGuid(HighGuid::Player, auction->bidder); Player* bidder = ObjectAccessor::FindConnectedPlayer(bidder_guid); @@ -292,6 +292,9 @@ void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, Ch if (!bidder) bidder_accId = sCharacterCache->GetCharacterAccountIdByGuid(bidder_guid); + if (bidder) + bidder->GetSession()->SendAuctionRemovedNotification(auction->Id, auction->itemEntry, item->GetItemRandomPropertyId()); + // bidder exist if ((bidder || bidder_accId) && !sAuctionBotConfig->IsBotChar(auction->bidder)) MailDraft(auction->BuildAuctionMailSubject(AUCTION_CANCELLED_TO_BIDDER), "") diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 80dba9a5ed3..dd7bb5d484c 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -188,7 +188,7 @@ class TC_GAME_API AuctionHouseMgr void SendAuctionSuccessfulMail(AuctionEntry* auction, CharacterDatabaseTransaction trans); void SendAuctionExpiredMail(AuctionEntry* auction, CharacterDatabaseTransaction trans); void SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 newPrice, Player* newBidder, CharacterDatabaseTransaction trans); - void SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans); + void SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans, Item* item); static uint32 GetAuctionDeposit(AuctionHouseEntry const* entry, uint32 time, Item* pItem, uint32 count); static AuctionHouseEntry const* GetAuctionHouseEntry(uint32 factionTemplateId); diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index bd01ad5850b..3f668392fcf 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -18,6 +18,7 @@ #include "Battlefield.h" #include "BattlefieldMgr.h" #include "Battleground.h" +#include "BattlegroundPackets.h" #include "CellImpl.h" #include "CreatureTextMgr.h" #include "DBCStores.h" @@ -630,11 +631,10 @@ void Battlefield::RemovePlayerFromResurrectQueue(ObjectGuid playerGuid) void Battlefield::SendAreaSpiritHealerQueryOpcode(Player* player, ObjectGuid guid) { - WorldPacket data(SMSG_AREA_SPIRIT_HEALER_TIME, 12); - uint32 time = m_LastResurrectTimer; // resurrect every 30 seconds - - data << guid << time; - player->SendDirectMessage(&data); + WorldPackets::Battleground::AreaSpiritHealerTime areaSpiritHealerTime; + areaSpiritHealerTime.HealerGuid = guid; + areaSpiritHealerTime.TimeLeft = m_LastResurrectTimer; + player->SendDirectMessage(areaSpiritHealerTime.Write()); } // ---------------------- diff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp index 6d5ebc28e4d..fb4143bd70b 100644 --- a/src/server/game/Battlegrounds/Arena.cpp +++ b/src/server/game/Battlegrounds/Arena.cpp @@ -18,6 +18,7 @@ #include "Arena.h" #include "ArenaScore.h" #include "ArenaTeamMgr.h" +#include "BattlegroundPackets.h" #include "Log.h" #include "ObjectAccessor.h" #include "Player.h" @@ -25,37 +26,20 @@ #include "WorldSession.h" #include "WorldStatePackets.h" -void ArenaScore::AppendToPacket(WorldPacket& data) +void ArenaScore::AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData) { - data << uint64(PlayerGuid); + playerData.PlayerGUID = PlayerGuid; - data << uint32(KillingBlows); - data << uint8(TeamId); - data << uint32(DamageDone); - data << uint32(HealingDone); + playerData.Kills = KillingBlows; + playerData.HonorOrFaction = TeamId; + playerData.DamageDone = DamageDone; + playerData.HealingDone = HealingDone; - BuildObjectivesBlock(data); + BuildObjectivesBlock(playerData); } -void ArenaScore::BuildObjectivesBlock(WorldPacket& data) +void ArenaScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& /*playerData*/) { - data << uint32(0); // Objectives Count -} - -void ArenaTeamScore::BuildRatingInfoBlock(WorldPacket& data) -{ - uint32 ratingLost = std::abs(std::min(RatingChange, 0)); - uint32 ratingWon = std::max(RatingChange, 0); - - // should be old rating, new rating, and client will calculate rating change itself - data << uint32(ratingLost); - data << uint32(ratingWon); - data << uint32(MatchmakerRating); -} - -void ArenaTeamScore::BuildTeamInfoBlock(WorldPacket& data) -{ - data << TeamName; } Arena::Arena() diff --git a/src/server/game/Battlegrounds/ArenaScore.h b/src/server/game/Battlegrounds/ArenaScore.h index a8dbcefe127..63552a36215 100644 --- a/src/server/game/Battlegrounds/ArenaScore.h +++ b/src/server/game/Battlegrounds/ArenaScore.h @@ -21,15 +21,15 @@ #include "BattlegroundScore.h" #include -struct TC_GAME_API ArenaScore : public BattlegroundScore +struct TC_GAME_API ArenaScore final : public BattlegroundScore { friend class Arena; protected: ArenaScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid), TeamId(team == ALLIANCE ? PVP_TEAM_ALLIANCE : PVP_TEAM_HORDE) { } - void AppendToPacket(WorldPacket& data) final override; - void BuildObjectivesBlock(WorldPacket& data) final override; + void AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData) override; + void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) override; // For Logging purpose std::string ToString() const override @@ -50,8 +50,6 @@ struct TC_GAME_API ArenaTeamScore protected: ArenaTeamScore() : RatingChange(0), MatchmakerRating(0) { } - virtual ~ArenaTeamScore() { } - void Reset() { RatingChange = 0; @@ -66,9 +64,6 @@ struct TC_GAME_API ArenaTeamScore TeamName = teamName; } - void BuildRatingInfoBlock(WorldPacket& data); - void BuildTeamInfoBlock(WorldPacket& data); - int32 RatingChange; uint32 MatchmakerRating; std::string TeamName; diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index f9901f3c422..7bb47cc75e2 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -18,6 +18,7 @@ #include "ArenaTeam.h" #include "ArenaTeamMgr.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "CalendarPackets.h" #include "CharacterCache.h" #include "DatabaseEnv.h" @@ -326,18 +327,22 @@ void ArenaTeam::DelMember(ObjectGuid guid, bool cleanDb) { if (group && playerMember->GetGroup() && group->GetGUID() == playerMember->GetGroup()->GetGUID()) { - if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, GetType())) + for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { + BattlegroundQueueTypeId bgQueue = playerMember->GetBattlegroundQueueTypeId(i); + if (bgQueue.BattlemasterListId != BATTLEGROUND_AA || bgQueue.TeamSize != GetType()) + continue; + GroupQueueInfo ginfo; BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue); if (queue.GetPlayerGroupInfoData(playerMember->GetGUID(), &ginfo)) if (!ginfo.IsInvitedToBGInstanceGUID) { - WorldPacket data; playerMember->RemoveBattlegroundQueueId(bgQueue); - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, nullptr, playerMember->GetBattlegroundQueueIndex(bgQueue), STATUS_NONE, 0, 0, 0, 0); + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusNone(&battlefieldStatus, i); queue.RemovePlayer(playerMember->GetGUID(), true); - playerMember->GetSession()->SendPacket(&data); + playerMember->SendDirectMessage(battlefieldStatus.Write()); } } } @@ -604,6 +609,20 @@ uint8 ArenaTeam::GetSlotByType(uint32 type) return 0xFF; } +uint8 ArenaTeam::GetTypeBySlot(uint8 slot) +{ + switch (slot) + { + case 0: return ARENA_TEAM_2v2; + case 1: return ARENA_TEAM_3v3; + case 2: return ARENA_TEAM_5v5; + default: + break; + } + TC_LOG_ERROR("bg.arena", "FATAL: Unknown arena team slot {} for some arena team", slot); + return 0xFF; +} + bool ArenaTeam::IsMember(ObjectGuid guid) const { for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h index 9495218980c..c6ee45a5125 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.h +++ b/src/server/game/Battlegrounds/ArenaTeam.h @@ -129,6 +129,7 @@ class TC_GAME_API ArenaTeam uint32 GetType() const { return Type; } uint8 GetSlot() const { return GetSlotByType(GetType()); } static uint8 GetSlotByType(uint32 type); + static uint8 GetTypeBySlot(uint8 slot); ObjectGuid GetCaptain() const { return CaptainGuid; } std::string const& GetName() const { return TeamName; } ArenaTeamStats const& GetStats() const { return Stats; } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 938ac559b4c..9176eaf430a 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -18,6 +18,7 @@ #include "Battleground.h" #include "ArenaScore.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "BattlegroundScore.h" #include "ChatTextBuilder.h" #include "Creature.h" @@ -42,18 +43,21 @@ #include "WorldStatePackets.h" #include -void BattlegroundScore::AppendToPacket(WorldPacket& data) +void BattlegroundScore::AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData) { - data << uint64(PlayerGuid); + playerData.PlayerGUID = PlayerGuid; - data << uint32(KillingBlows); - data << uint32(HonorableKills); - data << uint32(Deaths); - data << uint32(BonusHonor); - data << uint32(DamageDone); - data << uint32(HealingDone); + playerData.Kills = KillingBlows; + playerData.HonorOrFaction = WorldPackets::Battleground::PVPLogData_Honor + { + .HonorKills = HonorableKills, + .Deaths = Deaths, + .ContributionPoints = BonusHonor + }; + playerData.DamageDone = DamageDone; + playerData.HealingDone = HealingDone; - BuildObjectivesBlock(data); + BuildObjectivesBlock(playerData); } template @@ -153,6 +157,12 @@ Battleground::~Battleground() m_Map->SetBG(nullptr); m_Map = nullptr; } + + // Clear Group::m_bgGroup, Group might later reference it in its own destructor + for (Group* bgRaid : m_BgRaids) + if (bgRaid) + bgRaid->SetBattlegroundGroup(nullptr); + // remove from bg free slot queue RemoveFromBGFreeSlotQueue(); @@ -461,11 +471,10 @@ inline void Battleground::_ProcessJoin(uint32 diff) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) { // BG Status packet - WorldPacket status; - BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType()); - uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId); - sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, queueSlot, STATUS_IN_PROGRESS, 0, GetStartTime(), GetArenaType(), player->GetBGTeam()); - player->SendDirectMessage(&status); + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(m_TypeID, GetBracketId(), GetArenaType()); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), bgQueueTypeId); + player->SendDirectMessage(battlefieldStatus.Write()); player->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION); player->ResetAllPowers(); @@ -716,10 +725,11 @@ void Battleground::EndBattleground(uint32 winner) //we must set it this way, because end time is sent in packet! m_EndTime = TIME_TO_AUTOREMOVE; - WorldPacket pvpLogData; - BuildPvPLogDataPacket(pvpLogData); + WorldPackets::Battleground::PVPMatchStatistics pvpMatchStatistics; + BuildPvPLogDataPacket(pvpMatchStatistics); + pvpMatchStatistics.Write(); - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType()); for (BattlegroundPlayerMap::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { @@ -769,6 +779,10 @@ void Battleground::EndBattleground(uint32 winner) CharacterDatabase.Execute(stmt); } + // remove temporary currency bonus auras before rewarding player + player->RemoveAura(SPELL_HONORABLE_DEFENDER_25Y); + player->RemoveAura(SPELL_HONORABLE_DEFENDER_60Y); + // Reward winner team if (team == winner) { @@ -794,11 +808,12 @@ void Battleground::EndBattleground(uint32 winner) BlockMovement(player); - player->SendDirectMessage(&pvpLogData); + player->SendDirectMessage(pvpMatchStatistics.GetRawPacket()); + + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), bgQueueTypeId); + player->SendDirectMessage(battlefieldStatus.Write()); - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime(), GetArenaType(), player->GetBGTeam()); - player->SendDirectMessage(&data); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, player->GetMapId()); } } @@ -865,8 +880,7 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen if (participant) // if the player was a match participant, remove auras, calc rating, update queue { - BattlegroundTypeId bgTypeId = GetTypeID(); - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType()); if (player) { player->ClearAfkReports(); @@ -874,7 +888,7 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen // if arena, remove the specific arena auras if (isArena()) { - bgTypeId = BATTLEGROUND_AA; // set the bg type to all arenas (it will be used for queue refreshing) + bgQueueTypeId.BattlemasterListId = BATTLEGROUND_AA; // set the bg type to all arenas (it will be used for queue refreshing) // unsummon current and summon old pet if there was one and there isn't a current pet player->RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT); @@ -883,9 +897,9 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen if (SendPacket) { - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_NONE, 0, 0, 0, 0); - player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusNone(&battlefieldStatus, player->GetBattlegroundQueueIndex(bgQueueTypeId)); + player->SendDirectMessage(battlefieldStatus.Write()); } // this call is important, because player, when joins to battleground, this method is not called, so it must be called when leaving bg @@ -904,12 +918,12 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen { // a player has left the battleground, so there are free slots -> add to queue AddToBGFreeSlotQueue(); - sBattlegroundMgr->ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, GetBracketId()); + sBattlegroundMgr->ScheduleQueueUpdate(0, bgQueueTypeId); } // Let others know - WorldPacket data; - sBattlegroundMgr->BuildPlayerLeftBattlegroundPacket(&data, guid); - SendPacketToTeam(team, &data, player, false); + WorldPackets::Battleground::BattlegroundPlayerLeft playerLeft; + playerLeft.Guid = guid; + SendPacketToTeam(team, playerLeft.Write(), player, false); } if (player) @@ -998,9 +1012,9 @@ void Battleground::AddPlayer(Player* player) if (!isInBattleground) UpdatePlayersCountByTeam(team, false); // +1 player - WorldPacket data; - sBattlegroundMgr->BuildPlayerJoinedBattlegroundPacket(&data, player); - SendPacketToTeam(team, &data, player, false); + WorldPackets::Battleground::BattlegroundPlayerJoined playerJoined; + playerJoined.Guid = player->GetGUID(); + SendPacketToTeam(team, playerJoined.Write(), player, false); player->RemoveAurasByType(SPELL_AURA_MOUNTED); @@ -1197,33 +1211,33 @@ bool Battleground::HasFreeSlots() const return GetPlayersSize() < GetMaxPlayers(); } -void Battleground::BuildPvPLogDataPacket(WorldPacket& data) +void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchStatistics& pvpLogData) { - uint8 type = (isArena() ? 1 : 0); - - data.Initialize(MSG_PVP_LOG_DATA, 1 + 1 + 4 + 40 * GetPlayerScoresSize()); - data << uint8(type); // type (battleground = 0 / arena = 1) - - if (type) // arena + if (isArena()) { - for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i) - _arenaTeamScores[i].BuildRatingInfoBlock(data); + WorldPackets::Battleground::PVPLogData_Arena& arena = pvpLogData.Arena.emplace(); for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i) - _arenaTeamScores[i].BuildTeamInfoBlock(data); + { + ArenaTeamScore const& score = _arenaTeamScores[i]; + + uint32 ratingLost = std::abs(std::min(score.RatingChange, 0)); + uint32 ratingWon = std::max(score.RatingChange, 0); + + // should be old rating, new rating, and client will calculate rating change itself + arena.Ratings.Prematch[i] = ratingLost; + arena.Ratings.Postmatch[i] = ratingWon; + arena.Ratings.PrematchMMR[i] = score.MatchmakerRating; + + arena.TeamName[i] = score.TeamName; + } } if (GetStatus() == STATUS_WAIT_LEAVE) - { - data << uint8(1); // bg ended - data << uint8(GetWinner()); // who win - } - else - data << uint8(0); // bg not ended + pvpLogData.Winner = GetWinner(); - data << uint32(GetPlayerScoresSize()); - for (auto const& score : PlayerScores) - score.second->AppendToPacket(data); + for (auto const& [_, score] : PlayerScores) + score->AppendToPacket(pvpLogData.Players.emplace_back()); } bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) @@ -1726,16 +1740,17 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player) if (GetStatus() != STATUS_WAIT_LEAVE) return; - WorldPacket data; - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType()); BlockMovement(player); - BuildPvPLogDataPacket(data); - player->SendDirectMessage(&data); + WorldPackets::Battleground::PVPMatchStatistics pvpMatchStatistics; + BuildPvPLogDataPacket(pvpMatchStatistics); + player->SendDirectMessage(pvpMatchStatistics.Write()); - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, GetEndTime(), GetStartTime(), GetArenaType(), player->GetBGTeam()); - player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), bgQueueTypeId); + player->SendDirectMessage(battlefieldStatus.Write()); } uint32 Battleground::GetAlivePlayersCountByTeam(uint32 Team) const diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 76c98c3f6c2..eec41ece00b 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -29,6 +29,10 @@ namespace WorldPackets { + namespace Battleground + { + class PVPMatchStatistics; + } namespace WorldState { class InitWorldStates; @@ -321,6 +325,7 @@ class TC_GAME_API Battleground void AddToBGFreeSlotQueue(); //this queue will be useful when more battlegrounds instances will be available void RemoveFromBGFreeSlotQueue(); //this method could delete whole BG instance, if another free is available + void RemoveFromBGFreeSlotQueueOnShutdown() { m_InBGFreeSlotQueue = false; } void DecreaseInvitedCount(uint32 team) { (team == ALLIANCE) ? --m_InvitedAlliance : --m_InvitedHorde; } void IncreaseInvitedCount(uint32 team) { (team == ALLIANCE) ? ++m_InvitedAlliance : ++m_InvitedHorde; } @@ -399,7 +404,7 @@ class TC_GAME_API Battleground Group* GetBgRaid(uint32 TeamID) const { return TeamID == ALLIANCE ? m_BgRaids[TEAM_ALLIANCE] : m_BgRaids[TEAM_HORDE]; } void SetBgRaid(uint32 TeamID, Group* bg_raid); - void BuildPvPLogDataPacket(WorldPacket& data); + void BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchStatistics& pvpLogData); virtual bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true); static TeamId GetTeamIndexByTeamId(uint32 Team) { return Team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; } @@ -497,6 +502,15 @@ class TC_GAME_API Battleground // because BattleGrounds with different types and same level range has different m_BracketId uint8 GetUniqueBracketId() const; + BattlegroundPlayer const* GetBattlegroundPlayerData(ObjectGuid const& playerGuid) const + { + auto itr = m_Players.find(playerGuid); + if (itr == m_Players.end()) + return nullptr; + + return &itr->second; + } + Trinity::unique_weak_ptr GetWeakPtr() const { return m_weakRef; } void SetWeakPtr(Trinity::unique_weak_ptr weakRef) { m_weakRef = std::move(weakRef); } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 1b3d2f0c851..1aed0a37074 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -28,6 +28,7 @@ #include "BattlegroundDS.h" #include "BattlegroundRV.h" #include "BattlegroundIC.h" +#include "BattlegroundPackets.h" #include "Common.h" #include "Containers.h" #include "Chat.h" @@ -69,6 +70,10 @@ BattlegroundMgr::~BattlegroundMgr() void BattlegroundMgr::DeleteAllBattlegrounds() { + for (auto& [_, data] : bgDataStore) + for (Battleground* battleground : data.BGFreeSlotQueue) + battleground->RemoveFromBGFreeSlotQueueOnShutdown(); + bgDataStore.clear(); } @@ -113,24 +118,17 @@ void BattlegroundMgr::Update(uint32 diff) } // update events timer - for (int qtype = BATTLEGROUND_QUEUE_NONE; qtype < MAX_BATTLEGROUND_QUEUE_TYPES; ++qtype) - m_BattlegroundQueues[qtype].UpdateEvents(diff); + for (std::pair& pair : m_BattlegroundQueues) + pair.second.UpdateEvents(diff); // update scheduled queues if (!m_QueueUpdateScheduler.empty()) { - std::vector scheduled; + std::vector scheduled; std::swap(scheduled, m_QueueUpdateScheduler); - for (uint8 i = 0; i < scheduled.size(); i++) - { - uint32 arenaMMRating = scheduled[i] >> 32; - uint8 arenaType = scheduled[i] >> 24 & 255; - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundQueueTypeId(scheduled[i] >> 16 & 255); - BattlegroundTypeId bgTypeId = BattlegroundTypeId((scheduled[i] >> 8) & 255); - BattlegroundBracketId bracket_id = BattlegroundBracketId(scheduled[i] & 255); - m_BattlegroundQueues[bgQueueTypeId].BattlegroundQueueUpdate(diff, bgTypeId, bracket_id, arenaType, arenaMMRating > 0, arenaMMRating); - } + for (auto& [arenaMMRating, bgQueueTypeId] : scheduled) + GetBattlegroundQueue(bgQueueTypeId).BattlegroundQueueUpdate(diff, arenaMMRating > 0, arenaMMRating); } // if rating difference counts, maybe force-update queues @@ -141,11 +139,15 @@ void BattlegroundMgr::Update(uint32 diff) { // forced update for rated arenas (scan all, but skipped non rated) TC_LOG_TRACE("bg.arena", "BattlegroundMgr: UPDATING ARENA QUEUES"); - for (int qtype = BATTLEGROUND_QUEUE_2v2; qtype <= BATTLEGROUND_QUEUE_5v5; ++qtype) + for (uint8 teamSize : { ARENA_TYPE_2v2, ARENA_TYPE_3v3, ARENA_TYPE_5v5 }) + { for (int bracket = BG_BRACKET_ID_FIRST; bracket < MAX_BATTLEGROUND_BRACKETS; ++bracket) - m_BattlegroundQueues[qtype].BattlegroundQueueUpdate(diff, - BATTLEGROUND_AA, BattlegroundBracketId(bracket), - BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId(qtype)), true, 0); + { + BattlegroundQueueTypeId ratedArenaQueueId = BGQueueTypeId(BATTLEGROUND_AA, bracket, teamSize); + if (BattlegroundQueue* arenaQueue = Trinity::Containers::MapGetValuePtr(m_BattlegroundQueues, ratedArenaQueueId)) + arenaQueue->BattlegroundQueueUpdate(diff, true, 0); + } + } m_NextRatedArenaUpdate = sWorld->getIntConfig(CONFIG_ARENA_RATED_UPDATE_TIMER); } @@ -172,77 +174,64 @@ void BattlegroundMgr::Update(uint32 diff) } } -void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype, uint32 arenaFaction) +void BattlegroundMgr::BuildBattlegroundStatusHeader(WorldPackets::Battleground::BattlefieldStatusHeader* header, Battleground const* bg, uint32 queueSlot, BattlegroundQueueTypeId queueId) { - // we can be in 2 queues in same time... + header->QueueSlot = queueSlot; + header->QueueID = queueId.GetPacked(); + header->RangeMin = bg->GetMinLevel(); + header->RangeMax = bg->GetMaxLevel(); + header->InstanceID = bg->GetClientInstanceID(); + header->RegisteredMatch = bg->isRated(); +} - if (StatusID == 0 || !bg) - { - data->Initialize(SMSG_BATTLEFIELD_STATUS, 4+8); - *data << uint32(QueueSlot); // queue id (0...1) - *data << uint64(0); - return; - } +void BattlegroundMgr::BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone* battlefieldStatus, uint32 queueSlot) +{ + battlefieldStatus->QueueSlot = queueSlot; +} + +void BattlegroundMgr::BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation* battlefieldStatus, Battleground const* bg, uint32 queueSlot, uint32 timeout, BattlegroundQueueTypeId queueId) +{ + BuildBattlegroundStatusHeader(&battlefieldStatus->Hdr, bg, queueSlot, queueId); + battlefieldStatus->Mapid = bg->GetMapId(); + battlefieldStatus->Timeout = timeout; +} - data->Initialize(SMSG_BATTLEFIELD_STATUS, (4+8+1+1+4+1+4+4+4)); - *data << uint32(QueueSlot); // queue id (0...1) - player can be in 2 queues in time - // The following segment is read as uint64 in client but can be appended as their original type. - *data << uint8(arenatype); - TC_LOG_DEBUG("network", "BattlegroundMgr::BuildBattlegroundStatusPacket: arenatype = {} for bg instanceID {}, TypeID {}.", arenatype, bg->GetClientInstanceID(), bg->GetTypeID()); - *data << uint8(bg->isArena() ? 0xE : 0x0); - *data << uint32(bg->GetTypeID()); - *data << uint16(0x1F90); - // End of uint64 segment, decomposed this way for simplicity - *data << uint8(bg->GetMinLevel()); - *data << uint8(bg->GetMaxLevel()); - *data << uint32(bg->GetClientInstanceID()); - // alliance/horde for BG and skirmish/rated for Arenas - // following displays the minimap-icon 0 = faction icon 1 = arenaicon - *data << uint8(bg->isRated()); // 1 for rated match, 0 for bg or non rated match - - *data << uint32(StatusID); // status - switch (StatusID) +void BattlegroundMgr::BuildBattlegroundStatusActive(WorldPackets::Battleground::BattlefieldStatusActive* battlefieldStatus, Battleground const* bg, Player const* player, uint32 queueSlot, BattlegroundQueueTypeId queueId) +{ + BuildBattlegroundStatusHeader(&battlefieldStatus->Hdr, bg, queueSlot, queueId); + battlefieldStatus->ShutdownTimer = bg->GetEndTime(); + battlefieldStatus->ArenaFaction = player->GetBGTeam() == HORDE ? PVP_TEAM_HORDE : PVP_TEAM_ALLIANCE; + battlefieldStatus->StartTimer = bg->GetStartTime(); + battlefieldStatus->Mapid = bg->GetMapId(); + if (bg->IsRandom()) { - case STATUS_WAIT_QUEUE: // status_in_queue - *data << uint32(Time1); // average wait time, milliseconds - *data << uint32(Time2); // time in queue, updated every minute!, milliseconds - break; - case STATUS_WAIT_JOIN: // status_invite - *data << uint32(bg->GetMapId()); // map id - *data << uint64(0); // 3.3.5, unknown - *data << uint32(Time1); // time to remove from queue, milliseconds - break; - case STATUS_IN_PROGRESS: // status_in_progress - *data << uint32(bg->GetMapId()); // map id - *data << uint64(0); // 3.3.5, unknown - *data << uint32(Time1); // time to bg auto leave, 0 at bg start, 120000 after bg end, milliseconds - *data << uint32(Time2); // time from bg start, milliseconds - *data << uint8(arenaFaction == ALLIANCE ? 1 : 0); // arenafaction (0 for horde, 1 for alliance) - break; - default: - TC_LOG_ERROR("bg.battleground", "Unknown BG status!"); - break; + BattlegroundTemplate const* realTemplate = sBattlegroundMgr->GetBattlegroundTemplateByTypeId(bg->GetTypeID(true)); + if (PvPDifficultyEntry const* realBracket = GetBattlegroundBracketByLevel(realTemplate->MapIDs.front(), DEFAULT_MAX_LEVEL)) + battlefieldStatus->RandomQueueID = BattlegroundQueueTypeId{ + .BattlemasterListId = uint16(realTemplate->Id), + .BracketId = uint8(realBracket->GetBracketId()), + .TeamSize = 0 + }.GetPacked(); } } -void BattlegroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPacket* data, GroupJoinBattlegroundResult result) +void BattlegroundMgr::BuildBattlegroundStatusQueued(WorldPackets::Battleground::BattlefieldStatusQueued* battlefieldStatus, Battleground const* bg, uint32 queueSlot, uint32 joinTime, BattlegroundQueueTypeId queueId, uint32 avgWaitTime) { - data->Initialize(SMSG_GROUP_JOINED_BATTLEGROUND, 4); - *data << int32(result); - if (result == ERR_BATTLEGROUND_JOIN_TIMED_OUT || result == ERR_BATTLEGROUND_JOIN_FAILED) - *data << uint64(0); // player guid + BuildBattlegroundStatusHeader(&battlefieldStatus->Hdr, bg, queueSlot, queueId); + battlefieldStatus->AverageWaitTime = avgWaitTime; + battlefieldStatus->WaitTime = GetMSTimeDiffToNow(joinTime); } -void BattlegroundMgr::BuildPlayerLeftBattlegroundPacket(WorldPacket* data, ObjectGuid guid) +void BattlegroundMgr::BuildBattlegroundStatusFailed(WorldPackets::Battleground::BattlefieldStatusFailed* battlefieldStatus, GroupJoinBattlegroundResult result, ObjectGuid const* errorGuid /*= nullptr*/) { - data->Initialize(SMSG_BATTLEGROUND_PLAYER_LEFT, 8); - *data << uint64(guid); + battlefieldStatus->Reason = result; + if (errorGuid && (result == ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND || result == ERR_BATTLEGROUND_JOIN_TIMED_OUT)) + battlefieldStatus->ClientID = *errorGuid; } -void BattlegroundMgr::BuildPlayerJoinedBattlegroundPacket(WorldPacket* data, Player* player) +void BattlegroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPackets::Battleground::GroupJoinedBattleground* groupJoinedBattleground, BattlegroundTypeId bgTypeId) { - data->Initialize(SMSG_BATTLEGROUND_PLAYER_JOINED, 8); - *data << uint64(player->GetGUID()); + groupJoinedBattleground->Reason = bgTypeId; } Battleground* BattlegroundMgr::GetBattlegroundThroughClientInstance(uint32 instanceId, BattlegroundTypeId bgTypeId) @@ -488,7 +477,7 @@ bool BattlegroundMgr::CreateBattleground(BattlegroundTemplate const* bgTemplate) AddBattleground(bg); } - bg->SetMapId(bgTemplate->BattlemasterEntry->MapID[0]); + bg->SetMapId(!bgTemplate->MapIDs.empty() ? bgTemplate->MapIDs.front() : -1); bg->SetName(bgTemplate->BattlemasterEntry->Name[sWorld->GetDefaultDbcLocale()]); bg->SetArenaorBGType(bgTemplate->IsArena()); bg->SetMinPlayersPerTeam(bgTemplate->MinPlayersPerTeam); @@ -549,6 +538,9 @@ void BattlegroundMgr::LoadBattlegroundTemplates() bgTemplate.Weight = fields[10].GetUInt8(); bgTemplate.ScriptId = sObjectMgr->GetScriptId(fields[11].GetString()); bgTemplate.BattlemasterEntry = bl; + for (int32 mapId : bl->MapID) + if (sMapStore.LookupEntry(mapId)) + bgTemplate.MapIDs.push_back(mapId); if (bgTemplate.MaxPlayersPerTeam == 0 || bgTemplate.MinPlayersPerTeam > bgTemplate.MaxPlayersPerTeam) { @@ -594,8 +586,8 @@ void BattlegroundMgr::LoadBattlegroundTemplates() _battlegroundTemplates[bgTypeId] = bgTemplate; - if (bgTemplate.BattlemasterEntry->MapID[1] == -1) // in this case we have only one mapId - _battlegroundMapTemplates[bgTemplate.BattlemasterEntry->MapID[0]] = &_battlegroundTemplates[bgTypeId]; + if (bgTemplate.MapIDs.size() == 1) + _battlegroundMapTemplates[bgTemplate.MapIDs[0]] = &_battlegroundTemplates[bgTypeId]; ++count; } @@ -622,7 +614,7 @@ void BattlegroundMgr::InitAutomaticArenaPointDistribution() TC_LOG_DEBUG("bg.battleground", "Automatic Arena Point Distribution initialized."); } -void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId, uint8 fromWhere) +void BattlegroundMgr::SendBattlegroundList(Player* player, ObjectGuid const& guid, BattlegroundTypeId bgTypeId) { if (!player) return; @@ -634,56 +626,34 @@ void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid winner_kills = Trinity::Honor::hk_honor_at_level(player->GetLevel(), float(winner_kills)); loser_kills = Trinity::Honor::hk_honor_at_level(player->GetLevel(), float(loser_kills)); - data->Initialize(SMSG_BATTLEFIELD_LIST); - *data << uint64(guid); // battlemaster guid - *data << uint8(fromWhere); // from where you joined - *data << uint32(bgTypeId); // battleground id - *data << uint8(0); // unk - *data << uint8(0); // unk + WorldPackets::Battleground::BattlefieldList battlefieldList; + battlefieldList.BattlemasterGuid = guid; + battlefieldList.PvpAnywhere = guid.IsEmpty(); + battlefieldList.BattlemasterListID = bgTypeId; + battlefieldList.MinLevel = 0; + battlefieldList.MaxLevel = 0; - // Rewards - *data << uint8(player->GetRandomWinner()); // 3.3.3 hasWin - *data << uint32(winner_kills); // 3.3.3 winHonor - *data << uint32(winner_arena); // 3.3.3 winArena - *data << uint32(loser_kills); // 3.3.3 lossHonor + battlefieldList.HasHolidayWinToday = player->GetRandomWinner(); + battlefieldList.HolidayWinHonorCurrencyBonus = winner_kills; + battlefieldList.HolidayFirstWinArenaCurrencyBonus = winner_arena; + battlefieldList.HolidayLossHonorCurrencyBonus = loser_kills; - uint8 isRandom = bgTypeId == BATTLEGROUND_RB; + battlefieldList.HasRandomWinToday = player->GetRandomWinner(); + battlefieldList.RandomWinHonorCurrencyBonus = winner_kills; + battlefieldList.RandomFirstWinArenaCurrencyBonus = winner_arena; + battlefieldList.RandomLossHonorCurrencyBonus = loser_kills; - *data << uint8(isRandom); // 3.3.3 isRandom - if (isRandom) + if (bgTypeId != BATTLEGROUND_AA) { - // Rewards (random) - *data << uint8(player->GetRandomWinner()); // 3.3.3 hasWin_Random - *data << uint32(winner_kills); // 3.3.3 winHonor_Random - *data << uint32(winner_arena); // 3.3.3 winArena_Random - *data << uint32(loser_kills); // 3.3.3 lossHonor_Random - } - - if (bgTypeId == BATTLEGROUND_AA) // arena - *data << uint32(0); // unk (count?) - else // battleground - { - size_t count_pos = data->wpos(); - *data << uint32(0); // number of bg instances - - BattlegroundDataContainer::iterator it = bgDataStore.find(bgTypeId); - if (it != bgDataStore.end()) + if (BattlegroundData const* battlegrounds = Trinity::Containers::MapGetValuePtr(bgDataStore, bgTypeId)) { // expected bracket entry - if (PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(it->second.m_Battlegrounds.begin()->second->GetMapId(), player->GetLevel())) - { - uint32 count = 0; - BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); - BattlegroundClientIdsContainer& clientIds = it->second.m_ClientBattlegroundIds[bracketId]; - for (BattlegroundClientIdsContainer::const_iterator itr = clientIds.begin(); itr != clientIds.end(); ++itr) - { - *data << uint32(*itr); - ++count; - } - data->put(count_pos, count); - } + if (PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(battlegrounds->m_Battlegrounds.begin()->second->GetMapId(), player->GetLevel())) + battlefieldList.Battlefields = &battlegrounds->m_ClientBattlegroundIds[bracketEntry->GetBracketId()]; } } + + player->SendDirectMessage(battlefieldList.Write()); } void BattlegroundMgr::SendToBattleground(Player* player, uint32 instanceId, BattlegroundTypeId bgTypeId) @@ -705,12 +675,10 @@ void BattlegroundMgr::SendToBattleground(Player* player, uint32 instanceId, Batt void BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(Player* player, Battleground* bg, ObjectGuid guid) { - WorldPacket data(SMSG_AREA_SPIRIT_HEALER_TIME, 12); - uint32 time_ = 30000 - bg->GetLastResurrectTime(); // resurrect every 30 seconds - if (time_ == uint32(-1)) - time_ = 0; - data << guid << time_; - player->SendDirectMessage(&data); + WorldPackets::Battleground::AreaSpiritHealerTime areaSpiritHealerTime; + areaSpiritHealerTime.HealerGuid = guid; + areaSpiritHealerTime.TimeLeft = std::max(30000 - int32(bg->GetLastResurrectTime()), 0); + player->SendDirectMessage(areaSpiritHealerTime.Write()); } bool BattlegroundMgr::IsArenaType(BattlegroundTypeId bgTypeId) @@ -723,86 +691,14 @@ bool BattlegroundMgr::IsArenaType(BattlegroundTypeId bgTypeId) || bgTypeId == BATTLEGROUND_RL; } -BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 arenaType) +bool BattlegroundMgr::IsRandomBattleground(uint32 battlemasterListId) { - switch (bgTypeId) - { - case BATTLEGROUND_AB: - return BATTLEGROUND_QUEUE_AB; - case BATTLEGROUND_AV: - return BATTLEGROUND_QUEUE_AV; - case BATTLEGROUND_EY: - return BATTLEGROUND_QUEUE_EY; - case BATTLEGROUND_IC: - return BATTLEGROUND_QUEUE_IC; - case BATTLEGROUND_RB: - return BATTLEGROUND_QUEUE_RB; - case BATTLEGROUND_SA: - return BATTLEGROUND_QUEUE_SA; - case BATTLEGROUND_WS: - return BATTLEGROUND_QUEUE_WS; - case BATTLEGROUND_AA: - case BATTLEGROUND_BE: - case BATTLEGROUND_DS: - case BATTLEGROUND_NA: - case BATTLEGROUND_RL: - case BATTLEGROUND_RV: - switch (arenaType) - { - case ARENA_TYPE_2v2: - return BATTLEGROUND_QUEUE_2v2; - case ARENA_TYPE_3v3: - return BATTLEGROUND_QUEUE_3v3; - case ARENA_TYPE_5v5: - return BATTLEGROUND_QUEUE_5v5; - default: - return BATTLEGROUND_QUEUE_NONE; - } - default: - return BATTLEGROUND_QUEUE_NONE; - } + return battlemasterListId == BATTLEGROUND_RB; } -BattlegroundTypeId BattlegroundMgr::BGTemplateId(BattlegroundQueueTypeId bgQueueTypeId) +BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 bracketId, uint8 arenaType) { - switch (bgQueueTypeId) - { - case BATTLEGROUND_QUEUE_WS: - return BATTLEGROUND_WS; - case BATTLEGROUND_QUEUE_AB: - return BATTLEGROUND_AB; - case BATTLEGROUND_QUEUE_AV: - return BATTLEGROUND_AV; - case BATTLEGROUND_QUEUE_EY: - return BATTLEGROUND_EY; - case BATTLEGROUND_QUEUE_SA: - return BATTLEGROUND_SA; - case BATTLEGROUND_QUEUE_IC: - return BATTLEGROUND_IC; - case BATTLEGROUND_QUEUE_RB: - return BATTLEGROUND_RB; - case BATTLEGROUND_QUEUE_2v2: - case BATTLEGROUND_QUEUE_3v3: - case BATTLEGROUND_QUEUE_5v5: - return BATTLEGROUND_AA; - default: - return BattlegroundTypeId(0); // used for unknown template (it exists and does nothing) - } -} - -uint8 BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId bgQueueTypeId) -{ - switch (bgQueueTypeId) - { - case BATTLEGROUND_QUEUE_2v2: - return ARENA_TYPE_2v2; - case BATTLEGROUND_QUEUE_3v3: - return ARENA_TYPE_3v3; - case BATTLEGROUND_QUEUE_5v5: - return ARENA_TYPE_5v5; - default: - return 0; - } + return { .BattlemasterListId = uint16(bgTypeId), .BracketId = bracketId, .TeamSize = arenaType }; } void BattlegroundMgr::ToggleTesting() @@ -830,11 +726,40 @@ void BattlegroundMgr::SetHolidayActive(uint32 battlegroundId) bg->SetHoliday(true); } -void BattlegroundMgr::ScheduleQueueUpdate(uint32 arenaMatchmakerRating, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id) +bool BattlegroundMgr::IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId) +{ + BattlegroundTemplate const* battlemasterList = GetBattlegroundTemplateByTypeId(BattlegroundTypeId(bgQueueTypeId.BattlemasterListId)); + if (!battlemasterList) + return false; + + switch (battlemasterList->BattlemasterEntry->InstanceType) + { + case MAP_BATTLEGROUND: + if (bgQueueTypeId.TeamSize) + return false; + break; + case MAP_ARENA: + if (!bgQueueTypeId.TeamSize) + return false; + break; + default: + break; + } + + if (battlemasterList->MapIDs.empty()) + return false; + + if (!GetBattlegroundBracketById(battlemasterList->MapIDs[0], BattlegroundBracketId(bgQueueTypeId.BracketId))) + return false; + + return true; +} + +void BattlegroundMgr::ScheduleQueueUpdate(uint32 arenaMatchmakerRating, BattlegroundQueueTypeId bgQueueTypeId) { //This method must be atomic, @todo add mutex //we will use only 1 number created of bgTypeId and bracket_id - uint64 const scheduleId = ((uint64)arenaMatchmakerRating << 32) | ((uint64)arenaType << 24) | ((uint64)bgQueueTypeId << 16) | ((uint64)bgTypeId << 8) | (uint64)bracket_id; + ScheduledQueueUpdate scheduleId{ arenaMatchmakerRating, bgQueueTypeId }; if (std::find(m_QueueUpdateScheduler.begin(), m_QueueUpdateScheduler.end(), scheduleId) == m_QueueUpdateScheduler.end()) m_QueueUpdateScheduler.push_back(scheduleId); } @@ -958,23 +883,14 @@ BattlegroundTypeId BattlegroundMgr::GetRandomBG(BattlegroundTypeId bgTypeId) { if (BattlegroundTemplate const* bgTemplate = GetBattlegroundTemplateByTypeId(bgTypeId)) { - std::vector ids; - ids.reserve(16); - std::vector weights; - weights.reserve(16); - for (int32 mapId : bgTemplate->BattlemasterEntry->MapID) - { - if (mapId == -1) - break; - + std::vector ids; + ids.reserve(bgTemplate->MapIDs.size()); + for (int32 mapId : bgTemplate->MapIDs) if (BattlegroundTemplate const* bg = GetBattlegroundTemplateByMapId(mapId)) - { - ids.push_back(bg->Id); - weights.push_back(bg->Weight); - } - } + ids.push_back(bg); - return *Trinity::Containers::SelectRandomWeightedContainerElement(ids, weights); + if (!ids.empty()) + return (*Trinity::Containers::SelectRandomWeightedContainerElement(ids, [](BattlegroundTemplate const* bg) { return bg->Weight; }))->Id; } return BATTLEGROUND_TYPE_NONE; @@ -992,13 +908,12 @@ void BattlegroundMgr::AddToBGFreeSlotQueue(BattlegroundTypeId bgTypeId, Battlegr void BattlegroundMgr::RemoveFromBGFreeSlotQueue(BattlegroundTypeId bgTypeId, uint32 instanceId) { - BGFreeSlotQueueContainer& queues = bgDataStore[bgTypeId].BGFreeSlotQueue; - for (BGFreeSlotQueueContainer::iterator itr = queues.begin(); itr != queues.end(); ++itr) - if ((*itr)->GetInstanceID() == instanceId) - { - queues.erase(itr); - return; - } + if (BattlegroundData* battlegroundData = Trinity::Containers::MapGetValuePtr(bgDataStore, bgTypeId)) + { + auto itr = std::ranges::find(battlegroundData->BGFreeSlotQueue, instanceId, [](Battleground const* bg) { return bg->GetInstanceID(); }); + if (itr != battlegroundData->BGFreeSlotQueue.end()) + battlegroundData->BGFreeSlotQueue.erase(itr); + } } void BattlegroundMgr::AddBattleground(Battleground* bg) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index 939d3ef87b1..d32366f90c1 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -58,10 +58,25 @@ struct BattlegroundTemplate uint8 Weight; uint32 ScriptId; BattlemasterListEntry const* BattlemasterEntry; + std::vector MapIDs; bool IsArena() const; }; +namespace WorldPackets +{ + namespace Battleground + { + struct BattlefieldStatusHeader; + class BattlefieldStatusNone; + class BattlefieldStatusNeedConfirmation; + class BattlefieldStatusActive; + class BattlefieldStatusQueued; + class GroupJoinedBattleground; + using BattlefieldStatusFailed = GroupJoinedBattleground; + } +} + class TC_GAME_API BattlegroundMgr { private: @@ -79,11 +94,15 @@ class TC_GAME_API BattlegroundMgr void Update(uint32 diff); /* Packet Building */ - void BuildPlayerJoinedBattlegroundPacket(WorldPacket* data, Player* player); - void BuildPlayerLeftBattlegroundPacket(WorldPacket* data, ObjectGuid guid); - void BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId, uint8 fromWhere); - void BuildGroupJoinedBattlegroundPacket(WorldPacket* data, GroupJoinBattlegroundResult result); - void BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, uint8 arenaType, uint32 arenaFaction); + static void BuildBattlegroundStatusHeader(WorldPackets::Battleground::BattlefieldStatusHeader* header, Battleground const* bg, uint32 queueSlot, BattlegroundQueueTypeId queueId); + static void BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone* battlefieldStatus, uint32 queueSlot); + static void BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation* battlefieldStatus, Battleground const* bg, uint32 queueSlot, uint32 timeout, BattlegroundQueueTypeId queueId); + static void BuildBattlegroundStatusActive(WorldPackets::Battleground::BattlefieldStatusActive* battlefieldStatus, Battleground const* bg, Player const* player, uint32 queueSlot, BattlegroundQueueTypeId queueId); + static void BuildBattlegroundStatusQueued(WorldPackets::Battleground::BattlefieldStatusQueued* battlefieldStatus, Battleground const* bg, uint32 queueSlot, uint32 joinTime, BattlegroundQueueTypeId queueId, uint32 avgWaitTime); + static void BuildBattlegroundStatusFailed(WorldPackets::Battleground::BattlefieldStatusFailed* battlefieldStatus, GroupJoinBattlegroundResult result, ObjectGuid const* errorGuid = nullptr); + static void BuildGroupJoinedBattlegroundPacket(WorldPackets::Battleground::GroupJoinedBattleground* groupJoinedBattleground, BattlegroundTypeId bgTypeId); + + void SendBattlegroundList(Player* player, ObjectGuid const& guid, BattlegroundTypeId bgTypeId); void SendAreaSpiritHealerQueryOpcode(Player* player, Battleground* bg, ObjectGuid guid); /* Battlegrounds */ @@ -103,8 +122,9 @@ class TC_GAME_API BattlegroundMgr void SendToBattleground(Player* player, uint32 InstanceID, BattlegroundTypeId bgTypeId); /* Battleground queues */ - BattlegroundQueue& GetBattlegroundQueue(BattlegroundQueueTypeId bgQueueTypeId) { return m_BattlegroundQueues[bgQueueTypeId]; } - void ScheduleQueueUpdate(uint32 arenaMatchmakerRating, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id); + bool IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId); + BattlegroundQueue& GetBattlegroundQueue(BattlegroundQueueTypeId bgQueueTypeId) { return m_BattlegroundQueues.emplace(bgQueueTypeId, bgQueueTypeId).first->second; } + void ScheduleQueueUpdate(uint32 arenaMatchmakerRating, BattlegroundQueueTypeId bgQueueTypeId); uint32 GetPrematureFinishTime() const; void ToggleArenaTesting(); @@ -116,9 +136,8 @@ class TC_GAME_API BattlegroundMgr bool isArenaTesting() const { return m_ArenaTesting; } bool isTesting() const { return m_Testing; } - static BattlegroundQueueTypeId BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 arenaType); - static BattlegroundTypeId BGTemplateId(BattlegroundQueueTypeId bgQueueTypeId); - static uint8 BGArenaType(BattlegroundQueueTypeId bgQueueTypeId); + static bool IsRandomBattleground(uint32 battlemasterListId); + static BattlegroundQueueTypeId BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 bracketId, uint8 arenaType); static HolidayIds BGTypeToWeekendHolidayId(BattlegroundTypeId bgTypeId); static BattlegroundTypeId WeekendHolidayIdToBGType(HolidayIds holiday); @@ -146,9 +165,17 @@ class TC_GAME_API BattlegroundMgr typedef std::map BattlegroundDataContainer; BattlegroundDataContainer bgDataStore; - BattlegroundQueue m_BattlegroundQueues[MAX_BATTLEGROUND_QUEUE_TYPES]; + std::map m_BattlegroundQueues; + + struct ScheduledQueueUpdate + { + uint32 ArenaMatchmakerRating; + BattlegroundQueueTypeId QueueId; + + bool operator==(ScheduledQueueUpdate const& right) const = default; + }; - std::vector m_QueueUpdateScheduler; + std::vector m_QueueUpdateScheduler; uint32 m_NextRatedArenaUpdate; time_t m_NextAutoDistributionTime; uint32 m_AutoDistributionTimeChecker; diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 6ac695a46bb..8ba8a152012 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -19,6 +19,7 @@ #include "ArenaTeam.h" #include "ArenaTeamMgr.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "Chat.h" #include "DatabaseEnv.h" #include "DBCStores.h" @@ -34,17 +35,14 @@ /*** BATTLEGROUND QUEUE SYSTEM ***/ /*********************************************************/ -BattlegroundQueue::BattlegroundQueue() +BattlegroundQueue::BattlegroundQueue(BattlegroundQueueTypeId queueId) : m_queueId(queueId) { for (uint32 i = 0; i < PVP_TEAMS_COUNT; ++i) { - for (uint32 j = 0; j < MAX_BATTLEGROUND_BRACKETS; ++j) - { - m_SumOfWaitTimes[i][j] = 0; - m_WaitTimeLastPlayer[i][j] = 0; - for (uint32 k = 0; k < COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME; ++k) - m_WaitTimes[i][j][k] = 0; - } + m_SumOfWaitTimes[i] = 0; + m_WaitTimeLastPlayer[i] = 0; + for (uint32 k = 0; k < COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME; ++k) + m_WaitTimes[i][k] = 0; } } @@ -52,14 +50,9 @@ BattlegroundQueue::~BattlegroundQueue() { m_events.KillAllEvents(false); - for (int i = 0; i < MAX_BATTLEGROUND_BRACKETS; ++i) - { - for (uint32 j = 0; j < BG_QUEUE_GROUP_TYPES_COUNT; ++j) - { - for (GroupsQueueType::iterator itr = m_QueuedGroups[i][j].begin(); itr!= m_QueuedGroups[i][j].end(); ++itr) - delete (*itr); - } - } + for (uint32 j = 0; j < BG_QUEUE_GROUP_TYPES_COUNT; ++j) + for (GroupsQueueType::iterator itr = m_QueuedGroups[j].begin(); itr!= m_QueuedGroups[j].end(); ++itr) + delete (*itr); } /*********************************************************/ @@ -130,20 +123,16 @@ bool BattlegroundQueue::SelectionPool::AddGroup(GroupQueueInfo* ginfo, uint32 de /*********************************************************/ // add group or player (grp == NULL) to bg queue with the given leader and bg specifications -GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, BattlegroundTypeId BgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 arenateamid, uint32 PreviousOpponentsArenaTeamId) +GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group const* group, PvPDifficultyEntry const* bracketEntry, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 arenateamid, uint32 PreviousOpponentsArenaTeamId) { - BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); - // create new ginfo GroupQueueInfo* ginfo = new GroupQueueInfo; - ginfo->BgTypeId = BgTypeId; - ginfo->ArenaType = ArenaType; ginfo->ArenaTeamId = arenateamid; ginfo->IsRated = isRated; ginfo->IsInvitedToBGInstanceGUID = 0; ginfo->JoinTime = GameTime::GetGameTimeMS(); ginfo->RemoveInviteTime = 0; - ginfo->Team = leader->GetTeam(); + ginfo->Team = Team(leader->GetTeam()); ginfo->ArenaTeamRating = ArenaRating; ginfo->ArenaMatchmakerRating = MatchmakerRating; ginfo->PreviousOpponentsTeamId = PreviousOpponentsArenaTeamId; @@ -158,7 +147,7 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, Battlegr index += PVP_TEAMS_COUNT; if (ginfo->Team == HORDE) index++; - TC_LOG_DEBUG("bg.battleground", "Adding Group to BattlegroundQueue bgTypeId : {}, bracket_id : {}, index : {}", BgTypeId, bracketId, index); + TC_LOG_DEBUG("bg.battleground", "Adding Group to BattlegroundQueue bgTypeId : {}, bracket_id : {}, index : {}", m_queueId.BattlemasterListId, m_queueId.BracketId, index); uint32 lastOnlineTime = GameTime::GetGameTimeMS(); @@ -167,13 +156,13 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, Battlegr { ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(arenateamid); if (team) - sWorld->SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, team->GetName().c_str(), ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating); + sWorld->SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, team->GetName().c_str(), m_queueId.TeamSize, m_queueId.TeamSize, ginfo->ArenaTeamRating); } //add players from group to ginfo - if (grp) + if (group) { - for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* member = itr->GetSource(); if (!member) @@ -195,12 +184,12 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, Battlegr //add GroupInfo to m_QueuedGroups { - m_QueuedGroups[bracketId][index].push_back(ginfo); + m_QueuedGroups[index].push_back(ginfo); //announce to world, this code needs mutex if (!isRated && !isPremade && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE)) { - if (Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(ginfo->BgTypeId)) + if (Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BattlegroundTypeId(m_queueId.BattlemasterListId))) { uint32 MinPlayers = bg->GetMinPlayersPerTeam(); uint32 qHorde = 0; @@ -208,10 +197,10 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, Battlegr uint32 q_min_level = bracketEntry->MinLevel; uint32 q_max_level = bracketEntry->MaxLevel; GroupsQueueType::const_iterator itr; - for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr) + for (itr = m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr) if (!(*itr)->IsInvitedToBGInstanceGUID) qAlliance += (*itr)->Players.size(); - for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].end(); ++itr) + for (itr = m_QueuedGroups[BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[BG_QUEUE_NORMAL_HORDE].end(); ++itr) if (!(*itr)->IsInvitedToBGInstanceGUID) qHorde += (*itr)->Players.size(); @@ -235,11 +224,11 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, Battlegr return ginfo; } -void BattlegroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BattlegroundBracketId bracket_id) +void BattlegroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo) { uint32 timeInQueue = getMSTimeDiff(ginfo->JoinTime, GameTime::GetGameTimeMS()); uint8 team_index = TEAM_ALLIANCE; //default set to TEAM_ALLIANCE - or non rated arenas! - if (!ginfo->ArenaType) + if (!m_queueId.TeamSize) { if (ginfo->Team == HORDE) team_index = TEAM_HORDE; @@ -251,22 +240,22 @@ void BattlegroundQueue::PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* g } //store pointer to arrayindex of player that was added first - uint32* lastPlayerAddedPointer = &(m_WaitTimeLastPlayer[team_index][bracket_id]); + uint32* lastPlayerAddedPointer = &(m_WaitTimeLastPlayer[team_index]); //remove his time from sum - m_SumOfWaitTimes[team_index][bracket_id] -= m_WaitTimes[team_index][bracket_id][(*lastPlayerAddedPointer)]; + m_SumOfWaitTimes[team_index] -= m_WaitTimes[team_index][(*lastPlayerAddedPointer)]; //set average time to new - m_WaitTimes[team_index][bracket_id][(*lastPlayerAddedPointer)] = timeInQueue; + m_WaitTimes[team_index][(*lastPlayerAddedPointer)] = timeInQueue; //add new time to sum - m_SumOfWaitTimes[team_index][bracket_id] += timeInQueue; + m_SumOfWaitTimes[team_index] += timeInQueue; //set index of last player added to next one (*lastPlayerAddedPointer)++; (*lastPlayerAddedPointer) %= COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME; } -uint32 BattlegroundQueue::GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BattlegroundBracketId bracket_id) const +uint32 BattlegroundQueue::GetAverageQueueWaitTime(GroupQueueInfo* ginfo) const { uint8 team_index = TEAM_ALLIANCE; //default set to TEAM_ALLIANCE - or non rated arenas! - if (!ginfo->ArenaType) + if (!m_queueId.TeamSize) { if (ginfo->Team == HORDE) team_index = TEAM_HORDE; @@ -277,8 +266,8 @@ uint32 BattlegroundQueue::GetAverageQueueWaitTime(GroupQueueInfo* ginfo, Battleg team_index = TEAM_HORDE; //for rated arenas use TEAM_HORDE } //check if there is enought values(we always add values > 0) - if (m_WaitTimes[team_index][bracket_id][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME - 1]) - return (m_SumOfWaitTimes[team_index][bracket_id] / COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME); + if (m_WaitTimes[team_index][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME - 1]) + return (m_SumOfWaitTimes[team_index] / COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME); else //if there aren't enough values return 0 - not available return 0; @@ -309,23 +298,20 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount) uint32 index = (group->Team == HORDE) ? BG_QUEUE_PREMADE_HORDE : BG_QUEUE_PREMADE_ALLIANCE; - for (int32 bracket_id_tmp = MAX_BATTLEGROUND_BRACKETS - 1; bracket_id_tmp >= 0 && bracket_id == -1; --bracket_id_tmp) + //we must check premade and normal team's queue - because when players from premade are joining bg, + //they leave groupinfo so we can't use its players size to find out index + for (uint32 j = index; j < BG_QUEUE_GROUP_TYPES_COUNT; j += PVP_TEAMS_COUNT) { - //we must check premade and normal team's queue - because when players from premade are joining bg, - //they leave groupinfo so we can't use its players size to find out index - for (uint32 j = index; j < BG_QUEUE_GROUP_TYPES_COUNT; j += PVP_TEAMS_COUNT) + GroupsQueueType::iterator k = m_QueuedGroups[j].begin(); + for (; k != m_QueuedGroups[j].end(); ++k) { - GroupsQueueType::iterator k = m_QueuedGroups[bracket_id_tmp][j].begin(); - for (; k != m_QueuedGroups[bracket_id_tmp][j].end(); ++k) + if ((*k) == group) { - if ((*k) == group) - { - bracket_id = bracket_id_tmp; - group_itr = k; - //we must store index to be able to erase iterator - index = j; - break; - } + bracket_id = m_queueId.BracketId; + group_itr = k; + //we must store index to be able to erase iterator + index = j; + break; } } } @@ -350,16 +336,16 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount) // if invited to bg, and should decrease invited count, then do it if (decreaseInvitedCount && group->IsInvitedToBGInstanceGUID) - if (Battleground* bg = sBattlegroundMgr->GetBattleground(group->IsInvitedToBGInstanceGUID, group->BgTypeId)) + if (Battleground* bg = sBattlegroundMgr->GetBattleground(group->IsInvitedToBGInstanceGUID, BattlegroundTypeId(m_queueId.BattlemasterListId))) bg->DecreaseInvitedCount(group->Team); // remove player queue info m_QueuedPlayers.erase(itr); // announce to world if arena team left queue for rated match, show only once - if (group->ArenaType && group->IsRated && group->Players.empty() && sWorld->getBoolConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE)) + if (m_queueId.TeamSize && group->IsRated && group->Players.empty() && sWorld->getBoolConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE)) if (ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(group->ArenaTeamId)) - sWorld->SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, team->GetName().c_str(), group->ArenaType, group->ArenaType, group->ArenaTeamRating); + sWorld->SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, team->GetName().c_str(), m_queueId.TeamSize, m_queueId.TeamSize, group->ArenaTeamRating); // if player leaves queue and he is invited to rated arena match, then he have to lose if (group->IsInvitedToBGInstanceGUID && group->IsRated && decreaseInvitedCount) @@ -378,7 +364,7 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount) // remove group queue info if needed if (group->Players.empty()) { - m_QueuedGroups[bracket_id][index].erase(group_itr); + m_QueuedGroups[index].erase(group_itr); delete group; return; } @@ -392,14 +378,14 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount) // first send removal information if (Player* plr2 = ObjectAccessor::FindConnectedPlayer(group->Players.begin()->first)) { - Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(group->BgTypeId); - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(group->BgTypeId, group->ArenaType); - uint32 queueSlot = plr2->GetBattlegroundQueueIndex(bgQueueTypeId); - plr2->RemoveBattlegroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to + uint32 queueSlot = plr2->GetBattlegroundQueueIndex(m_queueId); + + plr2->RemoveBattlegroundQueueId(m_queueId); // must be called this way, because if you move this call to // queue->removeplayer, it causes bugs - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0, 0); - plr2->SendDirectMessage(&data); + + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusNone(&battlefieldStatus, queueSlot); + plr2->SendDirectMessage(battlefieldStatus.Write()); } // then actually delete, this may delete the group as well! RemovePlayer(group->Players.begin()->first, decreaseInvitedCount); @@ -429,7 +415,7 @@ uint32 BattlegroundQueue::GetPlayersInQueue(TeamId id) return m_SelectionPools[id].GetPlayerCount(); } -bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, uint32 side) +bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, Team side) { // set side if needed if (side) @@ -440,9 +426,8 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, // not yet invited // set invitation ginfo->IsInvitedToBGInstanceGUID = bg->GetInstanceID(); - BattlegroundTypeId bgTypeId = bg->GetTypeID(); - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, bg->GetArenaType()); - BattlegroundBracketId bracket_id = bg->GetBracketId(); + BattlegroundTypeId bgTypeId = BattlegroundTypeId(m_queueId.BattlemasterListId); + BattlegroundQueueTypeId bgQueueTypeId = m_queueId; // set ArenaTeamId for rated matches if (bg->isArena() && bg->isRated()) @@ -460,7 +445,7 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, continue; // invite the player - PlayerInvitedToBGUpdateAverageWaitTime(ginfo, bracket_id); + PlayerInvitedToBGUpdateAverageWaitTime(ginfo); //sBattlegroundMgr->InvitePlayer(player, bg, ginfo->Team); // set invited player counters @@ -469,10 +454,10 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, player->SetInviteForBattlegroundQueueType(bgQueueTypeId, ginfo->IsInvitedToBGInstanceGUID); // create remind invite events - BGQueueInviteEvent* inviteEvent = new BGQueueInviteEvent(player->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, ginfo->ArenaType, ginfo->RemoveInviteTime); + BGQueueInviteEvent* inviteEvent = new BGQueueInviteEvent(player->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, ginfo->RemoveInviteTime, bgQueueTypeId); m_events.AddEvent(inviteEvent, m_events.CalculateTime(Milliseconds(INVITATION_REMIND_TIME))); // create automatic remove events - BGQueueRemoveEvent* removeEvent = new BGQueueRemoveEvent(player->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, bgQueueTypeId, ginfo->RemoveInviteTime); + BGQueueRemoveEvent* removeEvent = new BGQueueRemoveEvent(player->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgQueueTypeId, ginfo->RemoveInviteTime); m_events.AddEvent(removeEvent, m_events.CalculateTime(Milliseconds(INVITE_ACCEPT_WAIT_TIME))); WorldPacket data; @@ -482,9 +467,9 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, TC_LOG_DEBUG("bg.battleground", "Battleground: invited player {} {} to BG instance {} queueindex {} bgtype {}", player->GetName(), player->GetGUID().ToString(), bg->GetInstanceID(), queueSlot, bg->GetTypeID()); - // send status packet - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME, 0, ginfo->ArenaType, 0); - player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, queueSlot, INVITE_ACCEPT_WAIT_TIME, bgQueueTypeId); + player->SendDirectMessage(battlefieldStatus.Write()); } return true; } @@ -497,12 +482,12 @@ This function is inviting players to already running battlegrounds Invitation type is based on config file large groups are disadvantageous, because they will be kicked first if invitation type = 1 */ -void BattlegroundQueue::FillPlayersToBG(Battleground* bg, BattlegroundBracketId bracket_id) +void BattlegroundQueue::FillPlayersToBG(Battleground* bg) { int32 hordeFree = bg->GetFreeSlotsForTeam(HORDE); int32 aliFree = bg->GetFreeSlotsForTeam(ALLIANCE); - uint32 aliCount = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].size(); - uint32 hordeCount = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].size(); + uint32 aliCount = m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE].size(); + uint32 hordeCount = m_QueuedGroups[BG_QUEUE_NORMAL_HORDE].size(); // try to get even teams if (sWorld->getIntConfig(CONFIG_BATTLEGROUND_INVITATION_TYPE) == BG_QUEUE_INVITATION_TYPE_EVEN) @@ -530,7 +515,7 @@ void BattlegroundQueue::FillPlayersToBG(Battleground* bg, BattlegroundBracketId } //iterator for iterating through bg queue - GroupsQueueType::const_iterator Ali_itr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].begin(); + GroupsQueueType::const_iterator Ali_itr = m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE].begin(); //count of groups in queue - used to stop cycles //index to queue which group is current @@ -538,7 +523,7 @@ void BattlegroundQueue::FillPlayersToBG(Battleground* bg, BattlegroundBracketId for (; aliIndex < aliCount && m_SelectionPools[TEAM_ALLIANCE].AddGroup((*Ali_itr), aliFree); aliIndex++) ++Ali_itr; //the same thing for horde - GroupsQueueType::const_iterator Horde_itr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].begin(); + GroupsQueueType::const_iterator Horde_itr = m_QueuedGroups[BG_QUEUE_NORMAL_HORDE].begin(); uint32 hordeIndex = 0; for (; hordeIndex < hordeCount && m_SelectionPools[TEAM_HORDE].AddGroup((*Horde_itr), hordeFree); hordeIndex++) @@ -602,22 +587,22 @@ void BattlegroundQueue::FillPlayersToBG(Battleground* bg, BattlegroundBracketId // this method checks if premade versus premade battleground is possible // then after 30 mins (default) in queue it moves premade group to normal queue // it tries to invite as much players as it can - to MaxPlayersPerTeam, because premade groups have more than MinPlayersPerTeam players -bool BattlegroundQueue::CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam) +bool BattlegroundQueue::CheckPremadeMatch(uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam) { //check match - if (!m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty() && !m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty()) + if (!m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].empty() && !m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].empty()) { //start premade match //if groups aren't invited GroupsQueueType::const_iterator ali_group, horde_group; - for (ali_group = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].begin(); ali_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end(); ++ali_group) + for (ali_group = m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].begin(); ali_group != m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].end(); ++ali_group) if (!(*ali_group)->IsInvitedToBGInstanceGUID) break; - for (horde_group = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].begin(); horde_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end(); ++horde_group) + for (horde_group = m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].begin(); horde_group != m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].end(); ++horde_group) if (!(*horde_group)->IsInvitedToBGInstanceGUID) break; - if (ali_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end() && horde_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end()) + if (ali_group != m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].end() && horde_group != m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].end()) { m_SelectionPools[TEAM_ALLIANCE].AddGroup((*ali_group), MaxPlayersPerTeam); m_SelectionPools[TEAM_HORDE].AddGroup((*horde_group), MaxPlayersPerTeam); @@ -626,7 +611,7 @@ bool BattlegroundQueue::CheckPremadeMatch(BattlegroundBracketId bracket_id, uint GroupsQueueType::const_iterator itr; for (uint32 i = 0; i < PVP_TEAMS_COUNT; i++) { - for (itr = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].begin(); itr != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].end(); ++itr) + for (itr = m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE + i].begin(); itr != m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE + i].end(); ++itr) { //if itr can join BG and player count is less that maxPlayers, then add group to selectionpool if (!(*itr)->IsInvitedToBGInstanceGUID && !m_SelectionPools[i].AddGroup((*itr), maxPlayers)) @@ -644,14 +629,14 @@ bool BattlegroundQueue::CheckPremadeMatch(BattlegroundBracketId bracket_id, uint uint32 time_before = GameTime::GetGameTimeMS() - sWorld->getIntConfig(CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH); for (uint32 i = 0; i < PVP_TEAMS_COUNT; i++) { - if (!m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].empty()) + if (!m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE + i].empty()) { - GroupsQueueType::iterator itr = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].begin(); + GroupsQueueType::iterator itr = m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE + i].begin(); if (!(*itr)->IsInvitedToBGInstanceGUID && ((*itr)->JoinTime < time_before || (*itr)->Players.size() < MinPlayersPerTeam)) { //we must insert group to normal queue and erase pointer from premade queue - m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].push_front((*itr)); - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE + i].erase(itr); + m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE + i].push_front((*itr)); + m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE + i].erase(itr); } } } @@ -660,13 +645,13 @@ bool BattlegroundQueue::CheckPremadeMatch(BattlegroundBracketId bracket_id, uint } // this method tries to create battleground or arena with MinPlayersPerTeam against MinPlayersPerTeam -bool BattlegroundQueue::CheckNormalMatch(Battleground* bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers) +bool BattlegroundQueue::CheckNormalMatch(Battleground* bg_template, uint32 minPlayers, uint32 maxPlayers) { GroupsQueueType::const_iterator itr_team[PVP_TEAMS_COUNT]; for (uint32 i = 0; i < PVP_TEAMS_COUNT; i++) { - itr_team[i] = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].begin(); - for (; itr_team[i] != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + i].end(); ++(itr_team[i])) + itr_team[i] = m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE + i].begin(); + for (; itr_team[i] != m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE + i].end(); ++(itr_team[i])) { if (!(*(itr_team[i]))->IsInvitedToBGInstanceGUID) { @@ -685,7 +670,7 @@ bool BattlegroundQueue::CheckNormalMatch(Battleground* bg_template, Battleground { //we will try to invite more groups to team with less players indexed by j ++(itr_team[j]); //this will not cause a crash, because for cycle above reached break; - for (; itr_team[j] != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + j].end(); ++(itr_team[j])) + for (; itr_team[j] != m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE + j].end(); ++(itr_team[j])) { if (!(*(itr_team[j]))->IsInvitedToBGInstanceGUID) if (!m_SelectionPools[j].AddGroup(*(itr_team[j]), m_SelectionPools[(j + 1) % PVP_TEAMS_COUNT].GetPlayerCount())) @@ -703,13 +688,13 @@ bool BattlegroundQueue::CheckNormalMatch(Battleground* bg_template, Battleground } // this method will check if we can invite players to same faction skirmish match -bool BattlegroundQueue::CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam) +bool BattlegroundQueue::CheckSkirmishForSameFaction(uint32 minPlayersPerTeam) { if (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() < minPlayersPerTeam && m_SelectionPools[TEAM_HORDE].GetPlayerCount() < minPlayersPerTeam) return false; - uint32 teamIndex = TEAM_ALLIANCE; - uint32 otherTeam = TEAM_HORDE; - uint32 otherTeamId = HORDE; + TeamId teamIndex = TEAM_ALLIANCE; + TeamId otherTeam = TEAM_HORDE; + Team otherTeamId = HORDE; if (m_SelectionPools[TEAM_HORDE].GetPlayerCount() == minPlayersPerTeam) { teamIndex = TEAM_HORDE; @@ -721,16 +706,16 @@ bool BattlegroundQueue::CheckSkirmishForSameFaction(BattlegroundBracketId bracke //store last ginfo pointer GroupQueueInfo* ginfo = m_SelectionPools[teamIndex].SelectedGroups.back(); //set itr_team to group that was added to selection pool latest - GroupsQueueType::iterator itr_team = m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].begin(); - for (; itr_team != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].end(); ++itr_team) + GroupsQueueType::iterator itr_team = m_QueuedGroups[uint8(BG_QUEUE_NORMAL_ALLIANCE) + uint8(teamIndex)].begin(); + for (; itr_team != m_QueuedGroups[uint8(BG_QUEUE_NORMAL_ALLIANCE) + uint8(teamIndex)].end(); ++itr_team) if (ginfo == *itr_team) break; - if (itr_team == m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].end()) + if (itr_team == m_QueuedGroups[uint8(BG_QUEUE_NORMAL_ALLIANCE) + uint8(teamIndex)].end()) return false; GroupsQueueType::iterator itr_team2 = itr_team; ++itr_team2; //invite players to other selection pool - for (; itr_team2 != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].end(); ++itr_team2) + for (; itr_team2 != m_QueuedGroups[uint8(BG_QUEUE_NORMAL_ALLIANCE) + uint8(teamIndex)].end(); ++itr_team2) { //if selection pool is full then break; if (!(*itr_team2)->IsInvitedToBGInstanceGUID && !m_SelectionPools[otherTeam].AddGroup(*itr_team2, minPlayersPerTeam)) @@ -745,15 +730,15 @@ bool BattlegroundQueue::CheckSkirmishForSameFaction(BattlegroundBracketId bracke //set correct team (*itr)->Team = otherTeamId; //add team to other queue - m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + otherTeam].push_front(*itr); + m_QueuedGroups[uint8(BG_QUEUE_NORMAL_ALLIANCE) + uint8(teamIndex)].push_front(*itr); //remove team from old queue GroupsQueueType::iterator itr2 = itr_team; ++itr2; - for (; itr2 != m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].end(); ++itr2) + for (; itr2 != m_QueuedGroups[uint8(BG_QUEUE_NORMAL_ALLIANCE) + uint8(teamIndex)].end(); ++itr2) { if (*itr2 == *itr) { - m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE + teamIndex].erase(itr2); + m_QueuedGroups[uint8(BG_QUEUE_NORMAL_ALLIANCE) + uint8(teamIndex)].erase(itr2); break; } } @@ -771,13 +756,17 @@ this method is called when group is inserted, or player / group is removed from it must be called after fully adding the members of a group to ensure group joining should be called from Battleground::RemovePlayer function in some cases */ -void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id, uint8 arenaType, bool isRated, uint32 arenaRating) +void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, bool isRated, uint32 arenaRating) { + BattlegroundTypeId bgTypeId = BattlegroundTypeId(m_queueId.BattlemasterListId); + BattlegroundBracketId bracket_id = BattlegroundBracketId(m_queueId.BracketId); + uint8 arenaType = m_queueId.TeamSize; + //if no players in queue - do nothing - if (m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty() && - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty() && - m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_ALLIANCE].empty() && - m_QueuedGroups[bracket_id][BG_QUEUE_NORMAL_HORDE].empty()) + if (m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].empty() && + m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].empty() && + m_QueuedGroups[BG_QUEUE_NORMAL_ALLIANCE].empty() && + m_QueuedGroups[BG_QUEUE_NORMAL_HORDE].empty()) return; // battleground with free slot for player should be always in the beggining of the queue @@ -795,7 +784,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp m_SelectionPools[TEAM_HORDE].Init(); // call a function that does the job for us - FillPlayersToBG(bg, bracket_id); + FillPlayersToBG(bg); // now everything is set, invite players for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_ALLIANCE].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_ALLIANCE].SelectedGroups.end(); ++citr) @@ -842,7 +831,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp if (bg_template->isBattleground()) { - if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)) + if (CheckPremadeMatch(MinPlayersPerTeam, MaxPlayersPerTeam)) { // create new battleground Battleground* bg2 = sBattlegroundMgr->CreateNewBattleground(bgTypeId, bracketEntry, 0, false); @@ -867,8 +856,8 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp if (!isRated) { // if there are enough players in pools, start new battleground or non rated arena - if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam) - || (bg_template->isArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam))) + if (CheckNormalMatch(bg_template, MinPlayersPerTeam, MaxPlayersPerTeam) + || (bg_template->isArena() && CheckSkirmishForSameFaction(MinPlayersPerTeam))) { // we successfully created a pool Battleground* bg2 = sBattlegroundMgr->CreateNewBattleground(bgTypeId, bracketEntry, arenaType, false); @@ -895,14 +884,14 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp { GroupQueueInfo* front1 = nullptr; GroupQueueInfo* front2 = nullptr; - if (!m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty()) + if (!m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].empty()) { - front1 = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].front(); + front1 = m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].front(); arenaRating = front1->ArenaMatchmakerRating; } - if (!m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty()) + if (!m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].empty()) { - front2 = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].front(); + front2 = m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].front(); arenaRating = front2->ArenaMatchmakerRating; } if (front1 && front2) @@ -935,8 +924,8 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp for (uint8 i = BG_QUEUE_PREMADE_ALLIANCE; i < BG_QUEUE_NORMAL_ALLIANCE; i++) { // take the group that joined first - GroupsQueueType::iterator itr2 = m_QueuedGroups[bracket_id][i].begin(); - for (; itr2 != m_QueuedGroups[bracket_id][i].end(); ++itr2) + GroupsQueueType::iterator itr2 = m_QueuedGroups[i].begin(); + for (; itr2 != m_QueuedGroups[i].end(); ++itr2) { // if group match conditions, then add it to pool if (!(*itr2)->IsInvitedToBGInstanceGUID @@ -955,7 +944,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp if (found == 1) { - for (GroupsQueueType::iterator itr3 = itr_teams[0]; itr3 != m_QueuedGroups[bracket_id][team].end(); ++itr3) + for (GroupsQueueType::iterator itr3 = itr_teams[0]; itr3 != m_QueuedGroups[team].end(); ++itr3) { if (!(*itr3)->IsInvitedToBGInstanceGUID && (((*itr3)->ArenaMatchmakerRating >= arenaMinRating && (*itr3)->ArenaMatchmakerRating <= arenaMaxRating) || (int32)(*itr3)->JoinTime < discardTime) @@ -990,13 +979,13 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp // now we must move team if we changed its faction to another faction queue, because then we will spam log by errors in Queue::RemovePlayer if (aTeam->Team != ALLIANCE) { - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].push_front(aTeam); - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].erase(itr_teams[TEAM_ALLIANCE]); + m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].push_front(aTeam); + m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].erase(itr_teams[TEAM_ALLIANCE]); } if (hTeam->Team != HORDE) { - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].push_front(hTeam); - m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].erase(itr_teams[TEAM_HORDE]); + m_QueuedGroups[BG_QUEUE_PREMADE_HORDE].push_front(hTeam); + m_QueuedGroups[BG_QUEUE_PREMADE_ALLIANCE].erase(itr_teams[TEAM_HORDE]); } arena->SetArenaMatchmakerRating(ALLIANCE, aTeam->ArenaMatchmakerRating); @@ -1026,18 +1015,16 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) if (!bg) return true; - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType()); - uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId); + uint32 queueSlot = player->GetBattlegroundQueueIndex(m_QueueId); if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue or in battleground { // check if player is invited to this bg - BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); + BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(m_QueueId); if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime)) { - WorldPacket data; - //we must send remaining time in queue - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, 0, m_ArenaType, 0); - player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, queueSlot, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, m_QueueId); + player->SendDirectMessage(battlefieldStatus.Write()); } } return true; //event will be deleted @@ -1064,7 +1051,7 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) // player logged off (we should do nothing, he is correctly removed from queue in another procedure) return true; - Battleground* bg = sBattlegroundMgr->GetBattleground(m_BgInstanceGUID, m_BgTypeId); + Battleground* bg = sBattlegroundMgr->GetBattleground(m_BgInstanceGUID, BattlegroundTypeId(m_BgQueueTypeId.BattlemasterListId)); //battleground can be deleted already when we are removing queue info //bg pointer can be NULL! so use it carefully! @@ -1091,11 +1078,11 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) bgQueue.RemovePlayer(m_PlayerGuid, true); //update queues if battleground isn't ended if (bg && bg->isBattleground() && bg->GetStatus() != STATUS_WAIT_LEAVE) - sBattlegroundMgr->ScheduleQueueUpdate(0, 0, m_BgQueueTypeId, m_BgTypeId, bg->GetBracketId()); + sBattlegroundMgr->ScheduleQueueUpdate(0, m_BgQueueTypeId); - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0, 0); - player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusNone(&battlefieldStatus, queueSlot); + player->SendDirectMessage(battlefieldStatus.Write()); } } diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h index b7cad6f5d44..7dfa68a4309 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.h +++ b/src/server/game/Battlegrounds/BattlegroundQueue.h @@ -23,8 +23,6 @@ #include "Battleground.h" #include "EventProcessor.h" -#include - //this container can't be deque, because deque doesn't like removing the last element - if you remove it, it invalidates next iterator and crash appears typedef std::list BGFreeSlotQueueContainer; @@ -40,10 +38,8 @@ struct PlayerQueueInfo // stores informatio struct GroupQueueInfo // stores information about the group in queue (also used when joined as solo!) { std::map Players; // player queue info map - uint32 Team; // Player team (ALLIANCE/HORDE) - BattlegroundTypeId BgTypeId; // battleground type id + ::Team Team; // Player team (ALLIANCE/HORDE) bool IsRated; // rated - uint8 ArenaType; // 2v2, 3v3, 5v5 or 0 when BG uint32 ArenaTeamId; // team id if rated match uint32 JoinTime; // time when group was added uint32 RemoveInviteTime; // time when we will remove invite for players in group @@ -75,22 +71,22 @@ class Battleground; class TC_GAME_API BattlegroundQueue { public: - BattlegroundQueue(); + BattlegroundQueue(BattlegroundQueueTypeId queueId); ~BattlegroundQueue(); - void BattlegroundQueueUpdate(uint32 diff, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id, uint8 arenaType = 0, bool isRated = false, uint32 minRating = 0); + void BattlegroundQueueUpdate(uint32 diff, bool isRated = false, uint32 minRating = 0); void UpdateEvents(uint32 diff); - void FillPlayersToBG(Battleground* bg, BattlegroundBracketId bracket_id); - bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam); - bool CheckNormalMatch(Battleground* bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers); - bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam); - GroupQueueInfo* AddGroup(Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0, uint32 OpponentsArenaTeamId = 0); + void FillPlayersToBG(Battleground* bg); + bool CheckPremadeMatch(uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam); + bool CheckNormalMatch(Battleground* bg_template, uint32 minPlayers, uint32 maxPlayers); + bool CheckSkirmishForSameFaction(uint32 minPlayersPerTeam); + GroupQueueInfo* AddGroup(Player* leader, Group const* group, PvPDifficultyEntry const* bracketEntry, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0, uint32 OpponentsArenaTeamId = 0); void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount); bool IsPlayerInvited(ObjectGuid pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime); bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo* ginfo); - void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BattlegroundBracketId bracket_id); - uint32 GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BattlegroundBracketId bracket_id) const; + void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo); + uint32 GetAverageQueueWaitTime(GroupQueueInfo* ginfo) const; typedef std::map QueuedPlayersMap; QueuedPlayersMap m_QueuedPlayers; @@ -107,7 +103,7 @@ class TC_GAME_API BattlegroundQueue BG_QUEUE_NORMAL_ALLIANCE is used for normal (or small) alliance groups or non-rated arena matches BG_QUEUE_NORMAL_HORDE is used for normal (or small) horde groups or non-rated arena matches */ - GroupsQueueType m_QueuedGroups[MAX_BATTLEGROUND_BRACKETS][BG_QUEUE_GROUP_TYPES_COUNT]; + GroupsQueueType m_QueuedGroups[BG_QUEUE_GROUP_TYPES_COUNT]; // class to select and invite groups to bg class SelectionPool @@ -127,12 +123,16 @@ class TC_GAME_API BattlegroundQueue //one selection pool for horde, other one for alliance SelectionPool m_SelectionPools[PVP_TEAMS_COUNT]; uint32 GetPlayersInQueue(TeamId id); + + BattlegroundQueueTypeId GetQueueId() const { return m_queueId; } private: - bool InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, uint32 side); - uint32 m_WaitTimes[PVP_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME]; - uint32 m_WaitTimeLastPlayer[PVP_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS]; - uint32 m_SumOfWaitTimes[PVP_TEAMS_COUNT][MAX_BATTLEGROUND_BRACKETS]; + BattlegroundQueueTypeId m_queueId; + + bool InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, Team side); + uint32 m_WaitTimes[PVP_TEAMS_COUNT][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME]; + uint32 m_WaitTimeLastPlayer[PVP_TEAMS_COUNT]; + uint32 m_SumOfWaitTimes[PVP_TEAMS_COUNT]; // Event handler EventProcessor m_events; @@ -145,8 +145,8 @@ class TC_GAME_API BattlegroundQueue class TC_GAME_API BGQueueInviteEvent : public BasicEvent { public: - BGQueueInviteEvent(ObjectGuid pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint8 arenaType, uint32 removeTime) : - m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_ArenaType(arenaType), m_RemoveTime(removeTime) + BGQueueInviteEvent(ObjectGuid pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint32 removeTime, BattlegroundQueueTypeId queueId) : + m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_RemoveTime(removeTime), m_QueueId(queueId) { } virtual ~BGQueueInviteEvent() { } @@ -156,8 +156,8 @@ class TC_GAME_API BGQueueInviteEvent : public BasicEvent ObjectGuid m_PlayerGuid; uint32 m_BgInstanceGUID; BattlegroundTypeId m_BgTypeId; - uint8 m_ArenaType; uint32 m_RemoveTime; + BattlegroundQueueTypeId m_QueueId; }; /* @@ -168,8 +168,8 @@ class TC_GAME_API BGQueueInviteEvent : public BasicEvent class TC_GAME_API BGQueueRemoveEvent : public BasicEvent { public: - BGQueueRemoveEvent(ObjectGuid pl_guid, uint32 bgInstanceGUID, BattlegroundTypeId BgTypeId, BattlegroundQueueTypeId bgQueueTypeId, uint32 removeTime) - : m_PlayerGuid(pl_guid), m_BgInstanceGUID(bgInstanceGUID), m_RemoveTime(removeTime), m_BgTypeId(BgTypeId), m_BgQueueTypeId(bgQueueTypeId) + BGQueueRemoveEvent(ObjectGuid pl_guid, uint32 bgInstanceGUID, BattlegroundQueueTypeId bgQueueTypeId, uint32 removeTime) + : m_PlayerGuid(pl_guid), m_BgInstanceGUID(bgInstanceGUID), m_RemoveTime(removeTime), m_BgQueueTypeId(bgQueueTypeId) { } virtual ~BGQueueRemoveEvent() { } @@ -180,7 +180,6 @@ class TC_GAME_API BGQueueRemoveEvent : public BasicEvent ObjectGuid m_PlayerGuid; uint32 m_BgInstanceGUID; uint32 m_RemoveTime; - BattlegroundTypeId m_BgTypeId; BattlegroundQueueTypeId m_BgQueueTypeId; }; diff --git a/src/server/game/Battlegrounds/BattlegroundScore.h b/src/server/game/Battlegrounds/BattlegroundScore.h index f4c19320678..999e8c4133d 100644 --- a/src/server/game/Battlegrounds/BattlegroundScore.h +++ b/src/server/game/Battlegrounds/BattlegroundScore.h @@ -22,6 +22,11 @@ #include "ObjectGuid.h" #include "SharedDefines.h" +namespace WorldPackets::Battleground +{ +struct PVPLogData_Player; +} + class WorldPacket; enum ScoreType @@ -92,8 +97,8 @@ struct BattlegroundScore } } - virtual void AppendToPacket(WorldPacket& data); - virtual void BuildObjectivesBlock(WorldPacket& /*data*/) = 0; + virtual void AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData); + virtual void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) = 0; // For Logging purpose virtual std::string ToString() const { return ""; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index 2f0320c55c3..c9353d29e3c 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -17,6 +17,7 @@ #include "BattlegroundAB.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "Creature.h" #include "DBCStores.h" #include "GameObject.h" @@ -25,15 +26,12 @@ #include "Player.h" #include "Random.h" #include "Util.h" -#include "WorldPacket.h" #include "WorldSession.h" #include "WorldStatePackets.h" -void BattlegroundABScore::BuildObjectivesBlock(WorldPacket& data) +void BattlegroundABScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) { - data << uint32(2); - data << uint32(BasesAssaulted); - data << uint32(BasesDefended); + playerData.Stats = { BasesAssaulted, BasesDefended }; } BattlegroundAB::BattlegroundAB() diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index c30958d9c19..d23b751b83f 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -130,7 +130,7 @@ enum BG_AB_Timers enum BG_AB_Score { - BG_AB_WARNING_NEAR_VICTORY_SCORE = 1400, + BG_AB_WARNING_NEAR_VICTORY_SCORE = 1440, BG_AB_MAX_TEAM_SCORE = 1600 }; @@ -197,8 +197,8 @@ enum BG_AB_Sounds BG_AB_SOUND_NODE_CAPTURED_HORDE = 8213, BG_AB_SOUND_NODE_ASSAULTED_ALLIANCE = 8212, BG_AB_SOUND_NODE_ASSAULTED_HORDE = 8174, - BG_AB_SOUND_NEAR_VICTORY_ALLIANCE = 8456, - BG_AB_SOUND_NEAR_VICTORY_HORDE = 8457 + BG_AB_SOUND_NEAR_VICTORY_ALLIANCE = 8457, + BG_AB_SOUND_NEAR_VICTORY_HORDE = 8456 }; enum BG_AB_Objectives @@ -288,10 +288,10 @@ struct BattlegroundABScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data) final override; + void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) override; - uint32 GetAttr1() const final override { return BasesAssaulted; } - uint32 GetAttr2() const final override { return BasesDefended; } + uint32 GetAttr1() const override { return BasesAssaulted; } + uint32 GetAttr2() const override { return BasesDefended; } uint32 BasesAssaulted; uint32 BasesDefended; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index 8d258d34075..6f272a874d4 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -16,6 +16,7 @@ */ #include "BattlegroundAV.h" +#include "BattlegroundPackets.h" #include "Creature.h" #include "CreatureAI.h" #include "DBCStores.h" @@ -27,14 +28,9 @@ #include "WorldSession.h" #include "WorldStatePackets.h" -void BattlegroundAVScore::BuildObjectivesBlock(WorldPacket& data) +void BattlegroundAVScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) { - data << uint32(5); // Objectives Count - data << uint32(GraveyardsAssaulted); - data << uint32(GraveyardsDefended); - data << uint32(TowersAssaulted); - data << uint32(TowersDefended); - data << uint32(MinesCaptured); + playerData.Stats = { GraveyardsAssaulted, GraveyardsDefended, TowersAssaulted, TowersDefended, MinesCaptured }; } BattlegroundAV::BattlegroundAV() diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index 249cb0dfb73..8e40f65a6a6 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -1597,13 +1597,13 @@ struct BattlegroundAVScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data) final override; + void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) override; - uint32 GetAttr1() const final override { return GraveyardsAssaulted; } - uint32 GetAttr2() const final override { return GraveyardsDefended; } - uint32 GetAttr3() const final override { return TowersAssaulted; } - uint32 GetAttr4() const final override { return TowersDefended; } - uint32 GetAttr5() const final override { return MinesCaptured; } + uint32 GetAttr1() const override { return GraveyardsAssaulted; } + uint32 GetAttr2() const override { return GraveyardsDefended; } + uint32 GetAttr3() const override { return TowersAssaulted; } + uint32 GetAttr4() const override { return TowersDefended; } + uint32 GetAttr5() const override { return MinesCaptured; } uint32 GraveyardsAssaulted; uint32 GraveyardsDefended; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index f230ec277a8..a9e55f5cc33 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -17,6 +17,7 @@ #include "BattlegroundEY.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "Creature.h" #include "DBCStores.h" #include "GameObject.h" @@ -26,7 +27,6 @@ #include "Player.h" #include "Random.h" #include "Util.h" -#include "WorldPacket.h" #include "WorldStatePackets.h" // these variables aren't used outside of this file, so declare them only here @@ -36,10 +36,9 @@ uint32 BG_EY_HonorScoreTicks[BG_HONOR_MODE_NUM] = 160 // holiday }; -void BattlegroundEYScore::BuildObjectivesBlock(WorldPacket& data) +void BattlegroundEYScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) { - data << uint32(1); // Objectives Count - data << uint32(FlagCaptures); + playerData.Stats = { FlagCaptures }; } BattlegroundEY::BattlegroundEY() diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index e45a09a7a13..81b3d897cab 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -370,9 +370,9 @@ struct BattlegroundEYScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data) final override; + void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) override; - uint32 GetAttr1() const final override { return FlagCaptures; } + uint32 GetAttr1() const override { return FlagCaptures; } uint32 FlagCaptures; }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp index 15cdbe8eaac..cf71d03db3e 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp @@ -16,6 +16,7 @@ */ #include "BattlegroundIC.h" +#include "BattlegroundPackets.h" #include "GameObject.h" #include "Log.h" #include "Map.h" @@ -23,14 +24,11 @@ #include "ScriptedCreature.h" #include "Transport.h" #include "Vehicle.h" -#include "WorldPacket.h" #include "WorldStatePackets.h" -void BattlegroundICScore::BuildObjectivesBlock(WorldPacket& data) +void BattlegroundICScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) { - data << uint32(2); // Objectives Count - data << uint32(BasesAssaulted); - data << uint32(BasesDefended); + playerData.Stats = { BasesAssaulted, BasesDefended }; } BattlegroundIC::BattlegroundIC() diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h index c2192e28c53..e70d5555817 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h @@ -930,10 +930,10 @@ struct BattlegroundICScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data) final override; + void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) override; - uint32 GetAttr1() const final override { return BasesAssaulted; } - uint32 GetAttr2() const final override { return BasesDefended; } + uint32 GetAttr1() const override { return BasesAssaulted; } + uint32 GetAttr2() const override { return BasesDefended; } uint32 BasesAssaulted; uint32 BasesDefended; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index 3477a18ebf7..3de916ca0e2 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -16,6 +16,7 @@ */ #include "BattlegroundSA.h" +#include "BattlegroundPackets.h" #include "DBCStores.h" #include "GameObject.h" #include "GameTime.h" @@ -26,14 +27,11 @@ #include "Player.h" #include "ScriptedCreature.h" #include "UpdateData.h" -#include "WorldPacket.h" #include "WorldStatePackets.h" -void BattlegroundSAScore::BuildObjectivesBlock(WorldPacket& data) +void BattlegroundSAScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) { - data << uint32(2); // Objectives Count - data << uint32(DemolishersDestroyed); - data << uint32(GatesDestroyed); + playerData.Stats = { DemolishersDestroyed, GatesDestroyed }; } BattlegroundSA::BattlegroundSA() diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index 1f2c2e53af0..17b5b9dd041 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -539,10 +539,10 @@ struct BattlegroundSAScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data) final override; + void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) override; - uint32 GetAttr1() const final override { return DemolishersDestroyed; } - uint32 GetAttr2() const final override { return GatesDestroyed; } + uint32 GetAttr1() const override { return DemolishersDestroyed; } + uint32 GetAttr2() const override { return GatesDestroyed; } uint32 DemolishersDestroyed; uint32 GatesDestroyed; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 7c00dd59992..90d2d5ef106 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -17,6 +17,7 @@ #include "BattlegroundWS.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "DBCStores.h" #include "GameObject.h" #include "Log.h" @@ -71,11 +72,9 @@ BattlegroundWS::BattlegroundWS() _minutesElapsed = 0; } -void BattlegroundWGScore::BuildObjectivesBlock(WorldPacket& data) +void BattlegroundWGScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) { - data << uint32(2); // Objectives Count - data << uint32(FlagCaptures); - data << uint32(FlagReturns); + playerData.Stats = { FlagCaptures, FlagReturns }; } BattlegroundWS::~BattlegroundWS() { } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index aa120ab8f3a..1d034b30cbf 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -186,10 +186,10 @@ struct BattlegroundWGScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data) final override; + void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) override; - uint32 GetAttr1() const final override { return FlagCaptures; } - uint32 GetAttr2() const final override { return FlagReturns; } + uint32 GetAttr1() const override { return FlagCaptures; } + uint32 GetAttr2() const override { return FlagReturns; } uint32 FlagCaptures; uint32 FlagReturns; diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index 1beffa37c3c..8b621a873fd 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -20,8 +20,6 @@ endif() GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) -add_definitions(-DTRINITY_API_EXPORT_GAME) - CollectIncludeDirectories( ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC_INCLUDES @@ -48,6 +46,10 @@ target_include_directories(game PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +set_target_properties(game + PROPERTIES + DEFINE_SYMBOL TRINITY_API_EXPORT_GAME) + target_link_libraries(game PRIVATE trinity-core-interface diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 427619d0533..31424d7ee43 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -77,7 +77,7 @@ bool ChatHandler::HasLowerSecurityAccount(WorldSession* target, uint32 target_ac return false; // ignore only for non-players for non strong checks (when allow apply command at least to same sec level) - if (m_session->HasPermission(rbac::RBAC_PERM_CHECK_FOR_LOWER_SECURITY) && !strong && !sWorld->getBoolConfig(CONFIG_GM_LOWER_SECURITY)) + if (m_session->HasPermission(rbac::RBAC_PERM_CAN_IGNORE_LOWER_SECURITY_CHECK) && !strong && !sWorld->getBoolConfig(CONFIG_GM_LOWER_SECURITY)) return false; if (target) diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp index 91af31cc41c..6c69343f1a0 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp @@ -16,8 +16,8 @@ */ #include "ChatCommandArgs.h" -#include "AchievementMgr.h" #include "ChatCommand.h" +#include "DBCStores.h" #include "ObjectMgr.h" #include "SpellMgr.h" #include "Util.h" @@ -29,7 +29,7 @@ struct AchievementVisitor { using value_type = AchievementEntry const*; value_type operator()(Hyperlink achData) const { return achData->Achievement; } - value_type operator()(uint32 achId) const { return sAchievementMgr->GetAchievement(achId); } + value_type operator()(uint32 achId) const { return sAchievementStore.LookupEntry(achId); } }; ChatCommandResult Trinity::Impl::ChatCommands::ArgInfo::TryConsume(AchievementEntry const*& data, ChatHandler const* handler, std::string_view args) { diff --git a/src/server/game/Chat/HyperlinkTags.cpp b/src/server/game/Chat/HyperlinkTags.cpp index 84f1986cd91..8aaee9ec346 100644 --- a/src/server/game/Chat/HyperlinkTags.cpp +++ b/src/server/game/Chat/HyperlinkTags.cpp @@ -16,7 +16,7 @@ */ #include "Hyperlinks.h" -#include "AchievementMgr.h" +#include "DBCStores.h" #include "ObjectMgr.h" #include "SpellInfo.h" #include "SpellMgr.h" @@ -63,7 +63,7 @@ bool Trinity::Hyperlinks::LinkTags::achievement::StoreTo(AchievementLinkData& va uint32 achievementId; if (!t.TryConsumeTo(achievementId)) return false; - val.Achievement = sAchievementMgr->GetAchievement(achievementId); + val.Achievement = sAchievementStore.LookupEntry(achievementId); if (!(val.Achievement && t.TryConsumeTo(val.CharacterId) && t.TryConsumeTo(val.IsFinished) && t.TryConsumeTo(val.Month) && t.TryConsumeTo(val.Day))) return false; diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 50ad9a8e673..502031712c4 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -374,21 +374,14 @@ void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell return; amount = 0.0f; } - else if (TempSummon* tempSummonVictim = target->ToTempSummon()) + + // If victim is personal spawn, redirect all aggro to summoner + if (target->IsPrivateObject() && (!GetOwner()->IsPrivateObject() || !GetOwner()->CheckPrivateObjectOwnerVisibility(target))) { - if (tempSummonVictim->IsVisibleBySummonerOnly()) + if (Unit* privateObjectOwner = ObjectAccessor::GetUnit(*GetOwner(), target->GetPrivateObjectOwner())) { - if (Unit* tempSummonSummoner = tempSummonVictim->GetSummonerUnit()) - { - // Personnal Spawns from same summoner can aggro each other - if (!_owner->ToTempSummon() || - !_owner->ToTempSummon()->IsVisibleBySummonerOnly() || - tempSummonVictim->GetSummonerGUID() != GetOwner()->ToTempSummon()->GetSummonerGUID()) - { - AddThreat(tempSummonSummoner, amount, spell, ignoreModifiers, ignoreRedirects); - amount = 0.0f; - } - } + AddThreat(privateObjectOwner, amount, spell, ignoreModifiers, ignoreRedirects); + amount = 0.0f; } } diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 5894c68df1e..e79f6605fb1 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -17,6 +17,7 @@ #include "ConditionMgr.h" #include "AchievementMgr.h" +#include "DBCStores.h" #include "DatabaseEnv.h" #include "GameEventMgr.h" #include "GameObject.h" @@ -122,7 +123,7 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND }; // Checks if object meets the condition -// Can have CONDITION_SOURCE_TYPE_NONE && !mReferenceId if called from a special event (ie: eventAI) +// Can have CONDITION_SOURCE_TYPE_NONE && !mReferenceId if called from a special event (ie: SmartAI) bool Condition::Meets(ConditionSourceInfo& sourceInfo) const { ASSERT(ConditionTarget < MAX_CONDITION_TARGETS); @@ -439,7 +440,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const } case CONDITION_REALM_ACHIEVEMENT: { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(ConditionValue1); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(ConditionValue1); if (achievement && sAchievementMgr->IsRealmCompleted(achievement)) condMeets = true; break; @@ -2003,7 +2004,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const } case CONDITION_ACHIEVEMENT: { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(cond->ConditionValue1); if (!achievement) { TC_LOG_ERROR("sql.sql", "{} has non existing achivement id ({}), skipped.", cond->ToString(true), cond->ConditionValue1); @@ -2302,7 +2303,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const break; case CONDITION_REALM_ACHIEVEMENT: { - AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1); + AchievementEntry const* achievement = sAchievementStore.LookupEntry(cond->ConditionValue1); if (!achievement) { TC_LOG_ERROR("sql.sql", "{} has non existing realm first achivement id ({}), skipped.", cond->ToString(true), cond->ConditionValue1); diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 6eb6a3ddcaf..886c3cb4839 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -188,7 +188,7 @@ void LoadDisables() TC_LOG_ERROR("sql.sql", "Disable flags specified for outdoor PvP {}, useless data.", entry); break; case DISABLE_TYPE_ACHIEVEMENT_CRITERIA: - if (!sAchievementMgr->GetAchievementCriteria(entry)) + if (!sAchievementCriteriaStore.LookupEntry(entry)) { TC_LOG_ERROR("sql.sql", "Achievement Criteria entry {} from `disables` doesn't exist in dbc, skipped.", entry); continue; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 7852f71725e..544c0a61f2e 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -616,8 +616,8 @@ void LoadDBCStores(const std::string& dataPath) } // valid taxi network node - uint8 field = (uint8)((node->ID - 1) / 32); - uint32 submask = 1 << ((node->ID - 1) % 32); + uint32 field = uint32((node->ID - 1) / (sizeof(TaxiMask::value_type) * 8)); + TaxiMask::value_type submask = TaxiMask::value_type(1 << ((node->ID - 1) % (sizeof(TaxiMask::value_type) * 8))); sTaxiNodesMask[field] |= submask; if (node->MountCreatureID[0] && node->MountCreatureID[0] != 32981) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 5f730c9c996..fa44b3deac5 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -251,9 +251,12 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) } Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), m_groupLootTimer(0), lootingGroupLowGUID(0), m_PlayerDamageReq(0), m_lootRecipient(), m_lootRecipientGroup(0), _pickpocketLootRestore(0), - m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_ignoreCorpseDecayRatio(false), m_wanderDistance(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), - m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_cannotReachTarget(false), m_cannotReachTimer(0), - m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), _waypointPathId(0), _currentWaypointNodeInfo(0, 0), + m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_ignoreCorpseDecayRatio(false), m_wanderDistance(0.0f), + m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), + m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), + m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_cannotReachTarget(false), m_cannotReachTimer(0), + m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_homePosition(), m_transportHomePosition(), + m_creatureInfo(nullptr), m_creatureData(nullptr), m_stringIds(), _waypointPathId(0), _currentWaypointNodeInfo(0, 0), m_formation(nullptr), m_triggerJustAppeared(true), m_respawnCompatibilityMode(false), _lastDamagedTime(0), _regenerateHealth(true), _regenerateHealthLock(false), _isMissingCanSwimFlagOutOfCombat(false) { @@ -635,6 +638,8 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, //We must update last scriptId or it looks like we reloaded a script, breaking some things such as gossip temporarily LastUsedScriptID = GetScriptId(); + m_stringIds[AsUnderlyingType(StringIdType::Template)] = &cInfo->StringId; + return true; } @@ -1057,9 +1062,9 @@ bool Creature::Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, u } { // area/zone id is needed immediately for ZoneScript::GetCreatureEntry hook before it is known which creature template to load (no model/scale available yet) - PositionFullTerrainStatus data; - GetMap()->GetFullTerrainStatusForPosition(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ(), data, MAP_ALL_LIQUIDS, DEFAULT_COLLISION_HEIGHT); - ProcessPositionDataChanged(data); + PositionFullTerrainStatus terrainStatus; + GetMap()->GetFullTerrainStatusForPosition(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ(), terrainStatus); + ProcessPositionDataChanged(terrainStatus); } // Allow players to see those units while dead, do it here (mayby altered by addon auras) @@ -1685,6 +1690,8 @@ bool Creature::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, // checked at creature_template loading m_defaultMovementType = MovementGeneratorType(data->movementType); + m_stringIds[AsUnderlyingType(StringIdType::Spawn)] = &data->StringId; + if (addToMap && !GetMap()->AddToMap(this)) return false; return true; @@ -2772,6 +2779,34 @@ uint32 Creature::GetScriptId() const return ASSERT_NOTNULL(sObjectMgr->GetCreatureTemplate(GetEntry()))->ScriptID; } +void Creature::InheritStringIds(Creature const* parent) +{ + // copy references to stringIds from template and spawn + m_stringIds = parent->m_stringIds; + + // then copy script stringId, not just its reference + SetScriptStringId(std::string(parent->GetStringId(StringIdType::Script))); +} + +bool Creature::HasStringId(std::string_view id) const +{ + return std::ranges::any_of(m_stringIds, [id](std::string const* stringId) { return stringId && *stringId == id; }); +} + +void Creature::SetScriptStringId(std::string id) +{ + if (!id.empty()) + { + m_scriptStringId.emplace(std::move(id)); + m_stringIds[AsUnderlyingType(StringIdType::Script)] = &*m_scriptStringId; + } + else + { + m_scriptStringId.reset(); + m_stringIds[AsUnderlyingType(StringIdType::Script)] = nullptr; + } +} + VendorItemData const* Creature::GetVendorItems() const { return sObjectMgr->GetNpcVendorItemList(GetEntry()); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 8a65ca53724..1c1504d74e3 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -198,6 +198,10 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma std::string const& GetAIName() const; std::string GetScriptName() const; uint32 GetScriptId() const; + void InheritStringIds(Creature const* parent); + bool HasStringId(std::string_view id) const; + void SetScriptStringId(std::string id); + std::string_view GetStringId(StringIdType type) const { return m_stringIds[size_t(type)] ? std::string_view(*m_stringIds[size_t(type)]) : std::string_view(); } // override WorldObject function for proper name localization std::string const& GetNameForLocaleIdx(LocaleConstant locale_idx) const override; @@ -421,6 +425,8 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma CreatureTemplate const* m_creatureInfo; // Can differ from sObjectMgr->GetCreatureTemplate(GetEntry()) in difficulty mode > 0 CreatureData const* m_creatureData; + std::array m_stringIds; + Optional m_scriptStringId; uint16 m_LootMode; // Bitmask (default: LOOT_MODE_DEFAULT) that determines what loot will be lootable diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 325bc22ab26..ce702002cfe 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -349,6 +349,7 @@ struct TC_GAME_API CreatureTemplate uint32 SpellSchoolImmuneMask; uint32 flags_extra; uint32 ScriptID; + std::string StringId; WorldPacket QueryData[TOTAL_LOCALES]; uint32 GetRandomValidModelId() const; uint32 GetFirstValidModelId() const; @@ -402,7 +403,7 @@ struct TC_GAME_API CreatureBaseStats uint32 GenerateHealth(CreatureTemplate const* info) const { - return uint32(ceil(BaseHealth[info->expansion] * info->ModHealth)); + return uint32(std::round(std::max(BaseHealth[info->expansion] * info->ModHealth, 1.0f))); } uint32 GenerateMana(CreatureTemplate const* info) const diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index ccd95f38583..2afc0f90307 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -28,7 +28,7 @@ TempSummon::TempSummon(SummonPropertiesEntry const* properties, WorldObject* owner, bool isWorldObject) : Creature(isWorldObject), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN), -m_timer(0), m_lifetime(0), m_canFollowOwner(true), m_visibleBySummonerOnly(false) +m_timer(0), m_lifetime(0), m_canFollowOwner(true) { if (owner) m_summonerGUID = owner->GetGUID(); diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 24aff599f97..60a55f96ce4 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -54,9 +54,6 @@ class TC_GAME_API TempSummon : public Creature uint32 GetTimer() const { return m_timer; } bool CanFollowOwner() const { return m_canFollowOwner; } void SetCanFollowOwner(bool can) { m_canFollowOwner = can; } - void SetVisibleBySummonerOnly(bool visibleBySummonerOnly) { m_visibleBySummonerOnly = visibleBySummonerOnly; } - bool IsVisibleBySummonerOnly() const { return m_visibleBySummonerOnly; } - SummonPropertiesEntry const* const m_Properties; std::string GetDebugInfo() const override; @@ -66,7 +63,6 @@ class TC_GAME_API TempSummon : public Creature uint32 m_lifetime; ObjectGuid m_summonerGUID; bool m_canFollowOwner; - bool m_visibleBySummonerOnly; }; class TC_GAME_API Minion : public TempSummon diff --git a/src/server/game/Entities/Creature/Trainer.cpp b/src/server/game/Entities/Creature/Trainer.cpp index 29679993176..e28b86efceb 100644 --- a/src/server/game/Entities/Creature/Trainer.cpp +++ b/src/server/game/Entities/Creature/Trainer.cpp @@ -105,8 +105,8 @@ namespace Trainer player->ModifyMoney(-moneyCost); - npc->SendPlaySpellVisual(179); - npc->SendPlaySpellImpact(player->GetGUID(), 362); + npc->SendPlaySpellVisualKit(179, 0); // 53 SpellCastDirected + player->SendPlaySpellVisualKit(362, 1); // 113 EmoteSalute // learn explicitly or cast explicitly if (trainerSpell->IsCastable()) diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 84d268f562f..017b79e5ffa 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -82,29 +82,23 @@ void DynamicObject::RemoveFromWorld() } } -bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, DynamicObjectType type) +bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type) { SetMap(caster->GetMap()); Relocate(pos); if (!IsPositionValid()) { - TC_LOG_ERROR("misc", "DynamicObject (spell {}) not created. Suggested coordinates isn't valid (X: {} Y: {})", spellId, GetPositionX(), GetPositionY()); + TC_LOG_ERROR("misc", "DynamicObject (spell {}) not created. Suggested coordinates isn't valid (X: {} Y: {})", spell->Id, GetPositionX(), GetPositionY()); return false; } WorldObject::_Create(guidlow, HighGuid::DynamicObject, caster->GetPhaseMask()); - SetEntry(spellId); + SetEntry(spell->Id); SetObjectScale(1); SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetGUID()); - - // The lower word of DYNAMICOBJECT_BYTES must be 0x0001. This value means that the visual radius will be overriden - // by client for most of the "ground patch" visual effect spells and a few "skyfall" ones like Hurricane. - // If any other value is used, the client will _always_ use the radius provided in DYNAMICOBJECT_RADIUS, but - // precompensation is necessary (eg radius *= 2) for many spells. Anyway, blizz sends 0x0001 for all the spells - // I saw sniffed... SetByteValue(DYNAMICOBJECT_BYTES, 0, type); - SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId); + SetUInt32Value(DYNAMICOBJECT_SPELLID, spell->Id); SetFloatValue(DYNAMICOBJECT_RADIUS, radius); SetUInt32Value(DYNAMICOBJECT_CASTTIME, GameTime::GetGameTimeMS()); diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h index 8d2cd68acd4..dc5b5218af2 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.h +++ b/src/server/game/Entities/DynamicObject/DynamicObject.h @@ -42,7 +42,7 @@ class TC_GAME_API DynamicObject : public WorldObject, public GridObjectScriptId; + + m_stringIds[AsUnderlyingType(StringIdType::Template)] = &goinfo->StringId; + AIM_Initialize(); // Initialize loot duplicate count depending on raid difficulty @@ -1142,6 +1145,8 @@ bool GameObject::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap m_goData = data; + m_stringIds[AsUnderlyingType(StringIdType::Spawn)] = &data->StringId; + if (addToMap && !GetMap()->AddToMap(this)) return false; @@ -2270,6 +2275,34 @@ uint32 GameObject::GetScriptId() const return GetGOInfo()->ScriptId; } +void GameObject::InheritStringIds(GameObject const* parent) +{ + // copy references to stringIds from template and spawn + m_stringIds = parent->m_stringIds; + + // then copy script stringId, not just its reference + SetScriptStringId(std::string(parent->GetStringId(StringIdType::Script))); +} + +bool GameObject::HasStringId(std::string_view id) const +{ + return std::ranges::any_of(m_stringIds, [id](std::string const* stringId) { return stringId && *stringId == id; }); +} + +void GameObject::SetScriptStringId(std::string id) +{ + if (!id.empty()) + { + m_scriptStringId.emplace(std::move(id)); + m_stringIds[AsUnderlyingType(StringIdType::Script)] = &*m_scriptStringId; + } + else + { + m_scriptStringId.reset(); + m_stringIds[AsUnderlyingType(StringIdType::Script)] = nullptr; + } +} + // overwrite WorldObject function for proper name localization std::string const & GameObject::GetNameForLocaleIdx(LocaleConstant loc_idx) const { @@ -2490,8 +2523,16 @@ void GameObject::SetLootState(LootState state, Unit* unit) AI()->OnLootStateChanged(state, unit); // Start restock timer if the chest is partially looted or not looted at all - if (GetGoType() == GAMEOBJECT_TYPE_CHEST && state == GO_ACTIVATED && GetGOInfo()->chest.chestRestockTime > 0 && m_restockTime == 0) - m_restockTime = GameTime::GetGameTime() + GetGOInfo()->chest.chestRestockTime; + if (GetGoType() == GAMEOBJECT_TYPE_CHEST && state == GO_ACTIVATED) + { + GameObjectTemplate const* goInfo = GetGOInfo(); + if (goInfo->chest.chestRestockTime > 0 && m_restockTime == 0) + m_restockTime = GameTime::GetGameTime() + goInfo->chest.chestRestockTime; + + // If world chests were opened, despawn them after 5 minutes + if (goInfo->chest.chestRestockTime == 0 && GetMap()->IsWorldMap()) + DespawnOrUnsummon(5min); + } if (GetGoType() == GAMEOBJECT_TYPE_DOOR) // only set collision for doors on SetGoState return; diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index f45682405b2..a73e6ce8fff 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -270,10 +270,15 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject void SetRespawnCompatibilityMode(bool mode = true) { m_respawnCompatibilityMode = mode; } bool GetRespawnCompatibilityMode() {return m_respawnCompatibilityMode; } + std::string const& GetAIName() const; uint32 GetScriptId() const; GameObjectAI* AI() const { return m_AI; } - std::string const& GetAIName() const; + void InheritStringIds(GameObject const* parent); + bool HasStringId(std::string_view id) const; + void SetScriptStringId(std::string id); + std::string_view GetStringId(StringIdType type) const { return m_stringIds[size_t(type)] ? std::string_view(*m_stringIds[size_t(type)]) : std::string_view(); } + void SetDisplayId(uint32 displayid); uint32 GetDisplayId() const { return GetUInt32Value(GAMEOBJECT_DISPLAYID); } @@ -339,6 +344,8 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject GameObjectTemplateAddon const* m_goTemplateAddon; GameObjectData const* m_goData; GameObjectValue m_goValue; + std::array m_stringIds; + Optional m_scriptStringId; int64 m_packedRotation; QuaternionData m_localRotation; diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index 40eda9ce862..a4e4a4bdce2 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -420,6 +420,7 @@ struct GameObjectTemplate std::string AIName; uint32 ScriptId; + std::string StringId; WorldPacket QueryData[TOTAL_LOCALES]; // helpers diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index c491f88dbab..49363f6b1d0 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -831,15 +831,15 @@ InventoryResult Item::CanBeMergedPartlyWith(ItemTemplate const* proto) const { // not allow merge looting currently items if (m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; // check item type if (GetEntry() != proto->ItemId) - return EQUIP_ERR_ITEM_CANT_STACK; + return EQUIP_ERR_CANT_STACK; // check free space (full stacks can't be target of merge if (GetCount() >= proto->GetMaxStackSize()) - return EQUIP_ERR_ITEM_CANT_STACK; + return EQUIP_ERR_CANT_STACK; return EQUIP_ERR_OK; } diff --git a/src/server/game/Entities/Item/ItemDefines.h b/src/server/game/Entities/Item/ItemDefines.h index 10f5c2c46da..db5c7fd3a03 100644 --- a/src/server/game/Entities/Item/ItemDefines.h +++ b/src/server/game/Entities/Item/ItemDefines.h @@ -23,95 +23,98 @@ // EnumUtils: DESCRIBE THIS enum InventoryResult : uint8 { - EQUIP_ERR_OK = 0, - EQUIP_ERR_CANT_EQUIP_LEVEL_I = 1, - EQUIP_ERR_CANT_EQUIP_SKILL = 2, - EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT = 3, - EQUIP_ERR_BAG_FULL = 4, - EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG = 5, - EQUIP_ERR_CANT_TRADE_EQUIP_BAGS = 6, - EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE = 7, - EQUIP_ERR_NO_REQUIRED_PROFICIENCY = 8, - EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE = 9, - EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM = 10, - EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2 = 11, - EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2 = 12, - EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED = 13, - EQUIP_ERR_CANT_DUAL_WIELD = 14, - EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG = 15, - EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2 = 16, - EQUIP_ERR_CANT_CARRY_MORE_OF_THIS = 17, - EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3 = 18, - EQUIP_ERR_ITEM_CANT_STACK = 19, - EQUIP_ERR_ITEM_CANT_BE_EQUIPPED = 20, - EQUIP_ERR_ITEMS_CANT_BE_SWAPPED = 21, - EQUIP_ERR_SLOT_IS_EMPTY = 22, - EQUIP_ERR_ITEM_NOT_FOUND = 23, - EQUIP_ERR_CANT_DROP_SOULBOUND = 24, - EQUIP_ERR_OUT_OF_RANGE = 25, - EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT = 26, - EQUIP_ERR_COULDNT_SPLIT_ITEMS = 27, - EQUIP_ERR_MISSING_REAGENT = 28, - EQUIP_ERR_NOT_ENOUGH_MONEY = 29, - EQUIP_ERR_NOT_A_BAG = 30, - EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS = 31, - EQUIP_ERR_DONT_OWN_THAT_ITEM = 32, - EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER = 33, - EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT = 34, - EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK = 35, - EQUIP_ERR_ITEM_LOCKED = 36, - EQUIP_ERR_YOU_ARE_STUNNED = 37, - EQUIP_ERR_YOU_ARE_DEAD = 38, - EQUIP_ERR_CANT_DO_RIGHT_NOW = 39, - EQUIP_ERR_INT_BAG_ERROR = 40, - EQUIP_ERR_CAN_EQUIP_ONLY1_BOLT = 41, - EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH = 42, - EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED = 43, - EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED = 44, - EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED = 45, - EQUIP_ERR_BOUND_CANT_BE_WRAPPED = 46, - EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED = 47, - EQUIP_ERR_BAGS_CANT_BE_WRAPPED = 48, - EQUIP_ERR_ALREADY_LOOTED = 49, - EQUIP_ERR_INVENTORY_FULL = 50, - EQUIP_ERR_BANK_FULL = 51, - EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT = 52, - EQUIP_ERR_BAG_FULL3 = 53, - EQUIP_ERR_ITEM_NOT_FOUND2 = 54, - EQUIP_ERR_ITEM_CANT_STACK2 = 55, - EQUIP_ERR_BAG_FULL4 = 56, - EQUIP_ERR_ITEM_SOLD_OUT = 57, - EQUIP_ERR_OBJECT_IS_BUSY = 58, - EQUIP_ERR_NONE = 59, - EQUIP_ERR_NOT_IN_COMBAT = 60, - EQUIP_ERR_NOT_WHILE_DISARMED = 61, - EQUIP_ERR_BAG_FULL6 = 62, - EQUIP_ERR_CANT_EQUIP_RANK = 63, - EQUIP_ERR_CANT_EQUIP_REPUTATION = 64, - EQUIP_ERR_TOO_MANY_SPECIAL_BAGS = 65, - EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW = 66, - EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE = 67, - EQUIP_ERR_VENDOR_MISSING_TURNINS = 68, - EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS = 69, - EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS = 70, - EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED = 71, - EQUIP_ERR_MAIL_BOUND_ITEM = 72, - EQUIP_ERR_NO_SPLIT_WHILE_PROSPECTING = 73, - EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 75, - EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 76, - EQUIP_ERR_TOO_MUCH_GOLD = 77, - EQUIP_ERR_NOT_DURING_ARENA_MATCH = 78, - EQUIP_ERR_CANNOT_TRADE_THAT = 79, - EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW = 80, - EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM = 81, - EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS = 82, - // no output = 83, - EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED = 84, - EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED = 85, - EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 86, - EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW = 87, - EQUIP_ERR_CANT_EQUIP_NEED_TALENT = 88, - EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED = 89 + EQUIP_ERR_OK = 0, + EQUIP_ERR_CANT_EQUIP_LEVEL_I = 1, // You must reach level %d to use that item. + EQUIP_ERR_CANT_EQUIP_SKILL = 2, // You aren't skilled enough to use that item. + EQUIP_ERR_WRONG_SLOT = 3, // That item does not go in that slot. + EQUIP_ERR_BAG_FULL = 4, // That bag is full. + EQUIP_ERR_BAG_IN_BAG = 5, // Can't put non-empty bags in other bags. + EQUIP_ERR_TRADE_EQUIPPED_BAG = 6, // You can't trade equipped bags. + EQUIP_ERR_AMMO_ONLY = 7, // Only ammo can go there. + EQUIP_ERR_PROFICIENCY_NEEDED = 8, // You do not have the required proficiency for that item. + EQUIP_ERR_NO_SLOT_AVAILABLE = 9, // No equipment slot is available for that item. + EQUIP_ERR_CANT_EQUIP_EVER = 10, // You can never use that item. + EQUIP_ERR_CANT_EQUIP_EVER_2 = 11, // You can never use that item. + EQUIP_ERR_NO_SLOT_AVAILABLE_2 = 12, // No equipment slot is available for that item. + EQUIP_ERR_2HANDED_EQUIPPED = 13, // Cannot equip that with a two-handed weapon. + EQUIP_ERR_2HSKILLNOTFOUND = 14, // You cannot dual-wield + EQUIP_ERR_WRONG_BAG_TYPE = 15, // That item doesn't go in that container. + EQUIP_ERR_WRONG_BAG_TYPE_2 = 16, // That item doesn't go in that container. + EQUIP_ERR_ITEM_MAX_COUNT = 17, // You can't carry any more of those items. + EQUIP_ERR_NO_SLOT_AVAILABLE_3 = 18, // No equipment slot is available for that item. + EQUIP_ERR_CANT_STACK = 19, // This item cannot stack. + EQUIP_ERR_NOT_EQUIPPABLE = 20, // This item cannot be equipped. + EQUIP_ERR_CANT_SWAP = 21, // These items can't be swapped. + EQUIP_ERR_SLOT_EMPTY = 22, // That slot is empty. + EQUIP_ERR_ITEM_NOT_FOUND = 23, // The item was not found. + EQUIP_ERR_DROP_BOUND_ITEM = 24, // You can't drop a soulbound item. + EQUIP_ERR_OUT_OF_RANGE = 25, // Out of range. + EQUIP_ERR_TOO_FEW_TO_SPLIT = 26, // Tried to split more than number in stack. + EQUIP_ERR_SPLIT_FAILED = 27, // Couldn't split those items. + EQUIP_ERR_SPELL_FAILED_REAGENTS_GENERIC = 28, // Missing reagent + EQUIP_ERR_NOT_ENOUGH_MONEY = 29, // You don't have enough money. + EQUIP_ERR_NOT_A_BAG = 30, // Not a bag. + EQUIP_ERR_DESTROY_NONEMPTY_BAG = 31, // You can only do that with empty bags. + EQUIP_ERR_NOT_OWNER = 32, // You don't own that item. + EQUIP_ERR_ONLY_ONE_QUIVER = 33, // You can only equip one quiver. + EQUIP_ERR_NO_BANK_SLOT = 34, // You must purchase that bag slot first + EQUIP_ERR_NO_BANK_HERE = 35, // You are too far away from a bank. + EQUIP_ERR_ITEM_LOCKED = 36, // Item is locked. + EQUIP_ERR_GENERIC_STUNNED = 37, // You are stunned + EQUIP_ERR_PLAYER_DEAD = 38, // You can't do that when you're dead. + EQUIP_ERR_CLIENT_LOCKED_OUT = 39, // You can't do that right now. + EQUIP_ERR_INTERNAL_BAG_ERROR = 40, // Internal Bag Error + EQUIP_ERR_ONLY_ONE_BOLT = 41, // You can only equip one quiver. + EQUIP_ERR_ONLY_ONE_AMMO = 42, // You can only equip one ammo pouch. + EQUIP_ERR_CANT_WRAP_STACKABLE = 43, // Stackable items can't be wrapped. + EQUIP_ERR_CANT_WRAP_EQUIPPED = 44, // Equipped items can't be wrapped. + EQUIP_ERR_CANT_WRAP_WRAPPED = 45, // Wrapped items can't be wrapped. + EQUIP_ERR_CANT_WRAP_BOUND = 46, // Bound items can't be wrapped. + EQUIP_ERR_CANT_WRAP_UNIQUE = 47, // Unique items can't be wrapped. + EQUIP_ERR_CANT_WRAP_BAGS = 48, // Bags can't be wrapped. + EQUIP_ERR_LOOT_GONE = 49, // Already looted + EQUIP_ERR_INV_FULL = 50, // Inventory is full. + EQUIP_ERR_BANK_FULL = 51, // Your bank is full + EQUIP_ERR_VENDOR_SOLD_OUT = 52, // That item is currently sold out. + EQUIP_ERR_BAG_FULL_2 = 53, // That bag is full. + EQUIP_ERR_ITEM_NOT_FOUND_2 = 54, // The item was not found. + EQUIP_ERR_CANT_STACK_2 = 55, // This item cannot stack. + EQUIP_ERR_BAG_FULL_3 = 56, // That bag is full. + EQUIP_ERR_VENDOR_SOLD_OUT_2 = 57, // That item is currently sold out. + EQUIP_ERR_OBJECT_IS_BUSY = 58, // That object is busy. + EQUIP_ERR_CANT_BE_DISENCHANTED = 59, // Item cannot be disenchanted + EQUIP_ERR_NOT_IN_COMBAT = 60, // You can't do that while in combat + EQUIP_ERR_NOT_WHILE_DISARMED = 61, // You can't do that while disarmed + EQUIP_ERR_BAG_FULL_4 = 62, // That bag is full. + EQUIP_ERR_CANT_EQUIP_RANK = 63, // You don't have the required rank for that item + EQUIP_ERR_CANT_EQUIP_REPUTATION = 64, // You don't have the required reputation for that item + EQUIP_ERR_TOO_MANY_SPECIAL_BAGS = 65, // You cannot equip another bag of that type + EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW = 66, // You can't loot that item now. + EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE = 67, // You cannot equip more than one of those. + EQUIP_ERR_VENDOR_MISSING_TURNINS = 68, // You do not have the required items for that purchase + EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS = 69, // You don't have enough honor points + EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS = 70, // You don't have enough arena points + EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED = 71, // You have the maximum number of those gems in your inventory or socketed into items. + EQUIP_ERR_MAIL_BOUND_ITEM = 72, // You can't mail soulbound items. + EQUIP_ERR_INTERNAL_BAG_ERROR_2 = 73, // Internal Bag Error + EQUIP_ERR_BAG_FULL_5 = 74, // That bag is full. + EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 75, // You have the maximum number of those gems socketed into equipped items. + EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 76, // You cannot socket more than one of those gems into a single item. + EQUIP_ERR_TOO_MUCH_GOLD = 77, // At gold limit + EQUIP_ERR_NOT_DURING_ARENA_MATCH = 78, // You can't do that while in an arena match + EQUIP_ERR_TRADE_BOUND_ITEM = 79, // You can't trade a soulbound item. + EQUIP_ERR_CANT_EQUIP_RATING = 80, // You don't have the personal, team, or battleground rating required to buy that item + EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM = 81, + EQUIP_ERR_NOT_SAME_ACCOUNT = 82, // Account-bound items can only be given to your own characters. + EQUIP_ERR_NONE = 83, + EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 84, // You can only carry %d %s + EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 85, // You can only equip %d |4item:items in the %s category + EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 86, // Your level is too high to use that item + EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW = 87, // You must reach level %d to purchase that item. + EQUIP_ERR_CANT_EQUIP_NEED_TALENT = 88, // You do not have the required talent to equip that. + EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS = 89, // You can only equip %d |4item:items in the %s category + EQUIP_ERR_SHAPESHIFT_FORM_CANNOT_EQUIP = 90, // Cannot equip item in this form + EQUIP_ERR_ITEM_INVENTORY_FULL_SATCHEL = 91, // Your inventory is full. Your satchel has been delivered to your mailbox. }; // EnumUtils: DESCRIBE THIS diff --git a/src/server/game/Entities/Item/enuminfo_ItemDefines.cpp b/src/server/game/Entities/Item/enuminfo_ItemDefines.cpp index 663161b9751..0af6cb8b37e 100644 --- a/src/server/game/Entities/Item/enuminfo_ItemDefines.cpp +++ b/src/server/game/Entities/Item/enuminfo_ItemDefines.cpp @@ -32,99 +32,103 @@ TC_API_EXPORT EnumText EnumUtils::ToString(InventoryResult valu switch (value) { case EQUIP_ERR_OK: return { "EQUIP_ERR_OK", "EQUIP_ERR_OK", "" }; - case EQUIP_ERR_CANT_EQUIP_LEVEL_I: return { "EQUIP_ERR_CANT_EQUIP_LEVEL_I", "EQUIP_ERR_CANT_EQUIP_LEVEL_I", "" }; - case EQUIP_ERR_CANT_EQUIP_SKILL: return { "EQUIP_ERR_CANT_EQUIP_SKILL", "EQUIP_ERR_CANT_EQUIP_SKILL", "" }; - case EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT: return { "EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT", "EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT", "" }; - case EQUIP_ERR_BAG_FULL: return { "EQUIP_ERR_BAG_FULL", "EQUIP_ERR_BAG_FULL", "" }; - case EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG: return { "EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG", "EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG", "" }; - case EQUIP_ERR_CANT_TRADE_EQUIP_BAGS: return { "EQUIP_ERR_CANT_TRADE_EQUIP_BAGS", "EQUIP_ERR_CANT_TRADE_EQUIP_BAGS", "" }; - case EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE: return { "EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE", "EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE", "" }; - case EQUIP_ERR_NO_REQUIRED_PROFICIENCY: return { "EQUIP_ERR_NO_REQUIRED_PROFICIENCY", "EQUIP_ERR_NO_REQUIRED_PROFICIENCY", "" }; - case EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE: return { "EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE", "EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE", "" }; - case EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM: return { "EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM", "EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM", "" }; - case EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2: return { "EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2", "EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2", "" }; - case EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2: return { "EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2", "EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2", "" }; - case EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED: return { "EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED", "EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED", "" }; - case EQUIP_ERR_CANT_DUAL_WIELD: return { "EQUIP_ERR_CANT_DUAL_WIELD", "EQUIP_ERR_CANT_DUAL_WIELD", "" }; - case EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG: return { "EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG", "EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG", "" }; - case EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2: return { "EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2", "EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2", "" }; - case EQUIP_ERR_CANT_CARRY_MORE_OF_THIS: return { "EQUIP_ERR_CANT_CARRY_MORE_OF_THIS", "EQUIP_ERR_CANT_CARRY_MORE_OF_THIS", "" }; - case EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3: return { "EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3", "EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3", "" }; - case EQUIP_ERR_ITEM_CANT_STACK: return { "EQUIP_ERR_ITEM_CANT_STACK", "EQUIP_ERR_ITEM_CANT_STACK", "" }; - case EQUIP_ERR_ITEM_CANT_BE_EQUIPPED: return { "EQUIP_ERR_ITEM_CANT_BE_EQUIPPED", "EQUIP_ERR_ITEM_CANT_BE_EQUIPPED", "" }; - case EQUIP_ERR_ITEMS_CANT_BE_SWAPPED: return { "EQUIP_ERR_ITEMS_CANT_BE_SWAPPED", "EQUIP_ERR_ITEMS_CANT_BE_SWAPPED", "" }; - case EQUIP_ERR_SLOT_IS_EMPTY: return { "EQUIP_ERR_SLOT_IS_EMPTY", "EQUIP_ERR_SLOT_IS_EMPTY", "" }; - case EQUIP_ERR_ITEM_NOT_FOUND: return { "EQUIP_ERR_ITEM_NOT_FOUND", "EQUIP_ERR_ITEM_NOT_FOUND", "" }; - case EQUIP_ERR_CANT_DROP_SOULBOUND: return { "EQUIP_ERR_CANT_DROP_SOULBOUND", "EQUIP_ERR_CANT_DROP_SOULBOUND", "" }; - case EQUIP_ERR_OUT_OF_RANGE: return { "EQUIP_ERR_OUT_OF_RANGE", "EQUIP_ERR_OUT_OF_RANGE", "" }; - case EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT: return { "EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT", "EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT", "" }; - case EQUIP_ERR_COULDNT_SPLIT_ITEMS: return { "EQUIP_ERR_COULDNT_SPLIT_ITEMS", "EQUIP_ERR_COULDNT_SPLIT_ITEMS", "" }; - case EQUIP_ERR_MISSING_REAGENT: return { "EQUIP_ERR_MISSING_REAGENT", "EQUIP_ERR_MISSING_REAGENT", "" }; - case EQUIP_ERR_NOT_ENOUGH_MONEY: return { "EQUIP_ERR_NOT_ENOUGH_MONEY", "EQUIP_ERR_NOT_ENOUGH_MONEY", "" }; - case EQUIP_ERR_NOT_A_BAG: return { "EQUIP_ERR_NOT_A_BAG", "EQUIP_ERR_NOT_A_BAG", "" }; - case EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS: return { "EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS", "EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS", "" }; - case EQUIP_ERR_DONT_OWN_THAT_ITEM: return { "EQUIP_ERR_DONT_OWN_THAT_ITEM", "EQUIP_ERR_DONT_OWN_THAT_ITEM", "" }; - case EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER: return { "EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER", "EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER", "" }; - case EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT: return { "EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT", "EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT", "" }; - case EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK: return { "EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK", "EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK", "" }; - case EQUIP_ERR_ITEM_LOCKED: return { "EQUIP_ERR_ITEM_LOCKED", "EQUIP_ERR_ITEM_LOCKED", "" }; - case EQUIP_ERR_YOU_ARE_STUNNED: return { "EQUIP_ERR_YOU_ARE_STUNNED", "EQUIP_ERR_YOU_ARE_STUNNED", "" }; - case EQUIP_ERR_YOU_ARE_DEAD: return { "EQUIP_ERR_YOU_ARE_DEAD", "EQUIP_ERR_YOU_ARE_DEAD", "" }; - case EQUIP_ERR_CANT_DO_RIGHT_NOW: return { "EQUIP_ERR_CANT_DO_RIGHT_NOW", "EQUIP_ERR_CANT_DO_RIGHT_NOW", "" }; - case EQUIP_ERR_INT_BAG_ERROR: return { "EQUIP_ERR_INT_BAG_ERROR", "EQUIP_ERR_INT_BAG_ERROR", "" }; - case EQUIP_ERR_CAN_EQUIP_ONLY1_BOLT: return { "EQUIP_ERR_CAN_EQUIP_ONLY1_BOLT", "EQUIP_ERR_CAN_EQUIP_ONLY1_BOLT", "" }; - case EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH: return { "EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH", "EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH", "" }; - case EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED: return { "EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED", "EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED", "" }; - case EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED: return { "EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED", "EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED", "" }; - case EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED: return { "EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED", "EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED", "" }; - case EQUIP_ERR_BOUND_CANT_BE_WRAPPED: return { "EQUIP_ERR_BOUND_CANT_BE_WRAPPED", "EQUIP_ERR_BOUND_CANT_BE_WRAPPED", "" }; - case EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED: return { "EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED", "EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED", "" }; - case EQUIP_ERR_BAGS_CANT_BE_WRAPPED: return { "EQUIP_ERR_BAGS_CANT_BE_WRAPPED", "EQUIP_ERR_BAGS_CANT_BE_WRAPPED", "" }; - case EQUIP_ERR_ALREADY_LOOTED: return { "EQUIP_ERR_ALREADY_LOOTED", "EQUIP_ERR_ALREADY_LOOTED", "" }; - case EQUIP_ERR_INVENTORY_FULL: return { "EQUIP_ERR_INVENTORY_FULL", "EQUIP_ERR_INVENTORY_FULL", "" }; - case EQUIP_ERR_BANK_FULL: return { "EQUIP_ERR_BANK_FULL", "EQUIP_ERR_BANK_FULL", "" }; - case EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT: return { "EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT", "EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT", "" }; - case EQUIP_ERR_BAG_FULL3: return { "EQUIP_ERR_BAG_FULL3", "EQUIP_ERR_BAG_FULL3", "" }; - case EQUIP_ERR_ITEM_NOT_FOUND2: return { "EQUIP_ERR_ITEM_NOT_FOUND2", "EQUIP_ERR_ITEM_NOT_FOUND2", "" }; - case EQUIP_ERR_ITEM_CANT_STACK2: return { "EQUIP_ERR_ITEM_CANT_STACK2", "EQUIP_ERR_ITEM_CANT_STACK2", "" }; - case EQUIP_ERR_BAG_FULL4: return { "EQUIP_ERR_BAG_FULL4", "EQUIP_ERR_BAG_FULL4", "" }; - case EQUIP_ERR_ITEM_SOLD_OUT: return { "EQUIP_ERR_ITEM_SOLD_OUT", "EQUIP_ERR_ITEM_SOLD_OUT", "" }; - case EQUIP_ERR_OBJECT_IS_BUSY: return { "EQUIP_ERR_OBJECT_IS_BUSY", "EQUIP_ERR_OBJECT_IS_BUSY", "" }; - case EQUIP_ERR_NONE: return { "EQUIP_ERR_NONE", "EQUIP_ERR_NONE", "" }; - case EQUIP_ERR_NOT_IN_COMBAT: return { "EQUIP_ERR_NOT_IN_COMBAT", "EQUIP_ERR_NOT_IN_COMBAT", "" }; - case EQUIP_ERR_NOT_WHILE_DISARMED: return { "EQUIP_ERR_NOT_WHILE_DISARMED", "EQUIP_ERR_NOT_WHILE_DISARMED", "" }; - case EQUIP_ERR_BAG_FULL6: return { "EQUIP_ERR_BAG_FULL6", "EQUIP_ERR_BAG_FULL6", "" }; - case EQUIP_ERR_CANT_EQUIP_RANK: return { "EQUIP_ERR_CANT_EQUIP_RANK", "EQUIP_ERR_CANT_EQUIP_RANK", "" }; - case EQUIP_ERR_CANT_EQUIP_REPUTATION: return { "EQUIP_ERR_CANT_EQUIP_REPUTATION", "EQUIP_ERR_CANT_EQUIP_REPUTATION", "" }; - case EQUIP_ERR_TOO_MANY_SPECIAL_BAGS: return { "EQUIP_ERR_TOO_MANY_SPECIAL_BAGS", "EQUIP_ERR_TOO_MANY_SPECIAL_BAGS", "" }; - case EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW: return { "EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW", "EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW", "" }; - case EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE: return { "EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE", "EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE", "" }; - case EQUIP_ERR_VENDOR_MISSING_TURNINS: return { "EQUIP_ERR_VENDOR_MISSING_TURNINS", "EQUIP_ERR_VENDOR_MISSING_TURNINS", "" }; - case EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS: return { "EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS", "EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS", "" }; - case EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS: return { "EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS", "EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS", "" }; - case EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED: return { "EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED", "EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED", "" }; - case EQUIP_ERR_MAIL_BOUND_ITEM: return { "EQUIP_ERR_MAIL_BOUND_ITEM", "EQUIP_ERR_MAIL_BOUND_ITEM", "" }; - case EQUIP_ERR_NO_SPLIT_WHILE_PROSPECTING: return { "EQUIP_ERR_NO_SPLIT_WHILE_PROSPECTING", "EQUIP_ERR_NO_SPLIT_WHILE_PROSPECTING", "" }; - case EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED: return { "EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED", "EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED", "" }; - case EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED: return { "EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED", "EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED", "" }; - case EQUIP_ERR_TOO_MUCH_GOLD: return { "EQUIP_ERR_TOO_MUCH_GOLD", "EQUIP_ERR_TOO_MUCH_GOLD", "" }; - case EQUIP_ERR_NOT_DURING_ARENA_MATCH: return { "EQUIP_ERR_NOT_DURING_ARENA_MATCH", "EQUIP_ERR_NOT_DURING_ARENA_MATCH", "" }; - case EQUIP_ERR_CANNOT_TRADE_THAT: return { "EQUIP_ERR_CANNOT_TRADE_THAT", "EQUIP_ERR_CANNOT_TRADE_THAT", "" }; - case EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW: return { "EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW", "EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW", "" }; + case EQUIP_ERR_CANT_EQUIP_LEVEL_I: return { "EQUIP_ERR_CANT_EQUIP_LEVEL_I", "EQUIP_ERR_CANT_EQUIP_LEVEL_I", "You must reach level %d to use that item." }; + case EQUIP_ERR_CANT_EQUIP_SKILL: return { "EQUIP_ERR_CANT_EQUIP_SKILL", "EQUIP_ERR_CANT_EQUIP_SKILL", "You aren't skilled enough to use that item." }; + case EQUIP_ERR_WRONG_SLOT: return { "EQUIP_ERR_WRONG_SLOT", "EQUIP_ERR_WRONG_SLOT", "That item does not go in that slot." }; + case EQUIP_ERR_BAG_FULL: return { "EQUIP_ERR_BAG_FULL", "EQUIP_ERR_BAG_FULL", "That bag is full." }; + case EQUIP_ERR_BAG_IN_BAG: return { "EQUIP_ERR_BAG_IN_BAG", "EQUIP_ERR_BAG_IN_BAG", "Can't put non-empty bags in other bags." }; + case EQUIP_ERR_TRADE_EQUIPPED_BAG: return { "EQUIP_ERR_TRADE_EQUIPPED_BAG", "EQUIP_ERR_TRADE_EQUIPPED_BAG", "You can't trade equipped bags." }; + case EQUIP_ERR_AMMO_ONLY: return { "EQUIP_ERR_AMMO_ONLY", "EQUIP_ERR_AMMO_ONLY", "Only ammo can go there." }; + case EQUIP_ERR_PROFICIENCY_NEEDED: return { "EQUIP_ERR_PROFICIENCY_NEEDED", "EQUIP_ERR_PROFICIENCY_NEEDED", "You do not have the required proficiency for that item." }; + case EQUIP_ERR_NO_SLOT_AVAILABLE: return { "EQUIP_ERR_NO_SLOT_AVAILABLE", "EQUIP_ERR_NO_SLOT_AVAILABLE", "No equipment slot is available for that item." }; + case EQUIP_ERR_CANT_EQUIP_EVER: return { "EQUIP_ERR_CANT_EQUIP_EVER", "EQUIP_ERR_CANT_EQUIP_EVER", "You can never use that item." }; + case EQUIP_ERR_CANT_EQUIP_EVER_2: return { "EQUIP_ERR_CANT_EQUIP_EVER_2", "EQUIP_ERR_CANT_EQUIP_EVER_2", "You can never use that item." }; + case EQUIP_ERR_NO_SLOT_AVAILABLE_2: return { "EQUIP_ERR_NO_SLOT_AVAILABLE_2", "EQUIP_ERR_NO_SLOT_AVAILABLE_2", "No equipment slot is available for that item." }; + case EQUIP_ERR_2HANDED_EQUIPPED: return { "EQUIP_ERR_2HANDED_EQUIPPED", "EQUIP_ERR_2HANDED_EQUIPPED", "Cannot equip that with a two-handed weapon." }; + case EQUIP_ERR_2HSKILLNOTFOUND: return { "EQUIP_ERR_2HSKILLNOTFOUND", "EQUIP_ERR_2HSKILLNOTFOUND", "You cannot dual-wield" }; + case EQUIP_ERR_WRONG_BAG_TYPE: return { "EQUIP_ERR_WRONG_BAG_TYPE", "EQUIP_ERR_WRONG_BAG_TYPE", "That item doesn't go in that container." }; + case EQUIP_ERR_WRONG_BAG_TYPE_2: return { "EQUIP_ERR_WRONG_BAG_TYPE_2", "EQUIP_ERR_WRONG_BAG_TYPE_2", "That item doesn't go in that container." }; + case EQUIP_ERR_ITEM_MAX_COUNT: return { "EQUIP_ERR_ITEM_MAX_COUNT", "EQUIP_ERR_ITEM_MAX_COUNT", "You can't carry any more of those items." }; + case EQUIP_ERR_NO_SLOT_AVAILABLE_3: return { "EQUIP_ERR_NO_SLOT_AVAILABLE_3", "EQUIP_ERR_NO_SLOT_AVAILABLE_3", "No equipment slot is available for that item." }; + case EQUIP_ERR_CANT_STACK: return { "EQUIP_ERR_CANT_STACK", "EQUIP_ERR_CANT_STACK", "This item cannot stack." }; + case EQUIP_ERR_NOT_EQUIPPABLE: return { "EQUIP_ERR_NOT_EQUIPPABLE", "EQUIP_ERR_NOT_EQUIPPABLE", "This item cannot be equipped." }; + case EQUIP_ERR_CANT_SWAP: return { "EQUIP_ERR_CANT_SWAP", "EQUIP_ERR_CANT_SWAP", "These items can't be swapped." }; + case EQUIP_ERR_SLOT_EMPTY: return { "EQUIP_ERR_SLOT_EMPTY", "EQUIP_ERR_SLOT_EMPTY", "That slot is empty." }; + case EQUIP_ERR_ITEM_NOT_FOUND: return { "EQUIP_ERR_ITEM_NOT_FOUND", "EQUIP_ERR_ITEM_NOT_FOUND", "The item was not found." }; + case EQUIP_ERR_DROP_BOUND_ITEM: return { "EQUIP_ERR_DROP_BOUND_ITEM", "EQUIP_ERR_DROP_BOUND_ITEM", "You can't drop a soulbound item." }; + case EQUIP_ERR_OUT_OF_RANGE: return { "EQUIP_ERR_OUT_OF_RANGE", "EQUIP_ERR_OUT_OF_RANGE", "Out of range." }; + case EQUIP_ERR_TOO_FEW_TO_SPLIT: return { "EQUIP_ERR_TOO_FEW_TO_SPLIT", "EQUIP_ERR_TOO_FEW_TO_SPLIT", "Tried to split more than number in stack." }; + case EQUIP_ERR_SPLIT_FAILED: return { "EQUIP_ERR_SPLIT_FAILED", "EQUIP_ERR_SPLIT_FAILED", "Couldn't split those items." }; + case EQUIP_ERR_SPELL_FAILED_REAGENTS_GENERIC: return { "EQUIP_ERR_SPELL_FAILED_REAGENTS_GENERIC", "EQUIP_ERR_SPELL_FAILED_REAGENTS_GENERIC", "Missing reagent" }; + case EQUIP_ERR_NOT_ENOUGH_MONEY: return { "EQUIP_ERR_NOT_ENOUGH_MONEY", "EQUIP_ERR_NOT_ENOUGH_MONEY", "You don't have enough money." }; + case EQUIP_ERR_NOT_A_BAG: return { "EQUIP_ERR_NOT_A_BAG", "EQUIP_ERR_NOT_A_BAG", "Not a bag." }; + case EQUIP_ERR_DESTROY_NONEMPTY_BAG: return { "EQUIP_ERR_DESTROY_NONEMPTY_BAG", "EQUIP_ERR_DESTROY_NONEMPTY_BAG", "You can only do that with empty bags." }; + case EQUIP_ERR_NOT_OWNER: return { "EQUIP_ERR_NOT_OWNER", "EQUIP_ERR_NOT_OWNER", "You don't own that item." }; + case EQUIP_ERR_ONLY_ONE_QUIVER: return { "EQUIP_ERR_ONLY_ONE_QUIVER", "EQUIP_ERR_ONLY_ONE_QUIVER", "You can only equip one quiver." }; + case EQUIP_ERR_NO_BANK_SLOT: return { "EQUIP_ERR_NO_BANK_SLOT", "EQUIP_ERR_NO_BANK_SLOT", "You must purchase that bag slot first" }; + case EQUIP_ERR_NO_BANK_HERE: return { "EQUIP_ERR_NO_BANK_HERE", "EQUIP_ERR_NO_BANK_HERE", "You are too far away from a bank." }; + case EQUIP_ERR_ITEM_LOCKED: return { "EQUIP_ERR_ITEM_LOCKED", "EQUIP_ERR_ITEM_LOCKED", "Item is locked." }; + case EQUIP_ERR_GENERIC_STUNNED: return { "EQUIP_ERR_GENERIC_STUNNED", "EQUIP_ERR_GENERIC_STUNNED", "You are stunned" }; + case EQUIP_ERR_PLAYER_DEAD: return { "EQUIP_ERR_PLAYER_DEAD", "EQUIP_ERR_PLAYER_DEAD", "You can't do that when you're dead." }; + case EQUIP_ERR_CLIENT_LOCKED_OUT: return { "EQUIP_ERR_CLIENT_LOCKED_OUT", "EQUIP_ERR_CLIENT_LOCKED_OUT", "You can't do that right now." }; + case EQUIP_ERR_INTERNAL_BAG_ERROR: return { "EQUIP_ERR_INTERNAL_BAG_ERROR", "EQUIP_ERR_INTERNAL_BAG_ERROR", "Internal Bag Error" }; + case EQUIP_ERR_ONLY_ONE_BOLT: return { "EQUIP_ERR_ONLY_ONE_BOLT", "EQUIP_ERR_ONLY_ONE_BOLT", "You can only equip one quiver." }; + case EQUIP_ERR_ONLY_ONE_AMMO: return { "EQUIP_ERR_ONLY_ONE_AMMO", "EQUIP_ERR_ONLY_ONE_AMMO", "You can only equip one ammo pouch." }; + case EQUIP_ERR_CANT_WRAP_STACKABLE: return { "EQUIP_ERR_CANT_WRAP_STACKABLE", "EQUIP_ERR_CANT_WRAP_STACKABLE", "Stackable items can't be wrapped." }; + case EQUIP_ERR_CANT_WRAP_EQUIPPED: return { "EQUIP_ERR_CANT_WRAP_EQUIPPED", "EQUIP_ERR_CANT_WRAP_EQUIPPED", "Equipped items can't be wrapped." }; + case EQUIP_ERR_CANT_WRAP_WRAPPED: return { "EQUIP_ERR_CANT_WRAP_WRAPPED", "EQUIP_ERR_CANT_WRAP_WRAPPED", "Wrapped items can't be wrapped." }; + case EQUIP_ERR_CANT_WRAP_BOUND: return { "EQUIP_ERR_CANT_WRAP_BOUND", "EQUIP_ERR_CANT_WRAP_BOUND", "Bound items can't be wrapped." }; + case EQUIP_ERR_CANT_WRAP_UNIQUE: return { "EQUIP_ERR_CANT_WRAP_UNIQUE", "EQUIP_ERR_CANT_WRAP_UNIQUE", "Unique items can't be wrapped." }; + case EQUIP_ERR_CANT_WRAP_BAGS: return { "EQUIP_ERR_CANT_WRAP_BAGS", "EQUIP_ERR_CANT_WRAP_BAGS", "Bags can't be wrapped." }; + case EQUIP_ERR_LOOT_GONE: return { "EQUIP_ERR_LOOT_GONE", "EQUIP_ERR_LOOT_GONE", "Already looted" }; + case EQUIP_ERR_INV_FULL: return { "EQUIP_ERR_INV_FULL", "EQUIP_ERR_INV_FULL", "Inventory is full." }; + case EQUIP_ERR_BANK_FULL: return { "EQUIP_ERR_BANK_FULL", "EQUIP_ERR_BANK_FULL", "Your bank is full" }; + case EQUIP_ERR_VENDOR_SOLD_OUT: return { "EQUIP_ERR_VENDOR_SOLD_OUT", "EQUIP_ERR_VENDOR_SOLD_OUT", "That item is currently sold out." }; + case EQUIP_ERR_BAG_FULL_2: return { "EQUIP_ERR_BAG_FULL_2", "EQUIP_ERR_BAG_FULL_2", "That bag is full." }; + case EQUIP_ERR_ITEM_NOT_FOUND_2: return { "EQUIP_ERR_ITEM_NOT_FOUND_2", "EQUIP_ERR_ITEM_NOT_FOUND_2", "The item was not found." }; + case EQUIP_ERR_CANT_STACK_2: return { "EQUIP_ERR_CANT_STACK_2", "EQUIP_ERR_CANT_STACK_2", "This item cannot stack." }; + case EQUIP_ERR_BAG_FULL_3: return { "EQUIP_ERR_BAG_FULL_3", "EQUIP_ERR_BAG_FULL_3", "That bag is full." }; + case EQUIP_ERR_VENDOR_SOLD_OUT_2: return { "EQUIP_ERR_VENDOR_SOLD_OUT_2", "EQUIP_ERR_VENDOR_SOLD_OUT_2", "That item is currently sold out." }; + case EQUIP_ERR_OBJECT_IS_BUSY: return { "EQUIP_ERR_OBJECT_IS_BUSY", "EQUIP_ERR_OBJECT_IS_BUSY", "That object is busy." }; + case EQUIP_ERR_CANT_BE_DISENCHANTED: return { "EQUIP_ERR_CANT_BE_DISENCHANTED", "EQUIP_ERR_CANT_BE_DISENCHANTED", "Item cannot be disenchanted" }; + case EQUIP_ERR_NOT_IN_COMBAT: return { "EQUIP_ERR_NOT_IN_COMBAT", "EQUIP_ERR_NOT_IN_COMBAT", "You can't do that while in combat" }; + case EQUIP_ERR_NOT_WHILE_DISARMED: return { "EQUIP_ERR_NOT_WHILE_DISARMED", "EQUIP_ERR_NOT_WHILE_DISARMED", "You can't do that while disarmed" }; + case EQUIP_ERR_BAG_FULL_4: return { "EQUIP_ERR_BAG_FULL_4", "EQUIP_ERR_BAG_FULL_4", "That bag is full." }; + case EQUIP_ERR_CANT_EQUIP_RANK: return { "EQUIP_ERR_CANT_EQUIP_RANK", "EQUIP_ERR_CANT_EQUIP_RANK", "You don't have the required rank for that item" }; + case EQUIP_ERR_CANT_EQUIP_REPUTATION: return { "EQUIP_ERR_CANT_EQUIP_REPUTATION", "EQUIP_ERR_CANT_EQUIP_REPUTATION", "You don't have the required reputation for that item" }; + case EQUIP_ERR_TOO_MANY_SPECIAL_BAGS: return { "EQUIP_ERR_TOO_MANY_SPECIAL_BAGS", "EQUIP_ERR_TOO_MANY_SPECIAL_BAGS", "You cannot equip another bag of that type" }; + case EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW: return { "EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW", "EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW", "You can't loot that item now." }; + case EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE: return { "EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE", "EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE", "You cannot equip more than one of those." }; + case EQUIP_ERR_VENDOR_MISSING_TURNINS: return { "EQUIP_ERR_VENDOR_MISSING_TURNINS", "EQUIP_ERR_VENDOR_MISSING_TURNINS", "You do not have the required items for that purchase" }; + case EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS: return { "EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS", "EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS", "You don't have enough honor points" }; + case EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS: return { "EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS", "EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS", "You don't have enough arena points" }; + case EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED: return { "EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED", "EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED", "You have the maximum number of those gems in your inventory or socketed into items." }; + case EQUIP_ERR_MAIL_BOUND_ITEM: return { "EQUIP_ERR_MAIL_BOUND_ITEM", "EQUIP_ERR_MAIL_BOUND_ITEM", "You can't mail soulbound items." }; + case EQUIP_ERR_INTERNAL_BAG_ERROR_2: return { "EQUIP_ERR_INTERNAL_BAG_ERROR_2", "EQUIP_ERR_INTERNAL_BAG_ERROR_2", "Internal Bag Error" }; + case EQUIP_ERR_BAG_FULL_5: return { "EQUIP_ERR_BAG_FULL_5", "EQUIP_ERR_BAG_FULL_5", "That bag is full." }; + case EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED: return { "EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED", "EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED", "You have the maximum number of those gems socketed into equipped items." }; + case EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED: return { "EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED", "EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED", "You cannot socket more than one of those gems into a single item." }; + case EQUIP_ERR_TOO_MUCH_GOLD: return { "EQUIP_ERR_TOO_MUCH_GOLD", "EQUIP_ERR_TOO_MUCH_GOLD", "At gold limit" }; + case EQUIP_ERR_NOT_DURING_ARENA_MATCH: return { "EQUIP_ERR_NOT_DURING_ARENA_MATCH", "EQUIP_ERR_NOT_DURING_ARENA_MATCH", "You can't do that while in an arena match" }; + case EQUIP_ERR_TRADE_BOUND_ITEM: return { "EQUIP_ERR_TRADE_BOUND_ITEM", "EQUIP_ERR_TRADE_BOUND_ITEM", "You can't trade a soulbound item." }; + case EQUIP_ERR_CANT_EQUIP_RATING: return { "EQUIP_ERR_CANT_EQUIP_RATING", "EQUIP_ERR_CANT_EQUIP_RATING", "You don't have the personal, team, or battleground rating required to buy that item" }; case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: return { "EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM", "EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM", "" }; - case EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS: return { "EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS", "EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS", "" }; - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED: return { "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED", "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED", "" }; - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED: return { "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED", "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED", "" }; - case EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED: return { "EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED", "EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED", "" }; - case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW: return { "EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW", "EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW", "" }; - case EQUIP_ERR_CANT_EQUIP_NEED_TALENT: return { "EQUIP_ERR_CANT_EQUIP_NEED_TALENT", "EQUIP_ERR_CANT_EQUIP_NEED_TALENT", "" }; - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED: return { "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED", "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED", "" }; + case EQUIP_ERR_NOT_SAME_ACCOUNT: return { "EQUIP_ERR_NOT_SAME_ACCOUNT", "EQUIP_ERR_NOT_SAME_ACCOUNT", "Account-bound items can only be given to your own characters." }; + case EQUIP_ERR_NONE: return { "EQUIP_ERR_NONE", "EQUIP_ERR_NONE", "" }; + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS: return { "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS", "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS", "You can only carry %d %s" }; + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS: return { "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS", "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS", "You can only equip %d |4item:items in the %s category" }; + case EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED: return { "EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED", "EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED", "Your level is too high to use that item" }; + case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW: return { "EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW", "EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW", "You must reach level %d to purchase that item." }; + case EQUIP_ERR_CANT_EQUIP_NEED_TALENT: return { "EQUIP_ERR_CANT_EQUIP_NEED_TALENT", "EQUIP_ERR_CANT_EQUIP_NEED_TALENT", "You do not have the required talent to equip that." }; + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS: return { "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS", "EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS", "You can only equip %d |4item:items in the %s category" }; + case EQUIP_ERR_SHAPESHIFT_FORM_CANNOT_EQUIP: return { "EQUIP_ERR_SHAPESHIFT_FORM_CANNOT_EQUIP", "EQUIP_ERR_SHAPESHIFT_FORM_CANNOT_EQUIP", "Cannot equip item in this form" }; + case EQUIP_ERR_ITEM_INVENTORY_FULL_SATCHEL: return { "EQUIP_ERR_ITEM_INVENTORY_FULL_SATCHEL", "EQUIP_ERR_ITEM_INVENTORY_FULL_SATCHEL", "Your inventory is full. Your satchel has been delivered to your mailbox." }; default: throw std::out_of_range("value"); } } template <> -TC_API_EXPORT size_t EnumUtils::Count() { return 88; } +TC_API_EXPORT size_t EnumUtils::Count() { return 92; } template <> TC_API_EXPORT InventoryResult EnumUtils::FromIndex(size_t index) @@ -134,91 +138,95 @@ TC_API_EXPORT InventoryResult EnumUtils::FromIndex(size_t index case 0: return EQUIP_ERR_OK; case 1: return EQUIP_ERR_CANT_EQUIP_LEVEL_I; case 2: return EQUIP_ERR_CANT_EQUIP_SKILL; - case 3: return EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT; + case 3: return EQUIP_ERR_WRONG_SLOT; case 4: return EQUIP_ERR_BAG_FULL; - case 5: return EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG; - case 6: return EQUIP_ERR_CANT_TRADE_EQUIP_BAGS; - case 7: return EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE; - case 8: return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; - case 9: return EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE; - case 10: return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; - case 11: return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2; - case 12: return EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2; - case 13: return EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED; - case 14: return EQUIP_ERR_CANT_DUAL_WIELD; - case 15: return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; - case 16: return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2; - case 17: return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; - case 18: return EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3; - case 19: return EQUIP_ERR_ITEM_CANT_STACK; - case 20: return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; - case 21: return EQUIP_ERR_ITEMS_CANT_BE_SWAPPED; - case 22: return EQUIP_ERR_SLOT_IS_EMPTY; + case 5: return EQUIP_ERR_BAG_IN_BAG; + case 6: return EQUIP_ERR_TRADE_EQUIPPED_BAG; + case 7: return EQUIP_ERR_AMMO_ONLY; + case 8: return EQUIP_ERR_PROFICIENCY_NEEDED; + case 9: return EQUIP_ERR_NO_SLOT_AVAILABLE; + case 10: return EQUIP_ERR_CANT_EQUIP_EVER; + case 11: return EQUIP_ERR_CANT_EQUIP_EVER_2; + case 12: return EQUIP_ERR_NO_SLOT_AVAILABLE_2; + case 13: return EQUIP_ERR_2HANDED_EQUIPPED; + case 14: return EQUIP_ERR_2HSKILLNOTFOUND; + case 15: return EQUIP_ERR_WRONG_BAG_TYPE; + case 16: return EQUIP_ERR_WRONG_BAG_TYPE_2; + case 17: return EQUIP_ERR_ITEM_MAX_COUNT; + case 18: return EQUIP_ERR_NO_SLOT_AVAILABLE_3; + case 19: return EQUIP_ERR_CANT_STACK; + case 20: return EQUIP_ERR_NOT_EQUIPPABLE; + case 21: return EQUIP_ERR_CANT_SWAP; + case 22: return EQUIP_ERR_SLOT_EMPTY; case 23: return EQUIP_ERR_ITEM_NOT_FOUND; - case 24: return EQUIP_ERR_CANT_DROP_SOULBOUND; + case 24: return EQUIP_ERR_DROP_BOUND_ITEM; case 25: return EQUIP_ERR_OUT_OF_RANGE; - case 26: return EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT; - case 27: return EQUIP_ERR_COULDNT_SPLIT_ITEMS; - case 28: return EQUIP_ERR_MISSING_REAGENT; + case 26: return EQUIP_ERR_TOO_FEW_TO_SPLIT; + case 27: return EQUIP_ERR_SPLIT_FAILED; + case 28: return EQUIP_ERR_SPELL_FAILED_REAGENTS_GENERIC; case 29: return EQUIP_ERR_NOT_ENOUGH_MONEY; case 30: return EQUIP_ERR_NOT_A_BAG; - case 31: return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; - case 32: return EQUIP_ERR_DONT_OWN_THAT_ITEM; - case 33: return EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER; - case 34: return EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT; - case 35: return EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK; + case 31: return EQUIP_ERR_DESTROY_NONEMPTY_BAG; + case 32: return EQUIP_ERR_NOT_OWNER; + case 33: return EQUIP_ERR_ONLY_ONE_QUIVER; + case 34: return EQUIP_ERR_NO_BANK_SLOT; + case 35: return EQUIP_ERR_NO_BANK_HERE; case 36: return EQUIP_ERR_ITEM_LOCKED; - case 37: return EQUIP_ERR_YOU_ARE_STUNNED; - case 38: return EQUIP_ERR_YOU_ARE_DEAD; - case 39: return EQUIP_ERR_CANT_DO_RIGHT_NOW; - case 40: return EQUIP_ERR_INT_BAG_ERROR; - case 41: return EQUIP_ERR_CAN_EQUIP_ONLY1_BOLT; - case 42: return EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH; - case 43: return EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED; - case 44: return EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED; - case 45: return EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED; - case 46: return EQUIP_ERR_BOUND_CANT_BE_WRAPPED; - case 47: return EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED; - case 48: return EQUIP_ERR_BAGS_CANT_BE_WRAPPED; - case 49: return EQUIP_ERR_ALREADY_LOOTED; - case 50: return EQUIP_ERR_INVENTORY_FULL; + case 37: return EQUIP_ERR_GENERIC_STUNNED; + case 38: return EQUIP_ERR_PLAYER_DEAD; + case 39: return EQUIP_ERR_CLIENT_LOCKED_OUT; + case 40: return EQUIP_ERR_INTERNAL_BAG_ERROR; + case 41: return EQUIP_ERR_ONLY_ONE_BOLT; + case 42: return EQUIP_ERR_ONLY_ONE_AMMO; + case 43: return EQUIP_ERR_CANT_WRAP_STACKABLE; + case 44: return EQUIP_ERR_CANT_WRAP_EQUIPPED; + case 45: return EQUIP_ERR_CANT_WRAP_WRAPPED; + case 46: return EQUIP_ERR_CANT_WRAP_BOUND; + case 47: return EQUIP_ERR_CANT_WRAP_UNIQUE; + case 48: return EQUIP_ERR_CANT_WRAP_BAGS; + case 49: return EQUIP_ERR_LOOT_GONE; + case 50: return EQUIP_ERR_INV_FULL; case 51: return EQUIP_ERR_BANK_FULL; - case 52: return EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT; - case 53: return EQUIP_ERR_BAG_FULL3; - case 54: return EQUIP_ERR_ITEM_NOT_FOUND2; - case 55: return EQUIP_ERR_ITEM_CANT_STACK2; - case 56: return EQUIP_ERR_BAG_FULL4; - case 57: return EQUIP_ERR_ITEM_SOLD_OUT; + case 52: return EQUIP_ERR_VENDOR_SOLD_OUT; + case 53: return EQUIP_ERR_BAG_FULL_2; + case 54: return EQUIP_ERR_ITEM_NOT_FOUND_2; + case 55: return EQUIP_ERR_CANT_STACK_2; + case 56: return EQUIP_ERR_BAG_FULL_3; + case 57: return EQUIP_ERR_VENDOR_SOLD_OUT_2; case 58: return EQUIP_ERR_OBJECT_IS_BUSY; - case 59: return EQUIP_ERR_NONE; + case 59: return EQUIP_ERR_CANT_BE_DISENCHANTED; case 60: return EQUIP_ERR_NOT_IN_COMBAT; case 61: return EQUIP_ERR_NOT_WHILE_DISARMED; - case 62: return EQUIP_ERR_BAG_FULL6; + case 62: return EQUIP_ERR_BAG_FULL_4; case 63: return EQUIP_ERR_CANT_EQUIP_RANK; case 64: return EQUIP_ERR_CANT_EQUIP_REPUTATION; case 65: return EQUIP_ERR_TOO_MANY_SPECIAL_BAGS; case 66: return EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW; - case 67: return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE; + case 67: return EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE; case 68: return EQUIP_ERR_VENDOR_MISSING_TURNINS; case 69: return EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS; case 70: return EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS; case 71: return EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED; case 72: return EQUIP_ERR_MAIL_BOUND_ITEM; - case 73: return EQUIP_ERR_NO_SPLIT_WHILE_PROSPECTING; - case 74: return EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED; - case 75: return EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED; - case 76: return EQUIP_ERR_TOO_MUCH_GOLD; - case 77: return EQUIP_ERR_NOT_DURING_ARENA_MATCH; - case 78: return EQUIP_ERR_CANNOT_TRADE_THAT; - case 79: return EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW; - case 80: return EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM; - case 81: return EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS; - case 82: return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED; - case 83: return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED; - case 84: return EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED; - case 85: return EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW; - case 86: return EQUIP_ERR_CANT_EQUIP_NEED_TALENT; - case 87: return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED; + case 73: return EQUIP_ERR_INTERNAL_BAG_ERROR_2; + case 74: return EQUIP_ERR_BAG_FULL_5; + case 75: return EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED; + case 76: return EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED; + case 77: return EQUIP_ERR_TOO_MUCH_GOLD; + case 78: return EQUIP_ERR_NOT_DURING_ARENA_MATCH; + case 79: return EQUIP_ERR_TRADE_BOUND_ITEM; + case 80: return EQUIP_ERR_CANT_EQUIP_RATING; + case 81: return EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM; + case 82: return EQUIP_ERR_NOT_SAME_ACCOUNT; + case 83: return EQUIP_ERR_NONE; + case 84: return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS; + case 85: return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS; + case 86: return EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED; + case 87: return EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW; + case 88: return EQUIP_ERR_CANT_EQUIP_NEED_TALENT; + case 89: return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS; + case 90: return EQUIP_ERR_SHAPESHIFT_FORM_CANNOT_EQUIP; + case 91: return EQUIP_ERR_ITEM_INVENTORY_FULL_SATCHEL; default: throw std::out_of_range("index"); } } @@ -231,91 +239,95 @@ TC_API_EXPORT size_t EnumUtils::ToIndex(InventoryResult value) case EQUIP_ERR_OK: return 0; case EQUIP_ERR_CANT_EQUIP_LEVEL_I: return 1; case EQUIP_ERR_CANT_EQUIP_SKILL: return 2; - case EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT: return 3; + case EQUIP_ERR_WRONG_SLOT: return 3; case EQUIP_ERR_BAG_FULL: return 4; - case EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG: return 5; - case EQUIP_ERR_CANT_TRADE_EQUIP_BAGS: return 6; - case EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE: return 7; - case EQUIP_ERR_NO_REQUIRED_PROFICIENCY: return 8; - case EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE: return 9; - case EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM: return 10; - case EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM2: return 11; - case EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE2: return 12; - case EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED: return 13; - case EQUIP_ERR_CANT_DUAL_WIELD: return 14; - case EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG: return 15; - case EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2: return 16; - case EQUIP_ERR_CANT_CARRY_MORE_OF_THIS: return 17; - case EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE3: return 18; - case EQUIP_ERR_ITEM_CANT_STACK: return 19; - case EQUIP_ERR_ITEM_CANT_BE_EQUIPPED: return 20; - case EQUIP_ERR_ITEMS_CANT_BE_SWAPPED: return 21; - case EQUIP_ERR_SLOT_IS_EMPTY: return 22; + case EQUIP_ERR_BAG_IN_BAG: return 5; + case EQUIP_ERR_TRADE_EQUIPPED_BAG: return 6; + case EQUIP_ERR_AMMO_ONLY: return 7; + case EQUIP_ERR_PROFICIENCY_NEEDED: return 8; + case EQUIP_ERR_NO_SLOT_AVAILABLE: return 9; + case EQUIP_ERR_CANT_EQUIP_EVER: return 10; + case EQUIP_ERR_CANT_EQUIP_EVER_2: return 11; + case EQUIP_ERR_NO_SLOT_AVAILABLE_2: return 12; + case EQUIP_ERR_2HANDED_EQUIPPED: return 13; + case EQUIP_ERR_2HSKILLNOTFOUND: return 14; + case EQUIP_ERR_WRONG_BAG_TYPE: return 15; + case EQUIP_ERR_WRONG_BAG_TYPE_2: return 16; + case EQUIP_ERR_ITEM_MAX_COUNT: return 17; + case EQUIP_ERR_NO_SLOT_AVAILABLE_3: return 18; + case EQUIP_ERR_CANT_STACK: return 19; + case EQUIP_ERR_NOT_EQUIPPABLE: return 20; + case EQUIP_ERR_CANT_SWAP: return 21; + case EQUIP_ERR_SLOT_EMPTY: return 22; case EQUIP_ERR_ITEM_NOT_FOUND: return 23; - case EQUIP_ERR_CANT_DROP_SOULBOUND: return 24; + case EQUIP_ERR_DROP_BOUND_ITEM: return 24; case EQUIP_ERR_OUT_OF_RANGE: return 25; - case EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT: return 26; - case EQUIP_ERR_COULDNT_SPLIT_ITEMS: return 27; - case EQUIP_ERR_MISSING_REAGENT: return 28; + case EQUIP_ERR_TOO_FEW_TO_SPLIT: return 26; + case EQUIP_ERR_SPLIT_FAILED: return 27; + case EQUIP_ERR_SPELL_FAILED_REAGENTS_GENERIC: return 28; case EQUIP_ERR_NOT_ENOUGH_MONEY: return 29; case EQUIP_ERR_NOT_A_BAG: return 30; - case EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS: return 31; - case EQUIP_ERR_DONT_OWN_THAT_ITEM: return 32; - case EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER: return 33; - case EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT: return 34; - case EQUIP_ERR_TOO_FAR_AWAY_FROM_BANK: return 35; + case EQUIP_ERR_DESTROY_NONEMPTY_BAG: return 31; + case EQUIP_ERR_NOT_OWNER: return 32; + case EQUIP_ERR_ONLY_ONE_QUIVER: return 33; + case EQUIP_ERR_NO_BANK_SLOT: return 34; + case EQUIP_ERR_NO_BANK_HERE: return 35; case EQUIP_ERR_ITEM_LOCKED: return 36; - case EQUIP_ERR_YOU_ARE_STUNNED: return 37; - case EQUIP_ERR_YOU_ARE_DEAD: return 38; - case EQUIP_ERR_CANT_DO_RIGHT_NOW: return 39; - case EQUIP_ERR_INT_BAG_ERROR: return 40; - case EQUIP_ERR_CAN_EQUIP_ONLY1_BOLT: return 41; - case EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH: return 42; - case EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED: return 43; - case EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED: return 44; - case EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED: return 45; - case EQUIP_ERR_BOUND_CANT_BE_WRAPPED: return 46; - case EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED: return 47; - case EQUIP_ERR_BAGS_CANT_BE_WRAPPED: return 48; - case EQUIP_ERR_ALREADY_LOOTED: return 49; - case EQUIP_ERR_INVENTORY_FULL: return 50; + case EQUIP_ERR_GENERIC_STUNNED: return 37; + case EQUIP_ERR_PLAYER_DEAD: return 38; + case EQUIP_ERR_CLIENT_LOCKED_OUT: return 39; + case EQUIP_ERR_INTERNAL_BAG_ERROR: return 40; + case EQUIP_ERR_ONLY_ONE_BOLT: return 41; + case EQUIP_ERR_ONLY_ONE_AMMO: return 42; + case EQUIP_ERR_CANT_WRAP_STACKABLE: return 43; + case EQUIP_ERR_CANT_WRAP_EQUIPPED: return 44; + case EQUIP_ERR_CANT_WRAP_WRAPPED: return 45; + case EQUIP_ERR_CANT_WRAP_BOUND: return 46; + case EQUIP_ERR_CANT_WRAP_UNIQUE: return 47; + case EQUIP_ERR_CANT_WRAP_BAGS: return 48; + case EQUIP_ERR_LOOT_GONE: return 49; + case EQUIP_ERR_INV_FULL: return 50; case EQUIP_ERR_BANK_FULL: return 51; - case EQUIP_ERR_ITEM_IS_CURRENTLY_SOLD_OUT: return 52; - case EQUIP_ERR_BAG_FULL3: return 53; - case EQUIP_ERR_ITEM_NOT_FOUND2: return 54; - case EQUIP_ERR_ITEM_CANT_STACK2: return 55; - case EQUIP_ERR_BAG_FULL4: return 56; - case EQUIP_ERR_ITEM_SOLD_OUT: return 57; + case EQUIP_ERR_VENDOR_SOLD_OUT: return 52; + case EQUIP_ERR_BAG_FULL_2: return 53; + case EQUIP_ERR_ITEM_NOT_FOUND_2: return 54; + case EQUIP_ERR_CANT_STACK_2: return 55; + case EQUIP_ERR_BAG_FULL_3: return 56; + case EQUIP_ERR_VENDOR_SOLD_OUT_2: return 57; case EQUIP_ERR_OBJECT_IS_BUSY: return 58; - case EQUIP_ERR_NONE: return 59; + case EQUIP_ERR_CANT_BE_DISENCHANTED: return 59; case EQUIP_ERR_NOT_IN_COMBAT: return 60; case EQUIP_ERR_NOT_WHILE_DISARMED: return 61; - case EQUIP_ERR_BAG_FULL6: return 62; + case EQUIP_ERR_BAG_FULL_4: return 62; case EQUIP_ERR_CANT_EQUIP_RANK: return 63; case EQUIP_ERR_CANT_EQUIP_REPUTATION: return 64; case EQUIP_ERR_TOO_MANY_SPECIAL_BAGS: return 65; case EQUIP_ERR_LOOT_CANT_LOOT_THAT_NOW: return 66; - case EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE: return 67; + case EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE: return 67; case EQUIP_ERR_VENDOR_MISSING_TURNINS: return 68; case EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS: return 69; case EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS: return 70; case EQUIP_ERR_ITEM_MAX_COUNT_SOCKETED: return 71; case EQUIP_ERR_MAIL_BOUND_ITEM: return 72; - case EQUIP_ERR_NO_SPLIT_WHILE_PROSPECTING: return 73; - case EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED: return 74; - case EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED: return 75; - case EQUIP_ERR_TOO_MUCH_GOLD: return 76; - case EQUIP_ERR_NOT_DURING_ARENA_MATCH: return 77; - case EQUIP_ERR_CANNOT_TRADE_THAT: return 78; - case EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW: return 79; - case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: return 80; - case EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS: return 81; - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED: return 82; - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED: return 83; - case EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED: return 84; - case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW: return 85; - case EQUIP_ERR_CANT_EQUIP_NEED_TALENT: return 86; - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED: return 87; + case EQUIP_ERR_INTERNAL_BAG_ERROR_2: return 73; + case EQUIP_ERR_BAG_FULL_5: return 74; + case EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED: return 75; + case EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED: return 76; + case EQUIP_ERR_TOO_MUCH_GOLD: return 77; + case EQUIP_ERR_NOT_DURING_ARENA_MATCH: return 78; + case EQUIP_ERR_TRADE_BOUND_ITEM: return 79; + case EQUIP_ERR_CANT_EQUIP_RATING: return 80; + case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: return 81; + case EQUIP_ERR_NOT_SAME_ACCOUNT: return 82; + case EQUIP_ERR_NONE: return 83; + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS: return 84; + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS: return 85; + case EQUIP_ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED: return 86; + case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW: return 87; + case EQUIP_ERR_CANT_EQUIP_NEED_TALENT: return 88; + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS: return 89; + case EQUIP_ERR_SHAPESHIFT_FORM_CANNOT_EQUIP: return 90; + case EQUIP_ERR_ITEM_INVENTORY_FULL_SATCHEL: return 91; default: throw std::out_of_range("value"); } } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 059fb6ebcec..b488ee6d8e5 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -233,19 +233,6 @@ void Object::DestroyForPlayer(Player* target, bool onDeath) const { ASSERT(target); - if (IsUnit()) - { - if (Battleground* bg = target->GetBattleground()) - { - if (bg->isArena()) - { - WorldPacket data(SMSG_ARENA_UNIT_DESTROYED, 8); - data << uint64(GetGUID()); - target->SendDirectMessage(&data); - } - } - } - WorldPacket data(SMSG_DESTROY_OBJECT, 8 + 1); data << uint64(GetGUID()); //! If the following bool is true, the client will call "void CGUnit_C::OnDeath()" for this object. @@ -360,10 +347,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const *data << object->GetOrientation(); - if (GetTypeId() == TYPEID_CORPSE) - *data << float(object->GetOrientation()); + if (transport) + *data << float(object->GetTransOffsetO()); else - *data << float(0); + *data << float(object->GetOrientation()); } else { @@ -505,15 +492,7 @@ void Object::ClearUpdateMask(bool remove) void Object::BuildFieldsUpdate(Player* player, UpdateDataMapType& data_map) const { - UpdateDataMapType::iterator iter = data_map.find(player); - - if (iter == data_map.end()) - { - std::pair p = data_map.emplace(player, UpdateData()); - ASSERT(p.second); - iter = p.first; - } - + UpdateDataMapType::iterator iter = data_map.try_emplace(player).first; BuildValuesUpdateBlockForPlayer(&iter->second, iter->first); } @@ -1056,7 +1035,7 @@ void WorldObject::_Create(ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 void WorldObject::UpdatePositionData() { PositionFullTerrainStatus data; - GetMap()->GetFullTerrainStatusForPosition(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ(), data, MAP_ALL_LIQUIDS, GetCollisionHeight()); + GetMap()->GetFullTerrainStatusForPosition(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ(), data, {}, GetCollisionHeight()); ProcessPositionDataChanged(data); } @@ -1542,6 +1521,22 @@ float WorldObject::GetSightRange(WorldObject const* target) const return 0.0f; } +bool WorldObject::CheckPrivateObjectOwnerVisibility(WorldObject const* seer) const +{ + if (!IsPrivateObject()) + return true; + + // Owner of this private object + if (_privateObjectOwner == seer->GetGUID()) + return true; + + // Another private object of the same owner + if (_privateObjectOwner == seer->GetPrivateObjectOwner()) + return true; + + return false; +} + bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool implicitDetect, bool distanceCheck, bool checkAlert) const { if (this == obj) @@ -1553,6 +1548,9 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool implicitDetect, bo if (obj->IsAlwaysVisibleFor(this) || CanAlwaysSee(obj)) return true; + if (!obj->CheckPrivateObjectOwnerVisibility(this)) + return false; + bool corpseVisibility = false; if (distanceCheck) { @@ -1582,15 +1580,8 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool implicitDetect, bo WorldObject const* viewpoint = this; if (Player const* player = ToPlayer()) - { viewpoint = player->GetViewpoint(); - if (Creature const* creature = obj->ToCreature()) - if (TempSummon const* tempSummon = creature->ToTempSummon()) - if (tempSummon->IsVisibleBySummonerOnly() && GetGUID() != tempSummon->GetSummonerGUID()) - return false; - } - if (!viewpoint) viewpoint = this; @@ -1858,7 +1849,7 @@ void WorldObject::AddObjectToRemoveList() map->AddObjectToRemoveList(this); } -TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, WorldObject* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/, bool visibleBySummonerOnly /*= false*/) +TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, WorldObject* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/, ObjectGuid privateObjectOwner /*= ObjectGuid::Empty*/) { uint32 mask = UNIT_MASK_SUMMON; if (properties) @@ -1946,7 +1937,7 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert summon->InitStats(duration); - summon->SetVisibleBySummonerOnly(visibleBySummonerOnly); + summon->SetPrivateObjectOwner(privateObjectOwner); AddToMap(summon->ToCreature()); summon->InitSummon(); @@ -1998,11 +1989,11 @@ void WorldObject::ClearZoneScript() m_zoneScript = nullptr; } -TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, Milliseconds despawnTime /*= 0s*/, uint32 /*vehId = 0*/, uint32 spellId /*= 0*/, bool visibleBySummonerOnly /*= false*/) +TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, Milliseconds despawnTime /*= 0s*/, uint32 vehId /*= 0*/, uint32 spellId /*= 0*/, ObjectGuid privateObjectOwner /*= ObjectGuid::Empty*/) { if (Map* map = FindMap()) { - if (TempSummon* summon = map->SummonCreature(entry, pos, nullptr, despawnTime.count(), this, spellId, 0, visibleBySummonerOnly)) + if (TempSummon* summon = map->SummonCreature(entry, pos, nullptr, despawnTime.count(), this, spellId, vehId, privateObjectOwner)) { summon->SetTempSummonType(despawnType); return summon; @@ -2012,13 +2003,13 @@ TempSummon* WorldObject::SummonCreature(uint32 entry, Position const& pos, TempS return nullptr; } -TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float o /*= 0*/, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, Milliseconds despawnTime /*= 0s*/, bool visibleBySummonerOnly /*= false*/) +TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float o /*= 0*/, TempSummonType despawnType /*= TEMPSUMMON_MANUAL_DESPAWN*/, Milliseconds despawnTime /*= 0s*/, ObjectGuid privateObjectOwner /*= ObjectGuid::Empty*/) { if (!x && !y && !z) GetClosePoint(x, y, z, GetCombatReach()); if (!o) o = GetOrientation(); - return SummonCreature(id, { x,y,z,o }, despawnType, despawnTime, 0, 0, visibleBySummonerOnly); + return SummonCreature(id, { x,y,z,o }, despawnType, despawnTime, 0, 0, privateObjectOwner); } GameObject* WorldObject::SummonGameObject(uint32 entry, Position const& pos, QuaternionData const& rot, Seconds respawnTime, GOSummonType summonType) @@ -2114,6 +2105,19 @@ Creature* WorldObject::FindNearestCreature(uint32 entry, float range, bool alive return creature; } +Creature* WorldObject::FindNearestCreatureWithOptions(float range, FindCreatureOptions const& options) const +{ + Creature* creature = nullptr; + Trinity::NearestCheckCustomizer checkCustomizer(*this, range); + Trinity::CreatureWithOptionsInObjectRangeCheck checker(*this, checkCustomizer, options); + Trinity::CreatureLastSearcher searcher(this, creature, checker); + if (options.IgnorePhases) + searcher.i_phaseMask = PHASEMASK_ANYWHERE; + + Cell::VisitAllObjects(this, searcher, range); + return creature; +} + GameObject* WorldObject::FindNearestGameObject(uint32 entry, float range, bool spawnedOnly) const { GameObject* go = nullptr; @@ -2123,6 +2127,19 @@ GameObject* WorldObject::FindNearestGameObject(uint32 entry, float range, bool s return go; } +GameObject* WorldObject::FindNearestGameObjectWithOptions(float range, FindGameObjectOptions const& options) const +{ + GameObject* go = nullptr; + Trinity::NearestCheckCustomizer checkCustomizer(*this, range); + Trinity::GameObjectWithOptionsInObjectRangeCheck checker(*this, checkCustomizer, options); + Trinity::GameObjectLastSearcher searcher(this, go, checker); + if (options.IgnorePhases) + searcher.i_phaseMask = PHASEMASK_ANYWHERE; + + Cell::VisitGridObjects(this, searcher, range); + return go; +} + GameObject* WorldObject::FindNearestUnspawnedGameObject(uint32 entry, float range) const { GameObject* go = nullptr; @@ -3119,6 +3136,18 @@ void WorldObject::GetGameObjectListWithEntryInGrid(Container& gameObjectContaine Cell::VisitGridObjects(this, searcher, maxSearchRange); } +template +void WorldObject::GetGameObjectListWithOptionsInGrid(Container& gameObjectContainer, float maxSearchRange, FindGameObjectOptions const& options) const +{ + Trinity::InRangeCheckCustomizer checkCustomizer(*this, maxSearchRange); + Trinity::GameObjectWithOptionsInObjectRangeCheck check(*this, checkCustomizer, options); + Trinity::GameObjectListSearcher searcher(this, gameObjectContainer, check); + if (options.IgnorePhases) + searcher.i_phaseMask = PHASEMASK_ANYWHERE; + + Cell::VisitGridObjects(this, searcher, maxSearchRange); +} + template void WorldObject::GetCreatureListWithEntryInGrid(Container& creatureContainer, uint32 entry, float maxSearchRange /*= 250.0f*/) const { @@ -3127,6 +3156,18 @@ void WorldObject::GetCreatureListWithEntryInGrid(Container& creatureContainer, u Cell::VisitGridObjects(this, searcher, maxSearchRange); } +template +void WorldObject::GetCreatureListWithOptionsInGrid(Container& creatureContainer, float maxSearchRange, FindCreatureOptions const& options) const +{ + Trinity::InRangeCheckCustomizer checkCustomizer(*this, maxSearchRange); + Trinity::CreatureWithOptionsInObjectRangeCheck check(*this, checkCustomizer, options); + Trinity::CreatureListSearcher searcher(this, creatureContainer, check); + if (options.IgnorePhases) + searcher.i_phaseMask = PHASEMASK_ANYWHERE; + + Cell::VisitGridObjects(this, searcher, maxSearchRange); +} + template void WorldObject::GetPlayerListInGrid(Container& playerContainer, float maxSearchRange, bool alive /*= true*/) const { @@ -3580,10 +3621,18 @@ template TC_GAME_API void WorldObject::GetGameObjectListWithEntryInGrid(std::lis template TC_GAME_API void WorldObject::GetGameObjectListWithEntryInGrid(std::deque&, uint32, float) const; template TC_GAME_API void WorldObject::GetGameObjectListWithEntryInGrid(std::vector&, uint32, float) const; +template TC_GAME_API void WorldObject::GetGameObjectListWithOptionsInGrid(std::list&, float, FindGameObjectOptions const&) const; +template TC_GAME_API void WorldObject::GetGameObjectListWithOptionsInGrid(std::deque&, float, FindGameObjectOptions const&) const; +template TC_GAME_API void WorldObject::GetGameObjectListWithOptionsInGrid(std::vector&, float, FindGameObjectOptions const&) const; + template TC_GAME_API void WorldObject::GetCreatureListWithEntryInGrid(std::list&, uint32, float) const; template TC_GAME_API void WorldObject::GetCreatureListWithEntryInGrid(std::deque&, uint32, float) const; template TC_GAME_API void WorldObject::GetCreatureListWithEntryInGrid(std::vector&, uint32, float) const; +template TC_GAME_API void WorldObject::GetCreatureListWithOptionsInGrid(std::list&, float, FindCreatureOptions const&) const; +template TC_GAME_API void WorldObject::GetCreatureListWithOptionsInGrid(std::deque&,float, FindCreatureOptions const&) const; +template TC_GAME_API void WorldObject::GetCreatureListWithOptionsInGrid(std::vector&, float, FindCreatureOptions const&) const; + template TC_GAME_API void WorldObject::GetPlayerListInGrid(std::list&, float, bool) const; template TC_GAME_API void WorldObject::GetPlayerListInGrid(std::deque&, float, bool) const; template TC_GAME_API void WorldObject::GetPlayerListInGrid(std::vector&, float, bool) const; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 9dca2efa026..f9587e64f4d 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -21,6 +21,7 @@ #include "Common.h" #include "Duration.h" #include "EventProcessor.h" +#include "MapDefines.h" #include "ModelIgnoreFlags.h" #include "MovementInfo.h" #include "ObjectDefines.h" @@ -57,9 +58,7 @@ class WorldObject; class WorldPacket; class ZoneScript; struct FactionTemplateEntry; -struct PositionFullTerrainStatus; struct QuaternionData; -enum ZLiquidStatus : uint32; typedef std::unordered_map UpdateDataMapType; @@ -296,6 +295,43 @@ class FlaggedValuesArray32 T_FLAGS m_flags; }; +struct FindCreatureOptions +{ + Optional CreatureId; + Optional StringId; + + Optional IsAlive; + Optional IsInCombat; + Optional IsSummon; + + bool IgnorePhases = false; + bool IgnoreNotOwnedPrivateObjects = true; + bool IgnorePrivateObjects = false; + + Optional AuraSpellId; + Optional OwnerGuid; + Optional CharmerGuid; + Optional CreatorGuid; + Optional PrivateObjectOwnerGuid; +}; + +struct FindGameObjectOptions +{ + Optional GameObjectId; + Optional StringId; + + Optional IsSummon; + Optional IsSpawned; + + bool IgnorePhases = false; + bool IgnoreNotOwnedPrivateObjects = true; + bool IgnorePrivateObjects = false; + + Optional OwnerGuid; + Optional PrivateObjectOwnerGuid; + Optional GameObjectType; +}; + class TC_GAME_API WorldObject : public Object, public WorldLocation { protected: @@ -418,15 +454,17 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation void ClearZoneScript(); ZoneScript* GetZoneScript() const { return m_zoneScript; } - TempSummon* SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime = 0s, uint32 vehId = 0, uint32 spellId = 0, bool visibleBySummonerOnly = false); - TempSummon* SummonCreature(uint32 entry, float x, float y, float z, float o = 0, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime = 0s, bool visibleBySummonerOnly = false); + TempSummon* SummonCreature(uint32 entry, Position const& pos, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime = 0s, uint32 vehId = 0, uint32 spellId = 0, ObjectGuid privateObjectOwner = ObjectGuid::Empty); + TempSummon* SummonCreature(uint32 entry, float x, float y, float z, float o = 0, TempSummonType despawnType = TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime = 0s, ObjectGuid privateObjectOwner = ObjectGuid::Empty); GameObject* SummonGameObject(uint32 entry, Position const& pos, QuaternionData const& rot, Seconds respawnTime, GOSummonType summonType = GO_SUMMON_TIMED_OR_CORPSE_DESPAWN); GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, QuaternionData const& rot, Seconds respawnTime, GOSummonType summonType = GO_SUMMON_TIMED_OR_CORPSE_DESPAWN); Creature* SummonTrigger(float x, float y, float z, float ang, Milliseconds despawnTime, CreatureAI* (*GetAI)(Creature*) = nullptr); void SummonCreatureGroup(uint8 group, std::list* list = nullptr); Creature* FindNearestCreature(uint32 entry, float range, bool alive = true) const; + Creature* FindNearestCreatureWithOptions(float range, FindCreatureOptions const& options) const; GameObject* FindNearestGameObject(uint32 entry, float range, bool spawnedOnly = true) const; + GameObject* FindNearestGameObjectWithOptions(float range, FindGameObjectOptions const& options) const; GameObject* FindNearestUnspawnedGameObject(uint32 entry, float range) const; GameObject* FindNearestGameObjectOfType(GameobjectTypes type, float range) const; Player* SelectNearestPlayer(float distance) const; @@ -483,9 +521,15 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation template void GetGameObjectListWithEntryInGrid(Container& gameObjectContainer, uint32 entry, float maxSearchRange = 250.0f) const; + template + void GetGameObjectListWithOptionsInGrid(Container& gameObjectContainer, float maxSearchRange, FindGameObjectOptions const& options) const; + template void GetCreatureListWithEntryInGrid(Container& creatureContainer, uint32 entry, float maxSearchRange = 250.0f) const; + template + void GetCreatureListWithOptionsInGrid(Container& creatureContainer, float maxSearchRange, FindCreatureOptions const& options) const; + template void GetPlayerListInGrid(Container& playerContainer, float maxSearchRange, bool alive = true) const; @@ -546,6 +590,12 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation // Event handler EventProcessor m_Events; + // Watcher + bool IsPrivateObject() const { return !_privateObjectOwner.IsEmpty(); } + ObjectGuid GetPrivateObjectOwner() const { return _privateObjectOwner; } + void SetPrivateObjectOwner(ObjectGuid const& owner) { _privateObjectOwner = owner; } + bool CheckPrivateObjectOwnerVisibility(WorldObject const* seer) const; + protected: std::string m_name; bool m_isActive; @@ -582,6 +632,9 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation uint32 m_phaseMask; // in area phase state uint16 m_notifyflags; + + ObjectGuid _privateObjectOwner; + virtual bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius = true, bool incTargetRadius = true) const; bool CanNeverSee(WorldObject const* obj) const; diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index 18fc2590554..44097221333 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -55,7 +55,7 @@ enum TypeMask TYPEMASK_DYNAMICOBJECT = 0x0040, TYPEMASK_CORPSE = 0x0080, - TYPEMASK_SEER = TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT, + TYPEMASK_SEER = TYPEMASK_UNIT | TYPEMASK_PLAYER | TYPEMASK_DYNAMICOBJECT, TYPEMASK_WORLDOBJECT = TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT | TYPEMASK_CORPSE }; diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index c7c9fbdcd3a..e8008e93c26 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -47,7 +47,8 @@ enum OBJECT_UPDATE_FLAGS UPDATEFLAG_STATIONARY_POSITION = 0x0040, UPDATEFLAG_VEHICLE = 0x0080, UPDATEFLAG_POSITION = 0x0100, - UPDATEFLAG_ROTATION = 0x0200 + UPDATEFLAG_ROTATION = 0x0200, + UPDATEFLAG_NO_BIRTH_ANIM = 0x0400 }; class UpdateData diff --git a/src/server/game/Entities/Pet/PetDefines.h b/src/server/game/Entities/Pet/PetDefines.h index 9f4683ef283..90150f3b0c6 100644 --- a/src/server/game/Entities/Pet/PetDefines.h +++ b/src/server/game/Entities/Pet/PetDefines.h @@ -67,18 +67,19 @@ enum PetSpellType PETSPELL_TALENT = 2 }; -enum ActionFeedback +enum class PetActionFeedback : uint8 { - FEEDBACK_NONE = 0, - FEEDBACK_PET_DEAD = 1, - FEEDBACK_NOTHING_TO_ATT = 2, - FEEDBACK_CANT_ATT_TARGET = 3 + None = 0, + Dead = 1, + NoTarget = 2, + InvalidTarget = 3, + NoPath = 4 }; -enum PetTalk +enum PetAction : int32 { - PET_TALK_SPECIAL_SPELL = 0, - PET_TALK_ATTACK = 1 + PET_ACTION_SPECIAL_SPELL = 0, + PET_ACTION_ATTACK = 1 }; #define PET_FOLLOW_DIST 1.0f diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 17eb1bb9efa..4919eb8c781 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25,6 +25,7 @@ #include "BattlefieldMgr.h" #include "Battleground.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "BattlegroundScore.h" #include "CellImpl.h" #include "Channel.h" @@ -251,7 +252,7 @@ Player::Player(WorldSession* session): Unit(true) SetLastRuneGraceTimer(i, 0); } - for (uint8 i=0; i < MAX_TIMERS; i++) + for (uint8 i = 0; i < MAX_TIMERS; i++) m_MirrorTimer[i] = DISABLED_MIRROR_TIMER; m_MirrorTimerFlags = UNDERWATER_NONE; @@ -278,6 +279,8 @@ Player::Player(WorldSession* session): Unit(true) m_canParry = false; m_canBlock = false; m_canTitanGrip = false; + m_titanGripWeaponSubclasses = 0; + m_titanGripArmorSubclasses = 0; m_titanGripPenaltySpellId = 0; m_ammoDPS = 0.0f; @@ -496,9 +499,8 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo SetPvpFlag(UNIT_BYTE2_FLAG_PVP); SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); } + SetUnitFlag2(UNIT_FLAG2_REGENERATE_POWER); - SetModCastingSpeed(1.0f); // fix cast time showed in spell tooltip on client - SetHoverHeight(1.0f); // default for players in 3.0.3 SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, uint32(-1)); // -1 is default value @@ -509,41 +511,15 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo SetFacialStyle(createInfo->FacialHair); SetRestState((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED); SetNativeGender(Gender(createInfo->Gender)); - SetArenaFaction(0); - - SetUInt32Value(PLAYER_GUILDID, 0); - SetRank(0); - SetUInt32Value(PLAYER_GUILD_TIMESTAMP, 0); - - for (int i = 0; i < KNOWN_TITLES_SIZE; ++i) - SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled - SetUInt32Value(PLAYER_CHOSEN_TITLE, 0); - - SetUInt32Value(PLAYER_FIELD_KILLS, 0); - SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 0); - SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0); - SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0); // set starting level - uint32 start_level = GetClass() != CLASS_DEATH_KNIGHT - ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL) - : sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL); - - if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL)) - { - uint32 gm_level = GetClass() != CLASS_DEATH_KNIGHT - ? sWorld->getIntConfig(CONFIG_START_GM_LEVEL) - : std::max(sWorld->getIntConfig(CONFIG_START_GM_LEVEL), sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL)); - - if (gm_level > start_level) - start_level = gm_level; - } - - SetLevel(start_level, false); + SetLevel(GetStartLevel(createInfo->Class), false); InitRunes(); - SetMoney(sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)); + SetMoney(GetClass() != CLASS_DEATH_KNIGHT + ? sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY) + : sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY)); SetHonorPoints(sWorld->getIntConfig(CONFIG_START_HONOR_POINTS)); SetArenaPoints(sWorld->getIntConfig(CONFIG_START_ARENA_POINTS)); @@ -1323,9 +1299,7 @@ void Player::Update(uint32 p_time) m_hostileReferenceCheckTimer -= p_time; } - //we should execute delayed teleports only for alive(!) players - //because we don't want player's ghost teleported from graveyard - if (IsHasDelayedTeleport() && IsAlive()) + if (IsHasDelayedTeleport()) TeleportTo(m_teleport_dest, m_teleport_options); } @@ -2015,12 +1989,12 @@ void Player::RegenerateAll() // Food emote comes above drinking emote if we have to decide (mage regen food for example) if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) { - SendPlaySpellVisual(SPELL_VISUAL_KIT_FOOD); + SendPlaySpellVisualKit(SPELL_VISUAL_KIT_FOOD, 0); break; } else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) { - SendPlaySpellVisual(SPELL_VISUAL_KIT_DRINK); + SendPlaySpellVisualKit(SPELL_VISUAL_KIT_DRINK, 0); break; } } @@ -2676,7 +2650,7 @@ void Player::InitStatsForLevel(bool reapplyMods) { SetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + i, 0); SetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i, 0); - SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + i, 1.00f); + SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + i, 1.0f); } //reset attack power, damage and attack speed fields @@ -5264,8 +5238,8 @@ float Player::GetSpellCritFromIntellect() const if (level > GT_MAX_LEVEL) level = GT_MAX_LEVEL; - GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass-1); - GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); + GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass - 1); + GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1); if (critBase == nullptr || critRatio == nullptr) return 0.0f; @@ -6093,8 +6067,8 @@ void Player::SendActionButtons(uint32 state) const data << uint8(state); /* state can be 0, 1, 2 - 0 - Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties - 1 - Used in any SMSG_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail. + 0 - Sends initial action buttons, client does not validate if we have the spell or not + 1 - Used used after spec swaps, client validates if a spell is known. 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons */ if (state != 2) @@ -9398,15 +9372,10 @@ void Player::SetSheath(SheathState sheathed) Unit::SetSheath(sheathed); // this must visualize Sheath changing for other players... } -uint8 Player::FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) const +uint8 Player::FindEquipSlot(Item const* item, uint32 slot, bool swap) const { - uint8 playerClass = GetClass(); - - uint8 slots[4]; - slots[0] = NULL_SLOT; - slots[1] = NULL_SLOT; - slots[2] = NULL_SLOT; - slots[3] = NULL_SLOT; + std::array slots = { NULL_SLOT, NULL_SLOT, NULL_SLOT, NULL_SLOT }; + ItemTemplate const* proto = item->GetTemplate(); switch (proto->InventoryType) { case INVTYPE_HEAD: @@ -9471,27 +9440,7 @@ uint8 Player::FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) c break; case INVTYPE_2HWEAPON: slots[0] = EQUIPMENT_SLOT_MAINHAND; - if (Item* mhWeapon = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND)) - { - if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate()) - { - if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM || mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF) - { - const_cast(this)->AutoUnequipOffhandIfNeed(true); - break; - } - } - } - - if (GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND)) - { - if (proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM || proto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF) - { - const_cast(this)->AutoUnequipOffhandIfNeed(true); - break; - } - } - if (CanDualWield() && CanTitanGrip() && proto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && proto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF) + if (CanDualWield() && CanTitanGrip(item)) slots[1] = EQUIPMENT_SLOT_OFFHAND; break; case INVTYPE_TABARD: @@ -9513,13 +9462,11 @@ uint8 Player::FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) c slots[0] = EQUIPMENT_SLOT_RANGED; break; case INVTYPE_BAG: - slots[0] = INVENTORY_SLOT_BAG_START + 0; - slots[1] = INVENTORY_SLOT_BAG_START + 1; - slots[2] = INVENTORY_SLOT_BAG_START + 2; - slots[3] = INVENTORY_SLOT_BAG_START + 3; + slots = { INVENTORY_SLOT_BAG_START + 0, INVENTORY_SLOT_BAG_START + 1, INVENTORY_SLOT_BAG_START + 2, INVENTORY_SLOT_BAG_START + 3 }; break; case INVTYPE_RELIC: { + uint8 playerClass = GetClass(); switch (proto->SubClass) { case ITEM_SUBCLASS_ARMOR_LIBRAM: @@ -10126,11 +10073,11 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item { if (no_space_count) *no_space_count = count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } if (pItem && pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; // no maximum if ((pProto->MaxCount <= 0 && pProto->ItemLimitCategory == 0) || pProto->MaxCount == 2147483647) @@ -10143,7 +10090,7 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item { if (no_space_count) *no_space_count = count + curcount - pProto->MaxCount; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } @@ -10155,7 +10102,7 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item { if (no_space_count) *no_space_count = count; - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; } if (limitEntry->Flags == ITEM_LIMIT_CATEGORY_MODE_HAVE) @@ -10167,7 +10114,7 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item *no_space_count = count + curcount - limitEntry->Quantity; if (itemLimitCategory) *itemLimitCategory = pProto->ItemLimitCategory; - return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED; + return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS; } } } @@ -10234,7 +10181,7 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP uint32 need_space; if (pSrcItem && pSrcItem->IsNotEmptyBag() && !IsBagPos(uint16(bag) << 8 | slot)) - return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; // empty specific slot - check item fit to slot if (!pItem2 || swap) @@ -10243,31 +10190,31 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP { // keyring case if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START+GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS)) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; // currencytoken case if (slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->IsCurrencyToken())) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; // prevent cheating if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; } else { Bag* pBag = GetBagByPos(bag); if (!pBag) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; ItemTemplate const* pBagProto = pBag->GetTemplate(); if (!pBagProto) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; if (slot >= pBagProto->ContainerSlots) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; if (!ItemCanGoIntoBag(pProto, pBagProto)) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; } // non empty stack with space @@ -10301,26 +10248,26 @@ InventoryResult Player::CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, Ite { // skip specific bag already processed in first called CanStoreItem_InBag if (bag == skip_bag) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; // skip non-existing bag or self targeted bag Bag* pBag = GetBagByPos(bag); if (!pBag || pBag == pSrcItem) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; if (pSrcItem && pSrcItem->IsNotEmptyBag()) - return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; ItemTemplate const* pBagProto = pBag->GetTemplate(); if (!pBagProto) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; // 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; + return EQUIP_ERR_WRONG_BAG_TYPE; if (!ItemCanGoIntoBag(pProto, pBagProto)) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; for (uint32 j = 0; j < pBag->GetBagSize(); j++) { @@ -10370,7 +10317,7 @@ InventoryResult Player::CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 sl { //this is never called for non-bag slots so we can do this if (pSrcItem && pSrcItem->IsNotEmptyBag()) - return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; for (uint32 j = slot_begin; j < slot_end; j++) { @@ -10425,7 +10372,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des { if (no_space_count) *no_space_count = count; - return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_ITEM_NOT_FOUND; + return swap ? EQUIP_ERR_CANT_SWAP : EQUIP_ERR_ITEM_NOT_FOUND; } if (pItem) @@ -10435,14 +10382,14 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des { if (no_space_count) *no_space_count = count; - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; } if (pItem->IsBindedNotWith(this)) { if (no_space_count) *no_space_count = count; - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; } } @@ -10478,7 +10425,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } @@ -10507,7 +10454,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot); @@ -10525,7 +10472,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } else // equipped bag @@ -10549,7 +10496,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } @@ -10576,7 +10523,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot); @@ -10594,7 +10541,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } else if (pProto->IsCurrencyToken()) @@ -10614,7 +10561,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } @@ -10633,7 +10580,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } else // equipped bag @@ -10656,7 +10603,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } @@ -10681,7 +10628,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot); @@ -10699,7 +10646,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } if (pProto->BagFamily) @@ -10717,7 +10664,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } @@ -10735,7 +10682,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } @@ -10761,7 +10708,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } else if (pProto->IsCurrencyToken()) @@ -10781,7 +10728,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } @@ -10798,13 +10745,13 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } } if (pItem && pItem->IsNotEmptyBag()) - return EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG; + return EQUIP_ERR_BAG_IN_BAG; // search free slot res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot); @@ -10822,7 +10769,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++) @@ -10838,14 +10785,14 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &des if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; + return EQUIP_ERR_ITEM_MAX_COUNT; } } if (no_space_count) *no_space_count = count + no_similar_count; - return EQUIP_ERR_INVENTORY_FULL; + return EQUIP_ERR_INV_FULL; } ////////////////////////////////////////////////////////////////////////// @@ -10936,11 +10883,11 @@ InventoryResult Player::CanStoreItems(Item** items, int count, uint32* itemLimit // item used if (item->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; // item it 'bind' if (item->IsBindedNotWith(this)) - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; ItemTemplate const* pBagProto; @@ -11186,10 +11133,10 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool { // item used if (pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; if (pItem->IsBindedNotWith(this)) - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; // check count of items (skip for auto move for same player from bank) InventoryResult res = CanTakeMoreSimilarItems(pItem); @@ -11202,10 +11149,10 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool // May be here should be more stronger checks; STUNNED checked // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked. if (HasUnitState(UNIT_STATE_STUNNED)) - return EQUIP_ERR_YOU_ARE_STUNNED; + return EQUIP_ERR_GENERIC_STUNNED; if (IsCharmed()) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; // @todo is this the correct error? + return EQUIP_ERR_CLIENT_LOCKED_OUT; // @todo is this the correct error? // do not allow equipping gear except weapons, offhands, projectiles, relics in // - combat @@ -11221,27 +11168,27 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool } if (IsInCombat()&& (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer != 0) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err + return EQUIP_ERR_CLIENT_LOCKED_OUT; // maybe exist better err if (IsNonMeleeSpellCast(false)) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } ScalingStatDistributionEntry const* ssd = pProto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(pProto->ScalingStatDistribution) : 0; // check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items) if (ssd && ssd->Maxlevel < DEFAULT_MAX_LEVEL && ssd->Maxlevel < GetLevel()) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; - uint8 eslot = FindEquipSlot(pProto, slot, swap); + uint8 eslot = FindEquipSlot(pItem, slot, swap); if (eslot == NULL_SLOT) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; res = CanUseItem(pItem, not_loading); if (res != EQUIP_ERR_OK) return res; if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot)) - return EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE; + return EQUIP_ERR_NO_SLOT_AVAILABLE; // if we are swapping 2 equiped items, CanEquipUniqueItem check // should ignore the item we are trying to swap, and not the @@ -11285,8 +11232,8 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool if (ItemTemplate const* pBagProto = pBag->GetTemplate()) if (pBagProto->Class == pProto->Class && (!swap || pBag->GetSlot() != eslot)) return (pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH) - ? EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH - : EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER; + ? EQUIP_ERR_ONLY_ONE_AMMO + : EQUIP_ERR_ONLY_ONE_QUIVER; uint32 type = pProto->InventoryType; @@ -11294,35 +11241,26 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool { // Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750) if (type == INVTYPE_WEAPON && pProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM) - return EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT; - + return EQUIP_ERR_WRONG_SLOT; else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND) { if (!CanDualWield()) - return EQUIP_ERR_CANT_DUAL_WIELD; + return EQUIP_ERR_2HSKILLNOTFOUND; } else if (type == INVTYPE_2HWEAPON) { - if (!CanDualWield() || !CanTitanGrip()) - return EQUIP_ERR_CANT_DUAL_WIELD; + if (!CanDualWield() || !CanTitanGrip(pItem)) + return EQUIP_ERR_2HSKILLNOTFOUND; } if (IsTwoHandUsed()) - return EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED; + return EQUIP_ERR_2HANDED_EQUIPPED; } // equip two-hand weapon case (with possible unequip 2 items) - if (type == INVTYPE_2HWEAPON) + if (eslot == EQUIPMENT_SLOT_MAINHAND) { - if (eslot == EQUIPMENT_SLOT_OFFHAND) - { - if (!CanTitanGrip()) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; - } - else if (eslot != EQUIPMENT_SLOT_MAINHAND) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; - - if (!CanTitanGrip()) + if (!CanTitanGrip(pItem)) { // offhand item must can be stored in inventory for offhand item and it also must be unequipped Item* offItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); @@ -11330,7 +11268,7 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool if (offItem && (!not_loading || CanUnequipItem(uint16(INVENTORY_SLOT_BAG_0) << 8 | EQUIPMENT_SLOT_OFFHAND, false) != EQUIP_ERR_OK || CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK)) - return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_INVENTORY_FULL; + return swap ? EQUIP_ERR_CANT_SWAP : EQUIP_ERR_INV_FULL; } } dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot); @@ -11338,7 +11276,7 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool } } - return !swap ? EQUIP_ERR_ITEM_NOT_FOUND : EQUIP_ERR_ITEMS_CANT_BE_SWAPPED; + return !swap ? EQUIP_ERR_ITEM_NOT_FOUND : EQUIP_ERR_CANT_SWAP; } InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const @@ -11362,10 +11300,10 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const // item used if (pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; if (IsCharmed()) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; // @todo is this the correct error? + return EQUIP_ERR_CLIENT_LOCKED_OUT; // @todo is this the correct error? // do not allow unequipping gear except weapons, offhands, projectiles, relics in // - combat @@ -11381,7 +11319,7 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const } if (!swap && pItem->IsNotEmptyBag()) - return EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS; + return EQUIP_ERR_DESTROY_NONEMPTY_BAG; return EQUIP_ERR_OK; } @@ -11389,7 +11327,7 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item* pItem, bool swap, bool not_loading) const { if (!pItem) - return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_ITEM_NOT_FOUND; + return swap ? EQUIP_ERR_CANT_SWAP : EQUIP_ERR_ITEM_NOT_FOUND; uint32 count = pItem->GetCount(); @@ -11397,14 +11335,14 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest GetName(), GetGUID().ToString(), 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; + return swap ? EQUIP_ERR_CANT_SWAP : EQUIP_ERR_ITEM_NOT_FOUND; // item used if (pItem->m_lootGenerated) - return EQUIP_ERR_ALREADY_LOOTED; + return EQUIP_ERR_LOOT_GONE; if (pItem->IsBindedNotWith(this)) - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; // Currency tokens are not supposed to be swapped out of their hidden bag uint8 pItemslot = pItem->GetSlot(); @@ -11412,7 +11350,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest { TC_LOG_ERROR("entities.player.cheat", "Possible hacking attempt: Player {} ({}) tried to move token [{} entry: {}] out of the currency bag!", GetName(), GetGUID().ToString(), pItem->GetGUID().ToString(), pProto->ItemId); - return EQUIP_ERR_ITEMS_CANT_BE_SWAPPED; + return EQUIP_ERR_CANT_SWAP; } // check count of items (skip for auto move for same player from bank) @@ -11426,10 +11364,10 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END) { if (!pItem->IsBag()) - return EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT; + return EQUIP_ERR_WRONG_SLOT; if (slot - BANK_SLOT_BAG_START >= GetBankBagSlotCount()) - return EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT; + return EQUIP_ERR_NO_BANK_SLOT; res = CanUseItem(pItem, not_loading); if (res != EQUIP_ERR_OK) @@ -11450,7 +11388,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest if (bag != NULL_BAG) { if (pItem->IsNotEmptyBag()) - return EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG; + return EQUIP_ERR_BAG_IN_BAG; // search stack in bag for merge to if (pProto->Stackable != 1) @@ -11582,7 +11520,7 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const GetName(), GetGUID().ToString(), pItem->GetEntry()); if (!IsAlive() && not_loading) - return EQUIP_ERR_YOU_ARE_DEAD; + return EQUIP_ERR_PLAYER_DEAD; //if (isStunned()) // return EQUIP_ERR_YOU_ARE_STUNNED; @@ -11591,7 +11529,7 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const if (pProto) { if (pItem->IsBindedNotWith(this)) - return EQUIP_ERR_DONT_OWN_THAT_ITEM; + return EQUIP_ERR_NOT_OWNER; InventoryResult res = CanUseItem(pProto); if (res != EQUIP_ERR_OK) @@ -11604,7 +11542,7 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet. if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill)) { - /// @todo when you right-click already equipped item it throws EQUIP_ERR_NO_REQUIRED_PROFICIENCY. + /// @todo when you right-click already equipped item it throws EQUIP_ERR_PROFICIENCY_NEEDED. // In fact it's a visual bug, everything works properly... I need sniffs of operations with // binded to account items from off server. @@ -11622,7 +11560,7 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const } } if (!allowEquip && GetSkillValue(itemSkill) == 0) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; } if (pProto->RequiredReputationFaction && uint32(GetReputationRank(pProto->RequiredReputationFaction)) < pProto->RequiredReputationRank) @@ -11643,28 +11581,28 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const if (((proto->Flags2 & ITEM_FLAG2_FACTION_HORDE) && GetTeam() != HORDE) || (((proto->Flags2 & ITEM_FLAG2_FACTION_ALLIANCE) && GetTeam() != ALLIANCE))) - return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + return EQUIP_ERR_CANT_EQUIP_EVER; if ((proto->AllowableClass & GetClassMask()) == 0 || (proto->AllowableRace & GetRaceMask()) == 0) - return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + return EQUIP_ERR_CANT_EQUIP_EVER; if (proto->RequiredSkill != 0) { if (GetSkillValue(proto->RequiredSkill) == 0) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank) return EQUIP_ERR_CANT_EQUIP_SKILL; } if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell)) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; if (GetLevel() < proto->RequiredLevel) return EQUIP_ERR_CANT_EQUIP_LEVEL_I; // If World Event is not active, prevent using event dependant items if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId)) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; // learning (recipes, mounts, pets, etc.) if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884) @@ -11698,15 +11636,15 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje }; //Copy from function Item::GetSkill() if ((proto->AllowableClass & GetClassMask()) == 0 || (proto->AllowableRace & GetRaceMask()) == 0) - return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + return EQUIP_ERR_CANT_EQUIP_EVER; if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell)) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; if (proto->RequiredSkill != 0) { if (!GetSkillValue(proto->RequiredSkill)) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank) return EQUIP_ERR_CANT_EQUIP_SKILL; } @@ -11714,7 +11652,7 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje uint8 _class = GetClass(); if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0) - return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; + return EQUIP_ERR_PROFICIENCY_NEEDED; if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISCELLANEOUS && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER && proto->InventoryType != INVTYPE_CLOAK) { @@ -11723,29 +11661,29 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje if (GetLevel() < 40) { if (proto->SubClass != ITEM_SUBCLASS_ARMOR_MAIL) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } else if (proto->SubClass != ITEM_SUBCLASS_ARMOR_PLATE) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } else if (_class == CLASS_HUNTER || _class == CLASS_SHAMAN) { if (GetLevel() < 40) { if (proto->SubClass != ITEM_SUBCLASS_ARMOR_LEATHER) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } else if (proto->SubClass != ITEM_SUBCLASS_ARMOR_MAIL) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } if (_class == CLASS_ROGUE || _class == CLASS_DRUID) if (proto->SubClass != ITEM_SUBCLASS_ARMOR_LEATHER) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; if (_class == CLASS_MAGE || _class == CLASS_PRIEST || _class == CLASS_WARLOCK) if (proto->SubClass != ITEM_SUBCLASS_ARMOR_CLOTH) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; + return EQUIP_ERR_CLIENT_LOCKED_OUT; } return EQUIP_ERR_OK; @@ -11755,14 +11693,14 @@ InventoryResult Player::CanUseAmmo(uint32 item) const { TC_LOG_DEBUG("entities.player.items", "STORAGE: CanUseAmmo item = {}", item); if (!IsAlive()) - return EQUIP_ERR_YOU_ARE_DEAD; + return EQUIP_ERR_PLAYER_DEAD; //if (isStunned()) // return EQUIP_ERR_YOU_ARE_STUNNED; ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item); if (pProto) { if (pProto->InventoryType!= INVTYPE_AMMO) - return EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE; + return EQUIP_ERR_AMMO_ONLY; InventoryResult res = CanUseItem(pProto); if (res != EQUIP_ERR_OK) @@ -11774,7 +11712,7 @@ InventoryResult Player::CanUseAmmo(uint32 item) const // Requires No Ammo if (HasAura(46699)) - return EQUIP_ERR_BAG_FULL6; + return EQUIP_ERR_BAG_FULL_4; return EQUIP_ERR_OK; } @@ -12725,21 +12663,21 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) 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, nullptr); + SendEquipError(EQUIP_ERR_SPLIT_FAILED, pSrcItem, nullptr); return; } // not let split all items (can be only at cheating) if (pSrcItem->GetCount() == count) { - SendEquipError(EQUIP_ERR_COULDNT_SPLIT_ITEMS, pSrcItem, nullptr); + SendEquipError(EQUIP_ERR_SPLIT_FAILED, pSrcItem, nullptr); return; } // 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, nullptr); + SendEquipError(EQUIP_ERR_TOO_FEW_TO_SPLIT, pSrcItem, nullptr); return; } @@ -12842,7 +12780,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (!IsAlive()) { - SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_PLAYER_DEAD, pSrcItem, pDstItem); return; } @@ -12863,14 +12801,14 @@ void Player::SwapItem(uint16 src, uint16 dst) // prevent put equipped/bank bag in self if (IsBagPos(src) && srcslot == dstbag) { - SendEquipError(EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_BAG_IN_BAG, pSrcItem, pDstItem); return; } // prevent equipping bag in the same slot from its inside if (IsBagPos(dst) && srcbag == dstslot) { - SendEquipError(EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_CANT_SWAP, pSrcItem, pDstItem); return; } @@ -13071,7 +13009,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto)) { // one from items not go to empty target bag - SendEquipError(EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_BAG_IN_BAG, pSrcItem, pDstItem); return; } @@ -13081,7 +13019,7 @@ void Player::SwapItem(uint16 src, uint16 dst) if (count > emptyBag->GetBagSize()) { // too small targeted bag - SendEquipError(EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, pSrcItem, pDstItem); + SendEquipError(EQUIP_ERR_CANT_SWAP, pSrcItem, pDstItem); return; } @@ -13295,9 +13233,9 @@ void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint data << uint64(0); // container break; } - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED: - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED: - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS: + case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS: { ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid); data << uint32(proto ? proto->ItemLimitCategory : 0); @@ -13338,18 +13276,58 @@ bool Player::IsUseEquipedWeapon(bool mainhand) const return !IsInFeralForm() && (!mainhand || !HasUnitFlag(UNIT_FLAG_DISARMED)); } -void Player::SetCanTitanGrip(bool value, uint32 penaltySpellId /*= 0*/) +bool Player::CanTitanGrip(Item const* item) const { - if (value == m_canTitanGrip) - return; + if (!m_canTitanGrip) + return false; + + ItemTemplate const* itemTemplate = item->GetTemplate(); + + uint32 subClassMask = [&] + { + switch (itemTemplate->Class) + { + case ITEM_CLASS_WEAPON: + return m_titanGripWeaponSubclasses; + case ITEM_CLASS_ARMOR: + return m_titanGripArmorSubclasses; + default: + break; + } + return 0u; + }(); + return !subClassMask || subClassMask & (1 << itemTemplate->SubClass); +} + +void Player::SetCanTitanGrip(bool value, uint32 penaltySpellId /*= 0*/, int32 allowedItemClass /*= 0*/, int32 allowedItemSubClassMask /*= 0*/) +{ m_canTitanGrip = value; + if (value) + { + switch (allowedItemClass) + { + case ITEM_CLASS_WEAPON: + m_titanGripWeaponSubclasses = allowedItemSubClassMask; + break; + case ITEM_CLASS_ARMOR: + m_titanGripArmorSubclasses = allowedItemSubClassMask; + break; + default: + break; + } + } + else + { + m_titanGripWeaponSubclasses = 0; + m_titanGripArmorSubclasses = 0; + } m_titanGripPenaltySpellId = penaltySpellId; } void Player::CheckTitanGripPenalty() { - if (!CanTitanGrip()) + if (!m_titanGripPenaltySpellId) return; bool apply = IsUsingTwoHandedWeaponInOneHand(); @@ -13365,7 +13343,7 @@ void Player::CheckTitanGripPenalty() bool Player::IsTwoHandUsed() const { Item* mainItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); - return mainItem && mainItem->GetTemplate()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip(); + return mainItem && mainItem->GetTemplate()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip(mainItem); } bool Player::IsUsingTwoHandedWeaponInOneHand() const @@ -14369,7 +14347,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men return; } - GetSession()->SendBattleGroundList(guid, bgTypeId); + sBattlegroundMgr->SendBattlegroundList(this, guid, bgTypeId); break; } } @@ -14440,11 +14418,11 @@ void Player::PrepareQuestMenu(ObjectGuid guid) //only for quests which cast teleport spells on player Map* _map = IsInWorld() ? GetMap() : sMapMgr->FindMap(GetMapId(), GetInstanceId()); ASSERT(_map); - GameObject* pGameObject = _map->GetGameObject(guid); - if (pGameObject) + GameObject* gameObject = _map->GetGameObject(guid); + if (gameObject) { - objectQR = sObjectMgr->GetGOQuestRelations(pGameObject->GetEntry()); - objectQIR = sObjectMgr->GetGOQuestInvolvedRelations(pGameObject->GetEntry()); + objectQR = sObjectMgr->GetGOQuestRelations(gameObject->GetEntry()); + objectQIR = sObjectMgr->GetGOQuestInvolvedRelations(gameObject->GetEntry()); } else return; @@ -14567,31 +14545,30 @@ 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) const +Quest const* Player::GetNextQuest(Object const* questGiver, Quest const* quest) const { - QuestRelationResult quests; + uint32 nextQuestID = quest->GetNextQuestInChain(); + if (!nextQuestID) + return nullptr; - Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); - if (creature) - quests = sObjectMgr->GetCreatureQuestRelations(creature->GetEntry()); - else + if (questGiver == this) { - //we should obtain map pointer from GetMap() in 99% of cases. Special case - //only for quests which cast teleport spells on player - Map* _map = IsInWorld() ? GetMap() : sMapMgr->FindMap(GetMapId(), GetInstanceId()); - ASSERT(_map); - GameObject* pGameObject = _map->GetGameObject(guid); - if (pGameObject) - quests = sObjectMgr->GetGOQuestRelations(pGameObject->GetEntry()); - else + if (!quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) return nullptr; + + return sObjectMgr->GetQuestTemplate(nextQuestID); } - if (uint32 nextQuestID = quest->GetNextQuestInChain()) - if (quests.HasQuest(nextQuestID)) - return sObjectMgr->GetQuestTemplate(nextQuestID); + //we should obtain map pointer from GetMap() in 99% of cases. Special case + //only for quests which cast teleport spells on player + if (WorldObject const* worldObjectQuestGiver = dynamic_cast(questGiver)) + if (!IsInMap(worldObjectQuestGiver)) + return nullptr; - return nullptr; + if (!questGiver->hasQuest(nextQuestID)) + return nullptr; + + return sObjectMgr->GetQuestTemplate(nextQuestID); } bool Player::CanSeeStartQuest(Quest const* quest) const @@ -14633,7 +14610,7 @@ bool Player::CanAddQuest(Quest const* quest, bool msg) const InventoryResult msg2 = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count); // 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) + if (msg2 == EQUIP_ERR_ITEM_MAX_COUNT) return true; if (msg2 != EQUIP_ERR_OK) { @@ -15735,7 +15712,7 @@ bool Player::GiveQuestSourceItem(Quest const* quest) return true; } // player already have max amount required item, just report success - else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) + else if (msg == EQUIP_ERR_ITEM_MAX_COUNT) return true; SendEquipError(msg, nullptr, nullptr, srcitem); @@ -16674,14 +16651,17 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP) const { uint32 questId = quest->GetQuestId(); sGameEventMgr->HandleQuestComplete(questId); - WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4)); - data << uint32(questId); + + uint32 xp; if (!IsMaxLevel()) - data << uint32(XP); + xp = XP; else - data << uint32(0); + xp = 0; + WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4)); + data << uint32(questId); + data << uint32(xp); data << uint32(quest->GetRewOrReqMoney(this)); data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest))); data << uint32(quest->GetBonusTalents()); // bonus talents @@ -17254,7 +17234,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol { map = currentBg->GetBgMap(); - BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(currentBg->GetTypeID(), currentBg->GetArenaType()); + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(currentBg->GetTypeID(), currentBg->GetBracketId(), currentBg->GetArenaType()); AddBattlegroundQueueId(bgQueueTypeId); m_bgData.bgTypeID = currentBg->GetTypeID(); @@ -18060,7 +18040,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { std::map::iterator invalidBagItr = invalidBagMap.find(bagGuid); if (std::find(problematicItems.begin(), problematicItems.end(), invalidBagItr->second) != problematicItems.end()) - err = EQUIP_ERR_INT_BAG_ERROR; + err = EQUIP_ERR_INTERNAL_BAG_ERROR; } else { @@ -18918,8 +18898,8 @@ void Player::SendSavedInstances() } } - //Send opcode 811. true or false means, whether you have current raid/heroic instances - data.Initialize(SMSG_UPDATE_INSTANCE_OWNERSHIP); + //Send opcode SMSG_UPDATE_INSTANCE_OWNERSHIP. true or false means, whether you have current raid/heroic instances + data.Initialize(SMSG_UPDATE_INSTANCE_OWNERSHIP, 4); data << uint32(hasBeenSaved); SendDirectMessage(&data); @@ -18932,7 +18912,7 @@ void Player::SendSavedInstances() { if (itr->second.perm) { - data.Initialize(SMSG_UPDATE_LAST_INSTANCE); + data.Initialize(SMSG_UPDATE_LAST_INSTANCE, 4); data << uint32(itr->second.save->GetMapId()); SendDirectMessage(&data); } @@ -19699,7 +19679,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans) // save all changes to the item... if (item->GetState() != ITEM_NEW) // only for existing items, no duplicates item->SaveToDB(trans); - // ...but do not save position in invntory + // ...but do not save position in inventory continue; } } @@ -20365,7 +20345,7 @@ void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) const // 1: There are players offline in your party. // 2>: There are players in your party attempting to zone into an instance. */ - WorldPacket data(SMSG_INSTANCE_RESET_FAILED, 4); + WorldPacket data(SMSG_INSTANCE_RESET_FAILED, 8); data << uint32(reason); data << uint32(MapId); SendDirectMessage(&data); @@ -20675,6 +20655,16 @@ void Player::TextEmote(std::string_view text, WorldObject const* /*= nullptr*/, SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT), true); } +void Player::WhisperAddon(std::string const& text, Player* receiver) +{ + std::string _text(text); + sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, uint32(LANG_ADDON), _text, receiver); + + WorldPacket data; + ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_ADDON, this, this, _text); + receiver->SendDirectMessage(&data); +} + void Player::TextEmote(uint32 textId, WorldObject const* target /*= nullptr*/, bool /*isBossEmote = false*/) { Talk(textId, CHAT_MSG_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target); @@ -21502,10 +21492,12 @@ void Player::InitDisplayIds() inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore) { + uint32 stacks = count; + count = stacks * pProto->BuyCount; ItemPosCountVec vDest; uint16 uiDest = 0; InventoryResult msg = bStore ? - CanStoreNewItem(bag, slot, vDest, item, pProto->BuyCount * count) : + CanStoreNewItem(bag, slot, vDest, item, count) : CanEquipNewItem(slot, uiDest, item, false); if (msg != EQUIP_ERR_OK) { @@ -21520,15 +21512,15 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); ASSERT(iece); if (iece->HonorPoints) - ModifyHonorPoints(-int32(iece->HonorPoints * count)); + ModifyHonorPoints(-int32(iece->HonorPoints * stacks)); if (iece->ArenaPoints) - ModifyArenaPoints(-int32(iece->ArenaPoints * count)); + ModifyArenaPoints(-int32(iece->ArenaPoints * stacks)); for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) { if (iece->ItemID[i]) - DestroyItemCount(iece->ItemID[i], (iece->ItemCount[i] * count), true); + DestroyItemCount(iece->ItemID[i], iece->ItemCount[i] * stacks, true); } } @@ -21537,15 +21529,16 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c EquipNewItem(uiDest, item, true); if (it) { - uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, pProto->BuyCount * count); + uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, count); WorldPacket data(SMSG_BUY_ITEM, (8+4+4+4)); data << uint64(pVendor->GetGUID()); data << uint32(vendorslot + 1); // numbered from 1 at client data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF); - data << uint32(count); + data << uint32(stacks); SendDirectMessage(&data); - SendNewItem(it, pProto->BuyCount * count, true, false, false); + + SendNewItem(it, count, true, false, false); if (!bStore) AutoUnequipOffhandIfNeed(); @@ -21564,7 +21557,7 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c } // Return true is the bought item has a max count to force refresh of window by caller -bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot) +bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint32 count, uint8 bag, uint8 slot) { // cheating attempt if (count < 1) count = 1; @@ -21649,6 +21642,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin if (crItem->ExtendedCost) { + uint32 stacks = count; ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); if (!iece) { @@ -21657,14 +21651,14 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin } // honor points price - if (GetHonorPoints() < (iece->HonorPoints * count)) + if (GetHonorPoints() < (iece->HonorPoints * stacks)) { SendEquipError(EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, nullptr, nullptr); return false; } // arena points price - if (GetArenaPoints() < (iece->ArenaPoints * count)) + if (GetArenaPoints() < (iece->ArenaPoints * stacks)) { SendEquipError(EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, nullptr, nullptr); return false; @@ -21673,7 +21667,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin // item base price for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) { - if (iece->ItemID[i] && !HasItemCount(iece->ItemID[i], (iece->ItemCount[i] * count))) + if (iece->ItemID[i] && !HasItemCount(iece->ItemID[i], (iece->ItemCount[i] * stacks))) { SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, nullptr, nullptr); return false; @@ -21693,11 +21687,11 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32) { uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice; - if ((uint32)count > maxCount) + if (uint32(count) > maxCount) { TC_LOG_ERROR("entities.player.cheat", "Player::BuyItemFromVendorSlot: Player '{}' ({}) tried to buy item (ItemID: {}, Count: {}), causing overflow", - GetName(), GetGUID().ToString(), pProto->ItemId, (uint32)count); - count = (uint8)maxCount; + GetName(), GetGUID().ToString(), pProto->ItemId, uint32(count)); + count = uint32(maxCount); } price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT @@ -21720,7 +21714,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin { if (pProto->BuyCount * count != 1) { - SendEquipError(EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, nullptr, nullptr); + SendEquipError(EQUIP_ERR_NOT_EQUIPPABLE, nullptr, nullptr); return false; } if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false)) @@ -21728,7 +21722,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin } else { - SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, nullptr, nullptr); + SendEquipError(EQUIP_ERR_WRONG_SLOT, nullptr, nullptr); return false; } @@ -22174,23 +22168,46 @@ bool Player::CanReportAfkDueToLimit() ///This player has been blamed to be inactive in a battleground void Player::ReportedAfkBy(Player* reporter) { + WorldPackets::Battleground::ReportPvPPlayerAFKResult reportAfkResult; + reportAfkResult.Offender = GetGUID(); Battleground* bg = GetBattleground(); // Battleground also must be in progress! if (!bg || bg != reporter->GetBattleground() || GetTeam() != reporter->GetTeam() || bg->GetStatus() != STATUS_IN_PROGRESS) + { + reporter->SendDirectMessage(reportAfkResult.Write()); return; + } // check if player has 'Idle' or 'Inactive' debuff - if (m_bgData.bgAfkReporter.find(reporter->GetGUID().GetCounter()) == m_bgData.bgAfkReporter.end() && !HasAura(43680) && !HasAura(43681) && reporter->CanReportAfkDueToLimit()) + if (m_bgData.bgAfkReporter.find(reporter->GetGUID()) == m_bgData.bgAfkReporter.end() && !HasAura(43680) && !HasAura(43681) && reporter->CanReportAfkDueToLimit()) { - m_bgData.bgAfkReporter.insert(reporter->GetGUID().GetCounter()); + m_bgData.bgAfkReporter.insert(reporter->GetGUID()); // by default 3 players have to complain to apply debuff if (m_bgData.bgAfkReporter.size() >= sWorld->getIntConfig(CONFIG_BATTLEGROUND_REPORT_AFK)) { // cast 'Idle' spell CastSpell(this, 43680, true); m_bgData.bgAfkReporter.clear(); + reportAfkResult.NumBlackMarksOnOffender = m_bgData.bgAfkReporter.size(); + reportAfkResult.NumPlayersIHaveReported = reporter->m_bgData.bgAfkReportedCount; + reportAfkResult.Result = WorldPackets::Battleground::ReportPvPPlayerAFKResult::PVP_REPORT_AFK_SUCCESS; } } + + reporter->SendDirectMessage(reportAfkResult.Write()); +} + +uint8 Player::GetStartLevel(uint8 playerClass) const +{ + uint8 startLevel = sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL); + + if (playerClass == CLASS_DEATH_KNIGHT) + startLevel = std::max(sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL), startLevel); + + if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL)) + startLevel = std::max(sWorld->getIntConfig(CONFIG_START_GM_LEVEL), startLevel); + + return startLevel; } WorldLocation Player::GetStartPosition() const @@ -23044,31 +23061,10 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue) if (skillValue < ability->MinSkillLineRank && ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE) RemoveSpell(ability->Spell); // need learn + else if (!IsInWorld()) + AddSpell(ability->Spell, true, true, true, false, false, ability->SkillLine); else - { - // used to avoid double Seal of Righteousness on paladins, it's the only player spell which has both spell and forward spell in auto learn - if (ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && ability->SupercededBySpell) - { - bool skipCurrent = false; - auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(ability->SupercededBySpell); - for (auto itr = bounds.first; itr != bounds.second; ++itr) - { - if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skillValue >= itr->second->MinSkillLineRank) - { - skipCurrent = true; - break; - } - } - - if (skipCurrent) - continue; - } - - if (!IsInWorld()) - AddSpell(ability->Spell, true, true, true, false, false, ability->SkillLine); - else - LearnSpell(ability->Spell, true, ability->SkillLine); - } + LearnSpell(ability->Spell, true, ability->SkillLine); } } @@ -23208,10 +23204,8 @@ Battleground* Player::GetBattleground() const bool Player::InBattlegroundQueue(bool ignoreArena) const { for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - if (m_bgBattlegroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_NONE && (!ignoreArena || - (m_bgBattlegroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_2v2 && - m_bgBattlegroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_3v3 && - m_bgBattlegroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_5v5))) + if (m_bgBattlegroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_NONE + && (!ignoreArena || m_bgBattlegroundQueueID[i].bgQueueTypeId.BattlemasterListId != BATTLEGROUND_AA)) return true; return false; } @@ -23534,13 +23528,23 @@ void Player::AutoUnequipOffhandIfNeed(bool force /*= false*/) if (!offItem) return; - // unequip offhand weapon if player doesn't have dual wield anymore - if (!CanDualWield() && (offItem->GetTemplate()->InventoryType == INVTYPE_WEAPONOFFHAND || offItem->GetTemplate()->InventoryType == INVTYPE_WEAPON)) - force = true; + ItemTemplate const* offhandTemplate = offItem->GetTemplate(); + + // unequip offhand weapon if player doesn't have dual wield anymore + if (!CanDualWield() && (offhandTemplate->InventoryType == INVTYPE_WEAPONOFFHAND || offhandTemplate->InventoryType == INVTYPE_WEAPON)) + force = true; // need unequip offhand for 2h-weapon without TitanGrip (in any from hands) - if (!force && (CanTitanGrip() || (offItem->GetTemplate()->InventoryType != INVTYPE_2HWEAPON && !IsTwoHandUsed()))) - return; + if (!force) + { + Item* mainItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); + if ((!mainItem || mainItem->GetTemplate()->InventoryType != INVTYPE_2HWEAPON) + && offhandTemplate->InventoryType != INVTYPE_2HWEAPON) + return; + + if ((!mainItem || CanTitanGrip(mainItem)) && CanTitanGrip(offItem)) + return; + } ItemPosCountVec off_dest; if (CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) == EQUIP_ERR_OK) @@ -24481,17 +24485,14 @@ void Player::SetTitle(CharTitlesEntry const* title, bool lost) SendDirectMessage(&data); } -uint32 Player::GetRuneBaseCooldown(uint8 index) +uint32 Player::GetRuneTypeBaseCooldown(RuneType runeType) const { - uint8 rune = GetBaseRune(index); - uint32 cooldown = RUNE_BASE_COOLDOWN; + float cooldown = RUNE_BASE_COOLDOWN; AuraEffectList const& regenAura = GetAuraEffectsByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT); for (AuraEffectList::const_iterator i = regenAura.begin();i != regenAura.end(); ++i) - { - if ((*i)->GetMiscValue() == POWER_RUNE && (*i)->GetMiscValueB() == rune) - cooldown = cooldown * (100 - (*i)->GetAmount()) / 100; - } + if ((*i)->GetMiscValue() == POWER_RUNE && (*i)->GetMiscValueB() == runeType) + cooldown *= 1.0f - (*i)->GetAmount() / 100.0f; return cooldown; } @@ -24708,7 +24709,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot) if (!item || item->is_looted) { - SendEquipError(EQUIP_ERR_ALREADY_LOOTED, nullptr, nullptr); + SendEquipError(EQUIP_ERR_LOOT_GONE, nullptr, nullptr); return; } @@ -24976,7 +24977,7 @@ InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 { // there is an equip limit on this item if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot)) - return EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE; + return EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE; } // check unique-equipped limit @@ -24984,16 +24985,16 @@ InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 { ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory); if (!limitEntry) - return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED; + return EQUIP_ERR_NOT_EQUIPPABLE; // NOTE: limitEntry->mode not checked because if item have have-limit then it applied and to equip case if (limit_count > limitEntry->Quantity) - return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED; + return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS; // there is an equip limit on this item if (HasItemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->Quantity - limit_count + 1, except_slot)) - return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED; + return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS; else if (HasGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->Quantity - limit_count + 1, except_slot)) return EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED; } @@ -26104,14 +26105,15 @@ void Player::SetReputation(uint32 factionentry, uint32 value) { GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value); } + uint32 Player::GetReputation(uint32 factionentry) const { return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry)); } -std::string const& Player::GetGuildName() const +std::string Player::GetGuildName() const { - return sGuildMgr->GetGuildById(GetGuildId())->GetName(); + return GetGuildId() ? sGuildMgr->GetGuildById(GetGuildId())->GetName() : ""; } void Player::SendDuelCountdown(uint32 counter) @@ -26204,6 +26206,26 @@ PetStable& Player::GetOrInitPetStable() return *m_petStable; } +void Player::SendItemRefundResult(Item* item, ItemExtendedCostEntry const* iece, uint8 error) const +{ + WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4 + 4 + 4 + 4 + 4 * 4 + 4 * 4); + data << uint64(item->GetGUID()); // item guid + data << uint32(error); // 0, or error code + if (!error) + { + data << uint32(item->GetPaidMoney()); // money cost + data << uint32(iece->HonorPoints); // honor point cost + data << uint32(iece->ArenaPoints); // arena point cost + for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data + { + data << uint32(iece->ItemID[i]); + data << uint32(iece->ItemCount[i]); + } + } + + SendDirectMessage(&data); +} + void Player::RefundItem(Item* item) { if (!item->IsRefundable()) @@ -26215,10 +26237,7 @@ void Player::RefundItem(Item* item) if (item->IsRefundExpired()) // item refund has expired { item->SetNotRefundable(this); - WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8+4); - data << uint64(item->GetGUID()); // Guid - data << uint32(10); // Error! - SendDirectMessage(&data); + SendItemRefundResult(item, nullptr, 10); return; } @@ -26256,25 +26275,11 @@ void Player::RefundItem(Item* item) if (store_error) { - WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8+4); - data << uint64(item->GetGUID()); // Guid - data << uint32(10); // Error! - SendDirectMessage(&data); + SendItemRefundResult(item, iece, 10); return; } - WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8+4+4+4+4+4*4+4*4); - data << uint64(item->GetGUID()); // item guid - data << uint32(0); // 0, or error code - data << uint32(item->GetPaidMoney()); // money cost - data << uint32(iece->HonorPoints); // honor point cost - data << uint32(iece->ArenaPoints); // arena point cost - for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data - { - data << uint32(iece->ItemID[i]); - data << uint32(iece->ItemCount[i]); - } - SendDirectMessage(&data); + SendItemRefundResult(item, iece, 0); uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 6a0e544d312..29c98bb71d2 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -44,6 +44,7 @@ struct CharTitlesEntry; struct ChatChannelsEntry; struct CreatureTemplate; struct FactionEntry; +struct ItemExtendedCostEntry; struct ItemSetEffect; struct ItemTemplate; struct Loot; @@ -318,38 +319,38 @@ enum DrunkenState enum PlayerFlags { - PLAYER_FLAGS_GROUP_LEADER = 0x00000001, - PLAYER_FLAGS_AFK = 0x00000002, - PLAYER_FLAGS_DND = 0x00000004, - PLAYER_FLAGS_GM = 0x00000008, - PLAYER_FLAGS_GHOST = 0x00000010, - PLAYER_FLAGS_RESTING = 0x00000020, - PLAYER_FLAGS_UNK6 = 0x00000040, - PLAYER_FLAGS_UNK7 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state - PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards - PLAYER_FLAGS_IN_PVP = 0x00000200, - PLAYER_FLAGS_HIDE_HELM = 0x00000400, - PLAYER_FLAGS_HIDE_CLOAK = 0x00000800, - PLAYER_FLAGS_PLAYED_LONG_TIME = 0x00001000, // played long time - PLAYER_FLAGS_PLAYED_TOO_LONG = 0x00002000, // played too long time - PLAYER_FLAGS_IS_OUT_OF_BOUNDS = 0x00004000, - PLAYER_FLAGS_DEVELOPER = 0x00008000, // prefix for something? - PLAYER_FLAGS_UNK16 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary - PLAYER_FLAGS_TAXI_BENCHMARK = 0x00020000, // taxi benchmark mode (on/off) (2.0.1) - PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually) - PLAYER_FLAGS_UBER = 0x00080000, - PLAYER_FLAGS_UNK20 = 0x00100000, - PLAYER_FLAGS_UNK21 = 0x00200000, - PLAYER_FLAGS_COMMENTATOR2 = 0x00400000, - PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree, allowed only spells with SPELL_ATTR0_REQ_AMMO, SPELL_EFFECT_ATTACK, checked only for active player - PLAYER_FLAGS_UNK24 = 0x01000000, // disabled all melee ability on tab include autoattack - PLAYER_FLAGS_NO_XP_GAIN = 0x02000000, - PLAYER_FLAGS_UNK26 = 0x04000000, - PLAYER_FLAGS_UNK27 = 0x08000000, - PLAYER_FLAGS_UNK28 = 0x10000000, - PLAYER_FLAGS_UNK29 = 0x20000000, - PLAYER_FLAGS_UNK30 = 0x40000000, - PLAYER_FLAGS_UNK31 = 0x80000000 + PLAYER_FLAGS_GROUP_LEADER = 0x00000001, + PLAYER_FLAGS_AFK = 0x00000002, + PLAYER_FLAGS_DND = 0x00000004, + PLAYER_FLAGS_GM = 0x00000008, + PLAYER_FLAGS_GHOST = 0x00000010, + PLAYER_FLAGS_RESTING = 0x00000020, + PLAYER_FLAGS_VOICE_CHAT = 0x00000040, + PLAYER_FLAGS_UNK7 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state + PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards + PLAYER_FLAGS_IN_PVP = 0x00000200, + PLAYER_FLAGS_HIDE_HELM = 0x00000400, + PLAYER_FLAGS_HIDE_CLOAK = 0x00000800, + PLAYER_FLAGS_PLAYED_LONG_TIME = 0x00001000, // played long time + PLAYER_FLAGS_PLAYED_TOO_LONG = 0x00002000, // played too long time + PLAYER_FLAGS_IS_OUT_OF_BOUNDS = 0x00004000, + PLAYER_FLAGS_DEVELOPER = 0x00008000, // prefix for something? + PLAYER_FLAGS_LOW_LEVEL_RAID_ENABLED = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary + PLAYER_FLAGS_TAXI_BENCHMARK = 0x00020000, // taxi benchmark mode (on/off) (2.0.1) + PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually) + PLAYER_FLAGS_UBER = 0x00080000, + PLAYER_FLAGS_UNK20 = 0x00100000, + PLAYER_FLAGS_UNK21 = 0x00200000, + PLAYER_FLAGS_COMMENTATOR2 = 0x00400000, + PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree, allowed only spells with SPELL_ATTR0_REQ_AMMO, SPELL_EFFECT_ATTACK, checked only for active player + PLAYER_FLAGS_UNK24 = 0x01000000, // disabled all melee ability on tab include autoattack + PLAYER_FLAGS_NO_XP_GAIN = 0x02000000, + PLAYER_FLAGS_UNK26 = 0x04000000, + PLAYER_FLAGS_UNK27 = 0x08000000, + PLAYER_FLAGS_UNK28 = 0x10000000, + PLAYER_FLAGS_UNK29 = 0x20000000, + PLAYER_FLAGS_UNK30 = 0x40000000, + PLAYER_FLAGS_UNK31 = 0x80000000 }; enum PlayerBytesOffsets @@ -830,7 +831,7 @@ struct BGData /// when player is teleported to BG - (it is battleground's GUID) BattlegroundTypeId bgTypeID; - std::set bgAfkReporter; + GuidSet bgAfkReporter; uint8 bgAfkReportedCount; time_t bgAfkReportedTimer; @@ -1079,6 +1080,7 @@ class TC_GAME_API Player : public Unit, public GridObject /// Handles whispers from Addons and players based on sender, receiver's guid and language. void Whisper(std::string_view text, Language language, Player* receiver, bool = false) override; void Whisper(uint32 textId, Player* target, bool isBossWhisper = false) override; + void WhisperAddon(std::string const& text, Player* receiver); /*********************************************************/ /*** STORAGE SYSTEM ***/ @@ -1086,7 +1088,7 @@ class TC_GAME_API Player : public Unit, public GridObject void SetVirtualItemSlot(uint8 i, Item* item); void SetSheath(SheathState sheathed) override; // overwrite Unit version - uint8 FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) const; + uint8 FindEquipSlot(Item const* item, uint32 slot, bool swap) 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; @@ -1188,7 +1190,7 @@ class TC_GAME_API Player : public Unit, public GridObject bool IsTwoHandUsed() const; bool IsUsingTwoHandedWeaponInOneHand() const; void SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast = false, bool sendChatMessage = true); - bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot); + bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint32 count, uint8 bag, uint8 slot); bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore); float GetReputationPriceDiscount(Creature const* creature) const; @@ -1244,7 +1246,7 @@ class TC_GAME_API Player : public Unit, public GridObject void PrepareQuestMenu(ObjectGuid guid); void SendPreparedQuest(ObjectGuid guid); bool IsActiveQuest(uint32 quest_id) const; - Quest const* GetNextQuest(ObjectGuid guid, Quest const* quest) const; + Quest const* GetNextQuest(Object const* questGiver, Quest const* quest) const; bool CanSeeStartQuest(Quest const* quest) const; bool CanTakeQuest(Quest const* quest, bool msg) const; bool CanAddQuest(Quest const* quest, bool msg) const; @@ -1471,7 +1473,7 @@ class TC_GAME_API Player : public Unit, public GridObject void RemoveTemporarySpell(uint32 spellId); void SetReputation(uint32 factionentry, uint32 value); uint32 GetReputation(uint32 factionentry) const; - std::string const& GetGuildName() const; + std::string GetGuildName() const; // Talents uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); } @@ -1605,8 +1607,8 @@ class TC_GAME_API Player : public Unit, public GridObject void SendUpdateToOutOfRangeGroupMembers(); void SetInGuild(uint32 guildId); - void SetRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); } - uint8 GetRank() const { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); } + void SetGuildRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); } + uint8 GetGuildRank() const { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); } void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; } uint32 GetGuildId() const { return GetUInt32Value(PLAYER_GUILDID); } Guild* GetGuild(); @@ -1671,6 +1673,8 @@ class TC_GAME_API Player : public Unit, public GridObject float OCTRegenMPPerSpirit() const; float GetRatingMultiplier(CombatRating cr) const; float GetRatingBonusValue(CombatRating cr) const; + + /// Returns base spellpower bonus from spellpower stat on items uint32 GetBaseSpellPowerBonus() const { return m_baseSpellPower; } int32 GetSpellPenetrationItemMod() const { return m_spellPenetrationItemMod; } @@ -1871,8 +1875,8 @@ class TC_GAME_API Player : public Unit, public GridObject void SetCanParry(bool value); bool CanBlock() const { return m_canBlock; } void SetCanBlock(bool value); - bool CanTitanGrip() const { return m_canTitanGrip; } - void SetCanTitanGrip(bool value, uint32 penaltySpellId = 0); + bool CanTitanGrip(Item const* item) const; + void SetCanTitanGrip(bool value, uint32 penaltySpellId = 0, int32 allowedItemClass = 0, int32 allowedItemSubClassMask = 0); void CheckTitanGripPenalty(); bool CanTameExoticPets() const { return IsGameMaster() || HasAuraType(SPELL_AURA_ALLOW_TAME_PET_TYPE); } @@ -2063,6 +2067,7 @@ class TC_GAME_API Player : public Unit, public GridObject float m_homebindY; float m_homebindZ; + uint8 GetStartLevel(uint8 playerClass) const; WorldLocation GetStartPosition() const; // currently visible objects at player client @@ -2178,7 +2183,8 @@ class TC_GAME_API Player : public Unit, public GridObject RuneType GetBaseRune(uint8 index) const { return RuneType(m_runes->runes[index].BaseRune); } RuneType GetCurrentRune(uint8 index) const { return RuneType(m_runes->runes[index].CurrentRune); } uint32 GetRuneCooldown(uint8 index) const { return m_runes->runes[index].Cooldown; } - uint32 GetRuneBaseCooldown(uint8 index); + uint32 GetRuneBaseCooldown(uint8 index) const { return GetRuneTypeBaseCooldown(GetBaseRune(index)); } + uint32 GetRuneTypeBaseCooldown(RuneType runeType) const; bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const; RuneType GetLastUsedRune() const { return m_runes->lastUsedRune; } void SetLastUsedRune(RuneType type) { m_runes->lastUsedRune = type; } @@ -2434,6 +2440,8 @@ class TC_GAME_API Player : public Unit, public GridObject bool m_canParry; bool m_canBlock; bool m_canTitanGrip; + uint32 m_titanGripWeaponSubclasses; + uint32 m_titanGripArmorSubclasses; uint32 m_titanGripPenaltySpellId; uint8 m_swingErrorMsg; float m_ammoDPS; @@ -2495,6 +2503,7 @@ class TC_GAME_API Player : public Unit, public GridObject GuidSet m_refundableItems; void SendRefundInfo(Item* item); void RefundItem(Item* item); + void SendItemRefundResult(Item* item, ItemExtendedCostEntry const* iece, uint8 error) const; // know currencies are not removed at any point (0 displayed) void AddKnownCurrency(uint32 itemId); diff --git a/src/server/game/Entities/Player/PlayerTaxi.h b/src/server/game/Entities/Player/PlayerTaxi.h index 8fe480b9d07..880ffd03291 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.h +++ b/src/server/game/Entities/Player/PlayerTaxi.h @@ -38,15 +38,15 @@ class TC_GAME_API PlayerTaxi bool IsTaximaskNodeKnown(uint32 nodeidx) const { - uint8 field = uint8((nodeidx - 1) / 32); - uint32 submask = 1 << ((nodeidx-1) % 32); - return (m_taximask[field] & submask) == submask; + uint32 field = uint32((nodeidx - 1) / (sizeof(TaxiMask::value_type) * 8)); + TaxiMask::value_type submask = TaxiMask::value_type(1 << ((nodeidx - 1) % (sizeof(TaxiMask::value_type) * 8))); + return (m_taximask[field] & submask) != 0; } bool SetTaximaskNode(uint32 nodeidx) { - uint8 field = uint8((nodeidx - 1) / 32); - uint32 submask = 1 << ((nodeidx - 1) % 32); - if ((m_taximask[field] & submask) != submask) + uint32 field = uint32((nodeidx - 1) / (sizeof(TaxiMask::value_type) * 8)); + TaxiMask::value_type submask = TaxiMask::value_type(1 << ((nodeidx - 1) % (sizeof(TaxiMask::value_type) * 8))); + if ((m_taximask[field] & submask) == 0) { m_taximask[field] |= submask; return true; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index cb467b8de38..eb2a81d6283 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -292,7 +292,7 @@ float Player::GetHealthBonusFromStamina() float baseStam = std::min(20.0f, stamina); float moreStam = stamina - baseStam; - return baseStam + (moreStam*10.0f); + return baseStam + (moreStam * 10.0f); } float Player::GetManaBonusFromIntellect() @@ -1033,20 +1033,8 @@ void Player::UpdateRuneRegen(RuneType rune) if (rune >= NUM_RUNE_TYPES) return; - uint32 cooldown = 0; - - for (uint32 i = 0; i < MAX_RUNES; ++i) - if (GetBaseRune(i) == rune) - { - cooldown = GetRuneBaseCooldown(i); - break; - } - - if (cooldown <= 0) - return; - - float regen = float(1 * IN_MILLISECONDS) / float(cooldown); - SetFloatValue(PLAYER_RUNE_REGEN_1 + uint8(rune), regen); + if (uint32 cooldown = GetRuneTypeBaseCooldown(rune)) + SetFloatValue(PLAYER_RUNE_REGEN_1 + uint8(rune), float(1 * IN_MILLISECONDS) / float(cooldown)); } void Player::_ApplyAllStatBonuses() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 88df3a10c4d..f5abdb65ce5 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -20,6 +20,7 @@ #include "Battlefield.h" #include "BattlefieldMgr.h" #include "Battleground.h" +#include "BattlegroundPackets.h" #include "BattlegroundScore.h" #include "CellImpl.h" #include "CharacterCache.h" @@ -57,6 +58,7 @@ #include "PassiveAI.h" #include "PetAI.h" #include "Pet.h" +#include "PetPackets.h" #include "Player.h" #include "PlayerAI.h" #include "QuestDef.h" @@ -68,6 +70,7 @@ #include "SpellInfo.h" #include "SpellHistory.h" #include "SpellMgr.h" +#include "SpellPackets.h" #include "StringConvert.h" #include "TemporarySummon.h" #include "Transport.h" @@ -251,12 +254,12 @@ uint32 HealInfo::GetHitMask() const return _hitMask; } -ProcEventInfo::ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget, +ProcEventInfo::ProcEventInfo(Unit* actor, Unit* actionTarget, uint32 typeMask, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell* spell, DamageInfo* damageInfo, HealInfo* healInfo) : - _actor(actor), _actionTarget(actionTarget), _procTarget(procTarget), + _actor(actor), _actionTarget(actionTarget), _typeMask(typeMask), _spellTypeMask(spellTypeMask), _spellPhaseMask(spellPhaseMask), _hitMask(hitMask), _spell(spell), _damageInfo(damageInfo), _healInfo(healInfo) @@ -410,10 +413,10 @@ Unit::~Unit() _DeleteRemovedAuras(); - delete i_motionMaster; - delete m_charmInfo; - delete movespline; - delete _spellHistory; + delete std::exchange(i_motionMaster, nullptr); + delete std::exchange(m_charmInfo, nullptr); + delete std::exchange(movespline, nullptr); + delete std::exchange(_spellHistory, nullptr); ASSERT(!m_duringRemoveFromWorld); ASSERT(!m_attacking); @@ -6632,6 +6635,10 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage return false; }); + // Add SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC percent bonus + if (spellProto->Mechanic) + AddPct(DoneTotalMod, GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC, spellProto->Mechanic)); + // done scripted mod (take it from owner) Unit const* owner = GetOwner() ? GetOwner() : this; AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); @@ -7932,6 +7939,10 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType return false; }); + // Add SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC percent bonus + if (spellProto && spellProto->Mechanic) + AddPct(DoneTotalMod, GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC, spellProto->Mechanic)); + // done scripted mod (take it from owner) Unit* owner = GetOwner() ? GetOwner() : this; AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); @@ -8432,9 +8443,9 @@ int32 Unit::ModifyPower(Powers power, int32 dVal, bool withPowerUpdate /*= true* int32 curPower = (int32)GetPower(power); int32 val = dVal + curPower; - if (val <= 0) + if (val <= GetMinPower(power)) { - SetPower(power, 0, withPowerUpdate); + SetPower(power, GetMinPower(power), withPowerUpdate); return -curPower; } @@ -9317,7 +9328,7 @@ float Unit::GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange typ bool Unit::CanFreeMove() const { return !HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_FLEEING | UNIT_STATE_IN_FLIGHT | - UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED) && GetOwnerGUID().IsEmpty(); + UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED); } void Unit::SetLevel(uint8 lvl, bool sendUpdate/* = true*/) @@ -10169,7 +10180,7 @@ void Unit::GetProcAurasTriggeredOnEvent(AuraApplicationProcContainer& aurasTrigg void Unit::TriggerAurasProcOnEvent(Unit* actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell* spell, DamageInfo* damageInfo, HealInfo* healInfo) { // prepare data for self trigger - ProcEventInfo myProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo); + ProcEventInfo myProcEventInfo(this, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo); if (typeMaskActor) { AuraApplicationProcContainer myAurasTriggeringProc; @@ -10193,7 +10204,7 @@ void Unit::TriggerAurasProcOnEvent(Unit* actionTarget, uint32 typeMaskActor, uin } // prepare data for target trigger - ProcEventInfo targetProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo); + ProcEventInfo targetProcEventInfo(this, actionTarget, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo); if (typeMaskActionTarget && actionTarget) { AuraApplicationProcContainer targetAurasTriggeringProc; @@ -10233,30 +10244,39 @@ void Unit::TriggerAurasProcOnEvent(ProcEventInfo& eventInfo, AuraApplicationProc } ///----------Pet responses methods----------------- -void Unit::SendPetActionFeedback(uint8 msg) +void Unit::SendPetActionFeedback(PetActionFeedback msg, uint32 spellId) const { Unit* owner = GetOwner(); if (!owner || owner->GetTypeId() != TYPEID_PLAYER) return; - WorldPacket data(SMSG_PET_ACTION_FEEDBACK, 1); - data << uint8(msg); - owner->ToPlayer()->SendDirectMessage(&data); + WorldPackets::Pet::PetActionFeedback petActionFeedback; + petActionFeedback.SpellID = spellId; + petActionFeedback.Response = msg; + owner->ToPlayer()->SendDirectMessage(petActionFeedback.Write()); } -void Unit::SendPetTalk(uint32 pettalk) +void Unit::SendPetActionSound(PetAction action) const { - Unit* owner = GetOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + WorldPackets::Pet::PetActionSound petActionSound; + petActionSound.UnitGUID = GetGUID(); + petActionSound.Action = action; + SendMessageToSet(petActionSound.Write(), false); +} + +void Unit::SendPetDismissSound() const +{ + CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId()); + if (!displayInfo) return; - WorldPacket data(SMSG_PET_ACTION_SOUND, 8 + 4); - data << uint64(GetGUID()); - data << uint32(pettalk); - owner->ToPlayer()->SendDirectMessage(&data); + WorldPackets::Pet::PetDismissSound petDismissSound; + petDismissSound.ModelId = displayInfo->ModelID; + petDismissSound.ModelPosition = GetPosition(); + SendMessageToSet(petDismissSound.Write(), false); } -void Unit::SendPetAIReaction(ObjectGuid guid) +void Unit::SendPetAIReaction(ObjectGuid guid) const { Unit* owner = GetOwner(); if (!owner || owner->GetTypeId() != TYPEID_PLAYER) @@ -11100,8 +11120,9 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id) // only if not player and not controlled by player pet. And not at BG if ((durabilityLoss && !player && !victim->ToPlayer()->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP))) { - TC_LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH)); - plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false); + double baseLoss = sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH); + TC_LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", baseLoss); + plrVictim->DurabilityLossAll(baseLoss, false); // durability lost message plrVictim->SendDurabilityLoss(); } @@ -12028,20 +12049,12 @@ void Unit::SetAuraStack(uint32 spellId, Unit* target, uint32 stack) aura->SetStackAmount(stack); } -void Unit::SendPlaySpellVisual(uint32 id) const -{ - WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 8 + 4); - data << uint64(GetGUID()); - data << uint32(id); // SpellVisualKit.dbc index - SendMessageToSet(&data, true); -} - -void Unit::SendPlaySpellImpact(ObjectGuid guid, uint32 id) const +void Unit::SendPlaySpellVisualKit(uint32 id, uint32 type) const { - WorldPacket data(SMSG_PLAY_SPELL_IMPACT, 8 + 4); - data << uint64(guid); // target - data << uint32(id); // SpellVisualKit.dbc index - SendMessageToSet(&data, false); + WorldPackets::Spells::PlaySpellVisualKit playSpellVisualKit(type); + playSpellVisualKit.Unit = GetGUID(); + playSpellVisualKit.KitRecID = id; + SendMessageToSet(playSpellVisualKit.Write(), true); } bool Unit::CanApplyResilience() const @@ -12128,8 +12141,8 @@ float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, i //calculate miss chance float missChance = victim->GetUnitMissChance(); - // melee attacks while dual wielding have +19% chance to miss - if (!spellId && haveOffhandWeapon()) + // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty + if (!spellId && haveOffhandWeapon() && attType != RANGED_ATTACK && !m_currentSpells[CURRENT_MELEE_SPELL]) missChance += 19.0f; // bonus from skills is 0.04% @@ -12210,6 +12223,17 @@ void Unit::UpdateObjectVisibility(bool forced) } } +void Unit::SendMoveKnockBack(Player* player, float speedXY, float speedZ, float vcos, float vsin) +{ + WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4)); + data << GetPackGUID(); + data << uint32(0); // counter + data << TaggedPosition(vcos, vsin); + data << float(speedXY); // Horizontal speed + data << float(speedZ); // Z Movement speed (vertical) + player->SendDirectMessage(&data); +} + void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ) { if (IsMovedByServer()) @@ -12220,15 +12244,7 @@ void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ) { float vcos, vsin; GetSinCos(x, y, vsin, vcos); - - WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4)); - data << GetPackGUID(); - data << uint32(0); // counter - data << TaggedPosition(vcos, vsin); - data << float(speedXY); // Horizontal speed - data << float(-speedZ); // Z Movement speed (vertical) - - GetGameClientMovingMe()->SendDirectMessage(&data); + SendMoveKnockBack(GetGameClientMovingMe()->GetBasePlayer(), speedXY, -speedZ, vcos, vsin); if (HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || HasAuraType(SPELL_AURA_FLY)) SetCanFly(true, true); @@ -12325,23 +12341,26 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const } } // Female - else switch (skinColor) + else { - case 10: // White - return 29409; - case 6: // Light Brown - case 7: - return 29410; - case 4: // Brown - case 5: - return 29411; - case 0: // Dark - case 1: - case 2: - case 3: - return 29412; - default: // original - Grey - return 8571; + switch (skinColor) + { + case 10: // White + return 29409; + case 6: // Light Brown + case 7: + return 29410; + case 4: // Brown + case 5: + return 29411; + case 0: // Dark + case 1: + case 2: + case 3: + return 29412; + default: // original - Grey + return 8571; + } } } else if (Player::TeamForRace(GetRace()) == ALLIANCE) @@ -12403,23 +12422,26 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const } } // Female - else switch (skinColor) + else { - case 0: // Dark (Black) - case 1: - return 29418; - case 2: // White - case 3: - return 29419; - case 6: // Light Brown/Grey - case 7: - case 8: - case 9: - return 29420; - case 10: // Completly White - return 29421; - default: // original - Brown - return 2289; + switch (skinColor) + { + case 0: // Dark (Black) + case 1: + return 29418; + case 2: // White + case 3: + return 29419; + case 6: // Light Brown/Grey + case 7: + case 8: + case 9: + return 29420; + case 10: // Completly White + return 29421; + default: // original - Brown + return 2289; + } } } else if (Player::TeamForRace(GetRace()) == ALLIANCE) @@ -12474,15 +12496,7 @@ void Unit::JumpTo(float speedXY, float speedZ, bool forward, Optional { float vcos = std::cos(angle+GetOrientation()); float vsin = std::sin(angle+GetOrientation()); - - WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8+4+4+4+4+4)); - data << GetPackGUID(); - data << uint32(0); // Sequence - data << TaggedPosition(vcos, vsin); - data << float(speedXY); // Horizontal speed - data << float(-speedZ); // Z Movement speed (vertical) - - ToPlayer()->SendDirectMessage(&data); + SendMoveKnockBack(ToPlayer(), speedXY, -speedZ, vcos, vsin); } } @@ -13574,6 +13588,21 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player const* t data->append(fieldBuffer); } +void Unit::DestroyForPlayer(Player* target, bool onDeath) const +{ + if (Battleground* bg = target->GetBattleground()) + { + if (bg->isArena()) + { + WorldPackets::Battleground::DestroyArenaUnit destroyArenaUnit; + destroyArenaUnit.Guid = GetGUID(); + target->GetSession()->SendPacket(destroyArenaUnit.Write()); + } + } + + WorldObject::DestroyForPlayer(target, onDeath); +} + int32 Unit::GetHighestExclusiveSameEffectSpellGroupValue(AuraEffect const* aurEff, AuraType auraType, bool checkMiscValue /*= false*/, int32 miscValue /*= 0*/) const { int32 val = 0; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 42e94a53e28..8f5ce6448ae 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -21,6 +21,7 @@ #include "Object.h" #include "CombatManager.h" #include "SpellAuraDefines.h" +#include "PetDefines.h" #include "ThreatManager.h" #include "Timer.h" #include "UnitDefines.h" @@ -500,13 +501,12 @@ class TC_GAME_API HealInfo class TC_GAME_API ProcEventInfo { public: - ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget, uint32 typeMask, + ProcEventInfo(Unit* actor, Unit* actionTarget, uint32 typeMask, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell* spell, DamageInfo* damageInfo, HealInfo* healInfo); Unit* GetActor() { return _actor; } Unit* GetActionTarget() const { return _actionTarget; } - Unit* GetProcTarget() const { return _procTarget; } uint32 GetTypeMask() const { return _typeMask; } uint32 GetSpellTypeMask() const { return _spellTypeMask; } @@ -524,7 +524,6 @@ class TC_GAME_API ProcEventInfo private: Unit* const _actor; Unit* const _actionTarget; - Unit* const _procTarget; uint32 _typeMask; uint32 _spellTypeMask; uint32 _spellPhaseMask; @@ -931,6 +930,7 @@ class TC_GAME_API Unit : public WorldObject void SetPowerType(Powers power, bool sendUpdate = true); void UpdateDisplayPower(); uint32 GetPower(Powers power) const { return GetUInt32Value(UNIT_FIELD_POWER1 + int32(power)); } + int32 GetMinPower(Powers /*power*/) const { return 0; } uint32 GetMaxPower(Powers power) const { return GetUInt32Value(UNIT_FIELD_MAXPOWER1 + int32(power)); } float GetPowerPct(Powers power) const { return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; } int32 CountPctFromMaxPower(Powers power, int32 pct) const { return CalculatePct(GetMaxPower(power), pct); } @@ -1182,8 +1182,8 @@ class TC_GAME_API Unit : public WorldObject Aura* AddAura(uint32 spellId, Unit* target); Aura* AddAura(SpellInfo const* spellInfo, uint8 effMask, Unit* target); void SetAuraStack(uint32 spellId, Unit* target, uint32 stack); - void SendPlaySpellVisual(uint32 id) const; - void SendPlaySpellImpact(ObjectGuid guid, uint32 id) const; + + void SendPlaySpellVisualKit(uint32 id, uint32 type) const; void DeMorph(); @@ -1204,6 +1204,7 @@ class TC_GAME_API Unit : public WorldObject void UpdateOrientation(float orientation); void UpdateHeight(float newZ); + void SendMoveKnockBack(Player* player, float speedXY, float speedZ, float vcos, float vsin); void KnockbackFrom(float x, float y, float speedXY, float speedZ); void JumpTo(float speedXY, float speedZ, bool forward = true, Optional dest = {}); void JumpTo(WorldObject* obj, float speedZ, bool withOrientation = false); @@ -1705,9 +1706,10 @@ class TC_GAME_API Unit : public WorldObject void ClearComboPointHolders(); ///----------Pet responses methods----------------- - void SendPetActionFeedback(uint8 msg); - void SendPetTalk(uint32 pettalk); - void SendPetAIReaction(ObjectGuid guid); + void SendPetActionFeedback(PetActionFeedback msg, uint32 spellId) const; + void SendPetActionSound(PetAction action) const; + void SendPetDismissSound() const; + void SendPetAIReaction(ObjectGuid guid) const; ///----------End of Pet responses methods---------- void PropagateSpeedChange(); @@ -1831,6 +1833,7 @@ class TC_GAME_API Unit : public WorldObject explicit Unit (bool isWorldObject); void BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, Player const* target) const override; + void DestroyForPlayer(Player* target, bool onDeath) const override; void _UpdateSpells(uint32 time); void _DeleteRemovedAuras(); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 31a1fa1d2a9..af083b1532e 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -495,7 +495,9 @@ void ObjectMgr::LoadCreatureTemplates() // 62 "flags_extra," // 63 - "ScriptName" + "ScriptName," + // 64 + "StringId" " FROM creature_template ct" " LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId"); @@ -615,6 +617,7 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.SpellSchoolImmuneMask = fields[61].GetUInt32(); creatureTemplate.flags_extra = fields[62].GetUInt32(); creatureTemplate.ScriptID = GetScriptId(fields[63].GetString()); + creatureTemplate.StringId = fields[64].GetString(); } void ObjectMgr::LoadCreatureTemplateResistances() @@ -2164,8 +2167,8 @@ void ObjectMgr::LoadCreatures() QueryResult result = WorldDatabase.Query("SELECT creature.guid, id, map, position_x, position_y, position_z, orientation, modelid, equipment_id, spawntimesecs, wander_distance, " // 11 12 13 14 15 16 17 18 19 20 21 "currentwaypoint, curhealth, curmana, MovementType, spawnMask, phaseMask, eventEntry, poolSpawnId, creature.npcflag, creature.unit_flags, creature.dynamicflags, " - // 22 - "creature.ScriptName " + // 22 23 + "creature.ScriptName, creature.StringId " "FROM creature " "LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid " "LEFT OUTER JOIN pool_members ON pool_members.type = 0 AND creature.guid = pool_members.spawnId"); @@ -2221,6 +2224,7 @@ void ObjectMgr::LoadCreatures() data.unit_flags = fields[20].GetUInt32(); data.dynamicflags = fields[21].GetUInt32(); data.scriptId = GetScriptId(fields[22].GetString()); + data.StringId = fields[23].GetString(); data.spawnGroupData = GetDefaultSpawnGroup(); MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapId); @@ -2485,8 +2489,8 @@ void ObjectMgr::LoadGameObjects() QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation, " // 7 8 9 10 11 12 13 14 15 16 17 "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, eventEntry, poolSpawnId, " - // 18 - "ScriptName " + // 18 19 + "ScriptName, StringId " "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid " "LEFT OUTER JOIN pool_members ON pool_members.type = 1 AND gameobject.guid = pool_members.spawnId"); @@ -2590,6 +2594,7 @@ void ObjectMgr::LoadGameObjects() uint32 PoolId = fields[17].GetUInt32(); data.scriptId = GetScriptId(fields[18].GetString()); + data.StringId = fields[19].GetString(); if (data.rotation.x < -1.0f || data.rotation.x > 1.0f) { @@ -6842,8 +6847,8 @@ uint32 ObjectMgr::GetNearestTaxiNode(float x, float y, float z, uint32 mapid, ui if (!node || node->ContinentID != mapid || (!node->MountCreatureID[team == ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981)) // dk flight continue; - uint8 field = (uint8)((i - 1) / 32); - uint32 submask = 1<<((i-1)%32); + uint32 field = uint32((node->ID - 1) / (sizeof(TaxiMask::value_type) * 8)); + TaxiMask::value_type submask = TaxiMask::value_type(1 << ((node->ID - 1) % (sizeof(TaxiMask::value_type) * 8))); // skip not taxi network nodes if ((sTaxiNodesMask[field] & submask) == 0) @@ -7381,7 +7386,7 @@ void ObjectMgr::LoadAccessRequirements() if (ar->achievement) { - if (!sAchievementMgr->GetAchievement(ar->achievement)) + if (!sAchievementStore.LookupEntry(ar->achievement)) { TC_LOG_ERROR("sql.sql", "Required Achievement {} not exist for map {} difficulty {}, remove quest done requirement.", ar->achievement, mapid, difficulty); ar->achievement = 0; @@ -7446,21 +7451,22 @@ void ObjectMgr::SetHighestGuids() { QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM characters"); if (result) - GetGuidSequenceGenerator(HighGuid::Player).Set((*result)[0].GetUInt32() + 1); + GetGenerator().Set((*result)[0].GetUInt32() + 1); result = CharacterDatabase.Query("SELECT MAX(guid) FROM item_instance"); if (result) - GetGuidSequenceGenerator(HighGuid::Item).Set((*result)[0].GetUInt32() + 1); + GetGenerator().Set((*result)[0].GetUInt32() + 1); // Cleanup other tables from nonexistent guids ( >= _hiItemGuid) - CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '{}'", GetGuidSequenceGenerator(HighGuid::Item).GetNextAfterMaxUsed()); // One-time query - CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '{}'", GetGuidSequenceGenerator(HighGuid::Item).GetNextAfterMaxUsed()); // One-time query - CharacterDatabase.PExecute("DELETE FROM auctionhouse WHERE itemguid >= '{}'", GetGuidSequenceGenerator(HighGuid::Item).GetNextAfterMaxUsed()); // One-time query - CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE item_guid >= '{}'", GetGuidSequenceGenerator(HighGuid::Item).GetNextAfterMaxUsed()); // One-time query + CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '{}'", GetGenerator().GetNextAfterMaxUsed()); // One-time query + CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '{}'", GetGenerator().GetNextAfterMaxUsed()); // One-time query + CharacterDatabase.PExecute("DELETE a, ab FROM auctionhouse a LEFT JOIN auctionbidders ab ON ab.id = a.id WHERE itemguid >= '{}'", + GetGenerator().GetNextAfterMaxUsed()); // One-time query + CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE item_guid >= '{}'", GetGenerator().GetNextAfterMaxUsed()); // One-time query result = WorldDatabase.Query("SELECT MAX(guid) FROM transports"); if (result) - GetGuidSequenceGenerator(HighGuid::Transport).Set((*result)[0].GetUInt32() + 1); + GetGenerator().Set((*result)[0].GetUInt32() + 1); result = CharacterDatabase.Query("SELECT MAX(id) FROM auctionhouse"); if (result) @@ -7661,8 +7667,8 @@ void ObjectMgr::LoadGameObjectTemplate() QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, " // 8 9 10 11 12 13 14 15 16 17 18 19 20 "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, " - // 21 22 23 24 25 26 27 28 29 30 31 32 33 - "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName " + // 21 22 23 24 25 26 27 28 29 30 31 32 33 34 + "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName, StringId " "FROM gameobject_template"); if (!result) @@ -7693,6 +7699,7 @@ void ObjectMgr::LoadGameObjectTemplate() got.AIName = fields[32].GetString(); got.ScriptId = GetScriptId(fields[33].GetString()); + got.StringId = fields[34].GetString(); // Checks if (!got.AIName.empty() && !sGameObjectAIRegistry->HasItem(got.AIName)) @@ -9699,7 +9706,7 @@ bool ObjectMgr::RemoveVendorItem(uint32 entry, uint32 item, bool persist /*= tru return true; } -bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 maxcount, uint32 incrtime, uint32 ExtendedCost, Player* player, std::set* skip_vendors, uint32 ORnpcflag) const +bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount, uint32 incrtime, uint32 ExtendedCost, Player* player, std::set* skip_vendors, uint32 ORnpcflag) const { CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(vendor_entry); if (!cInfo) @@ -9726,12 +9733,12 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 max return false; } - if (!sObjectMgr->GetItemTemplate(item_id)) + if (!sObjectMgr->GetItemTemplate(id)) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_NOT_FOUND, item_id); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_NOT_FOUND, id); else - TC_LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` for Vendor (Entry: {}) have in item list non-existed item ({}), ignore", vendor_entry, item_id); + TC_LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` for Vendor (Entry: {}) have in item list non-existed item ({}), ignore", vendor_entry, id); return false; } @@ -9740,7 +9747,7 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 max if (player) ChatHandler(player->GetSession()).PSendSysMessage(LANG_EXTENDED_COST_NOT_EXIST, ExtendedCost); else - TC_LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` has Item (Entry: {}) with wrong ExtendedCost ({}) for vendor ({}), ignore", item_id, ExtendedCost, vendor_entry); + TC_LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` has Item (Entry: {}) with wrong ExtendedCost ({}) for vendor ({}), ignore", id, ExtendedCost, vendor_entry); return false; } @@ -9749,7 +9756,7 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 max if (player) ChatHandler(player->GetSession()).PSendSysMessage("MaxCount != 0 (%u) but IncrTime == 0", maxcount); else - TC_LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` has `maxcount` ({}) for item {} of vendor (Entry: {}) but `incrtime`=0, ignore", maxcount, item_id, vendor_entry); + TC_LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` has `maxcount` ({}) for item {} of vendor (Entry: {}) but `incrtime`=0, ignore", maxcount, id, vendor_entry); return false; } else if (maxcount == 0 && incrtime > 0) @@ -9757,7 +9764,7 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 max if (player) ChatHandler(player->GetSession()).PSendSysMessage("MaxCount == 0 but IncrTime<>= 0"); else - TC_LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` has `maxcount`=0 for item {} of vendor (Entry: {}) but `incrtime`<>0, ignore", item_id, vendor_entry); + TC_LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` has `maxcount`=0 for item {} of vendor (Entry: {}) but `incrtime`<>0, ignore", id, vendor_entry); return false; } @@ -9765,12 +9772,12 @@ bool ObjectMgr::IsVendorItemValid(uint32 vendor_entry, uint32 item_id, int32 max if (!vItems) return true; // later checks for non-empty lists - if (vItems->FindItemCostPair(item_id, ExtendedCost)) + if (vItems->FindItemCostPair(id, ExtendedCost)) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, item_id, ExtendedCost); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, id, ExtendedCost); else - TC_LOG_ERROR("sql.sql", "Table `npc_vendor` has duplicate items {} (with extended cost {}) for vendor (Entry: {}), ignoring", item_id, ExtendedCost, vendor_entry); + TC_LOG_ERROR("sql.sql", "Table `npc_vendor` has duplicate items {} (with extended cost {}) for vendor (Entry: {}), ignoring", id, ExtendedCost, vendor_entry); return false; } @@ -10035,7 +10042,7 @@ void ObjectMgr::LoadCreatureClassLevelStats() for (uint8 i = 0; i < MAX_EXPANSIONS; ++i) { - stats.BaseHealth[i] = fields[2 + i].GetUInt16(); + stats.BaseHealth[i] = fields[2 + i].GetUInt32(); if (stats.BaseHealth[i] == 0) { @@ -10051,8 +10058,8 @@ void ObjectMgr::LoadCreatureClassLevelStats() } } - stats.BaseMana = fields[5].GetUInt16(); - stats.BaseArmor = fields[6].GetUInt16(); + stats.BaseMana = fields[5].GetUInt32(); + stats.BaseArmor = fields[6].GetUInt32(); stats.AttackPower = fields[7].GetUInt16(); stats.RangedAttackPower = fields[8].GetUInt16(); @@ -10096,9 +10103,9 @@ void ObjectMgr::LoadFactionChangeAchievements() uint32 alliance = fields[0].GetUInt32(); uint32 horde = fields[1].GetUInt32(); - if (!sAchievementMgr->GetAchievement(alliance)) + if (!sAchievementStore.LookupEntry(alliance)) TC_LOG_ERROR("sql.sql", "Achievement {} (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance); - else if (!sAchievementMgr->GetAchievement(horde)) + else if (!sAchievementStore.LookupEntry(horde)) TC_LOG_ERROR("sql.sql", "Achievement {} (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde); else FactionChangeAchievements[alliance] = horde; diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index cdd1981ada0..46c7a273a6a 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -966,7 +966,7 @@ class TC_GAME_API ObjectMgr GameObjectTemplate const* GetGameObjectTemplate(uint32 entry) const; GameObjectTemplateContainer const& GetGameObjectTemplates() const { return _gameObjectTemplateStore; } - uint32 LoadReferenceVendor(int32 vendor, int32 item_id, std::set* skip_vendors); + uint32 LoadReferenceVendor(int32 vendor, int32 item, std::set* skip_vendors); void LoadGameObjectTemplate(); void LoadGameObjectTemplateAddons(); @@ -1489,7 +1489,7 @@ class TC_GAME_API ObjectMgr } void AddVendorItem(uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, bool persist = true); // for event bool RemoveVendorItem(uint32 entry, uint32 item, bool persist = true); // for event - bool IsVendorItemValid(uint32 vendor_entry, uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost, Player* player = nullptr, std::set* skip_vendors = nullptr, uint32 ORnpcflag = 0) const; + bool IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount, uint32 ptime, uint32 ExtendedCost, Player* player = nullptr, std::set* skip_vendors = nullptr, uint32 ORnpcflag = 0) const; void LoadScriptNames(); ScriptNameContainer const& GetAllScriptNames() const; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 5448b8e93d9..a5990e8817c 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -32,6 +32,15 @@ namespace Trinity { + template + struct GridMapTypeMaskForType : std::integral_constant { }; + + template<> struct GridMapTypeMaskForType : std::integral_constant { }; + template<> struct GridMapTypeMaskForType : std::integral_constant { }; + template<> struct GridMapTypeMaskForType : std::integral_constant { }; + template<> struct GridMapTypeMaskForType : std::integral_constant { }; + template<> struct GridMapTypeMaskForType : std::integral_constant { }; + struct TC_GAME_API VisibleNotifier { Player &i_player; @@ -191,10 +200,53 @@ namespace Trinity // SEARCHERS & LIST SEARCHERS & WORKERS // WorldObject searchers & workers + enum class WorldObjectSearcherContinuation + { + Continue, + Return + }; + + template + class SearcherFirstObjectResult + { + Type& result; + + protected: + explicit SearcherFirstObjectResult(Type& ref_) : result(ref_) { } + + WorldObjectSearcherContinuation ShouldContinue() const + { + return result ? WorldObjectSearcherContinuation::Return : WorldObjectSearcherContinuation::Continue; + } + + void Insert(Type object) + { + result = object; + } + }; + + template + class SearcherLastObjectResult + { + Type& result; + + protected: + explicit SearcherLastObjectResult(Type& ref_) : result(ref_) { } + + WorldObjectSearcherContinuation ShouldContinue() const + { + return WorldObjectSearcherContinuation::Continue; + } + + void Insert(Type object) + { + result = object; + } + }; // Generic base class to insert elements into arbitrary containers using push_back template - class ContainerInserter + class SearcherContainerResult { using InserterType = void(*)(void*, Type&&); @@ -203,7 +255,7 @@ namespace Trinity protected: template - ContainerInserter(T& ref_) : ref(&ref_) + explicit SearcherContainerResult(T& ref_) : ref(&ref_) { inserter = [](void* containerRaw, Type&& object) { @@ -212,71 +264,52 @@ namespace Trinity }; } + WorldObjectSearcherContinuation ShouldContinue() const + { + return WorldObjectSearcherContinuation::Continue; + } + void Insert(Type object) { inserter(ref, std::move(object)); } }; - template - struct WorldObjectSearcher + template + struct WorldObjectSearcherBase : Result { uint32 i_mapTypeMask; uint32 i_phaseMask; - WorldObject* &i_object; - Check &i_check; - - WorldObjectSearcher(WorldObject const* searcher, WorldObject* & result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + Check& i_check; - void Visit(GameObjectMapType &m); - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - void Visit(CorpseMapType &m); - void Visit(DynamicObjectMapType &m); + template + WorldObjectSearcherBase(uint32 phaseMask, Container& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : Result(result), i_mapTypeMask(mapTypeMask), i_phaseMask(phaseMask), i_check(check) { } - template void Visit(GridRefManager &) { } + template + void Visit(GridRefManager&); }; template - struct WorldObjectLastSearcher + struct WorldObjectSearcher : WorldObjectSearcherBase> { - uint32 i_mapTypeMask; - uint32 i_phaseMask; - WorldObject* &i_object; - Check &i_check; - - WorldObjectLastSearcher(WorldObject const* searcher, WorldObject* & result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } - - void Visit(GameObjectMapType &m); - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - void Visit(CorpseMapType &m); - void Visit(DynamicObjectMapType &m); - - template void Visit(GridRefManager &) { } + WorldObjectSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : WorldObjectSearcherBase>(searcher->GetPhaseMask(), result, check, mapTypeMask) { } }; template - struct WorldObjectListSearcher : ContainerInserter + struct WorldObjectLastSearcher : WorldObjectSearcherBase> { - uint32 i_mapTypeMask; - uint32 i_phaseMask; - Check& i_check; + WorldObjectLastSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : WorldObjectSearcherBase>(searcher->GetPhaseMask(), result, check, mapTypeMask) { } + }; + template + struct WorldObjectListSearcher : WorldObjectSearcherBase> + { template - WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : ContainerInserter(container), - i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - void Visit(CorpseMapType &m); - void Visit(GameObjectMapType &m); - void Visit(DynamicObjectMapType &m); - - template void Visit(GridRefManager &) { } + WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : WorldObjectSearcherBase>(searcher->GetPhaseMask(), container, check, mapTypeMask) { } }; template @@ -289,100 +322,55 @@ namespace Trinity WorldObjectWorker(WorldObject const* searcher, Do const& _do, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_do(_do) { } - void Visit(GameObjectMapType &m) - { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) - return; - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - i_do(itr->GetSource()); - } - - void Visit(PlayerMapType &m) - { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER)) - return; - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - i_do(itr->GetSource()); - } - void Visit(CreatureMapType &m) - { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CREATURE)) - return; - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - i_do(itr->GetSource()); - } - - void Visit(CorpseMapType &m) + template + void Visit(GridRefManager& m) { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CORPSE)) + if (!(i_mapTypeMask & GridMapTypeMaskForType::value)) return; - for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (auto itr = m.begin(); itr != m.end(); ++itr) if (itr->GetSource()->InSamePhase(i_phaseMask)) i_do(itr->GetSource()); } - - void Visit(DynamicObjectMapType &m) - { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_DYNAMICOBJECT)) - return; - for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - i_do(itr->GetSource()); - } - - template void Visit(GridRefManager &) { } }; // Gameobject searchers - template - struct GameObjectSearcher + template + struct GameObjectSearcherBase : Result { uint32 i_phaseMask; - GameObject* &i_object; Check &i_check; - GameObjectSearcher(WorldObject const* searcher, GameObject* & result, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + template + GameObjectSearcherBase(uint32 phaseMask, Container& result, Check& check) + : Result(result), i_phaseMask(phaseMask), i_check(check) { } - void Visit(GameObjectMapType &m); + void Visit(GameObjectMapType& m); template void Visit(GridRefManager &) { } }; - // Last accepted by Check GO if any (Check can change requirements at each call) template - struct GameObjectLastSearcher + struct GameObjectSearcher : GameObjectSearcherBase> { - uint32 i_phaseMask; - GameObject* &i_object; - Check& i_check; - - GameObjectLastSearcher(WorldObject const* searcher, GameObject* & result, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } - - void Visit(GameObjectMapType &m); - - template void Visit(GridRefManager &) { } + GameObjectSearcher(WorldObject const* searcher, GameObject*& result, Check& check) + : GameObjectSearcherBase>(searcher->GetPhaseMask(), result, check) { } }; + // Last accepted by Check GO if any (Check can change requirements at each call) template - struct GameObjectListSearcher : ContainerInserter + struct GameObjectLastSearcher : GameObjectSearcherBase> { - uint32 i_phaseMask; - Check& i_check; + GameObjectLastSearcher(WorldObject const* searcher, GameObject*& result, Check& check) + : GameObjectSearcherBase>(searcher->GetPhaseMask(), result, check) { } + }; + template + struct GameObjectListSearcher : GameObjectSearcherBase> + { template - GameObjectListSearcher(WorldObject const* searcher, Container& container, Check & check) - : ContainerInserter(container), - i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - void Visit(GameObjectMapType &m); - - template void Visit(GridRefManager &) { } + GameObjectListSearcher(WorldObject const* searcher, Container& container, Check& check) + : GameObjectSearcherBase>(searcher->GetPhaseMask(), container, check) { } }; template @@ -407,105 +395,88 @@ namespace Trinity // Unit searchers - // First accepted by Check Unit if any - template - struct UnitSearcher + template + struct UnitSearcherBase : Result { uint32 i_phaseMask; - Unit* &i_object; - Check & i_check; + Check& i_check; - UnitSearcher(WorldObject const* searcher, Unit* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + template + UnitSearcherBase(uint32 phaseMask, Container& result, Check& check) + : Result(result), i_phaseMask(phaseMask), i_check(check) { } - void Visit(CreatureMapType &m); - void Visit(PlayerMapType &m); + void Visit(CreatureMapType& m) { VisitImpl(m); } + void Visit(PlayerMapType& m) { VisitImpl(m); } - template void Visit(GridRefManager &) { } + template void Visit(GridRefManager&) { } + + private: + template void VisitImpl(GridRefManager& m); }; - // Last accepted by Check Unit if any (Check can change requirements at each call) + // First accepted by Check Unit if any template - struct UnitLastSearcher + struct UnitSearcher : UnitSearcherBase> { - uint32 i_phaseMask; - Unit* &i_object; - Check & i_check; - - UnitLastSearcher(WorldObject const* searcher, Unit* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } - - void Visit(CreatureMapType &m); - void Visit(PlayerMapType &m); + UnitSearcher(WorldObject const* searcher, Unit*& result, Check& check) + : UnitSearcherBase>(searcher->GetPhaseMask(), result, check) { } + }; - template void Visit(GridRefManager &) { } + // Last accepted by Check Unit if any (Check can change requirements at each call) + template + struct UnitLastSearcher : UnitSearcherBase> + { + UnitLastSearcher(WorldObject const* searcher, Unit*& result, Check& check) + : UnitSearcherBase>(searcher->GetPhaseMask(), result, check) { } }; // All accepted by Check units if any template - struct UnitListSearcher : ContainerInserter + struct UnitListSearcher : UnitSearcherBase> { - uint32 i_phaseMask; - Check& i_check; - template UnitListSearcher(WorldObject const* searcher, Container& container, Check& check) - : ContainerInserter(container), - i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } + : UnitSearcherBase>(searcher->GetPhaseMask(), container, check) { } }; // Creature searchers - template - struct CreatureSearcher + template + struct CreatureSearcherBase : Result { uint32 i_phaseMask; - Creature* &i_object; - Check & i_check; + Check& i_check; - CreatureSearcher(WorldObject const* searcher, Creature* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + template + CreatureSearcherBase(uint32 phaseMask, Container& result, Check& check) + : Result(result), i_phaseMask(phaseMask), i_check(check) { } - void Visit(CreatureMapType &m); + void Visit(CreatureMapType& m); template void Visit(GridRefManager &) { } }; - // Last accepted by Check Creature if any (Check can change requirements at each call) template - struct CreatureLastSearcher + struct CreatureSearcher : CreatureSearcherBase> { - uint32 i_phaseMask; - Creature* &i_object; - Check & i_check; - - CreatureLastSearcher(WorldObject const* searcher, Creature* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } - - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } + CreatureSearcher(WorldObject const* searcher, Creature*& result, Check& check) + : CreatureSearcherBase>(searcher->GetPhaseMask(), result, check) { } }; + // Last accepted by Check Creature if any (Check can change requirements at each call) template - struct CreatureListSearcher : ContainerInserter + struct CreatureLastSearcher : CreatureSearcherBase> { - uint32 i_phaseMask; - Check& i_check; + CreatureLastSearcher(WorldObject const* searcher, Creature*& result, Check& check) + : CreatureSearcherBase>(searcher->GetPhaseMask(), result, check) { } + }; + template + struct CreatureListSearcher : CreatureSearcherBase> + { template CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check) - : ContainerInserter(container), - i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } + : CreatureSearcherBase>(searcher->GetPhaseMask(), container, check) { } }; template @@ -529,56 +500,45 @@ namespace Trinity // Player searchers - template - struct PlayerSearcher + template + struct PlayerSearcherBase : Result { uint32 i_phaseMask; - Player* &i_object; - Check & i_check; + Check& i_check; - PlayerSearcher(WorldObject const* searcher, Player* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + template + PlayerSearcherBase(uint32 phaseMask, Container& result, Check& check) + : Result(result), i_phaseMask(phaseMask), i_check(check) { } - void Visit(PlayerMapType &m); + void Visit(PlayerMapType& m); template void Visit(GridRefManager &) { } }; template - struct PlayerListSearcher : ContainerInserter + struct PlayerSearcher : PlayerSearcherBase> { - uint32 i_phaseMask; - Check& i_check; - - template - PlayerListSearcher(WorldObject const* searcher, Container& container, Check & check) - : ContainerInserter(container), - i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - template - PlayerListSearcher(uint32 phaseMask, Container& container, Check & check) - : ContainerInserter(container), - i_phaseMask(phaseMask), i_check(check) { } - - void Visit(PlayerMapType &m); - - template void Visit(GridRefManager &) { } + PlayerSearcher(WorldObject const* searcher, Player*& result, Check& check) + : PlayerSearcherBase>(searcher->GetPhaseMask(), result, check) { } }; template - struct PlayerLastSearcher + struct PlayerLastSearcher : PlayerSearcherBase> { - uint32 i_phaseMask; - Player* &i_object; - Check& i_check; - - PlayerLastSearcher(WorldObject const* searcher, Player*& result, Check& check) : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) - { - } + PlayerLastSearcher(WorldObject const* searcher, Player*& result, Check& check) + : PlayerSearcherBase>(searcher->GetPhaseMask(), result, check) { } + }; - void Visit(PlayerMapType& m); + template + struct PlayerListSearcher : PlayerSearcherBase> + { + template + PlayerListSearcher(WorldObject const* searcher, Container& container, Check& check) + : PlayerSearcherBase>(searcher->GetPhaseMask(), container, check) { } - template void Visit(GridRefManager &) { } + template + PlayerListSearcher(uint32 phaseMask, Container& container, Check& check) + : PlayerSearcherBase>(phaseMask, container, check) { } }; template @@ -622,6 +582,44 @@ namespace Trinity // CHECKS && DO classes + // CHECK modifiers + class InRangeCheckCustomizer + { + public: + explicit InRangeCheckCustomizer(WorldObject const& obj, float range) : i_obj(obj), i_range(range) { } + + bool Test(WorldObject const* o) const + { + return i_obj.IsWithinDist(o, i_range); + } + + void Update(WorldObject const* /*o*/) { } + + private: + WorldObject const& i_obj; + float i_range; + }; + + class NearestCheckCustomizer + { + public: + explicit NearestCheckCustomizer(WorldObject const& obj, float range) : i_obj(obj), i_range(range) { } + + bool Test(WorldObject const* o) const + { + return i_obj.IsWithinDistInMap(o, i_range); + } + + void Update(WorldObject const* o) + { + i_range = i_obj.GetDistance(o); + } + + private: + WorldObject const& i_obj; + float i_range; + }; + // WorldObject check classes class TC_GAME_API AnyDeadUnitObjectInRangeCheck @@ -1375,7 +1373,12 @@ namespace Trinity bool operator()(Creature* u) { - if (u->getDeathState() != DEAD && u->GetEntry() == i_entry && u->IsAlive() == i_alive && u->GetGUID() != i_obj.GetGUID() && i_obj.IsWithinDistInMap(u, i_range)) + if (u->getDeathState() != DEAD + && u->GetEntry() == i_entry + && u->IsAlive() == i_alive + && u->GetGUID() != i_obj.GetGUID() + && i_obj.IsWithinDistInMap(u, i_range) + && u->CheckPrivateObjectOwnerVisibility(&i_obj)) { i_range = i_obj.GetDistance(u); // use found unit range as new range limit for next check return true; @@ -1393,6 +1396,114 @@ namespace Trinity NearestCreatureEntryWithLiveStateInObjectRangeCheck(NearestCreatureEntryWithLiveStateInObjectRangeCheck const&) = delete; }; + template + class CreatureWithOptionsInObjectRangeCheck + { + public: + CreatureWithOptionsInObjectRangeCheck(WorldObject const& obj, Customizer& customizer, FindCreatureOptions const& args) + : i_obj(obj), i_args(args), i_customizer(customizer) { } + + bool operator()(Creature const* u) const + { + if (u->getDeathState() == DEAD) // Despawned + return false; + + if (u->GetGUID() == i_obj.GetGUID()) + return false; + + if (!i_customizer.Test(u)) + return false; + + if (i_args.CreatureId && u->GetEntry() != i_args.CreatureId) + return false; + + if (i_args.StringId && !u->HasStringId(*i_args.StringId)) + return false; + + if (i_args.IsAlive.has_value() && u->IsAlive() != i_args.IsAlive) + return false; + + if (i_args.IsSummon.has_value() && u->IsSummon() != i_args.IsSummon) + return false; + + if (i_args.IsInCombat.has_value() && u->IsInCombat() != i_args.IsInCombat) + return false; + + if ((i_args.OwnerGuid && u->GetOwnerGUID() != i_args.OwnerGuid) + || (i_args.CharmerGuid && u->GetCharmerGUID() != i_args.CharmerGuid) + || (i_args.CreatorGuid && u->GetCreatorGUID() != i_args.CreatorGuid) + || (i_args.PrivateObjectOwnerGuid && u->GetPrivateObjectOwner() != i_args.PrivateObjectOwnerGuid)) + return false; + + if (i_args.IgnorePrivateObjects && u->IsPrivateObject()) + return false; + + if (i_args.IgnoreNotOwnedPrivateObjects && !u->CheckPrivateObjectOwnerVisibility(&i_obj)) + return false; + + if (i_args.AuraSpellId && !u->HasAura(*i_args.AuraSpellId)) + return false; + + i_customizer.Update(u); + return true; + } + + private: + WorldObject const& i_obj; + FindCreatureOptions const& i_args; + Customizer& i_customizer; + }; + + template + class GameObjectWithOptionsInObjectRangeCheck + { + public: + GameObjectWithOptionsInObjectRangeCheck(WorldObject const& obj, Customizer& customizer, FindGameObjectOptions const& args) + : i_obj(obj), i_args(args), i_customizer(customizer) { } + + bool operator()(GameObject const* go) const + { + if (i_args.IsSpawned.has_value() && i_args.IsSpawned != go->isSpawned()) // Despawned + return false; + + if (go->GetGUID() == i_obj.GetGUID()) + return false; + + if (!i_customizer.Test(go)) + return false; + + if (i_args.GameObjectId && go->GetEntry() != i_args.GameObjectId) + return false; + + if (i_args.StringId && !go->HasStringId(*i_args.StringId)) + return false; + + if (i_args.IsSummon.has_value() && (go->GetSpawnId() == 0) != i_args.IsSummon) + return false; + + if ((i_args.OwnerGuid && go->GetOwnerGUID() != i_args.OwnerGuid) + || (i_args.PrivateObjectOwnerGuid && go->GetPrivateObjectOwner() != i_args.PrivateObjectOwnerGuid)) + return false; + + if (i_args.IgnorePrivateObjects && go->IsPrivateObject()) + return false; + + if (i_args.IgnoreNotOwnedPrivateObjects && !go->CheckPrivateObjectOwnerVisibility(&i_obj)) + return false; + + if (i_args.GameObjectType && go->GetGoType() != i_args.GameObjectType) + return false; + + i_customizer.Update(go); + return true; + } + + private: + WorldObject const& i_obj; + FindGameObjectOptions const& i_args; + Customizer& i_customizer; + }; + class AnyPlayerInObjectRangeCheck { public: diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index 5c2d958ed2c..2a852b6c046 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -41,469 +41,118 @@ inline void Trinity::VisibleNotifier::Visit(GridRefManager &m) // WorldObject searchers & workers -template -void Trinity::WorldObjectSearcher::Visit(GameObjectMapType &m) +template +template +void Trinity::WorldObjectSearcherBase::Visit(GridRefManager& m) { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) + if (!(i_mapTypeMask & GridMapTypeMaskForType::value)) return; - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} - -template -void Trinity::WorldObjectSearcher::Visit(PlayerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER)) - return; - - // already found - if (i_object) - return; - - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; + this->Insert(ref.GetSource()); - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; } } } -template -void Trinity::WorldObjectSearcher::Visit(CreatureMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CREATURE)) - return; - - // already found - if (i_object) - return; - - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template -void Trinity::WorldObjectSearcher::Visit(CorpseMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CORPSE)) - return; - - // already found - if (i_object) - return; - - for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template -void Trinity::WorldObjectSearcher::Visit(DynamicObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_DYNAMICOBJECT)) - return; - - // already found - if (i_object) - return; - - for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template -void Trinity::WorldObjectLastSearcher::Visit(GameObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) - return; - - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::WorldObjectLastSearcher::Visit(PlayerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER)) - return; - - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::WorldObjectLastSearcher::Visit(CreatureMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CREATURE)) - return; - - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::WorldObjectLastSearcher::Visit(CorpseMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CORPSE)) - return; - - for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::WorldObjectLastSearcher::Visit(DynamicObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_DYNAMICOBJECT)) - return; - - for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::WorldObjectListSearcher::Visit(PlayerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER)) - return; - - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::WorldObjectListSearcher::Visit(CreatureMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CREATURE)) - return; - - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::WorldObjectListSearcher::Visit(CorpseMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CORPSE)) - return; - - for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::WorldObjectListSearcher::Visit(GameObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) - return; - - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::WorldObjectListSearcher::Visit(DynamicObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_DYNAMICOBJECT)) - return; - - for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - // Gameobject searchers -template -void Trinity::GameObjectSearcher::Visit(GameObjectMapType &m) +template +void Trinity::GameObjectSearcherBase::Visit(GameObjectMapType& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) + if (!ref.GetSource()->InSamePhase(i_phaseMask)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} + this->Insert(ref.GetSource()); -template -void Trinity::GameObjectLastSearcher::Visit(GameObjectMapType &m) -{ - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; + } } } -template -void Trinity::GameObjectListSearcher::Visit(GameObjectMapType &m) -{ - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - // Unit searchers -template -void Trinity::UnitSearcher::Visit(CreatureMapType &m) +template +template +void Trinity::UnitSearcherBase::VisitImpl(GridRefManager& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) + if (!ref.GetSource()->InSamePhase(i_phaseMask)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} - -template -void Trinity::UnitSearcher::Visit(PlayerMapType &m) -{ - // already found - if (i_object) - return; - - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; + this->Insert(ref.GetSource()); - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; } } } -template -void Trinity::UnitLastSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::UnitLastSearcher::Visit(PlayerMapType &m) -{ - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::UnitListSearcher::Visit(PlayerMapType &m) -{ - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::UnitListSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - // Creature searchers -template -void Trinity::CreatureSearcher::Visit(CreatureMapType &m) +template +void Trinity::CreatureSearcherBase::Visit(CreatureMapType& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) + if (!ref.GetSource()->InSamePhase(i_phaseMask)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} - -template -void Trinity::CreatureLastSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; + this->Insert(ref.GetSource()); - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; + } } } -template -void Trinity::CreatureListSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} +// Player searchers -template -void Trinity::PlayerListSearcher::Visit(PlayerMapType &m) +template +void Trinity::PlayerSearcherBase::Visit(PlayerMapType& m) { - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::PlayerSearcher::Visit(PlayerMapType &m) -{ - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) + if (!ref.GetSource()->InSamePhase(i_phaseMask)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} + this->Insert(ref.GetSource()); -template -void Trinity::PlayerLastSearcher::Visit(PlayerMapType& m) -{ - for (PlayerMapType::iterator itr = m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; + } } } diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index e3b870cba51..dd49abd092a 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -467,18 +467,15 @@ bool Group::AddMember(Player* player) player->ResetInstances(INSTANCE_RESET_GROUP_JOIN, false); player->ResetInstances(INSTANCE_RESET_GROUP_JOIN, true); - if (player->GetLevel() >= LEVELREQUIREMENT_HEROIC) + if (player->GetDungeonDifficulty() != GetDungeonDifficulty()) { - if (player->GetDungeonDifficulty() != GetDungeonDifficulty()) - { - player->SetDungeonDifficulty(GetDungeonDifficulty()); - player->SendDungeonDifficulty(true); - } - if (player->GetRaidDifficulty() != GetRaidDifficulty()) - { - player->SetRaidDifficulty(GetRaidDifficulty()); - player->SendRaidDifficulty(true); - } + player->SetDungeonDifficulty(GetDungeonDifficulty()); + player->SendDungeonDifficulty(true); + } + if (player->GetRaidDifficulty() != GetRaidDifficulty()) + { + player->SetRaidDifficulty(GetRaidDifficulty()); + player->SendRaidDifficulty(true); } } player->SetGroupUpdateFlag(GROUP_UPDATE_FULL); @@ -2013,8 +2010,10 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed) } } -GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 /*MaxPlayerCount*/, bool isRated, uint32 arenaSlot) +GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 /*MaxPlayerCount*/, bool isRated, uint32 arenaSlot, ObjectGuid& errorGuid) const { + errorGuid = ObjectGuid::Empty; + // check if this group is LFG group if (isLFGGroup()) return ERR_LFG_CANT_USE_BATTLEGROUND; @@ -2042,16 +2041,15 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* uint32 arenaTeamId = reference->GetArenaTeamId(arenaSlot); uint32 team = reference->GetTeam(); - BattlegroundQueueTypeId bgQueueTypeIdRandom = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_RB, 0); - // check every member of the group to be able to join memberscount = 0; - for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next(), ++memberscount) + for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next(), ++memberscount) { Player* member = itr->GetSource(); // offline member? don't let join if (!member) return ERR_BATTLEGROUND_JOIN_FAILED; + errorGuid = member->GetGUID(); // rbac permissions if (!member->CanJoinToBattleground(bgOrTemplate)) return ERR_BATTLEGROUND_JOIN_TIMED_OUT; @@ -2069,7 +2067,8 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* if (member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId)) return ERR_BATTLEGROUND_JOIN_FAILED; // not blizz-like // don't let join if someone from the group is in bg queue random - if (bgOrTemplate->GetTypeID() != BATTLEGROUND_AA && member->InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeIdRandom)) + bool isInRandomBgQueue = member->InBattlegroundQueueForBattlegroundQueueType(BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_RB, memberBracketEntry->GetBracketId(), 0)); + if (bgOrTemplate->GetTypeID() != BATTLEGROUND_AA && isInRandomBgQueue) return ERR_IN_RANDOM_BG; // don't let join to bg queue random if someone from the group is already in bg queue if (bgOrTemplate->GetTypeID() == BATTLEGROUND_RB && member->InBattlegroundQueue(true)) @@ -2088,6 +2087,8 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* return ERR_BATTLEGROUND_JOIN_FAILED; } + errorGuid = ObjectGuid::Empty; + // only check for MinPlayerCount since MinPlayerCount == MaxPlayerCount for arenas... if (bgOrTemplate->isArena() && memberscount != MinPlayerCount) return ERR_ARENA_TEAM_PARTY_SIZE; diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index f03a2fc44fa..8c43bba5301 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -257,7 +257,7 @@ class TC_GAME_API Group void SetBattlegroundGroup(Battleground* bg); void SetBattlefieldGroup(Battlefield* bf); - GroupJoinBattlegroundResult CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot); + GroupJoinBattlegroundResult CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot, ObjectGuid& errorGuid) const; void ChangeMembersGroup(ObjectGuid guid, uint8 group); void SetTargetIcon(uint8 id, ObjectGuid whoGuid, ObjectGuid targetGuid); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index d548d226bfb..5864e8c4d14 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -581,7 +581,7 @@ void Guild::Member::ChangeRank(CharacterDatabaseTransaction trans, uint8 newRank // Update rank information in player's field, if he is online. if (Player* player = FindConnectedPlayer()) - player->SetRank(newRank); + player->SetGuildRank(newRank); CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_MEMBER_RANK); stmt->setUInt8 (0, newRank); @@ -796,13 +796,13 @@ bool Guild::PlayerMoveItemData::InitItem() // Anti-WPE protection. Do not move non-empty bags to bank. if (m_pItem->IsNotEmptyBag()) { - m_pPlayer->SendEquipError(EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, m_pItem); + m_pPlayer->SendEquipError(EQUIP_ERR_DESTROY_NONEMPTY_BAG, m_pItem); m_pItem = nullptr; } // Bound items cannot be put into bank. else if (!m_pItem->CanBeTraded()) { - m_pPlayer->SendEquipError(EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, m_pItem); + m_pPlayer->SendEquipError(EQUIP_ERR_CANT_SWAP, m_pItem); m_pItem = nullptr; } } @@ -1029,11 +1029,11 @@ InventoryResult Guild::BankMoveItemData::CanStore(Item* pItem, bool swap) uint32 count = pItem->GetCount(); // Soulbound items cannot be moved if (pItem->IsSoulBound()) - return EQUIP_ERR_CANT_DROP_SOULBOUND; + return EQUIP_ERR_DROP_BOUND_ITEM; // Make sure destination bank tab exists if (m_container >= m_pGuild->_GetPurchasedTabsSize()) - return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; + return EQUIP_ERR_WRONG_BAG_TYPE; // Slot explicitely specified. Check it. if (m_slotId != NULL_SLOT) @@ -1044,7 +1044,7 @@ InventoryResult Guild::BankMoveItemData::CanStore(Item* pItem, bool swap) pItemDest = nullptr; if (!_ReserveSpace(m_slotId, pItem, pItemDest, count)) - return EQUIP_ERR_ITEM_CANT_STACK; + return EQUIP_ERR_CANT_STACK; if (count == 0) return EQUIP_ERR_OK; @@ -1398,17 +1398,17 @@ void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, std::to_string(tabId), tab->GetName(), tab->GetIcon()); } -void Guild::HandleSetMemberNote(WorldSession* session, std::string_view name, std::string_view note, bool officer) +void Guild::HandleSetMemberNote(WorldSession* session, std::string_view note, std::string_view name, bool isPublic) { // Player must have rights to set public/officer note - if (!_HasRankRight(session->GetPlayer(), officer ? GR_RIGHT_EOFFNOTE : GR_RIGHT_EPNOTE)) + if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE)) SendCommandResult(session, GUILD_COMMAND_PUBLIC_NOTE, ERR_GUILD_PERMISSIONS); else if (Member* member = GetMember(name)) { - if (officer) - member->SetOfficerNote(note); - else + if (isPublic) member->SetPublicNote(note); + else + member->SetOfficerNote(note); HandleRoster(session); } @@ -1579,12 +1579,12 @@ void Guild::HandleRemoveMember(WorldSession* session, std::string_view name) else { ObjectGuid guid = member->GetGUID(); + _LogEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, player->GetGUID().GetCounter(), guid.GetCounter()); + _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, name, player->GetName()); // After call to DeleteMember pointer to member becomes invalid CharacterDatabaseTransaction trans(nullptr); DeleteMember(trans, guid, false, true); - _LogEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, player->GetGUID().GetCounter(), guid.GetCounter()); - _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, name, player->GetName()); } } } @@ -1676,7 +1676,7 @@ void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId) stmt->setUInt8(1, rankId); CharacterDatabase.Execute(stmt); // Delete rank - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_LOWEST_RANK); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANK); stmt->setUInt32(0, m_id); stmt->setUInt8(1, rankId); CharacterDatabase.Execute(stmt); @@ -1835,12 +1835,7 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const void Guild::SendBankTabData(WorldSession* session, uint8 tabId, bool sendAllSlots) const { if (tabId < _GetPurchasedTabsSize()) - _SendBankContent(session, tabId, sendAllSlots); -} - -void Guild::SendBankTabsInfo(WorldSession* session, bool sendAllSlots /*= false*/) const -{ - _SendBankList(session, 0, sendAllSlots); + SendBankList(session, tabId, sendAllSlots); } void Guild::SendBankTabText(WorldSession* session, uint8 tabId) const @@ -1897,7 +1892,7 @@ void Guild::SendLoginInfo(WorldSession* session) TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [{}] MOTD", session->GetPlayerInfo()); - SendBankTabsInfo(session); + SendBankList(session); Player* player = session->GetPlayer(); @@ -2218,7 +2213,7 @@ bool Guild::AddMember(CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 { player->SetInGuild(m_id); player->SetGuildIdInvited(0); - player->SetRank(rankId); + player->SetGuildRank(rankId); member.SetStats(player); SendLoginInfo(player->GetSession()); name = player->GetName(); @@ -2294,7 +2289,7 @@ bool Guild::DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bo // If player not online data in data field will be loaded from guild tabs no need to update it !! if (Player* newLeaderPlayer = newLeader->FindPlayer()) - newLeaderPlayer->SetRank(GR_GUILDMASTER); + newLeaderPlayer->SetGuildRank(GR_GUILDMASTER); // If leader does not exist (at guild loading with deleted leader) do not send broadcasts if (oldLeader) @@ -2312,7 +2307,7 @@ bool Guild::DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bo if (player) { player->SetInGuild(0); - player->SetRank(0); + player->SetGuildRank(0); } else sCharacterCache->UpdateCharacterGuildId(guid, 0); @@ -2788,20 +2783,6 @@ bool Guild::_DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError return true; } -void Guild::_SendBankContent(WorldSession* session, uint8 tabId, bool sendAllSlots) const -{ - ObjectGuid guid = session->GetPlayer()->GetGUID(); - if (!_MemberHasTabRights(guid, tabId, GUILD_BANK_RIGHT_VIEW_TAB)) - return; - - _SendBankList(session, tabId, sendAllSlots); -} - -void Guild::_SendBankMoneyUpdate(WorldSession* session) const -{ - _SendBankList(session); -} - void Guild::_SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const { ASSERT(pSrc->IsBank() || pDest->IsBank()); @@ -2836,7 +2817,7 @@ void Guild::_SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) cons void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const { - _SendBankList(nullptr, tabId, false, &slots); + SendBankList(nullptr, tabId, false, &slots); } void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, @@ -2865,15 +2846,15 @@ void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: {} ({})", GetGuildEventString(guildEvent), guildEvent); } -void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= 0*/, bool sendAllSlots /*= false*/, SlotIds *slots /*= nullptr*/) const +void Guild::SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= 0*/, bool fullUpdate /*= false*/, SlotIds *slots /*= nullptr*/) const { WorldPackets::Guild::GuildBankQueryResults packet; packet.Money = m_bankMoney; packet.Tab = int32(tabId); - packet.FullUpdate = sendAllSlots; + packet.FullUpdate = fullUpdate; - if (sendAllSlots && !tabId) + if (fullUpdate && !tabId) { packet.TabInfo.reserve(_GetPurchasedTabsSize()); for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i) @@ -2885,55 +2866,58 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= } } - if (BankTab const* tab = GetBankTab(tabId)) + if (!session || _MemberHasTabRights(session->GetPlayer()->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB)) { - auto fillItems = [&](auto begin, auto end, bool skipEmpty) + if (BankTab const* tab = GetBankTab(tabId)) { - for (auto itr = begin; itr != end; ++itr) + auto fillItems = [&](auto begin, auto end, bool skipEmpty) { - if (Item* tabItem = tab->GetItem(*itr)) + for (auto itr = begin; itr != end; ++itr) { - WorldPackets::Guild::GuildBankItemInfo itemInfo; - - itemInfo.Slot = *itr; - itemInfo.ItemID = tabItem->GetEntry(); - itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId(); - itemInfo.RandomPropertiesSeed = tabItem->GetItemSuffixFactor(); - itemInfo.Count = int32(tabItem->GetCount()); - itemInfo.Charges = int32(abs(tabItem->GetSpellCharges())); - itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); - itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS); - - for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot) + if (Item* tabItem = tab->GetItem(*itr)) { - if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot))) + WorldPackets::Guild::GuildBankItemInfo itemInfo; + + itemInfo.Slot = *itr; + itemInfo.ItemID = tabItem->GetEntry(); + itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId(); + itemInfo.RandomPropertiesSeed = tabItem->GetItemSuffixFactor(); + itemInfo.Count = int32(tabItem->GetCount()); + itemInfo.Charges = int32(abs(tabItem->GetSpellCharges())); + itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); + itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS); + + for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot) { - WorldPackets::Guild::GuildBankSocketEnchant gem; - gem.SocketIndex = socketSlot; - gem.SocketEnchantID = int32(enchId); - itemInfo.SocketEnchant.push_back(gem); + if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot))) + { + WorldPackets::Guild::GuildBankSocketEnchant gem; + gem.SocketIndex = socketSlot; + gem.SocketEnchantID = int32(enchId); + itemInfo.SocketEnchant.push_back(gem); + } } - } - packet.ItemInfo.push_back(itemInfo); - } - else if (!skipEmpty) - { - WorldPackets::Guild::GuildBankItemInfo itemInfo; + packet.ItemInfo.push_back(itemInfo); + } + else if (!skipEmpty) + { + WorldPackets::Guild::GuildBankItemInfo itemInfo; - itemInfo.Slot = *itr; - itemInfo.ItemID = 0; + itemInfo.Slot = *itr; + itemInfo.ItemID = 0; - packet.ItemInfo.push_back(itemInfo); + packet.ItemInfo.push_back(itemInfo); + } } - } - }; + }; - if (sendAllSlots) - fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true); - else if (slots && !slots->empty()) - fillItems(slots->begin(), slots->end(), false); + if (fullUpdate) + fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true); + else if (slots && !slots->empty()) + fillItems(slots->begin(), slots->end(), false); + } } if (session) @@ -2943,7 +2927,7 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= session->SendPacket(packet.Write()); TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}", - session->GetPlayerInfo(), tabId, sendAllSlots, packet.WithdrawalsRemaining); + session->GetPlayerInfo(), tabId, fullUpdate, packet.WithdrawalsRemaining); } else /// @todo - Probably this is just sent to session + those that have sent CMSG_GUILD_BANKER_ACTIVATE { @@ -2959,7 +2943,7 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*= packet.SetWithdrawalsRemaining(_GetMemberRemainingSlots(member, tabId)); player->SendDirectMessage(packet.GetRawPacket()); TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}" - , player->GetName(), tabId, sendAllSlots, packet.WithdrawalsRemaining); + , player->GetName(), tabId, fullUpdate, packet.WithdrawalsRemaining); } } } diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index c83b2233404..5e93660f877 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -313,8 +313,8 @@ class TC_GAME_API Guild std::string GetPublicNote() const { return m_publicNote; } std::string GetOfficerNote() const { return m_officerNote; } uint8 GetClass() const { return m_class; } - uint8 GetLevel() const { return m_level; } uint8 GetGender() const { return m_gender; } + uint8 GetLevel() const { return m_level; } uint8 GetFlags() const { return m_flags; } uint32 GetZoneId() const { return m_zoneId; } bool IsOnline() const { return (m_flags & GUILDMEMBER_STATUS_ONLINE); } @@ -501,7 +501,6 @@ class TC_GAME_API Guild private: ObjectGuid::LowType m_guildId; - uint8 m_rankId; std::string m_name; uint32 m_rights; @@ -655,7 +654,7 @@ class TC_GAME_API Guild void HandleSetEmblem(WorldSession* session, EmblemInfo const& emblemInfo); void HandleSetLeader(WorldSession* session, std::string_view name); void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string_view name, std::string_view icon); - void HandleSetMemberNote(WorldSession* session, std::string_view name, std::string_view note, bool officer); + void HandleSetMemberNote(WorldSession* session, std::string_view note, std::string_view name, bool isPublic); void HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string_view name, uint32 rights, uint32 moneyPerDay, std::array const& rightsAndSlots); void HandleBuyBankTab(WorldSession* session, uint8 tabId); void HandleInviteMember(WorldSession* session, std::string_view name); @@ -678,7 +677,7 @@ class TC_GAME_API Guild void SendInfo(WorldSession* session) const; void SendEventLog(WorldSession* session) const; void SendBankLog(WorldSession* session, uint8 tabId) const; - void SendBankTabsInfo(WorldSession* session, bool showTabs = false) const; + void SendBankList(WorldSession* session = nullptr, uint8 tabId = 0, bool fullUpdate = false, SlotIds* slots = nullptr) const; void SendBankTabData(WorldSession* session, uint8 tabId, bool sendAllSlots) const; void SendBankTabText(WorldSession* session, uint8 tabId) const; void SendPermissions(WorldSession* session) const; @@ -718,6 +717,7 @@ class TC_GAME_API Guild bool DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bool isDisbanding = false, bool isKicked = false); bool ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 newRank); bool IsMember(ObjectGuid guid) const; + uint32 GetMembersCount() const { return uint32(m_members.size()); } uint64 GetMemberAvailableMoneyForRepairItems(ObjectGuid guid) const; // Bank @@ -727,6 +727,7 @@ class TC_GAME_API Guild // Bank tabs void SetBankTabText(uint8 tabId, std::string_view text); + EmblemInfo const& GetEmblemInfo() const { return m_emblemInfo; } void ResetTimes(); Trinity::unique_weak_ptr GetWeakPtr() const { return m_weakRef; } @@ -823,11 +824,8 @@ class TC_GAME_API Guild void _MoveItems(MoveItemData* pSrc, MoveItemData* pDest, uint32 splitedAmount); bool _DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError, uint32 splitedAmount = 0); - void _SendBankContent(WorldSession* session, uint8 tabId, bool sendAllSlots) const; - void _SendBankMoneyUpdate(WorldSession* session) const; void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const; void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const; - void _SendBankList(WorldSession* session = nullptr, uint8 tabId = 0, bool sendFullSlots = false, SlotIds* slots = nullptr) const; void _BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, Optional param1 = {}, Optional param2 = {}, Optional param3 = {}) const; }; diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp index 6a04bcce3f0..077a8e18805 100644 --- a/src/server/game/Handlers/ArenaTeamHandler.cpp +++ b/src/server/game/Handlers/ArenaTeamHandler.cpp @@ -234,8 +234,12 @@ void WorldSession::HandleArenaTeamLeaveOpcode(WorldPacket& recvData) } // Player cannot be removed during queues - if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, arenaTeam->GetType())) + for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { + BattlegroundQueueTypeId bgQueue = _player->GetBattlegroundQueueTypeId(i); + if (bgQueue.BattlemasterListId != BATTLEGROUND_AA || bgQueue.TeamSize != arenaTeam->GetType()) + continue; + GroupQueueInfo ginfo; BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue); if (queue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo)) @@ -277,8 +281,12 @@ void WorldSession::HandleArenaTeamDisbandOpcode(WorldPacket& recvData) return; // Teams cannot be disbanded during queues - if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, arenaTeam->GetType())) + for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { + BattlegroundQueueTypeId bgQueue = _player->GetBattlegroundQueueTypeId(i); + if (bgQueue.BattlemasterListId != BATTLEGROUND_AA || bgQueue.TeamSize != arenaTeam->GetType()) + continue; + GroupQueueInfo ginfo; BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue); if (queue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo)) @@ -336,8 +344,12 @@ void WorldSession::HandleArenaTeamRemoveOpcode(WorldPacket& recvData) } // Team cannot be removed during queues - if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, arenaTeam->GetType())) + for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { + BattlegroundQueueTypeId bgQueue = _player->GetBattlegroundQueueTypeId(i); + if (bgQueue.BattlemasterListId != BATTLEGROUND_AA || bgQueue.TeamSize != arenaTeam->GetType()) + continue; + GroupQueueInfo ginfo; BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue); if (queue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo)) @@ -403,7 +415,7 @@ void WorldSession::HandleArenaTeamLeaderOpcode(WorldPacket& recvData) void WorldSession::SendArenaTeamCommandResult(uint32 teamAction, const std::string& team, const std::string& player, uint32 errorId) { - WorldPacket data(SMSG_ARENA_TEAM_COMMAND_RESULT, 4+team.length()+1+player.length()+1+4); + WorldPacket data(SMSG_ARENA_TEAM_COMMAND_RESULT, 4 + team.length() + 1 + player.length() + 1 + 4); data << uint32(teamAction); data << team; data << player; @@ -413,10 +425,10 @@ void WorldSession::SendArenaTeamCommandResult(uint32 teamAction, const std::stri void WorldSession::SendNotInArenaTeamPacket(uint8 type) { - WorldPacket data(SMSG_ARENA_ERROR, 4+1); // 886 - You are not in a %uv%u arena team - uint32 unk = 0; - data << uint32(unk); // unk(0) - if (!unk) + WorldPacket data(SMSG_ARENA_ERROR, 4+1); + uint32 error = 0; + data << uint32(error); // 0 = ERR_ARENA_NO_TEAM_II, 1 = ERR_ARENA_EXPIRED_CAIS, 2 = ERR_LFG_CANT_USE_BATTLEGROUND + if (!error) data << uint8(type); // team type (2=2v2, 3=3v3, 5=5v5), can be used for custom types... SendPacket(&data); } diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index fd6bd6da091..b50b071b943 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -76,14 +76,31 @@ void WorldSession::SendAuctionHello(ObjectGuid guid, Unit const* unit) } //call this method when player bids, creates, or deletes auction -void WorldSession::SendAuctionCommandResult(uint32 auctionItemId, AuctionAction command, AuctionError errorCode, InventoryResult bagResult) +void WorldSession::SendAuctionCommandResult(AuctionEntry const* auction, AuctionAction command, AuctionError errorCode, InventoryResult bagResult) { - WorldPacket data(SMSG_AUCTION_COMMAND_RESULT, 16); - data << int32(auctionItemId); + WorldPacket data(SMSG_AUCTION_COMMAND_RESULT, 4 + 4 + 4 + 8 + 4 + 4); + data << int32(auction ? auction->Id : 0); data << int32(command); data << int32(errorCode); - if (errorCode == ERR_AUCTION_INVENTORY) - data << int32(bagResult); + + switch (errorCode) + { + case ERR_AUCTION_OK: + if (command == AUCTION_PLACE_BID) + data << uint32(auction->bid ? auction->GetAuctionOutBid() : 0); + break; + case ERR_AUCTION_INVENTORY: + data << uint32(bagResult); + break; + case ERR_AUCTION_HIGHER_BID: + data << uint64(auction->bidder); + data << uint32(auction->bid); + data << uint32(auction->bid ? auction->GetAuctionOutBid() : 0); + break; + default: + break; + } + SendPacket(&data); } @@ -115,6 +132,15 @@ void WorldSession::SendAuctionOwnerNotification(AuctionEntry* auction) SendPacket(&data); } +void WorldSession::SendAuctionRemovedNotification(uint32 auctionId, uint32 itemEntry, int32 randomPropertyId) +{ + WorldPacket data(SMSG_AUCTION_REMOVED_NOTIFICATION, (4+4+4)); + data << uint32(auctionId); + data << uint32(itemEntry); + data << uint32(randomPropertyId); + SendPacket(&data); +} + //this void creates new auction and adds auction to some auctionhouse void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) { @@ -129,7 +155,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (itemsCount > MAX_AUCTION_ITEMS) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); recvData.rfinish(); return; } @@ -156,7 +182,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (bid > MAX_MONEY_AMOUNT || buyout > MAX_MONEY_AMOUNT) { TC_LOG_DEBUG("network", "WORLD: HandleAuctionSellItem - Player {} {} attempted to sell item with higher price than max gold amount.", _player->GetName(), _player->GetGUID().ToString()); - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } @@ -200,7 +226,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!item) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_ITEM_NOT_FOUND); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_ITEM_NOT_FOUND); return; } @@ -211,7 +237,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) item->GetTemplate()->HasFlag(ITEM_FLAG_CONJURED) || item->GetUInt32Value(ITEM_FIELD_DURATION) || item->GetCount() < count[i] || itemEntry != item->GetTemplate()->ItemId) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } @@ -221,7 +247,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!finalCount) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } @@ -232,7 +258,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) { if (itemGUIDs[i] == itemGUIDs[j]) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } } @@ -244,7 +270,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (item->GetMaxStackCount() < finalCount) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } } @@ -257,7 +283,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) uint32 deposit = sAuctionMgr->GetAuctionDeposit(auctionHouseEntry, etime, item, finalCount); if (!_player->HasEnoughMoney(deposit)) { - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; } @@ -271,7 +297,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!auctioneerData) { TC_LOG_ERROR("misc", "Data for auctioneer not found ({})", auctioneer.ToString()); - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); delete AH; return; } @@ -280,7 +306,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!auctioneerInfo) { TC_LOG_ERROR("misc", "Non existing auctioneer ({})", auctioneer.ToString()); - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); delete AH; return; } @@ -319,7 +345,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) // Add to pending auctions, or fail with insufficient funds error if (!sAuctionMgr->PendingAuctionAdd(_player, AH)) { - SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); + SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; } @@ -335,7 +361,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) _player->SaveInventoryAndGoldToDB(trans); CharacterDatabase.CommitTransaction(trans); - SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, ERR_AUCTION_OK); + SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_OK); GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); } @@ -345,7 +371,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!newItem) { TC_LOG_ERROR("network", "CMSG_AUCTION_SELL_ITEM: Could not create clone of item {}", item->GetEntry()); - SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); delete AH; return; } @@ -377,7 +403,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) // Add to pending auctions, or fail with insufficient funds error if (!sAuctionMgr->PendingAuctionAdd(_player, AH)) { - SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); + SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; } @@ -417,7 +443,7 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) _player->SaveInventoryAndGoldToDB(trans); CharacterDatabase.CommitTransaction(trans); - SendAuctionCommandResult(AH->Id, AUCTION_SELL_ITEM, ERR_AUCTION_OK); + SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_OK); GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1); } @@ -456,7 +482,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) if (!auction || auction->owner == player->GetGUID().GetCounter()) { //you cannot bid your own auction: - SendAuctionCommandResult(0, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); + SendAuctionCommandResult(nullptr, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); return; } @@ -466,7 +492,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) if (!auction_owner && sCharacterCache->GetCharacterAccountIdByGuid(ownerGuid) == player->GetSession()->GetAccountId()) { //you cannot bid your another character auction: - SendAuctionCommandResult(0, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_BID_OWN); return; } @@ -478,14 +504,15 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) if ((price < auction->buyout || auction->buyout == 0) && price < auction->bid + auction->GetAuctionOutBid()) { - //auction has already higher bid, client tests it! + // client already test it but just in case ... + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_HIGHER_BID); return; } if (!player->HasEnoughMoney(price)) { - //you don't have enought money!, client tests! - //SendAuctionCommandResult(auction->auctionId, AUCTION_PLACE_BID, ???); + // client already test it but just in case ... + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; } @@ -533,7 +560,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) trans->Append(stmt); } - SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, ERR_AUCTION_OK); + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_OK); } else { @@ -560,7 +587,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) sAuctionMgr->SendAuctionSuccessfulMail(auction, trans); sAuctionMgr->SendAuctionWonMail(auction, trans); - SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, ERR_AUCTION_OK); + SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_OK); auction->DeleteFromDB(trans); @@ -608,8 +635,7 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket& recvData) uint32 auctionCut = auction->GetAuctionCut(); if (!player->HasEnoughMoney(auctionCut)) //player doesn't have enough money, maybe message needed return; - //some auctionBidderNotification would be needed, but don't know that parts.. - sAuctionMgr->SendAuctionCancelledToBidderMail(auction, trans); + sAuctionMgr->SendAuctionCancelledToBidderMail(auction, trans, pItem); player->ModifyMoney(-int32(auctionCut)); } @@ -621,20 +647,20 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket& recvData) else { TC_LOG_ERROR("network", "Auction id: {} got non existing item (item guid : {})!!!", auction->Id, auction->itemGUIDLow); - SendAuctionCommandResult(0, AUCTION_CANCEL, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(auction, AUCTION_CANCEL, ERR_AUCTION_DATABASE_ERROR); return; } } else { - SendAuctionCommandResult(0, AUCTION_CANCEL, ERR_AUCTION_DATABASE_ERROR); + SendAuctionCommandResult(nullptr, AUCTION_CANCEL, ERR_AUCTION_DATABASE_ERROR); //this code isn't possible ... maybe there should be assert TC_LOG_ERROR("entities.player.cheat", "CHEATER : {} tried to cancel auction (id: {}) of another player or auction is NULL", player->GetGUID().ToString(), auctionId); return; } //inform player, that auction is removed - SendAuctionCommandResult(auction->Id, AUCTION_CANCEL, ERR_AUCTION_OK); + SendAuctionCommandResult(auction, AUCTION_CANCEL, ERR_AUCTION_OK); // Now remove the auction @@ -788,7 +814,7 @@ void WorldSession::HandleAuctionListItems(WorldPacket& recvData) WorldPacket data(SMSG_AUCTION_LIST_RESULT, (4+4+4)); uint32 count = 0; uint32 totalcount = 0; - data << (uint32) 0; + data << uint32(0); // converting string that we try to find to lower case std::wstring wsearchedname; diff --git a/src/server/game/Handlers/BankHandler.cpp b/src/server/game/Handlers/BankHandler.cpp index 745f131b824..1c306cc6707 100644 --- a/src/server/game/Handlers/BankHandler.cpp +++ b/src/server/game/Handlers/BankHandler.cpp @@ -83,7 +83,7 @@ void WorldSession::HandleAutoBankItemOpcode(WorldPackets::Bank::AutoBankItem& pa if (dest.size() == 1 && dest[0].pos == item->GetPos()) { - _player->SendEquipError(EQUIP_ERR_NONE, item, nullptr); + _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, nullptr); return; } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 3facbdaa57d..81f3591dc98 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -18,8 +18,11 @@ #include "WorldSession.h" #include "ArenaTeam.h" #include "ArenaTeamMgr.h" +#include "Battlefield.h" +#include "BattlefieldMgr.h" #include "Battleground.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "Chat.h" #include "Common.h" #include "Creature.h" @@ -30,21 +33,15 @@ #include "Group.h" #include "Language.h" #include "Log.h" +#include "NPCPackets.h" #include "Object.h" #include "ObjectAccessor.h" -#include "ObjectMgr.h" -#include "Opcodes.h" #include "Player.h" #include "World.h" -#include "WorldPacket.h" -void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recvData) +void WorldSession::HandleBattlemasterHelloOpcode(WorldPackets::NPC::Hello& hello) { - ObjectGuid guid; - recvData >> guid; - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEMASTER_HELLO Message from {}", guid.ToString()); - - Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_BATTLEMASTER); + Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(hello.Unit, UNIT_NPC_FLAG_BATTLEMASTER); if (!unit) return; @@ -62,49 +59,25 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recvData) return; } - SendBattleGroundList(guid, bgTypeId); -} - -void WorldSession::SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId) -{ - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundListPacket(&data, guid, _player, bgTypeId, 0); - SendPacket(&data); + sBattlegroundMgr->SendBattlegroundList(_player, hello.Unit, bgTypeId); } -void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) +void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::BattlemasterJoin& battlemasterJoin) { - ObjectGuid guid; - uint32 bgTypeId_; - uint32 instanceId; - uint8 joinAsGroup; bool isPremade = false; - Group* grp = nullptr; - - recvData >> guid; // battlemaster guid - recvData >> bgTypeId_; // battleground type id (DBC id) - recvData >> instanceId; // instance id, 0 if First Available selected - recvData >> joinAsGroup; // join as group - - if (!sBattlemasterListStore.LookupEntry(bgTypeId_)) + if (!sBattlemasterListStore.LookupEntry(battlemasterJoin.BattlemasterListID)) { - TC_LOG_ERROR("network", "Battleground: invalid bgtype ({}) received. possible cheater? player {}", bgTypeId_, _player->GetGUID().ToString()); + TC_LOG_ERROR("network", "Battleground: invalid bgtype ({}) received. possible cheater? player {}", battlemasterJoin.BattlemasterListID, _player->GetGUID().ToString()); return; } - if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, bgTypeId_, nullptr)) + if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, battlemasterJoin.BattlemasterListID, nullptr)) { ChatHandler(this).PSendSysMessage(LANG_BG_DISABLED); return; } - BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgTypeId_); - - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEMASTER_JOIN Message from {}", guid.ToString()); - - // can do this, since it's battleground, not arena - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, 0); - BattlegroundQueueTypeId bgQueueTypeIdRandom = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_RB, 0); + BattlegroundTypeId bgTypeId = BattlegroundTypeId(battlemasterJoin.BattlemasterListID); // ignore if player is already in BG if (_player->InBattleground()) @@ -112,8 +85,8 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) // get bg instance or bg template if instance not found Battleground* bg = nullptr; - if (instanceId) - bg = sBattlegroundMgr->GetBattlegroundThroughClientInstance(instanceId, bgTypeId); + if (battlemasterJoin.InstanceID) + bg = sBattlegroundMgr->GetBattlegroundThroughClientInstance(battlemasterJoin.InstanceID, bgTypeId); if (!bg) bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId); @@ -125,53 +98,64 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) if (!bracketEntry) return; - GroupJoinBattlegroundResult err; + // can do this, since it's battleground, not arena + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, bracketEntry->GetBracketId(), 0); + + GroupJoinBattlegroundResult err = ERR_BATTLEGROUND_NONE; + + Group const* grp = _player->GetGroup(); // check queue conditions - if (!joinAsGroup) + if (!battlemasterJoin.JoinAsGroup) { if (GetPlayer()->isUsingLfg()) { - // player is using dungeon finder or raid finder - WorldPacket data; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_LFG_CANT_USE_BATTLEGROUND); - GetPlayer()->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_LFG_CANT_USE_BATTLEGROUND); + SendPacket(battlefieldStatus.Write()); return; } // check RBAC permissions if (!_player->CanJoinToBattleground(bg)) { - WorldPacket data; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_BATTLEGROUND_JOIN_TIMED_OUT); - GetPlayer()->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_BATTLEGROUND_JOIN_TIMED_OUT); + SendPacket(battlefieldStatus.Write()); return; } // check Deserter debuff if (_player->IsDeserter()) { - WorldPacket data; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); - _player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); + SendPacket(battlefieldStatus.Write()); return; } - if (_player->GetBattlegroundQueueIndex(bgQueueTypeIdRandom) < PLAYER_MAX_BATTLEGROUND_QUEUES) + bool isInRandomBgQueue = [&] + { + for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) + if (_player->GetBattlegroundQueueTypeId(i).BattlemasterListId == BATTLEGROUND_RB) + return true; + return false; + }(); + if (!BattlegroundMgr::IsRandomBattleground(bgTypeId) && isInRandomBgQueue) { // player is already in random queue - WorldPacket data; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_IN_RANDOM_BG); - _player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_IN_RANDOM_BG); + SendPacket(battlefieldStatus.Write()); return; } - if (_player->InBattlegroundQueue(true) && bgTypeId == BATTLEGROUND_RB) + if (_player->InBattlegroundQueue(true) && !isInRandomBgQueue && BattlegroundMgr::IsRandomBattleground(bgTypeId)) { // player is already in queue, can't start random queue - WorldPacket data; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_IN_NON_RANDOM_BG); - _player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_IN_NON_RANDOM_BG); + SendPacket(battlefieldStatus.Write()); return; } @@ -183,9 +167,9 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) // check if has free queue slots if (!_player->HasFreeBattlegroundQueueId()) { - WorldPacket data; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_BATTLEGROUND_TOO_MANY_QUEUES); - _player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_BATTLEGROUND_TOO_MANY_QUEUES); + SendPacket(battlefieldStatus.Write()); return; } @@ -194,28 +178,27 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) return; BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); - - GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, nullptr, bgTypeId, bracketEntry, 0, false, isPremade, 0, 0); - uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); - // already checked if queueSlot is valid, now just get it + GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, nullptr, bracketEntry, false, isPremade, 0, 0); + uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo); uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId); - WorldPacket data; - // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->ArenaType, 0); - SendPacket(&data); - TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for bg queue type {} bg type {}: GUID {}, NAME {}", - bgQueueTypeId, bgTypeId, _player->GetGUID().ToString(), _player->GetName()); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusQueued(&battlefieldStatus, bg, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime); + SendPacket(battlefieldStatus.Write()); + + TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for bg queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, {}, NAME {}", + bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), + _player->GetGUID().ToString(), _player->GetName()); } else { - grp = _player->GetGroup(); - // no group found, error if (!grp) return; if (grp->GetLeaderGUID() != _player->GetGUID()) return; - err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0); + + ObjectGuid errorGuid; + err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0, errorGuid); isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam()); BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); @@ -225,96 +208,63 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) if (err > 0) { TC_LOG_DEBUG("bg.battleground", "Battleground: the following players are joining as group:"); - ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, 0, false, isPremade, 0, 0); - avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); + ginfo = bgQueue.AddGroup(_player, grp, bracketEntry, false, isPremade, 0, 0); + avgTime = bgQueue.GetAverageQueueWaitTime(ginfo); } - for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* member = itr->GetSource(); if (!member) continue; // this should never happen - WorldPacket data; - if (err <= 0) { - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, err); - member->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, err, &errorGuid); + member->SendDirectMessage(battlefieldStatus.Write()); continue; } // add to queue uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId); - // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->ArenaType, 0); - member->SendDirectMessage(&data); - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, err); - member->SendDirectMessage(&data); - TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for bg queue type {} bg type {}: GUID {}, NAME {}", - bgQueueTypeId, bgTypeId, member->GetGUID().ToString(), member->GetName()); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusQueued(&battlefieldStatus, bg, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime); + member->SendDirectMessage(battlefieldStatus.Write()); + + WorldPackets::Battleground::GroupJoinedBattleground groupJoinedBattleground; + BattlegroundMgr::BuildGroupJoinedBattlegroundPacket(&groupJoinedBattleground, BattlegroundTypeId(err)); + member->SendDirectMessage(battlefieldStatus.Write()); + TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for bg queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, {}, NAME {}", + bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), + member->GetGUID().ToString(), member->GetName()); } TC_LOG_DEBUG("bg.battleground", "Battleground: group end"); } - sBattlegroundMgr->ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); + sBattlegroundMgr->ScheduleQueueUpdate(0, bgQueueTypeId); } -void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recvData*/) +void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPackets::Battleground::BattlegroundPlayerPositionsRequest& /*battlegroundPlayerPositionsRequest*/) { - TC_LOG_DEBUG("network", "WORLD: Recvd MSG_BATTLEGROUND_PLAYER_POSITIONS Message"); - Battleground* bg = _player->GetBattleground(); if (!bg) // can't be received if player not in battleground return; - uint32 flagCarrierCount = 0; - Player* allianceFlagCarrier = nullptr; - Player* hordeFlagCarrier = nullptr; - + WorldPackets::Battleground::BattlegroundPlayerPositions playerPositions; if (ObjectGuid guid = bg->GetFlagPickerGUID(TEAM_ALLIANCE)) - { - allianceFlagCarrier = ObjectAccessor::FindPlayer(guid); - if (allianceFlagCarrier) - ++flagCarrierCount; - } + if (Player* allianceFlagCarrier = ObjectAccessor::GetPlayer(*_player, guid)) + playerPositions.FlagCarriers.emplace_back(guid, allianceFlagCarrier->GetPosition()); if (ObjectGuid guid = bg->GetFlagPickerGUID(TEAM_HORDE)) - { - hordeFlagCarrier = ObjectAccessor::FindPlayer(guid); - if (hordeFlagCarrier) - ++flagCarrierCount; - } - - WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4 + 16 * flagCarrierCount); - // Used to send several player positions (found used in AV) - data << 0; // CGBattlefieldInfo__m_numPlayerPositions - /* - for (CGBattlefieldInfo__m_numPlayerPositions) - data << guid << posx << posy; - */ - data << flagCarrierCount; - if (allianceFlagCarrier) - { - data << uint64(allianceFlagCarrier->GetGUID()); - data << float(allianceFlagCarrier->GetPositionX()); - data << float(allianceFlagCarrier->GetPositionY()); - } - - if (hordeFlagCarrier) - { - data << uint64(hordeFlagCarrier->GetGUID()); - data << float(hordeFlagCarrier->GetPositionX()); - data << float(hordeFlagCarrier->GetPositionY()); - } + if (Player* hordeFlagCarrier = ObjectAccessor::GetPlayer(*_player, guid)) + playerPositions.FlagCarriers.emplace_back(guid, hordeFlagCarrier->GetPosition()); - SendPacket(&data); + SendPacket(playerPositions.Write()); } -void WorldSession::HandlePVPLogDataOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandlePVPLogDataOpcode(WorldPackets::Battleground::PVPLogDataRequest& /*pvpLogDataRequest*/) { - TC_LOG_DEBUG("network", "WORLD: Recvd MSG_PVP_LOG_DATA Message"); - Battleground* bg = _player->GetBattleground(); if (!bg) return; @@ -323,101 +273,73 @@ void WorldSession::HandlePVPLogDataOpcode(WorldPacket & /*recvData*/) if (bg->isArena()) return; - WorldPacket data; - bg->BuildPvPLogDataPacket(data); - SendPacket(&data); - - TC_LOG_DEBUG("network", "WORLD: Sent MSG_PVP_LOG_DATA Message"); + WorldPackets::Battleground::PVPMatchStatistics pvpMatchStatistics; + bg->BuildPvPLogDataPacket(pvpMatchStatistics); + SendPacket(pvpMatchStatistics.Write()); } -void WorldSession::HandleBattlefieldListOpcode(WorldPacket &recvData) +void WorldSession::HandleBattlefieldListOpcode(WorldPackets::Battleground::BattlefieldListRequest& battlefieldList) { - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message"); - - uint32 bgTypeId; - recvData >> bgTypeId; // id from DBC - - uint8 fromWhere; - recvData >> fromWhere; // 0 - battlemaster (lua: ShowBattlefieldList), 1 - UI (lua: RequestBattlegroundInstanceInfo) - - uint8 canGainXP; - recvData >> canGainXP; // players with locked xp have their own bg queue on retail - - BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); - if (!bl) + BattlemasterListEntry const* battlemasterListEntry = sBattlemasterListStore.LookupEntry(battlefieldList.ListID); + if (!battlemasterListEntry) { - TC_LOG_DEBUG("bg.battleground", "BattlegroundHandler: invalid bgtype ({}) with player (Name: {}, {}) received.", bgTypeId, _player->GetName(), _player->GetGUID().ToString()); + TC_LOG_DEBUG("bg.battleground", "BattlegroundHandler: invalid bgtype ({}) with player (Name: {}, {}) received.", battlefieldList.ListID, _player->GetName(), _player->GetGUID().ToString()); return; } - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundListPacket(&data, ObjectGuid::Empty, _player, BattlegroundTypeId(bgTypeId), fromWhere); - SendPacket(&data); + sBattlegroundMgr->SendBattlegroundList(_player, ObjectGuid::Empty, BattlegroundTypeId(battlefieldList.ListID)); } -void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) +void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::BattlefieldPort& battlefieldPort) { - uint8 type; // arenatype if arena - uint8 unk2; // unk, can be 0x0 (may be if was invited?) and 0x1 - uint32 bgTypeId_; // type id from dbc - uint16 unk; // 0x1F90 constant? - uint8 action; // enter battle 0x1, leave queue 0x0 - - recvData >> type >> unk2 >> bgTypeId_ >> unk >> action; - if (!sBattlemasterListStore.LookupEntry(bgTypeId_)) - { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} ArenaType: {}, Unk: {}, BgType: {}, Action: {}. Invalid BgType!", - GetPlayerInfo(), type, unk2, bgTypeId_, action); - return; - } - - if (!_player->InBattlegroundQueue()) + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundQueueTypeId::FromPacked(battlefieldPort.QueueID); + uint32 queueSlot = _player->GetBattlegroundQueueIndex(bgQueueTypeId); + if (queueSlot >= PLAYER_MAX_BATTLEGROUND_QUEUES) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} ArenaType: {}, Unk: {}, BgType: {}, Action: {}. Player not in queue!", - GetPlayerInfo(), type, unk2, bgTypeId_, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, AcceptedInvite: {}. Invalid queueSlot.", + GetPlayerInfo(), bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), battlefieldPort.AcceptedInvite); return; } - //get GroupQueueInfo from BattlegroundQueue - BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgTypeId_); - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, type); BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); + //we must use temporary variable, because GroupQueueInfo pointer can be deleted in BattlegroundQueue::RemovePlayer() function GroupQueueInfo ginfo; if (!bgQueue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo)) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} ArenaType: {}, Unk: {}, BgType: {}, Action: {}. Player not in queue (No player Group Info)!", - GetPlayerInfo(), type, unk2, bgTypeId_, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, AcceptedInvite: {}. Player not in queue (No player Group Info)!", + GetPlayerInfo(), bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), battlefieldPort.AcceptedInvite); return; } - // if action == 1, then instanceId is required - if (!ginfo.IsInvitedToBGInstanceGUID && action == 1) + // if action == 1, then player must have been invited to join + if (!ginfo.IsInvitedToBGInstanceGUID && battlefieldPort.AcceptedInvite) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} ArenaType: {}, Unk: {}, BgType: {}, Action: {}. Player is not invited to any bg!", - GetPlayerInfo(), type, unk2, bgTypeId_, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, AcceptedInvite: {}. Player is not invited to any bg!", + GetPlayerInfo(), bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), battlefieldPort.AcceptedInvite); return; } + BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgQueueTypeId.BattlemasterListId); Battleground* bg = sBattlegroundMgr->GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId); if (!bg) { - if (action) + if (battlefieldPort.AcceptedInvite) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} ArenaType: {}, Unk: {}, BgType: {}, Action: {}. Cant find BG with id {}!", - GetPlayerInfo(), type, unk2, bgTypeId_, action, ginfo.IsInvitedToBGInstanceGUID); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, AcceptedInvite: {}. Cant find BG with id {}!", + GetPlayerInfo(), bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), battlefieldPort.AcceptedInvite, ginfo.IsInvitedToBGInstanceGUID); return; } bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId); if (!bg) { - TC_LOG_ERROR("network", "BattlegroundHandler: bg_template not found for type id {}.", bgTypeId); + TC_LOG_ERROR("network", "BattlegroundHandler: BattlegroundTemplate not found for type id {}.", bgTypeId); return; } } - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} ArenaType: {}, Unk: {}, BgType: {}, Action: {}.", - GetPlayerInfo(), type, unk2, bgTypeId_, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, AcceptedInvite: {}.", + GetPlayerInfo(), bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), battlefieldPort.AcceptedInvite); // expected bracket entry PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->GetLevel()); @@ -425,16 +347,16 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) return; //some checks if player isn't cheating - it is not exactly cheating, but we cannot allow it - if (action == 1 && ginfo.ArenaType == 0) + if (battlefieldPort.AcceptedInvite && bgQueue.GetQueueId().TeamSize == 0) { //if player is trying to enter battleground (not arena!) and he has deserter debuff, we must just remove him from queue if (_player->IsDeserter()) { //send bg command result to show nice message - WorldPacket data2; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data2, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); - _player->SendDirectMessage(&data2); - action = 0; + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); + SendPacket(battlefieldStatus.Write()); + battlefieldPort.AcceptedInvite = false; TC_LOG_DEBUG("bg.battleground", "Player {} {} has a deserter debuff, do not port him to battleground!", _player->GetName(), _player->GetGUID().ToString()); } //if player don't match battleground max level, then do not allow him to enter! (this might happen when player leveled up during his waiting in queue @@ -442,12 +364,11 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) { TC_LOG_ERROR("network", "Player {} {} has level ({}) higher than maxlevel ({}) of battleground ({})! Do not port him to battleground!", _player->GetName(), _player->GetGUID().ToString(), _player->GetLevel(), bg->GetMaxLevel(), bg->GetTypeID()); - action = 0; + battlefieldPort.AcceptedInvite = false; } } - uint32 queueSlot = _player->GetBattlegroundQueueIndex(bgQueueTypeId); - WorldPacket data; - if (action) + + if (battlefieldPort.AcceptedInvite) { // check Freeze debuff if (_player->HasAura(9454)) @@ -468,8 +389,9 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) // stop taxi flight at port _player->FinishTaxiFlight(); - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType(), ginfo.Team); - _player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusActive(&battlefieldStatus, bg, _player, queueSlot, bgQueueTypeId); + SendPacket(battlefieldStatus.Write()); // remove battleground queue status from BGmgr bgQueue.RemovePlayer(_player->GetGUID(), false); @@ -487,7 +409,9 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) sBattlegroundMgr->SendToBattleground(_player, ginfo.IsInvitedToBGInstanceGUID, bgTypeId); // add only in HandleMoveWorldPortAck() // bg->AddPlayer(_player, team); - TC_LOG_DEBUG("bg.battleground", "Battleground: player {} {} joined battle for bg {}, bgtype {}, queue type {}.", _player->GetName(), _player->GetGUID().ToString(), bg->GetInstanceID(), bg->GetTypeID(), bgQueueTypeId); + TC_LOG_DEBUG("bg.battleground", "Battleground: player {} ({}) joined battle for bg {}, bgtype {}, queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}.", + _player->GetName(), _player->GetGUID().ToString(), bg->GetInstanceID(), bg->GetTypeID(), + bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize)); } else // leave queue { @@ -505,14 +429,20 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) at->SaveToDB(); } } + + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusNone(&battlefieldStatus, queueSlot); + SendPacket(battlefieldStatus.Write()); + _player->RemoveBattlegroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0, 0); bgQueue.RemovePlayer(_player->GetGUID(), true); // player left queue, we should update it - do not update Arena Queue - if (!ginfo.ArenaType) - sBattlegroundMgr->ScheduleQueueUpdate(ginfo.ArenaMatchmakerRating, ginfo.ArenaType, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); - SendPacket(&data); - TC_LOG_DEBUG("bg.battleground", "Battleground: player {} {} left queue for bgtype {}, queue type {}.", _player->GetName(), _player->GetGUID().ToString(), bg->GetTypeID(), bgQueueTypeId); + if (!bgQueue.GetQueueId().TeamSize) + sBattlegroundMgr->ScheduleQueueUpdate(ginfo.ArenaMatchmakerRating, bgQueueTypeId); + + TC_LOG_DEBUG("bg.battleground", "Battleground: player {} ({}) left queue for bgtype {}, queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}.", + _player->GetName(), _player->GetGUID().ToString(), bg->GetTypeID(), + bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize)); // track if player refuses to join the BG after being invited if (bg->isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS) && @@ -526,15 +456,8 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) } } -void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& recvData) +void WorldSession::HandleBattlefieldLeaveOpcode(WorldPackets::Battleground::BattlefieldLeave& /*battlefieldLeave*/) { - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_LEAVE_BATTLEFIELD Message"); - - recvData.read_skip(); // unk1 - recvData.read_skip(); // unk2 - recvData.read_skip(); // BattlegroundTypeId - recvData.read_skip(); // unk3 - // not allow leave battleground in combat if (_player->IsInCombat()) if (Battleground* bg = _player->GetBattleground()) @@ -544,35 +467,31 @@ void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& recvData) _player->LeaveBattleground(); } -void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPackets::Battleground::RequestBattlefieldStatus& /*requestBattlefieldStatus*/) { - // empty opcode - TC_LOG_DEBUG("network", "WORLD: Battleground status"); - - WorldPacket data; // we must update all queues here Battleground* bg = nullptr; for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(i); - if (!bgQueueTypeId) + if (bgQueueTypeId == BATTLEGROUND_QUEUE_NONE) continue; - BattlegroundTypeId bgTypeId = BattlegroundMgr::BGTemplateId(bgQueueTypeId); - uint8 arenaType = BattlegroundMgr::BGArenaType(bgQueueTypeId); - if (bgTypeId == _player->GetBattlegroundTypeId()) + BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgQueueTypeId.BattlemasterListId); + bg = _player->GetBattleground(); + if (bg) { - bg = _player->GetBattleground(); - //i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena - //so i must use bg pointer to get that information - if (bg && bg->GetArenaType() == arenaType) + BattlegroundPlayer const* bgPlayer = bg->GetBattlegroundPlayerData(_player->GetGUID()); + if (bgPlayer) { - // this line is checked, i only don't know if GetStartTime is changing itself after bg end! - // send status in Battleground - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, i, STATUS_IN_PROGRESS, bg->GetEndTime(), bg->GetStartTime(), arenaType, _player->GetBGTeam()); - SendPacket(&data); + //i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena + //so i must use bg pointer to get that information + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusActive(&battlefieldStatus, bg, _player, i, bgQueueTypeId); + SendPacket(battlefieldStatus.Write()); continue; } } + //we are sending update to player about queue - he can be invited there! //get GroupQueueInfo for queue status BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); @@ -584,10 +503,10 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recvData*/) bg = sBattlegroundMgr->GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId); if (!bg) continue; - uint32 remainingTime = getMSTimeDiff(GameTime::GetGameTimeMS(), ginfo.RemoveInviteTime); - // send status invited to Battleground - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType, 0); - SendPacket(&data); + + WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, i, getMSTimeDiff(GameTime::GetGameTimeMS(), ginfo.RemoveInviteTime), bgQueueTypeId); + SendPacket(battlefieldStatus.Write()); } else { @@ -600,60 +519,34 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recvData*/) if (!bracketEntry) continue; - uint32 avgTime = bgQueue.GetAverageQueueWaitTime(&ginfo, bracketEntry->GetBracketId()); - // send status in Battleground Queue - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, i, STATUS_WAIT_QUEUE, avgTime, getMSTimeDiff(ginfo.JoinTime, GameTime::GetGameTimeMS()), arenaType, 0); - SendPacket(&data); + uint32 avgTime = bgQueue.GetAverageQueueWaitTime(&ginfo); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusQueued(&battlefieldStatus, bg, i, 0, bgQueueTypeId, avgTime); + SendPacket(battlefieldStatus.Write()); } } } -void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) +void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::BattlemasterJoinArena& packet) { - TC_LOG_DEBUG("network", "WORLD: CMSG_BATTLEMASTER_JOIN_ARENA"); - - ObjectGuid guid; // arena Battlemaster guid - uint8 arenaslot; // 2v2, 3v3 or 5v5 - uint8 asGroup; // asGroup - uint8 isRated; // isRated - Group* grp = nullptr; - - recvData >> guid >> arenaslot >> asGroup >> isRated; - // ignore if rated but queued solo - if (isRated && !asGroup) + if (packet.IsRated && !packet.JoinAsGroup) return; // ignore if we already in BG or BG queue if (_player->InBattleground()) return; - Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_BATTLEMASTER); + Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.BattlemasterGuid, UNIT_NPC_FLAG_BATTLEMASTER); if (!unit) return; - uint8 arenatype = 0; + uint8 arenatype = ArenaTeam::GetTypeBySlot(packet.TeamSizeIndex); uint32 arenaRating = 0; uint32 matchmakerRating = 0; uint32 previousOpponents = 0; - switch (arenaslot) - { - case 0: - arenatype = ARENA_TYPE_2v2; - break; - case 1: - arenatype = ARENA_TYPE_3v3; - break; - case 2: - arenatype = ARENA_TYPE_5v5; - break; - default: - TC_LOG_ERROR("network", "Unknown arena slot {} at HandleBattlemasterJoinArena()", arenaslot); - return; - } - - //check existance + //check existence Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA); if (!bg) { @@ -668,29 +561,28 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) } BattlegroundTypeId bgTypeId = bg->GetTypeID(); - BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype); PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->GetLevel()); if (!bracketEntry) return; - GroupJoinBattlegroundResult err = ERR_GROUP_JOIN_BATTLEGROUND_FAIL; - - if (!asGroup) + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, bracketEntry->GetBracketId(), arenatype); + Group* grp = _player->GetGroup(); + if (!packet.JoinAsGroup) { if (_player->isUsingLfg()) { // player is using dungeon finder or raid finder - WorldPacket data; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_LFG_CANT_USE_BATTLEGROUND); - _player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_LFG_CANT_USE_BATTLEGROUND); + SendPacket(battlefieldStatus.Write()); return; } if (!_player->CanJoinToBattleground(bg)) { - WorldPacket data; - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_BATTLEGROUND_JOIN_FAILED); - _player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_BATTLEGROUND_JOIN_FAILED); + SendPacket(battlefieldStatus.Write()); return; } @@ -704,27 +596,26 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) } else { - grp = _player->GetGroup(); // no group found, error if (!grp) return; if (grp->GetLeaderGUID() != _player->GetGUID()) return; - err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, isRated != 0, arenaslot); } uint32 ateamId = 0; - if (isRated) + if (packet.IsRated) { - ateamId = _player->GetArenaTeamId(arenaslot); + ateamId = _player->GetArenaTeamId(packet.TeamSizeIndex); // check real arenateam existence only here (if it was moved to group->CanJoin .. () then we would ahve to get it twice) ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId); if (!at) { - _player->GetSession()->SendNotInArenaTeamPacket(arenatype); + SendNotInArenaTeamPacket(arenatype); return; } + // get the team rating for queueing arenaRating = at->GetRating(); matchmakerRating = at->GetAverageMMR(grp); @@ -736,24 +627,26 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) previousOpponents = at->GetPreviousOpponents(); } - BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); - if (asGroup) + BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); + if (packet.JoinAsGroup) { uint32 avgTime = 0; + GroupQueueInfo* ginfo = nullptr; + ObjectGuid errorGuid; + GroupJoinBattlegroundResult err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, packet.TeamSizeIndex, errorGuid); if (err > 0) { - TC_LOG_DEBUG("bg.battleground", "Battleground: arena join as group start"); - if (isRated) + if (packet.IsRated) { - TC_LOG_DEBUG("bg.battleground", "Battleground: arena team id {}, leader {} queued with matchmaker rating {} for type {}", _player->GetArenaTeamId(arenaslot), _player->GetName(), matchmakerRating, arenatype); + TC_LOG_DEBUG("bg.battleground", "Battleground: arena team id {}, leader {} queued with matchmaker rating {} for type {}", _player->GetArenaTeamId(packet.TeamSizeIndex), _player->GetName(), matchmakerRating, arenatype); bg->SetRated(true); } else bg->SetRated(false); - GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, isRated != 0, false, arenaRating, matchmakerRating, ateamId, previousOpponents); - avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); + ginfo = bgQueue.AddGroup(_player, grp, bracketEntry, packet.IsRated, false, arenaRating, matchmakerRating, ateamId, previousOpponents); + avgTime = bgQueue.GetAverageQueueWaitTime(ginfo); } for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) @@ -762,50 +655,61 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) if (!member) continue; - WorldPacket data; - if (err <= 0) { - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, err); - member->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, err, &errorGuid); + member->SendDirectMessage(battlefieldStatus.Write()); continue; } + if (!_player->CanJoinToBattleground(bg)) + { + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusFailed(&battlefieldStatus, ERR_BATTLEGROUND_JOIN_FAILED, &errorGuid); + member->SendDirectMessage(battlefieldStatus.Write()); + return; + } + // add to queue uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId); - // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype, 0); - member->SendDirectMessage(&data); - sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, err); - member->SendDirectMessage(&data); - TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for arena as group bg queue type {} bg type {}: {}, NAME {}", bgQueueTypeId, bgTypeId, member->GetGUID().ToString(), member->GetName()); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusQueued(&battlefieldStatus, bg, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime); + member->SendDirectMessage(battlefieldStatus.Write()); + + WorldPackets::Battleground::GroupJoinedBattleground groupJoinedBattleground; + BattlegroundMgr::BuildGroupJoinedBattlegroundPacket(&groupJoinedBattleground, BattlegroundTypeId(err)); + member->SendDirectMessage(groupJoinedBattleground.Write()); + TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for arena as group bg queue {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}, {}, NAME {}", + bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), + member->GetGUID().ToString(), member->GetName()); } } else { - GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, nullptr, bgTypeId, bracketEntry, arenatype, isRated != 0, false, arenaRating, matchmakerRating, ateamId, previousOpponents); - uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); + GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, nullptr, bracketEntry, packet.IsRated, false, arenaRating, matchmakerRating, ateamId, previousOpponents); + uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo); uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId); - WorldPacket data; - // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype, 0); - SendPacket(&data); - TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for arena, skirmish, bg queue type {} bg type {}: {}, NAME {}", bgQueueTypeId, bgTypeId, _player->GetGUID().ToString(), _player->GetName()); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + BattlegroundMgr::BuildBattlegroundStatusQueued(&battlefieldStatus, bg, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime); + SendPacket(battlefieldStatus.Write()); + + TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for arena, skirmish, bg queue type {{ BattlemasterListId: {}, BracketId: {}, TeamSize: {} }}: {}, NAME {}", + bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.BracketId), uint32(bgQueueTypeId.TeamSize), + _player->GetGUID().ToString(), _player->GetName()); } - sBattlegroundMgr->ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); + + sBattlegroundMgr->ScheduleQueueUpdate(matchmakerRating, bgQueueTypeId); } -void WorldSession::HandleReportPvPAFK(WorldPacket& recvData) +void WorldSession::HandleReportPvPAFK(WorldPackets::Battleground::ReportPvPPlayerAFK& reportPvPPlayerAFK) { - ObjectGuid playerGuid; - recvData >> playerGuid; - Player* reportedPlayer = ObjectAccessor::FindPlayer(playerGuid); - + Player* reportedPlayer = ObjectAccessor::FindPlayer(reportPvPPlayerAFK.Offender); if (!reportedPlayer) { - TC_LOG_INFO("bg.reportpvpafk", "WorldSession::HandleReportPvPAFK: {} [IP: {}] reported {}", _player->GetName(), _player->GetSession()->GetRemoteAddress(), playerGuid.ToString()); + TC_LOG_INFO("bg.reportpvpafk", "WorldSession::HandleReportPvPAFK: {} [IP: {}] reported {}", _player->GetName(), _player->GetSession()->GetRemoteAddress(), reportPvPPlayerAFK.Offender.ToString()); return; } @@ -813,3 +717,56 @@ void WorldSession::HandleReportPvPAFK(WorldPacket& recvData) reportedPlayer->ReportedAfkBy(_player); } + +void WorldSession::HandleAreaSpiritHealerQueryOpcode(WorldPackets::Battleground::AreaSpiritHealerQuery& areaSpiritHealerQuery) +{ + Player* player = GetPlayer(); + Creature* spiritHealer = ObjectAccessor::GetCreature(*player, areaSpiritHealerQuery.HealerGuid); + if (!spiritHealer) + return; + + if (!spiritHealer->IsSpiritService()) + return; + + if (Battleground* bg = _player->GetBattleground()) + sBattlegroundMgr->SendAreaSpiritHealerQueryOpcode(_player, bg, areaSpiritHealerQuery.HealerGuid); + + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) + bf->SendAreaSpiritHealerQueryOpcode(_player, areaSpiritHealerQuery.HealerGuid); +} + +void WorldSession::HandleAreaSpiritHealerQueueOpcode(WorldPackets::Battleground::AreaSpiritHealerQueue& areaSpiritHealerQueue) +{ + Creature* spiritHealer = ObjectAccessor::GetCreature(*GetPlayer(), areaSpiritHealerQueue.HealerGuid); + if (!spiritHealer) + return; + + if (!spiritHealer->IsSpiritService()) + return; + + if (Battleground* bg = _player->GetBattleground()) + bg->AddPlayerToResurrectQueue(areaSpiritHealerQueue.HealerGuid, _player->GetGUID()); + + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) + bf->AddPlayerToResurrectQueue(areaSpiritHealerQueue.HealerGuid, _player->GetGUID()); +} + +void WorldSession::HandleHearthAndResurrect(WorldPackets::Battleground::HearthAndResurrect& /*hearthAndResurrect*/) +{ + if (_player->IsInFlight()) + return; + + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) + { + bf->PlayerAskToLeave(_player); + return; + } + + AreaTableEntry const* atEntry = sAreaTableStore.LookupEntry(_player->GetAreaId()); + if (!atEntry || !(atEntry->Flags & AREA_FLAG_WINTERGRASP_2)) + return; + + _player->BuildPlayerRepop(); + _player->ResurrectPlayer(1.0f); + _player->TeleportTo(_player->m_homebindMapId, _player->m_homebindX, _player->m_homebindY, _player->m_homebindZ, _player->GetOrientation()); +} diff --git a/src/server/game/Handlers/BattlefieldHandler.cpp b/src/server/game/Handlers/BattlefieldHandler.cpp index 934ba73d6fc..d64564bff75 100644 --- a/src/server/game/Handlers/BattlefieldHandler.cpp +++ b/src/server/game/Handlers/BattlefieldHandler.cpp @@ -155,14 +155,10 @@ void WorldSession::HandleBfEntryInviteResponse(WorldPacket& recvData) // If player accept invitation if (accepted) - { bf->PlayerAcceptInviteToWar(_player); - } else - { if (_player->GetZoneId() == bf->GetZoneId()) bf->KickPlayerFromBattlefield(_player->GetGUID()); - } } /** @@ -178,9 +174,6 @@ void WorldSession::HandleBfQueueExitRequest(WorldPacket& recvData) TC_LOG_DEBUG("misc", "HandleBfQueueExitRequest: battleId: {} ", battleId); - Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId); - if (!bf) - return; - - bf->AskToLeaveQueue(_player); + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId)) + bf->AskToLeaveQueue(_player); } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 8d9ce0217ae..bd916a61f86 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -595,12 +595,12 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) stmt->setUInt32(2, realm.Id.Realm); trans->Append(stmt); - LoginDatabase.CommitTransaction(trans); - - AddTransactionCallback(CharacterDatabase.AsyncCommitTransaction(characterTransaction)).AfterComplete([this, newChar = std::move(newChar)](bool success) + AddTransactionCallback(CharacterDatabase.AsyncCommitTransaction(characterTransaction)).AfterComplete([this, newChar = std::move(newChar), trans](bool success) { if (success) { + LoginDatabase.CommitTransaction(trans); + TC_LOG_INFO("entities.player.character", "Account: {} (IP: {}) Create Character: {} {}", GetAccountId(), GetRemoteAddress(), newChar->GetName(), newChar->GetGUID().ToString()); sScriptMgr->OnPlayerCreate(newChar.get()); sCharacterCache->AddCharacterCacheEntry(newChar->GetGUID(), GetAccountId(), newChar->GetName(), newChar->GetNativeGender(), newChar->GetRace(), newChar->GetClass(), newChar->GetLevel()); @@ -776,12 +776,12 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder const& holder) { Field* fields = resultGuild->Fetch(); pCurrChar->SetInGuild(fields[0].GetUInt32()); - pCurrChar->SetRank(fields[1].GetUInt8()); + pCurrChar->SetGuildRank(fields[1].GetUInt8()); } else if (pCurrChar->GetGuildId()) // clear guild related fields in case wrong data about non existed membership { pCurrChar->SetInGuild(0); - pCurrChar->SetRank(0); + pCurrChar->SetGuildRank(0); } if (pCurrChar->GetGuildId() != 0) @@ -1305,7 +1305,7 @@ void WorldSession::HandleAlterAppearance(WorldPacket& recvData) // 0 - ok // 1, 3 - not enough money - // 2 - you have to seat on barber chair + // 2 - you have to sit on barber chair if (!_player->HasEnoughMoney(cost)) { SendBarberShopResult(BARBER_SHOP_RESULT_NO_MONEY); diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 50f5cefe9eb..ef38b1edef0 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -366,7 +366,10 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) (HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !sender->isAcceptWhispers() && !sender->IsInWhisperWhiteList(receiver->GetGUID()))) sender->AddWhisperWhiteList(receiver->GetGUID()); - GetPlayer()->Whisper(msg, Language(lang), receiver); + if (lang == LANG_ADDON) + GetPlayer()->WhisperAddon(msg, receiver); + else + GetPlayer()->Whisper(msg, Language(lang), receiver); break; } case CHAT_MSG_PARTY: @@ -649,6 +652,9 @@ void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData) case EMOTE_STATE_KNEEL: case EMOTE_ONESHOT_NONE: break; + case EMOTE_STATE_DANCE: + GetPlayer()->SetEmoteState(emote); + break; default: // Only allow text-emotes for "dead" entities (feign death included) if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 1cff1a545a4..e9d64c786e9 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -525,7 +525,7 @@ void WorldSession::HandleRaidTargetUpdateOpcode(WorldPacket& recvData) if (!group) return; - uint8 x; + uint8 x; recvData >> x; /** error handling **/ @@ -533,9 +533,7 @@ void WorldSession::HandleRaidTargetUpdateOpcode(WorldPacket& recvData) // everything's fine, do it if (x == 0xFF) // target icon request - { group->SendTargetIconList(this); - } else // target icon update { if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) @@ -803,7 +801,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke { AuraApplication const* aurApp = player->GetVisibleAura(i); *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0); - *data << uint8(1); + *data << uint8(aurApp ? aurApp->GetFlags() : 0); } } } @@ -812,9 +810,9 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) - *data << (uint64) pet->GetGUID(); + *data << pet->GetGUID(); else - *data << (uint64) 0; + *data << uint64(0); } if (mask & GROUP_UPDATE_FLAG_PET_NAME) @@ -906,15 +904,15 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_REQUEST_PARTY_MEMBER_STATS"); - ObjectGuid Guid; - recvData >> Guid; + ObjectGuid guid; + recvData >> guid; - Player* player = ObjectAccessor::FindConnectedPlayer(Guid); + Player* player = ObjectAccessor::FindConnectedPlayer(guid); if (!player || !GetPlayer()->IsInSameRaidWith(player)) { WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2); data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related - data << Guid.WriteAsPacked(); + data << guid.WriteAsPacked(); data << uint32(GROUP_UPDATE_FLAG_STATUS); data << uint16(MEMBER_STATUS_OFFLINE); SendPacket(&data); @@ -1006,7 +1004,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData) data << uint32(pet->GetMaxHealth()); if (updateFlags & GROUP_UPDATE_FLAG_PET_POWER_TYPE) - data << (uint8)pet->GetPowerType(); + data << uint8(pet->GetPowerType()); if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_POWER) data << uint16(pet->GetPower(pet->GetPowerType())); @@ -1038,17 +1036,12 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData) SendPacket(&data); } -/*!*/void WorldSession::HandleRequestRaidInfoOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandleRequestRaidInfoOpcode(WorldPacket& /*recvData*/) { // every time the player checks the character screen _player->SendRaidInfo(); } -/*void WorldSession::HandleGroupCancelOpcode(WorldPacket& recvData) -{ - TC_LOG_DEBUG("WORLD: got CMSG_GROUP_CANCEL."); -}*/ - void WorldSession::HandleOptOutOfLootOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_OPT_OUT_OF_LOOT"); diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 8a8e1c8d85e..8a7e32e7e2c 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -151,7 +151,7 @@ void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPackets::Guild::GuildSetM if (normalizePlayerName(packet.NoteeName)) if (Guild* guild = GetPlayer()->GetGuild()) - guild->HandleSetMemberNote(this, packet.NoteeName, packet.Note, false); + guild->HandleSetMemberNote(this, packet.Note, packet.NoteeName, true); } void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPackets::Guild::GuildSetMemberNote& packet) @@ -161,7 +161,7 @@ void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPackets::Guild::GuildSet if (normalizePlayerName(packet.NoteeName)) if (Guild* guild = GetPlayer()->GetGuild()) - guild->HandleSetMemberNote(this, packet.NoteeName, packet.Note, true); + guild->HandleSetMemberNote(this, packet.Note, packet.NoteeName, false); } void WorldSession::HandleGuildSetRankPermissions(WorldPackets::Guild::GuildSetRankPermissions& packet) @@ -265,7 +265,7 @@ void WorldSession::HandleGuildBankActivate(WorldPackets::Guild::GuildBankActivat return; } - guild->SendBankTabsInfo(this, packet.FullUpdate); + guild->SendBankList(this, 0, packet.FullUpdate); } // Called when opening guild bank tab only (first one) @@ -276,7 +276,7 @@ void WorldSession::HandleGuildBankQueryTab(WorldPackets::Guild::GuildBankQueryTa if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK)) if (Guild* guild = GetPlayer()->GetGuild()) - guild->SendBankTabData(this, packet.Tab, true /*packet.FullUpdate*/); + guild->SendBankList(this, packet.Tab, true /*packet.FullUpdate*/); // HACK: client doesn't query entire tab content if it had received SMSG_GUILD_BANK_LIST in this session // but we broadcast bank updates to entire guild when *ANYONE* changes anything, incorrectly initializing clients // tab content with only data for that change @@ -332,7 +332,7 @@ void WorldSession::HandleGuildBankSwapItems(WorldPackets::Guild::GuildBankSwapIt // Player <-> Bank // Allow to work with inventory only if (!Player::IsInventoryPos(playerBag, playerSlotId) && !(playerBag == NULL_BAG && playerSlotId == NULL_SLOT)) - GetPlayer()->SendEquipError(EQUIP_ERR_NONE, nullptr); + GetPlayer()->SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, nullptr); else guild->SwapItemsWithInventory(GetPlayer(), toChar != 0, packet.BankTab, packet.BankSlot, playerBag, playerSlotId, splitedAmount); } diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index ec546fcbf97..b22de311602 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -56,7 +56,7 @@ void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData) if (!_player->IsValidPos(dstbag, dstslot, false)) // can be autostore pos { - _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, nullptr, nullptr); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, nullptr, nullptr); return; } @@ -83,7 +83,7 @@ void WorldSession::HandleSwapInvItemOpcode(WorldPacket& recvData) if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, dstslot, true)) { - _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, nullptr, nullptr); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, nullptr, nullptr); return; } @@ -147,7 +147,7 @@ void WorldSession::HandleSwapItem(WorldPacket& recvData) if (!_player->IsValidPos(dstbag, dstslot, true)) { - _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, nullptr, nullptr); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, nullptr, nullptr); return; } @@ -295,7 +295,7 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData) if (pItem->GetTemplate()->HasFlag(ITEM_FLAG_NO_USER_DESTROY)) { - _player->SendEquipError(EQUIP_ERR_CANT_DROP_SOULBOUND, nullptr, nullptr); + _player->SendEquipError(EQUIP_ERR_DROP_BOUND_ITEM, nullptr, nullptr); return; } @@ -549,28 +549,12 @@ void WorldSession::HandleBuyItemInSlotOpcode(WorldPacket& recvData) else return; // cheating - uint8 bag = NULL_BAG; // init for case invalid bagGUID - - // find bag slot by bag guid - if (bagguid == _player->GetGUID()) + uint8 bag = NULL_BAG; + if (bagguid == GetPlayer()->GetGUID()) // The client sends the player guid when trying to store an item in the default backpack bag = INVENTORY_SLOT_BAG_0; + else if (Item* bagItem = _player->GetItemByGuid(bagguid)) + bag = bagItem->GetSlot(); else - { - for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) - { - if (Bag* pBag = _player->GetBagByPos(i)) - { - if (bagguid == pBag->GetGUID()) - { - bag = i; - break; - } - } - } - } - - // bag not found, cheating? - if (bag == NULL_BAG) return; GetPlayer()->BuyItemFromVendorSlot(vendorguid, slot, item, count, bag, bagslot); @@ -653,41 +637,48 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) { if (VendorItem const* item = items->GetItem(slot)) { - if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(item->item)) + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(item->item); + if (!itemTemplate) + continue; + + uint32 leftInStock = !item->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(item); + if (!_player->IsGameMaster()) // ignore conditions if GM on { - if (!(itemTemplate->AllowableClass & _player->GetClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP && !_player->IsGameMaster()) + // Respect allowed class + if (!(itemTemplate->AllowableClass & _player->GetClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP) continue; + // Only display items in vendor lists for the team the // player is on. If GM on, display all items. - if (!_player->IsGameMaster() && ((itemTemplate->HasFlag(ITEM_FLAG2_FACTION_HORDE) && _player->GetTeam() == ALLIANCE) || (itemTemplate->HasFlag(ITEM_FLAG2_FACTION_ALLIANCE) && _player->GetTeam() == HORDE))) + if ((itemTemplate->HasFlag(ITEM_FLAG2_FACTION_HORDE) && _player->GetTeam() == ALLIANCE) || + (itemTemplate->HasFlag(ITEM_FLAG2_FACTION_ALLIANCE) && _player->GetTeam() == HORDE)) continue; // Items sold out are not displayed in list - uint32 leftInStock = !item->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(item); - if (!_player->IsGameMaster() && !leftInStock) + if (leftInStock == 0) continue; + } - if (!sConditionMgr->IsObjectMeetingVendorItemConditions(vendor->GetEntry(), item->item, _player, vendor)) - { - TC_LOG_DEBUG("condition", "SendListInventory: conditions not met for creature entry {} item {}", vendor->GetEntry(), item->item); - continue; - } + if (!sConditionMgr->IsObjectMeetingVendorItemConditions(vendor->GetEntry(), item->item, _player, vendor)) + { + TC_LOG_DEBUG("condition", "SendListInventory: conditions not met for creature entry {} item {}", vendor->GetEntry(), item->item); + continue; + } - // reputation discount - int32 price = item->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; + // reputation discount + int32 price = item->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; - data << uint32(slot + 1); // client expects counting to start at 1 - data << uint32(item->item); - data << uint32(itemTemplate->DisplayInfoID); - data << int32(leftInStock); - data << uint32(price); - data << uint32(itemTemplate->MaxDurability); - data << uint32(itemTemplate->BuyCount); - data << uint32(item->ExtendedCost); + data << uint32(slot + 1); // client expects counting to start at 1 + data << uint32(item->item); + data << uint32(itemTemplate->DisplayInfoID); + data << int32(leftInStock); + data << uint32(price); + data << uint32(itemTemplate->MaxDurability); + data << uint32(itemTemplate->BuyCount); + data << uint32(item->ExtendedCost); - if (++count >= MAX_VENDOR_ITEMS) - break; - } + if (++count >= MAX_VENDOR_ITEMS) + break; } } @@ -716,7 +707,7 @@ void WorldSession::HandleAutoStoreBagItemOpcode(WorldPacket& recvData) if (!_player->IsValidPos(dstbag, NULL_SLOT, false)) // can be autostore pos { - _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, nullptr, nullptr); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, nullptr, nullptr); return; } @@ -745,7 +736,7 @@ void WorldSession::HandleAutoStoreBagItemOpcode(WorldPacket& recvData) if (dest.size() == 1 && dest[0].pos == src) { // just remove grey item state - _player->SendEquipError(EQUIP_ERR_NONE, pItem, nullptr); + _player->SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, pItem, nullptr); return; } @@ -757,7 +748,7 @@ void WorldSession::HandleSetAmmoOpcode(WorldPacket& recvData) { if (!_player->IsAlive()) { - _player->SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, nullptr, nullptr); + _player->SendEquipError(EQUIP_ERR_PLAYER_DEAD, nullptr, nullptr); return; } @@ -859,44 +850,44 @@ void WorldSession::HandleWrapItemOpcode(WorldPacket& recvData) if (item == gift) // not possable with pacjket from real client { - _player->SendEquipError(EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED, item, nullptr); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_WRAPPED, item, nullptr); return; } if (item->IsEquipped()) { - _player->SendEquipError(EQUIP_ERR_EQUIPPED_CANT_BE_WRAPPED, item, nullptr); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_EQUIPPED, item, nullptr); return; } if (!item->GetGuidValue(ITEM_FIELD_GIFTCREATOR).IsEmpty()) // HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED); { - _player->SendEquipError(EQUIP_ERR_WRAPPED_CANT_BE_WRAPPED, item, nullptr); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_WRAPPED, item, nullptr); return; } if (item->IsBag()) { - _player->SendEquipError(EQUIP_ERR_BAGS_CANT_BE_WRAPPED, item, nullptr); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_BAGS, item, nullptr); return; } if (item->IsSoulBound()) { - _player->SendEquipError(EQUIP_ERR_BOUND_CANT_BE_WRAPPED, item, nullptr); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_BOUND, item, nullptr); return; } if (item->GetMaxStackCount() != 1) { - _player->SendEquipError(EQUIP_ERR_STACKABLE_CANT_BE_WRAPPED, item, nullptr); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_STACKABLE, item, nullptr); return; } // maybe not correct check (it is better than nothing) - if (item->GetTemplate()->MaxCount>0) + if (item->GetTemplate()->MaxCount > 0) { - _player->SendEquipError(EQUIP_ERR_UNIQUE_CANT_BE_WRAPPED, item, nullptr); + _player->SendEquipError(EQUIP_ERR_CANT_WRAP_UNIQUE, item, nullptr); return; } @@ -1108,9 +1099,10 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) { if (GemEnchants[i]) { + uint32 gemCount = 1; itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); if (Item* guidItem = _player->GetItemByGuid(gem_guids[i])) - _player->DestroyItem(guidItem->GetBagSlot(), guidItem->GetSlot(), true); + _player->DestroyItemCount(guidItem, gemCount, true); } } diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 590e62774b5..d41d1b2aaa3 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -455,12 +455,12 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData) ItemPosCountVec dest; InventoryResult msg = target->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item.itemid, item.count); if (!item.AllowedForPlayer(target, true)) - msg = EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM; + msg = EQUIP_ERR_CANT_EQUIP_EVER; if (msg != EQUIP_ERR_OK) { - if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) + if (msg == EQUIP_ERR_ITEM_MAX_COUNT) _player->SendLootError(lootguid, LOOT_ERROR_MASTER_UNIQUE_ITEM); - else if (msg == EQUIP_ERR_INVENTORY_FULL) + else if (msg == EQUIP_ERR_INV_FULL) _player->SendLootError(lootguid, LOOT_ERROR_MASTER_INV_FULL); else _player->SendLootError(lootguid, LOOT_ERROR_MASTER_OTHER); diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 858b35f6ac2..22fe050c80d 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -194,7 +194,7 @@ void WorldSession::HandleSendMail(WorldPackets::Mail::SendMail& sendMail) // handle empty bag before CanBeTraded, since that func already has that check if (item->IsNotEmptyBag()) { - player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS); + player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_DESTROY_NONEMPTY_BAG); return; } @@ -206,7 +206,7 @@ void WorldSession::HandleSendMail(WorldPackets::Mail::SendMail& sendMail) if (item->IsBoundAccountWide() && item->IsSoulBound() && GetAccountId() != receiverAccountId) { - player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS); + player->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_NOT_SAME_ACCOUNT); return; } diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index eda9900a26e..030dc0ab823 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -17,9 +17,6 @@ #include "WorldSession.h" #include "AccountMgr.h" -#include "Battlefield.h" -#include "BattlefieldMgr.h" -#include "Battleground.h" #include "BattlegroundMgr.h" #include "CharacterPackets.h" #include "Chat.h" @@ -473,6 +470,30 @@ void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData) recvData >> guid; _player->SetSelection(guid); + + // Update target of current autoshoot spell + if (!guid.IsEmpty()) + { + if (Spell* autoReapeatSpell = _player->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)) + { + if (!autoReapeatSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR4_UNK24) // client automatically handles spells with SPELL_ATTR4_AUTO_RANGED_COMBAT + && autoReapeatSpell->m_targets.GetUnitTargetGUID() != guid) + { + Unit* unitTarget = [&]() -> Unit* + { + Unit* unit = ObjectAccessor::GetUnit(*_player, guid); + if (unit && _player->IsValidAttackTarget(unit, autoReapeatSpell->GetSpellInfo())) + return unit; + return nullptr; + }(); + + if (unitTarget) + autoReapeatSpell->m_targets.SetUnitTarget(unitTarget); + else + autoReapeatSpell->m_targets.RemoveObjectTarget(); + } + } + } } void WorldSession::HandleStandStateChangeOpcode(WorldPacket& recvData) @@ -1327,72 +1348,6 @@ void WorldSession::SendSetPhaseShift(uint32 PhaseShift) data << uint32(PhaseShift); SendPacket(&data); } -// Battlefield and Battleground -void WorldSession::HandleAreaSpiritHealerQueryOpcode(WorldPacket& recvData) -{ - TC_LOG_DEBUG("network", "WORLD: CMSG_AREA_SPIRIT_HEALER_QUERY"); - - Battleground* bg = _player->GetBattleground(); - - ObjectGuid guid; - recvData >> guid; - - Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); - if (!unit) - return; - - if (!unit->IsSpiritService()) // it's not spirit service - return; - - if (bg) - sBattlegroundMgr->SendAreaSpiritHealerQueryOpcode(_player, bg, guid); - - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) - bf->SendAreaSpiritHealerQueryOpcode(_player, guid); -} - -void WorldSession::HandleAreaSpiritHealerQueueOpcode(WorldPacket& recvData) -{ - TC_LOG_DEBUG("network", "WORLD: CMSG_AREA_SPIRIT_HEALER_QUEUE"); - - Battleground* bg = _player->GetBattleground(); - - ObjectGuid guid; - recvData >> guid; - - Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); - if (!unit) - return; - - if (!unit->IsSpiritService()) // it's not spirit service - return; - - if (bg) - bg->AddPlayerToResurrectQueue(guid, _player->GetGUID()); - - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) - bf->AddPlayerToResurrectQueue(guid, _player->GetGUID()); -} - -void WorldSession::HandleHearthAndResurrect(WorldPacket& /*recvData*/) -{ - if (_player->IsInFlight()) - return; - - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId())) - { - bf->PlayerAskToLeave(_player); - return; - } - - AreaTableEntry const* atEntry = sAreaTableStore.LookupEntry(_player->GetAreaId()); - if (!atEntry || !(atEntry->Flags & AREA_FLAG_WINTERGRASP_2)) - return; - - _player->BuildPlayerRepop(); - _player->ResurrectPlayer(1.0f); - _player->TeleportTo(_player->m_homebindMapId, _player->m_homebindX, _player->m_homebindY, _player->m_homebindZ, _player->GetOrientation()); -} void WorldSession::HandleInstanceLockResponse(WorldPacket& recvPacket) { diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 8064c73d622..8df75eb2e67 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -303,6 +303,10 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket) if (!mover->movespline->Finalized()) return; + // stop some emotes at player move + if (plrMover && (plrMover->GetEmoteState() != 0)) + plrMover->SetEmoteState(EMOTE_ONESHOT_NONE); + /* handle special cases */ if (movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) { diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 12590139ea9..7c3fa78fd71 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -174,14 +174,6 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe break; case COMMAND_ATTACK: // spellid = 1792 - ATTACK { - // Can't attack if owner is pacified - if (_player->HasAuraType(SPELL_AURA_MOD_PACIFY)) - { - // pet->SendPetCastFail(spellid, SPELL_FAILED_PACIFIED); - /// @todo Send proper error message to client - return; - } - // only place where pet can be player Unit* TargetUnit = ObjectAccessor::GetUnit(*_player, guid2); if (!TargetUnit) @@ -212,8 +204,8 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe AI->AttackStart(TargetUnit); // 10% chance to play special pet attack talk, else growl - if (pet->IsPet() && ((Pet*)pet)->getPetType() == SUMMON_PET && pet != TargetUnit && urand(0, 100) < 10) - pet->SendPetTalk((uint32)PET_TALK_ATTACK); + if (pet->IsPet() && pet->ToPet()->getPetType() == SUMMON_PET && pet != TargetUnit && roll_chance_i(10)) + pet->SendPetActionSound(PET_ACTION_ATTACK); else { // 90% chance for pet and 100% chance for charmed creature @@ -242,10 +234,13 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe ASSERT(pet->GetTypeId() == TYPEID_UNIT); if (pet->IsPet()) { - if (((Pet*)pet)->getPetType() == HUNTER_PET) - GetPlayer()->RemovePet((Pet*)pet, PET_SAVE_AS_DELETED); + if (pet->ToPet()->getPetType() == HUNTER_PET) + GetPlayer()->RemovePet(pet->ToPet(), PET_SAVE_AS_DELETED); else - GetPlayer()->RemovePet((Pet*)pet, PET_SAVE_NOT_IN_SLOT); + { + pet->SendPetDismissSound(); + GetPlayer()->RemovePet(pet->ToPet(), PET_SAVE_NOT_IN_SLOT); + } } else if (pet->HasUnitTypeMask(UNIT_MASK_MINION)) { @@ -342,8 +337,8 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe // 10% chance to play special pet attack talk, else growl // actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell - if (pet->IsPet() && (((Pet*)pet)->getPetType() == SUMMON_PET) && (pet != unit_target) && (urand(0, 100) < 10)) - pet->SendPetTalk((uint32)PET_TALK_SPECIAL_SPELL); + if (pet->IsPet() && pet->ToPet()->getPetType() == SUMMON_PET && pet != unit_target && roll_chance_i(10)) + pet->SendPetActionSound(PET_ACTION_SPECIAL_SPELL); else { pet->SendPetAIReaction(guid1); @@ -811,10 +806,10 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) { if (Pet* pet = creature->ToPet()) { - // 10% chance to play special pet attack talk, else growl + // 10% chance to play special pet attack sound, else growl // actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell - if (pet->getPetType() == SUMMON_PET && (urand(0, 100) < 10)) - pet->SendPetTalk(PET_TALK_SPECIAL_SPELL); + if (pet->getPetType() == SUMMON_PET && roll_chance_i(10)) + pet->SendPetActionSound(PET_ACTION_SPECIAL_SPELL); else pet->SendPetAIReaction(guid); } diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp index 47640072dbe..e233c83b868 100644 --- a/src/server/game/Handlers/PetitionsHandler.cpp +++ b/src/server/game/Handlers/PetitionsHandler.cpp @@ -463,7 +463,7 @@ void WorldSession::HandleSignPetition(WorldPacket& recvData) WorldPacket data(SMSG_PETITION_SIGN_RESULTS, (8+8+4)); data << uint64(petitionGuid); data << uint64(_player->GetGUID()); - data << (uint32)PETITION_SIGN_ALREADY_SIGNED; + data << uint32(PETITION_SIGN_ALREADY_SIGNED); // close at signer side SendPacket(&data); diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index d1febe6baa7..6e9db0a3c7f 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -18,6 +18,7 @@ #include "WorldSession.h" #include "CharacterCache.h" #include "Common.h" +#include "Corpse.h" #include "DatabaseEnv.h" #include "DBCStores.h" #include "GameTime.h" @@ -28,6 +29,7 @@ #include "ObjectMgr.h" #include "Player.h" #include "QueryPackets.h" +#include "Transport.h" #include "UpdateMask.h" #include "World.h" @@ -141,13 +143,13 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObj } } -void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& /*queryCorpseLocation*/) { if (!_player->HasCorpse()) { - WorldPacket data(MSG_CORPSE_QUERY, 1); - data << uint8(0); // corpse not found - SendPacket(&data); + WorldPackets::Query::CorpseLocation packet; + packet.Valid = false; // corpse not found + SendPacket(packet.Write()); return; } @@ -178,15 +180,13 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recvData*/) } } - WorldPacket data(MSG_CORPSE_QUERY, 1+(6*4)); - data << uint8(1); // corpse found - data << int32(mapID); - data << float(x); - data << float(y); - data << float(z); - data << int32(corpseMapID); - data << uint32(0); // unknown - SendPacket(&data); + WorldPackets::Query::CorpseLocation packet; + packet.Valid = true; + packet.MapID = corpseMapID; + packet.ActualMapID = mapID; + packet.Position = Position(x, y, z); + packet.Transport = 0; // TODO: If corpse is on transport, send transport offsets and transport guid + SendPacket(packet.Write()); } void WorldSession::HandleNpcTextQueryOpcode(WorldPacket& recvData) @@ -314,19 +314,22 @@ void WorldSession::HandleQueryPageText(WorldPacket& recvData) } } -void WorldSession::HandleCorpseMapPositionQuery(WorldPacket& recvData) +void WorldSession::HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTransport& queryCorpseTransport) { - TC_LOG_DEBUG("network", "WORLD: Recv CMSG_CORPSE_MAP_POSITION_QUERY"); - - uint32 unk; - recvData >> unk; + WorldPackets::Query::CorpseTransportQuery response; + if (Corpse const* corpse = _player->GetCorpse()) + { + if (Transport const* transport = corpse->GetTransport()) + { + if (transport->GetGUID().GetCounter() == queryCorpseTransport.Transport) + { + response.Position = transport->GetPosition(); + response.Facing = transport->GetOrientation(); + } + } + } - WorldPacket data(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, 4+4+4+4); - data << float(0); - data << float(0); - data << float(0); - data << float(0); - SendPacket(&data); + SendPacket(response.Write()); } void WorldSession::HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& query) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 5dff546301b..7c74891d6d3 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -276,6 +276,10 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = {}, quest = {}, reward = {}", guid.ToString(), questId, reward); + Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + if (!quest) + return; + Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); if (!object || !object->hasInvolvedQuest(questId)) return; @@ -284,71 +288,69 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (!_player->CanInteractWithQuestGiver(object)) return; - if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) + if ((!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE) || + (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete())) { - if ((!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE) || - (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete())) - { - TC_LOG_ERROR("entities.player.cheat", "Error in QUEST_STATUS_COMPLETE: player {} {} tried to complete quest {}, but is not allowed to do so (possible packet-hacking or high latency)", - _player->GetName(), _player->GetGUID().ToString(), questId); - return; - } - if (_player->CanRewardQuest(quest, true)) // First, check if player is allowed to turn the quest in (all objectives completed). If not, we send players to the offer reward screen + TC_LOG_ERROR("entities.player.cheat", "Error in QUEST_STATUS_COMPLETE: player {} {} tried to complete quest {}, but is not allowed to do so (possible packet-hacking or high latency)", + _player->GetName(), _player->GetGUID().ToString(), questId); + return; + } + + if (_player->CanRewardQuest(quest, true)) // First, check if player is allowed to turn the quest in (all objectives completed). If not, we send players to the offer reward screen + { + if (_player->CanRewardQuest(quest, reward, true)) // Then check if player can receive the reward item (if inventory is not full, if player doesn't have too many unique items, and so on). If not, the client will close the gossip window { - if (_player->CanRewardQuest(quest, reward, true)) // Then check if player can receive the reward item (if inventory is not full, if player doesn't have too many unique items, and so on). If not, the client will close the gossip window - { - _player->RewardQuest(quest, reward, object); + _player->RewardQuest(quest, reward, object); - switch (object->GetTypeId()) + switch (object->GetTypeId()) + { + case TYPEID_UNIT: { - case TYPEID_UNIT: + Creature* questgiver = object->ToCreature(); + // Send next quest + if (Quest const* nextQuest = _player->GetNextQuest(questgiver, quest)) { - Creature* questgiver = object->ToCreature(); - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); - - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); - } - } + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->ClearMenus(); - questgiver->AI()->OnQuestReward(_player, quest, reward); - break; + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + } } - case TYPEID_GAMEOBJECT: + + _player->PlayerTalkClass->ClearMenus(); + questgiver->AI()->OnQuestReward(_player, quest, reward); + break; + } + case TYPEID_GAMEOBJECT: + { + GameObject* questGiver = object->ToGameObject(); + // Send next quest + if (Quest const* nextQuest = _player->GetNextQuest(questGiver, quest)) { - GameObject* questGiver = object->ToGameObject(); - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + // Only send the quest to the player if the conditions are met + if (_player->CanTakeQuest(nextQuest, false)) { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); - - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); - } - } + if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) + _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->ClearMenus(); - questGiver->AI()->OnQuestReward(_player, quest, reward); - break; + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + } } - default: - break; + + _player->PlayerTalkClass->ClearMenus(); + questGiver->AI()->OnQuestReward(_player, quest, reward); + break; } + default: + break; } } - else - _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true); } + else + _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true); } void WorldSession::HandleQuestgiverRequestRewardOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 06aab37890c..ee694f7d366 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -181,7 +181,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) // additional check, client outputs message on its own if (!player->IsAlive()) { - player->SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, nullptr, nullptr); + player->SendEquipError(EQUIP_ERR_PLAYER_DEAD, nullptr, nullptr); return; } @@ -207,7 +207,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) // Verify that the bag is an actual bag or wrapped item that can be used "normally" if (!proto->HasFlag(ITEM_FLAG_HAS_LOOT) && !item->IsWrapped()) { - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, nullptr); TC_LOG_ERROR("entities.player.cheat", "Possible hacking attempt: Player {} {} tried to open item [{}, entry: {}] which is not openable!", player->GetName(), player->GetGUID().ToString(), item->GetGUID().ToString(), proto->ItemId); return; @@ -487,7 +487,7 @@ void WorldSession::HandlePetCancelAuraOpcode(WorldPackets::Spells::PetCancelAura if (!pet->IsAlive()) { - pet->SendPetActionFeedback(FEEDBACK_PET_DEAD); + pet->SendPetActionFeedback(PetActionFeedback::Dead, 0); return; } diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp index 889a0114148..2a0f5ebaf4d 100644 --- a/src/server/game/Handlers/TaxiHandler.cpp +++ b/src/server/game/Handlers/TaxiHandler.cpp @@ -91,12 +91,12 @@ void WorldSession::SendTaxiMenu(Creature* unit) { // find current node uint32 curloc = sObjectMgr->GetNearestTaxiNode(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetMapId(), GetPlayer()->GetTeam()); - - if (curloc == 0) + if (!curloc) return; bool lastTaxiCheaterState = GetPlayer()->isTaxiCheater(); - if (unit->GetEntry() == 29480) GetPlayer()->SetTaxiCheater(true); // Grimwing in Ebon Hold, special case. NOTE: Not perfect, Zul'Aman should not be included according to WoWhead, and I think taxicheat includes it. + if (unit->GetEntry() == 29480) + GetPlayer()->SetTaxiCheater(true); // Grimwing in Ebon Hold, special case. NOTE: Not perfect, Zul'Aman should not be included according to WoWhead, and I think taxicheat includes it. TC_LOG_DEBUG("network", "WORLD: CMSG_TAXINODE_STATUS_QUERY {} ", curloc); diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 4d8588bf7be..9b02adb6c86 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -327,7 +327,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) if (item->IsBindedNotWith(trader)) { info.Status = TRADE_STATUS_CLOSE_WINDOW; - info.Result = EQUIP_ERR_CANNOT_TRADE_THAT; + info.Result = EQUIP_ERR_TRADE_BOUND_ITEM; SendTradeStatus(info); return; } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 765852581fd..9ab7f63aabd 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2352,7 +2352,7 @@ float GridMap::getLiquidLevel(float x, float y) const } // Get water state on map -inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data, float collisionHeight) +inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, Optional ReqLiquidType, LiquidData* data, float collisionHeight) { // Check water type (if no water return) if (!_liquidGlobalFlags && !_liquidFlags) @@ -2400,7 +2400,7 @@ inline ZLiquidStatus GridMap::GetLiquidStatus(float x, float y, float z, uint8 R return LIQUID_MAP_NO_WATER; // Check req liquid type mask - if (ReqLiquidType && !(ReqLiquidType&type)) + if (ReqLiquidType && !(*ReqLiquidType & type)) return LIQUID_MAP_NO_WATER; // Check water level: @@ -2466,7 +2466,7 @@ float Map::GetWaterOrGroundLevel(uint32 phasemask, float x, float y, float z, fl LiquidData liquid_status; - ZLiquidStatus res = GetLiquidStatus(phasemask, x, y, ground_z, MAP_ALL_LIQUIDS, &liquid_status, collisionHeight); + ZLiquidStatus res = GetLiquidStatus(phasemask, x, y, ground_z, {}, &liquid_status, collisionHeight); switch (res) { case LIQUID_MAP_ABOVE_WATER: @@ -2542,27 +2542,18 @@ static inline bool IsInWMOInterior(uint32 mogpFlags) bool Map::GetAreaInfo(uint32 phaseMask, float x, float y, float z, uint32& flags, int32& adtId, int32& rootId, int32& groupId) const { - float vmap_z = z; - float dynamic_z = z; float check_z = z; VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager(); - uint32 vflags; - int32 vadtId; - int32 vrootId; - int32 vgroupId; - uint32 dflags; - int32 dadtId; - int32 drootId; - int32 dgroupId; - - bool hasVmapAreaInfo = vmgr->getAreaInfo(GetId(), x, y, vmap_z, vflags, vadtId, vrootId, vgroupId); - bool hasDynamicAreaInfo = _dynamicTree.getAreaInfo(x, y, dynamic_z, phaseMask, dflags, dadtId, drootId, dgroupId); - auto useVmap = [&]() { check_z = vmap_z; flags = vflags; adtId = vadtId; rootId = vrootId; groupId = vgroupId; }; - auto useDyn = [&]() { check_z = dynamic_z; flags = dflags; adtId = dadtId; rootId = drootId; groupId = dgroupId; }; + VMAP::AreaAndLiquidData vdata; + VMAP::AreaAndLiquidData ddata; + bool hasVmapAreaInfo = vmgr->getAreaAndLiquidData(GetId(), x, y, z, {}, vdata) && vdata.areaInfo.has_value(); + bool hasDynamicAreaInfo = _dynamicTree.getAreaAndLiquidData(x, y, z, phaseMask, {}, ddata) && ddata.areaInfo.has_value(); + auto useVmap = [&] { check_z = vdata.floorZ; groupId = vdata.areaInfo->groupId; adtId = vdata.areaInfo->adtId; rootId = vdata.areaInfo->rootId; flags = vdata.areaInfo->mogpFlags; }; + auto useDyn = [&] { check_z = ddata.floorZ; groupId = ddata.areaInfo->groupId; adtId = ddata.areaInfo->adtId; rootId = ddata.areaInfo->rootId; flags = ddata.areaInfo->mogpFlags; }; if (hasVmapAreaInfo) { - if (hasDynamicAreaInfo && dynamic_z > vmap_z) + if (hasDynamicAreaInfo && ddata.floorZ > vdata.floorZ) useDyn(); else useVmap(); @@ -2641,34 +2632,31 @@ void Map::GetZoneAndAreaId(uint32 phaseMask, uint32& zoneid, uint32& areaid, flo zoneid = area->ParentAreaID; } -ZLiquidStatus Map::GetLiquidStatus(uint32 phaseMask, float x, float y, float z, uint8 ReqLiquidType, LiquidData* data, float collisionHeight) const +ZLiquidStatus Map::GetLiquidStatus(uint32 phaseMask, float x, float y, float z, Optional ReqLiquidType, LiquidData* data, float collisionHeight) const { ZLiquidStatus result = LIQUID_MAP_NO_WATER; VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager(); - float liquid_level = INVALID_HEIGHT; - float ground_level = INVALID_HEIGHT; - uint32 liquid_type = 0; - uint32 mogpFlags = 0; + VMAP::AreaAndLiquidData vmapData; bool useGridLiquid = true; - if (vmgr->GetLiquidLevel(GetId(), x, y, z, ReqLiquidType, liquid_level, ground_level, liquid_type, mogpFlags)) + if (vmgr->getAreaAndLiquidData(GetId(), x, y, z, ReqLiquidType, vmapData) && vmapData.liquidInfo) { - useGridLiquid = !IsInWMOInterior(mogpFlags); - TC_LOG_DEBUG("maps", "GetLiquidStatus(): vmap liquid level: {} ground: {} type: {}", liquid_level, ground_level, liquid_type); + useGridLiquid = !vmapData.areaInfo || !IsInWMOInterior(vmapData.areaInfo->mogpFlags); + TC_LOG_DEBUG("maps", "GetLiquidStatus(): vmap liquid level: {} ground: {} type: {}", vmapData.liquidInfo->level, vmapData.floorZ, vmapData.liquidInfo->type); // Check water level and ground level - if (liquid_level > ground_level && G3D::fuzzyGe(z, ground_level - GROUND_HEIGHT_TOLERANCE)) + if (vmapData.liquidInfo->level > vmapData.floorZ && G3D::fuzzyGe(z, vmapData.floorZ - GROUND_HEIGHT_TOLERANCE)) { // All ok in water -> store data if (data) { // hardcoded in client like this - if (GetId() == 530 && liquid_type == 2) - liquid_type = 15; + if (GetId() == 530 && vmapData.liquidInfo->type == 2) + vmapData.liquidInfo->type = 15; uint32 liquidFlagType = 0; - if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquid_type)) + if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(vmapData.liquidInfo->type)) liquidFlagType = liq->SoundBank; - if (liquid_type && liquid_type < 21) + if (vmapData.liquidInfo->type && vmapData.liquidInfo->type < 21) { if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(GetAreaId(phaseMask, x, y, z))) { @@ -2682,20 +2670,20 @@ ZLiquidStatus Map::GetLiquidStatus(uint32 phaseMask, float x, float y, float z, if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(overrideLiquid)) { - liquid_type = overrideLiquid; + vmapData.liquidInfo->type = overrideLiquid; liquidFlagType = liq->SoundBank; } } } - data->level = liquid_level; - data->depth_level = ground_level; + data->level = vmapData.liquidInfo->level; + data->depth_level = vmapData.floorZ; - data->entry = liquid_type; + data->entry = vmapData.liquidInfo->type; data->type_flags = 1 << liquidFlagType; } - float delta = liquid_level - z; + float delta = vmapData.liquidInfo->level - z; // Get position delta if (delta > collisionHeight) // Under water @@ -2715,7 +2703,7 @@ ZLiquidStatus Map::GetLiquidStatus(uint32 phaseMask, float x, float y, float z, LiquidData map_data; ZLiquidStatus map_result = gmap->GetLiquidStatus(x, y, z, ReqLiquidType, &map_data, collisionHeight); // Not override LIQUID_MAP_ABOVE_WATER with LIQUID_MAP_NO_WATER: - if (map_result != LIQUID_MAP_NO_WATER && (map_data.level > ground_level)) + if (map_result != LIQUID_MAP_NO_WATER && (map_data.level > vmapData.floorZ)) { if (data) { @@ -2732,7 +2720,7 @@ ZLiquidStatus Map::GetLiquidStatus(uint32 phaseMask, float x, float y, float z, return result; } -void Map::GetFullTerrainStatusForPosition(uint32 phaseMask, float x, float y, float z, PositionFullTerrainStatus& data, uint8 reqLiquidType, float collisionHeight) const +void Map::GetFullTerrainStatusForPosition(uint32 phaseMask, float x, float y, float z, PositionFullTerrainStatus& data, Optional reqLiquidType, float collisionHeight) const { VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager(); VMAP::AreaAndLiquidData vmapData; @@ -2779,7 +2767,7 @@ void Map::GetFullTerrainStatusForPosition(uint32 phaseMask, float x, float y, fl { if (wmoData->areaInfo) { - data.areaInfo.emplace(wmoData->areaInfo->adtId, wmoData->areaInfo->rootId, wmoData->areaInfo->groupId, wmoData->areaInfo->mogpFlags); + data.wmoLocation.emplace(wmoData->areaInfo->groupId, wmoData->areaInfo->adtId, wmoData->areaInfo->rootId, wmoData->areaInfo->uniqueId); // wmo found WMOAreaTableEntry const* wmoEntry = GetWMOAreaTableEntryByTripple(wmoData->areaInfo->rootId, wmoData->areaInfo->adtId, wmoData->areaInfo->groupId); data.outdoors = (wmoData->areaInfo->mogpFlags & 0x8) != 0; @@ -2908,7 +2896,7 @@ bool Map::IsInWater(uint32 phaseMask, float x, float y, float pZ, LiquidData* da { LiquidData liquid_status; LiquidData* liquid_ptr = data ? data : &liquid_status; - return (GetLiquidStatus(phaseMask, x, y, pZ, MAP_ALL_LIQUIDS, liquid_ptr) & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0; + return (GetLiquidStatus(phaseMask, x, y, pZ, {}, liquid_ptr) & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER)) != 0; } bool Map::IsUnderWater(uint32 phaseMask, float x, float y, float z) const @@ -2983,6 +2971,9 @@ void Map::SendInitTransports(Player* player) if (*i != player->GetTransport()) (*i)->BuildCreateUpdateBlockForPlayer(&transData, player); + if (!transData.HasData()) + return; + WorldPacket packet; transData.BuildPacket(&packet); player->SendDirectMessage(&packet); @@ -2996,6 +2987,9 @@ void Map::SendRemoveTransports(Player* player) if (*i != player->GetTransport()) (*i)->BuildOutOfRangeUpdateBlock(&transData); + if (!transData.HasData()) + return; + WorldPacket packet; transData.BuildPacket(&packet); player->SendDirectMessage(&packet); @@ -4232,6 +4226,11 @@ bool Map::Instanceable() const return i_mapEntry && i_mapEntry->Instanceable(); } +bool Map::IsWorldMap() const +{ + return i_mapEntry && i_mapEntry->IsWorldMap(); +} + bool Map::IsDungeon() const { return i_mapEntry && i_mapEntry->IsDungeon(); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 84783d95c0c..f82420e49e3 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -24,6 +24,7 @@ #include "DynamicTree.h" #include "GridDefines.h" #include "GridRefManager.h" +#include "MapDefines.h" #include "MapRefManager.h" #include "MPSCQueue.h" #include "ObjectGuid.h" @@ -140,18 +141,6 @@ struct map_liquidHeader float liquidLevel; }; -enum ZLiquidStatus : uint32 -{ - LIQUID_MAP_NO_WATER = 0x00000000, - LIQUID_MAP_ABOVE_WATER = 0x00000001, - LIQUID_MAP_WATER_WALK = 0x00000002, - LIQUID_MAP_IN_WATER = 0x00000004, - LIQUID_MAP_UNDER_WATER = 0x00000008 -}; - -#define MAP_LIQUID_STATUS_SWIMMING (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER) -#define MAP_LIQUID_STATUS_IN_CONTACT (MAP_LIQUID_STATUS_SWIMMING | LIQUID_MAP_WATER_WALK) - #define MAP_LIQUID_TYPE_NO_WATER 0x00 #define MAP_LIQUID_TYPE_WATER 0x01 #define MAP_LIQUID_TYPE_OCEAN 0x02 @@ -162,34 +151,6 @@ enum ZLiquidStatus : uint32 #define MAP_LIQUID_TYPE_DARK_WATER 0x10 -struct LiquidData -{ - uint32 type_flags; - uint32 entry; - float level; - float depth_level; -}; - -struct PositionFullTerrainStatus -{ - struct AreaInfo - { - AreaInfo(int32 _adtId, int32 _rootId, int32 _groupId, uint32 _flags) : adtId(_adtId), rootId(_rootId), groupId(_groupId), mogpFlags(_flags) { } - int32 const adtId; - int32 const rootId; - int32 const groupId; - uint32 const mogpFlags; - }; - - PositionFullTerrainStatus() : areaId(0), floorZ(0.0f), outdoors(true), liquidStatus(LIQUID_MAP_NO_WATER) { } - uint32 areaId; - float floorZ; - bool outdoors; - ZLiquidStatus liquidStatus; - Optional areaInfo; - Optional liquidInfo; -}; - class TC_GAME_API GridMap { uint32 _flags; @@ -250,16 +211,11 @@ class TC_GAME_API GridMap inline float getHeight(float x, float y) const {return (this->*_gridGetHeight)(x, y);} float getMinHeight(float x, float y) const; float getLiquidLevel(float x, float y) const; - ZLiquidStatus GetLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data = 0, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h + ZLiquidStatus GetLiquidStatus(float x, float y, float z, Optional ReqLiquidType, LiquidData* data = 0, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h }; #pragma pack(push, 1) -enum LevelRequirementVsMode -{ - LEVELREQUIREMENT_HEROIC = 70 -}; - struct ZoneDynamicInfo { ZoneDynamicInfo(); @@ -400,8 +356,8 @@ class TC_GAME_API Map : public GridRefManager Map const* GetParent() const { return m_parentMap; } - void GetFullTerrainStatusForPosition(uint32 phaseMask, float x, float y, float z, PositionFullTerrainStatus& data, uint8 reqLiquidType, float collisionHeight) const; - ZLiquidStatus GetLiquidStatus(uint32 phaseMask, float x, float y, float z, uint8 ReqLiquidType, LiquidData* data = nullptr, float collisionHeight = 2.03128f) const; // DEFAULT_COLLISION_HEIGHT in Object.h + void GetFullTerrainStatusForPosition(uint32 phaseMask, float x, float y, float z, PositionFullTerrainStatus& data, Optional reqLiquidType = {}, float collisionHeight = 2.03128f) const; // DEFAULT_COLLISION_HEIGHT in Object.h + ZLiquidStatus GetLiquidStatus(uint32 phaseMask, float x, float y, float z, Optional ReqLiquidType, LiquidData* data = nullptr, float collisionHeight = 2.03128f) const; // DEFAULT_COLLISION_HEIGHT in Object.h bool GetAreaInfo(uint32 phaseMask, float x, float y, float z, uint32& mogpflags, int32& adtId, int32& rootId, int32& groupId) const; uint32 GetAreaId(uint32 phaseMask, float x, float y, float z) const; @@ -458,6 +414,7 @@ class TC_GAME_API Map : public GridRefManager MapDifficulty const* GetMapDifficulty() const; bool Instanceable() const; + bool IsWorldMap() const; bool IsDungeon() const; bool IsNonRaidDungeon() const; bool IsRaid() const; @@ -505,7 +462,7 @@ class TC_GAME_API Map : public GridRefManager void UpdateIteratorBack(Player* player); - TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, WorldObject* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0, bool visibleOnlyBySummoner = false); + TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, WorldObject* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0, ObjectGuid privateObjectOwner = ObjectGuid::Empty); void SummonCreatureGroup(uint8 group, std::list* list = nullptr); Player* GetPlayer(ObjectGuid const& guid); Corpse* GetCorpse(ObjectGuid const& guid); diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index b2e42a91bb8..a49c8bc95f4 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -180,7 +180,10 @@ Map::EnterState MapManager::PlayerCannotEnter(uint32 mapid, Player* player, bool TC_LOG_DEBUG("maps", "MAP: Player '{}' has corpse in instance '{}' and can enter.", player->GetName(), mapName); } else + { TC_LOG_DEBUG("maps", "Map::CanPlayerEnter - player '{}' is dead but does not have a corpse!", player->GetName()); + return Map::CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE; + } } //Get instance where player's group is bound & its map diff --git a/src/server/game/Maps/SpawnData.h b/src/server/game/Maps/SpawnData.h index 863fa13f4bc..d12b814f91f 100644 --- a/src/server/game/Maps/SpawnData.h +++ b/src/server/game/Maps/SpawnData.h @@ -99,6 +99,7 @@ struct SpawnData : public SpawnMetadata int32 spawntimesecs = 0; uint8 spawnMask = 0; uint32 scriptId = 0; + std::string StringId; protected: SpawnData(SpawnObjectType t) : SpawnMetadata(t) {} diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 138991a5115..7df9976243c 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1015,7 +1015,7 @@ enum TrinityStrings LANG_CMDPARSER_SPELL_NO_EXIST = 1514, LANG_CMDPARSER_EXACT_SEQ_MISMATCH = 1515, LANG_CMDPARSER_CURRENCY_NO_EXIST = 1516, // master branch ONLY - LANG_CMDPARSER_QUEST_NO_EXIST = 1517, // RESERVED future cherry-pick + LANG_CMDPARSER_QUEST_NO_EXIST = 1517, // 1516-1996 - free LANG_DEBUG_AREATRIGGER_ENTITY_ENTERED = 1997, // master branch ONLY @@ -1153,7 +1153,7 @@ enum TrinityStrings LANG_NPCINFO_NPC_FLAGS = 5086, // master branch ONLY LANG_NPCINFO_PHASE_IDS = 5087, // master branch ONLY LANG_SCENARIO = 5088, // master branch ONLY - LANG_OBJECTINFO_STRINGIDS = 5089, // master branch ONLY + LANG_OBJECTINFO_STRINGIDS = 5089, // Room for more Trinity strings 5090-6603 diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index 08de2f4e12c..bb90f288596 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -184,7 +184,7 @@ void PathGenerator::BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 con // Check both start and end points, if they're both in water, then we can *safely* let the creature move for (uint32 i = 0; i < _pathPoints.size(); ++i) { - ZLiquidStatus status = _source->GetMap()->GetLiquidStatus(_source->GetPhaseMask(), _pathPoints[i].x, _pathPoints[i].y, _pathPoints[i].z, MAP_ALL_LIQUIDS, nullptr, _source->GetCollisionHeight()); + ZLiquidStatus status = _source->GetMap()->GetLiquidStatus(_source->GetPhaseMask(), _pathPoints[i].x, _pathPoints[i].y, _pathPoints[i].z, {}, nullptr, _source->GetCollisionHeight()); // One of the points is not in the water, cancel movement. if (status == LIQUID_MAP_NO_WATER) { @@ -696,7 +696,7 @@ void PathGenerator::UpdateFilter() NavTerrainFlag PathGenerator::GetNavTerrain(float x, float y, float z) { LiquidData data; - ZLiquidStatus liquidStatus = _source->GetMap()->GetLiquidStatus(_source->GetPhaseMask(), x, y, z, MAP_ALL_LIQUIDS, &data, _source->GetCollisionHeight()); + ZLiquidStatus liquidStatus = _source->GetMap()->GetLiquidStatus(_source->GetPhaseMask(), x, y, z, {}, &data, _source->GetCollisionHeight()); if (liquidStatus == LIQUID_MAP_NO_WATER) return NAV_GROUND; diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 931b6ebd1d0..0b9c767123b 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -61,7 +61,7 @@ namespace Movement MoveSpline& move_spline = *unit->movespline; // Elevators also use MOVEMENTFLAG_ONTRANSPORT but we do not keep track of their position changes (movementInfo.transport.guid is 0 in that case) - bool transport = unit->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && unit->GetTransGUID(); + bool transport = unit->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && !unit->GetTransGUID().IsEmpty(); Location real_position; // there is a big chance that current position is unknown if current state is not finalized, need compute it // this also allows CalculatePath spline position and update map position in much greater intervals @@ -266,6 +266,11 @@ namespace Movement args.path[1] = transform(dest); } + void MoveSplineInit::SetFall() + { + args.flags.EnableFalling(); + } + Vector3 TransportPathTransform::operator()(Vector3 input) { if (_transformForTransport) diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index acf57a89fb4..6fcd3258443 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -151,7 +151,6 @@ namespace Movement inline void MoveSplineInit::SetWalk(bool enable) { args.walk = enable; } inline void MoveSplineInit::SetSmooth() { args.flags.EnableCatmullRom(); } inline void MoveSplineInit::SetCyclic() { args.flags.cyclic = true; } - inline void MoveSplineInit::SetFall() { args.flags.EnableFalling(); } inline void MoveSplineInit::SetVelocity(float vel) { args.velocity = vel; args.HasVelocity = true; } inline void MoveSplineInit::SetBackward() { args.flags.backward = true; } inline void MoveSplineInit::SetTransportEnter() { args.flags.EnableTransportEnter(); } diff --git a/src/server/game/Petitions/PetitionMgr.h b/src/server/game/Petitions/PetitionMgr.h index 4e38ba0da02..16fddfa2f47 100644 --- a/src/server/game/Petitions/PetitionMgr.h +++ b/src/server/game/Petitions/PetitionMgr.h @@ -27,18 +27,22 @@ enum PetitionTurns { - PETITION_TURN_OK = 0, - PETITION_TURN_ALREADY_IN_GUILD = 2, - PETITION_TURN_NEED_MORE_SIGNATURES = 4 + PETITION_TURN_OK = 0, + PETITION_TURN_ALREADY_IN_GUILD = 2, + PETITION_TURN_NEED_MORE_SIGNATURES = 4, + PETITION_TURN_GUILD_PERMISSIONS = 11, }; enum PetitionSigns { - PETITION_SIGN_OK = 0, - PETITION_SIGN_ALREADY_SIGNED = 1, - PETITION_SIGN_ALREADY_IN_GUILD = 2, - PETITION_SIGN_CANT_SIGN_OWN = 3, - PETITION_SIGN_NOT_SERVER = 4 + PETITION_SIGN_OK = 0, + PETITION_SIGN_ALREADY_SIGNED = 1, + PETITION_SIGN_ALREADY_IN_GUILD = 2, + PETITION_SIGN_CANT_SIGN_OWN = 3, + PETITION_SIGN_NOT_SERVER = 5, + PETITION_SIGN_FULL = 8, + PETITION_SIGN_ALREADY_SIGNED_OTHER = 10, + PETITION_SIGN_RESTRICTED_ACCOUNT = 11, }; typedef std::pair Signature; diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 511bf145014..ddc0097fada 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -36,7 +36,7 @@ Quest::Quest(Field* questRecord) _type = questRecord[5].GetUInt16(); _suggestedPlayers = questRecord[6].GetUInt8(); _timeAllowed = questRecord[7].GetUInt32(); - _allowableRaces = questRecord[8].GetUInt16(); + _allowableRaces = questRecord[8].GetUInt32(); _requiredFactionId1 = questRecord[9].GetUInt16(); _requiredFactionId2 = questRecord[10].GetUInt16(); _requiredFactionValue1 = questRecord[11].GetInt32(); diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index d51b12bee81..4f22049223b 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -809,8 +809,8 @@ class SpecializedScriptRegistry } else { - // The script uses a script name from database, but isn't assigned to anything. - TC_LOG_ERROR("sql.sql", "Script '{}' exists in the core, but the database does not assign it to any creature.", + // The script exist in the core, but isn't assigned to anything in the database. + TC_LOG_ERROR("sql.sql", "Script '{}' exists in the core, but is not referenced by the database!", script->GetName()); // Avoid calling "delete script;" because we are currently in the script constructor diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 041ea5b7599..de8cc0b7524 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -19,6 +19,7 @@ #define AllPackets_h__ #include "BankPackets.h" +#include "BattlegroundPackets.h" #include "CalendarPackets.h" #include "CharacterPackets.h" #include "ChatPackets.h" diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp new file mode 100644 index 00000000000..460820e900a --- /dev/null +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -0,0 +1,272 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 . + */ + +#include "BattlegroundPackets.h" +#include "Battleground.h" + +void WorldPackets::Battleground::AreaSpiritHealerQuery::Read() +{ + _worldPacket >> HealerGuid; +} + +void WorldPackets::Battleground::AreaSpiritHealerQueue::Read() +{ + _worldPacket >> HealerGuid; +} + +WorldPacket const* WorldPackets::Battleground::AreaSpiritHealerTime::Write() +{ + _worldPacket << HealerGuid; + _worldPacket << int32(TimeLeft); + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData_RatingData const& ratingData) +{ + for (std::size_t i = 0; i < 2; ++i) + { + data << int32(ratingData.Prematch[i]); + data << int32(ratingData.Postmatch[i]); + data << int32(ratingData.PrematchMMR[i]); + } + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData_Arena const& arena) +{ + data << arena.Ratings; + for (std::string_view const& teamName : arena.TeamName) + data << teamName; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData_Honor const& honorData) +{ + data << uint32(honorData.HonorKills); + data << uint32(honorData.Deaths); + data << uint32(honorData.ContributionPoints); + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData_Player const& playerData) +{ + data << playerData.PlayerGUID; + data << uint32(playerData.Kills); + std::visit([&](auto const& v) { return data << v; }, playerData.HonorOrFaction); + data << uint32(playerData.DamageDone); + data << uint32(playerData.HealingDone); + data << uint32(playerData.Stats.size()); + for (uint32 pvpStat : playerData.Stats) + data << uint32(pvpStat); + + return data; +} + +WorldPacket const* WorldPackets::Battleground::PVPMatchStatistics::Write() +{ + _worldPacket.reserve(sizeof(PVPLogData_Arena) + 1 + 1 + 4 + Players.size() * sizeof(PVPLogData_Player)); + + _worldPacket << uint8(Arena.has_value()); + if (Arena) + _worldPacket << *Arena; + + _worldPacket << uint8(Winner.has_value()); + if (Winner) + _worldPacket << uint8(*Winner); + + _worldPacket << uint32(Players.size()); + for (PVPLogData_Player const& player : Players) + _worldPacket << player; + + return &_worldPacket; +} + +void WorldPackets::Battleground::BattlemasterJoin::Read() +{ + _worldPacket >> BattlemasterGuid; + _worldPacket >> BattlemasterListID; + _worldPacket >> InstanceID; + _worldPacket >> JoinAsGroup; +} + +void WorldPackets::Battleground::BattlemasterJoinArena::Read() +{ + _worldPacket >> BattlemasterGuid; + _worldPacket >> TeamSizeIndex; + _worldPacket >> JoinAsGroup; + _worldPacket >> IsRated; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::BattlefieldStatusHeader const& header) +{ + data << uint32(header.QueueSlot); + data << uint64(header.QueueID); + data << uint8(header.RangeMin); + data << uint8(header.RangeMax); + data << uint32(header.InstanceID); + data << uint8(header.RegisteredMatch); + return data; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusNone::Write() +{ + _worldPacket << uint32(QueueSlot); + _worldPacket << uint64(0); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusNeedConfirmation::Write() +{ + _worldPacket << Hdr; + _worldPacket << uint32(STATUS_WAIT_JOIN); + _worldPacket << uint32(Mapid); + _worldPacket << uint64(RandomQueueID); + _worldPacket << uint32(Timeout); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusActive::Write() +{ + _worldPacket << Hdr; + _worldPacket << uint32(STATUS_IN_PROGRESS); + _worldPacket << uint32(Mapid); + _worldPacket << uint64(RandomQueueID); + _worldPacket << uint32(ShutdownTimer); + _worldPacket << uint32(StartTimer); + _worldPacket << uint8(ArenaFaction); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusQueued::Write() +{ + _worldPacket << Hdr; + _worldPacket << uint32(STATUS_WAIT_QUEUE); + _worldPacket << uint32(AverageWaitTime); + _worldPacket << uint32(WaitTime); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::GroupJoinedBattleground::Write() +{ + _worldPacket << uint32(Reason); + if (Reason == ERR_BATTLEGROUND_JOIN_TIMED_OUT || Reason == ERR_BATTLEGROUND_JOIN_FAILED) + _worldPacket << ClientID; + + return &_worldPacket; +} + +void WorldPackets::Battleground::BattlefieldLeave::Read() +{ + _worldPacket >> QueueID; +} + +void WorldPackets::Battleground::BattlefieldPort::Read() +{ + _worldPacket >> QueueID; + _worldPacket >> AcceptedInvite; +} + +void WorldPackets::Battleground::BattlefieldListRequest::Read() +{ + _worldPacket >> ListID; + _worldPacket >> PvpAnywhere; + _worldPacket >> NoXpGain; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldList::Write() +{ + _worldPacket << BattlemasterGuid; + _worldPacket << uint8(PvpAnywhere); + _worldPacket << int32(BattlemasterListID); + _worldPacket << uint8(MinLevel); + _worldPacket << uint8(MaxLevel); + + _worldPacket << uint8(HasHolidayWinToday); + _worldPacket << uint32(HolidayWinHonorCurrencyBonus); + _worldPacket << uint32(HolidayFirstWinArenaCurrencyBonus); + _worldPacket << uint32(HolidayLossHonorCurrencyBonus); + + _worldPacket << uint8(BattlemasterListID == BATTLEGROUND_RB); + if (BattlemasterListID == BATTLEGROUND_RB) + { + _worldPacket << uint8(HasRandomWinToday); + _worldPacket << uint32(RandomWinHonorCurrencyBonus); + _worldPacket << uint32(RandomFirstWinArenaCurrencyBonus); + _worldPacket << uint32(RandomLossHonorCurrencyBonus); + } + + _worldPacket << uint32(Battlefields ? Battlefields->size() : 0); + if (Battlefields) + for (uint32 battlefield : *Battlefields) + _worldPacket << uint32(battlefield); + + return &_worldPacket; +} + +void WorldPackets::Battleground::ReportPvPPlayerAFK::Read() +{ + _worldPacket >> Offender; +} + +WorldPacket const* WorldPackets::Battleground::ReportPvPPlayerAFKResult::Write() +{ + _worldPacket << uint8(Result); + _worldPacket << uint8(NumBlackMarksOnOffender); + _worldPacket << uint8(NumPlayersIHaveReported); + _worldPacket << Offender; + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::BattlegroundPlayerPosition const& playerPosition) +{ + data << playerPosition.Guid; + data << playerPosition.Pos; + return data; +} + +WorldPacket const* WorldPackets::Battleground::BattlegroundPlayerPositions::Write() +{ + _worldPacket << uint32(Players.size()); + for (BattlegroundPlayerPosition const& pos : Players) + _worldPacket << pos; + + _worldPacket << uint32(FlagCarriers.size()); + for (BattlegroundPlayerPosition const& pos : FlagCarriers) + _worldPacket << pos; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlegroundPlayerJoined::Write() +{ + _worldPacket << Guid; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlegroundPlayerLeft::Write() +{ + _worldPacket << Guid; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::DestroyArenaUnit::Write() +{ + _worldPacket << Guid; + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h new file mode 100644 index 00000000000..3006c89dc7f --- /dev/null +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -0,0 +1,375 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 . + */ + +#ifndef BattlegroundPackets_h__ +#define BattlegroundPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" +#include "Optional.h" +#include "Position.h" +#include +#include + +namespace WorldPackets +{ + namespace Battleground + { + class AreaSpiritHealerQuery final : public ClientPacket + { + public: + AreaSpiritHealerQuery(WorldPacket&& packet) : ClientPacket(CMSG_AREA_SPIRIT_HEALER_QUERY, std::move(packet)) { } + + void Read() override; + + ObjectGuid HealerGuid; + }; + + class AreaSpiritHealerQueue final : public ClientPacket + { + public: + AreaSpiritHealerQueue(WorldPacket&& packet) : ClientPacket(CMSG_AREA_SPIRIT_HEALER_QUEUE, std::move(packet)) { } + + void Read() override; + + ObjectGuid HealerGuid; + }; + + class AreaSpiritHealerTime final : public ServerPacket + { + public: + AreaSpiritHealerTime() : ServerPacket(SMSG_AREA_SPIRIT_HEALER_TIME, 8 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid HealerGuid; + int32 TimeLeft = 0; + }; + + class HearthAndResurrect final : public ClientPacket + { + public: + HearthAndResurrect(WorldPacket&& packet) : ClientPacket(CMSG_HEARTH_AND_RESURRECT, std::move(packet)) { } + + void Read() override { } + }; + + class PVPLogDataRequest final : public ClientPacket + { + public: + PVPLogDataRequest(WorldPacket&& packet) : ClientPacket(MSG_PVP_LOG_DATA, std::move(packet)) { } + + void Read() override { } + }; + + struct PVPLogData_RatingData + { + std::array Prematch = { }; + std::array Postmatch = { }; + std::array PrematchMMR = { }; + }; + + struct PVPLogData_Arena + { + PVPLogData_RatingData Ratings; + std::array TeamName; + }; + + struct PVPLogData_Honor + { + uint32 HonorKills = 0; + uint32 Deaths = 0; + uint32 ContributionPoints = 0; + }; + + struct PVPLogData_Player + { + ObjectGuid PlayerGUID; + uint32 Kills = 0; + std::variant HonorOrFaction; + uint32 DamageDone = 0; + uint32 HealingDone = 0; + std::vector Stats; + }; + + class PVPMatchStatistics final : public ServerPacket + { + public: + PVPMatchStatistics() : ServerPacket(MSG_PVP_LOG_DATA, 0) { } + + WorldPacket const* Write() override; + + Optional Winner; + std::vector Players; + Optional Arena; + }; + + struct BattlefieldStatusHeader + { + uint32 QueueSlot = 0; + uint64 QueueID = 0; + uint8 RangeMin = 0; + uint8 RangeMax = 0; + uint32 InstanceID = 0; + bool RegisteredMatch = false; + }; + + class BattlefieldStatusNone final : public ServerPacket + { + public: + BattlefieldStatusNone() : ServerPacket(SMSG_BATTLEFIELD_STATUS, 4 + 8) { } + + WorldPacket const* Write() override; + + uint32 QueueSlot = 0; + }; + + class BattlefieldStatusNeedConfirmation final : public ServerPacket + { + public: + BattlefieldStatusNeedConfirmation() : ServerPacket(SMSG_BATTLEFIELD_STATUS, 4 + 4 + sizeof(BattlefieldStatusHeader) + 8) { } + + WorldPacket const* Write() override; + + uint32 Timeout = 0; + uint32 Mapid = 0; + BattlefieldStatusHeader Hdr; + uint64 RandomQueueID = 0; + }; + + class BattlefieldStatusActive final : public ServerPacket + { + public: + BattlefieldStatusActive() : ServerPacket(SMSG_BATTLEFIELD_STATUS, sizeof(BattlefieldStatusHeader) + 4 + 1 + 4 + 4 + 8) { } + + WorldPacket const* Write() override; + + BattlefieldStatusHeader Hdr; + uint32 ShutdownTimer = 0; + uint8 ArenaFaction = 0; + uint32 StartTimer = 0; + uint32 Mapid = 0; + uint64 RandomQueueID = 0; + }; + + class BattlefieldStatusQueued final : public ServerPacket + { + public: + BattlefieldStatusQueued() : ServerPacket(SMSG_BATTLEFIELD_STATUS, 4 + sizeof(BattlefieldStatusHeader) + 4) { } + + WorldPacket const* Write() override; + + uint32 AverageWaitTime = 0; + BattlefieldStatusHeader Hdr; + uint32 WaitTime = 0; + }; + + class GroupJoinedBattleground final : public ServerPacket + { + public: + GroupJoinedBattleground() : ServerPacket(SMSG_GROUP_JOINED_BATTLEGROUND, 8 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid ClientID; + int32 Reason = 0; + }; + + using BattlefieldStatusFailed = GroupJoinedBattleground; + + class BattlemasterJoin final : public ClientPacket + { + public: + BattlemasterJoin(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEMASTER_JOIN, std::move(packet)) { } + + void Read() override; + + ObjectGuid BattlemasterGuid; + uint32 BattlemasterListID = 0; + uint32 InstanceID = 0; + bool JoinAsGroup = false; + }; + + class BattlemasterJoinArena final : public ClientPacket + { + public: + BattlemasterJoinArena(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEMASTER_JOIN_ARENA, std::move(packet)) { } + + void Read() override; + + ObjectGuid BattlemasterGuid; + uint8 TeamSizeIndex = 0; + bool JoinAsGroup = false; + bool IsRated = false; + }; + + class BattlefieldLeave final : public ClientPacket + { + public: + BattlefieldLeave(WorldPacket&& packet) : ClientPacket(CMSG_LEAVE_BATTLEFIELD, std::move(packet)) { } + + void Read() override; + + uint64 QueueID = 0; + }; + + class BattlefieldPort final : public ClientPacket + { + public: + BattlefieldPort(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEFIELD_PORT, std::move(packet)) { } + + void Read() override; + + uint64 QueueID = 0; + bool AcceptedInvite = false; + }; + + class BattlefieldListRequest final : public ClientPacket + { + public: + BattlefieldListRequest(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEFIELD_LIST, std::move(packet)) { } + + void Read() override; + + int32 ListID = 0; + bool PvpAnywhere = false; + bool NoXpGain = false; + }; + + class BattlefieldList final : public ServerPacket + { + public: + BattlefieldList() : ServerPacket(SMSG_BATTLEFIELD_LIST, 8 + 1 + 4 + 1 + 1 + 1 + 4 + 4 + 4 + 1 + 1 + 4 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid BattlemasterGuid; + int32 BattlemasterListID = 0; + uint8 MinLevel = 0; + uint8 MaxLevel = 0; + std::set const* Battlefields = nullptr; + bool PvpAnywhere = false; + bool HasHolidayWinToday = false; + uint32 HolidayWinHonorCurrencyBonus = 0; + uint32 HolidayFirstWinArenaCurrencyBonus = 0; + uint32 HolidayLossHonorCurrencyBonus = 0; + bool HasRandomWinToday = false; + uint32 RandomWinHonorCurrencyBonus = 0; + uint32 RandomFirstWinArenaCurrencyBonus = 0; + uint32 RandomLossHonorCurrencyBonus = 0; + }; + + class RequestBattlefieldStatus final : public ClientPacket + { + public: + RequestBattlefieldStatus(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEFIELD_STATUS, std::move(packet)) { } + + void Read() override { } + }; + + class ReportPvPPlayerAFK final : public ClientPacket + { + public: + ReportPvPPlayerAFK(WorldPacket&& packet) : ClientPacket(CMSG_REPORT_PVP_AFK, std::move(packet)) { } + + void Read() override; + + ObjectGuid Offender; + }; + + class ReportPvPPlayerAFKResult final : public ServerPacket + { + public: + ReportPvPPlayerAFKResult() : ServerPacket(SMSG_REPORT_PVP_AFK_RESULT, 8 + 1 + 1 + 1) { } + + WorldPacket const* Write() override; + + enum ResultCode : uint8 + { + PVP_REPORT_AFK_SUCCESS = 0, + PVP_REPORT_AFK_GENERIC_FAILURE = 1, // there are more error codes but they are impossible to receive without modifying the client + PVP_REPORT_AFK_SYSTEM_ENABLED = 5, + PVP_REPORT_AFK_SYSTEM_DISABLED = 6 + }; + + ObjectGuid Offender; + uint8 NumPlayersIHaveReported = 0; + uint8 NumBlackMarksOnOffender = 0; + uint8 Result = PVP_REPORT_AFK_GENERIC_FAILURE; + }; + + class BattlegroundPlayerPositionsRequest final : public ClientPacket + { + public: + BattlegroundPlayerPositionsRequest(WorldPacket&& packet) : ClientPacket(MSG_BATTLEGROUND_PLAYER_POSITIONS, std::move(packet)) { } + + void Read() override { } + }; + + struct BattlegroundPlayerPosition + { + BattlegroundPlayerPosition() { } + BattlegroundPlayerPosition(ObjectGuid const& guid, TaggedPosition const& pos) : Guid(guid), Pos(pos) { } + + ObjectGuid Guid; + TaggedPosition Pos; + }; + + class BattlegroundPlayerPositions final : public ServerPacket + { + public: + BattlegroundPlayerPositions() : ServerPacket(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4) { } + + WorldPacket const* Write() override; + + std::vector Players; + std::vector FlagCarriers; + }; + + class BattlegroundPlayerJoined final : public ServerPacket + { + public: + BattlegroundPlayerJoined() : ServerPacket(SMSG_BATTLEGROUND_PLAYER_JOINED, 8) { } + + WorldPacket const* Write() override; + + ObjectGuid Guid; + }; + + class BattlegroundPlayerLeft final : public ServerPacket + { + public: + BattlegroundPlayerLeft() : ServerPacket(SMSG_BATTLEGROUND_PLAYER_LEFT, 8) { } + + WorldPacket const* Write() override; + + ObjectGuid Guid; + }; + + class DestroyArenaUnit final : public ServerPacket + { + public: + DestroyArenaUnit() : ServerPacket(SMSG_ARENA_UNIT_DESTROYED, 8) { } + + WorldPacket const* Write() override; + + ObjectGuid Guid; + }; + } +} + +#endif // BattlegroundPackets_h__ diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp index 7653e2a2328..c3d060eb9f6 100755 --- a/src/server/game/Server/Packets/PetPackets.cpp +++ b/src/server/game/Server/Packets/PetPackets.cpp @@ -50,3 +50,28 @@ WorldPacket const* WorldPackets::Pet::PetUnlearnedSpell::Write() _worldPacket << uint32(SpellID); return &_worldPacket; } + +WorldPacket const* WorldPackets::Pet::PetActionFeedback::Write() +{ + _worldPacket << uint8(Response); + if (Response == ::PetActionFeedback::NoTarget || Response == ::PetActionFeedback::InvalidTarget) + _worldPacket << int32(SpellID); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Pet::PetActionSound::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << int32(Action); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Pet::PetDismissSound::Write() +{ + _worldPacket << int32(ModelId); + _worldPacket << ModelPosition; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h index cf175fb6f5a..ab9856d1dc1 100755 --- a/src/server/game/Server/Packets/PetPackets.h +++ b/src/server/game/Server/Packets/PetPackets.h @@ -19,6 +19,8 @@ #define PetPackets_h__ #include "Packet.h" +#include "PetDefines.h" +#include "Position.h" #include "ObjectGuid.h" namespace WorldPackets @@ -94,6 +96,39 @@ namespace WorldPackets void Read() override { } }; + + class PetActionFeedback final : public ServerPacket + { + public: + PetActionFeedback() : ServerPacket(SMSG_PET_ACTION_FEEDBACK, 4 + 1) { } + + WorldPacket const* Write() override; + + int32 SpellID = 0; + ::PetActionFeedback Response = ::PetActionFeedback::None; + }; + + class PetActionSound final : public ServerPacket + { + public: + PetActionSound() : ServerPacket(SMSG_PET_ACTION_SOUND, 8 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + int32 Action = 0; + }; + + class PetDismissSound final : public ServerPacket + { + public: + PetDismissSound() : ServerPacket(SMSG_PET_DISMISS_SOUND, 4 + 12) { } + + WorldPacket const* Write() override; + + int32 ModelId = 0; + TaggedPosition ModelPosition; + }; } } diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index c09a0da8e59..83ccc9399ce 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -76,6 +76,34 @@ WorldPacket const* WorldPackets::Query::QueryGameObjectResponse::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Query::CorpseLocation::Write() +{ + _worldPacket << uint8(Valid); + + if (Valid) + { + _worldPacket << int32(MapID); + _worldPacket << Position; + _worldPacket << int32(ActualMapID); + _worldPacket << uint32(Transport); + } + + return &_worldPacket; +} + +void WorldPackets::Query::QueryCorpseTransport::Read() +{ + _worldPacket >> Transport; +} + +WorldPacket const* WorldPackets::Query::CorpseTransportQuery::Write() +{ + _worldPacket << Position; + _worldPacket << float(Facing); + + return &_worldPacket; +} + void WorldPackets::Query::QueryItemSingle::Read() { _worldPacket >> ItemID; diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 333e2eb7854..8c36c07afcd 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -108,6 +108,49 @@ namespace WorldPackets GameObjectStats Stats; }; + class QueryCorpseLocationFromClient final : public ClientPacket + { + public: + QueryCorpseLocationFromClient(WorldPacket&& packet) : ClientPacket(MSG_CORPSE_QUERY, std::move(packet)) { } + + void Read() override { } + }; + + class CorpseLocation final : public ServerPacket + { + public: + CorpseLocation() : ServerPacket(MSG_CORPSE_QUERY, 1 + 4 + 4 + 4 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + uint32 Transport = 0; + TaggedPosition<::Position::XYZ> Position; + int32 ActualMapID = 0; + int32 MapID = 0; + bool Valid = false; + }; + + class QueryCorpseTransport final : public ClientPacket + { + public: + QueryCorpseTransport(WorldPacket&& packet) : ClientPacket(CMSG_CORPSE_MAP_POSITION_QUERY, std::move(packet)) { } + + void Read() override; + + uint32 Transport = 0; + }; + + class CorpseTransportQuery final : public ServerPacket + { + public: + CorpseTransportQuery() : ServerPacket(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, 4 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + TaggedPosition<::Position::XYZ> Position; + float Facing = 0.0f; + }; + class QueryItemSingle final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index fa74294b13e..37d38d1da60 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -19,46 +19,34 @@ #include "SharedDefines.h" #include "Spell.h" #include "SpellInfo.h" +#include -void WorldPackets::Spells::CancelCast::Read() +namespace WorldPackets::Spells { - _worldPacket >> CastID; - _worldPacket >> SpellID; -} - -void WorldPackets::Spells::CancelAura::Read() -{ - _worldPacket >> SpellID; -} - -void WorldPackets::Spells::PetCancelAura::Read() +void CancelAura::Read() { - _worldPacket >> PetGUID; _worldPacket >> SpellID; } -void WorldPackets::Spells::CancelChannelling::Read() +void CancelChannelling::Read() { _worldPacket >> ChannelSpell; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus const& spellMissStatus) +void PetCancelAura::Read() { - data << uint64(spellMissStatus.TargetGUID); - data << uint8(spellMissStatus.Reason); - if (spellMissStatus.Reason == SPELL_MISS_REFLECT) - data << uint8(spellMissStatus.ReflectStatus); - return data; + _worldPacket >> PetGUID; + _worldPacket >> SpellID; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation const& targetLocation) +ByteBuffer& operator<<(ByteBuffer& data, TargetLocation const& targetLocation) { data << targetLocation.Transport.WriteAsPacked(); // relative position guid here - transport for example data << targetLocation.Location.PositionXYZStream(); return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData const& spellTargetData) +ByteBuffer& operator<<(ByteBuffer& data, SpellTargetData const& spellTargetData) { data << uint32(spellTargetData.Flags); @@ -76,40 +64,52 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData c if (spellTargetData.Name) data << *spellTargetData.Name; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, SpellMissStatus const& spellMissStatus) +{ + data << uint64(spellMissStatus.TargetGUID); + data << uint8(spellMissStatus.Reason); + if (spellMissStatus.Reason == SPELL_MISS_REFLECT) + data << uint8(spellMissStatus.ReflectStatus); + return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::RuneData const& runeData) +ByteBuffer& operator<<(ByteBuffer& data, RuneData const& runeData) { data << uint8(runeData.Start); data << uint8(runeData.Count); for (uint8 cooldown : runeData.Cooldowns) data << uint8(cooldown); + return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::MissileTrajectoryResult const& traj) +ByteBuffer& operator<<(ByteBuffer& data, MissileTrajectoryResult const& traj) { data << float(traj.Pitch); data << uint32(traj.TravelTime); return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellAmmo const& spellAmmo) +ByteBuffer& operator<<(ByteBuffer& data, SpellAmmo const& spellAmmo) { data << uint32(spellAmmo.DisplayID); data << uint32(spellAmmo.InventoryType); return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::CreatureImmunities const& immunities) +ByteBuffer& operator<<(ByteBuffer& data, CreatureImmunities const& immunities) { data << uint32(immunities.School); data << uint32(immunities.Value); return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData const& spellCastData) +ByteBuffer& operator<<(ByteBuffer& data, SpellCastData const& spellCastData) { data << spellCastData.CasterGUID.WriteAsPacked(); data << spellCastData.CasterUnit.WriteAsPacked(); @@ -125,19 +125,16 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con // Spells like 40647 (with a huge radius) can easily reach this limit (spell might need // target conditions but we still need to limit the number of targets sent and keeping // correct count for both hit and miss). - static std::size_t const PACKET_TARGET_LIMIT = std::numeric_limits::max(); - if (spellCastData.HitTargets->size() > PACKET_TARGET_LIMIT) - spellCastData.HitTargets->resize(PACKET_TARGET_LIMIT); - - data << uint8(spellCastData.HitTargets->size()); - for (ObjectGuid const& target : *spellCastData.HitTargets) - data << uint64(target); + static constexpr std::size_t PACKET_TARGET_LIMIT = std::numeric_limits::max(); - if (spellCastData.MissStatus->size() > PACKET_TARGET_LIMIT) - spellCastData.MissStatus->resize(PACKET_TARGET_LIMIT); + std::span hitTargets(spellCastData.HitTargets->data(), std::min(spellCastData.HitTargets->size(), PACKET_TARGET_LIMIT)); + data << uint8(hitTargets.size()); + for (ObjectGuid const& target : hitTargets) + data << target; - data << uint8(spellCastData.MissStatus->size()); - for (WorldPackets::Spells::SpellMissStatus const& status : *spellCastData.MissStatus) + std::span missTargets(spellCastData.MissStatus->data(), std::min(spellCastData.MissStatus->size(), PACKET_TARGET_LIMIT)); + data << uint8(missTargets.size()); + for (SpellMissStatus const& status : missTargets) data << status; } @@ -164,37 +161,66 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con data << uint32(0); } - if (spellCastData.Target.Flags & TARGET_FLAG_DEST_LOCATION) - data << uint8(0); + if (spellCastData.DestLocSpellCastIndex) + data << uint8(*spellCastData.DestLocSpellCastIndex); + + if (spellCastData.TargetPoints) + { + data << int32(spellCastData.TargetPoints->size()); + for (TargetLocation const& targetPoint : *spellCastData.TargetPoints) + { + data << targetPoint.Location.PositionXYZStream(); + data << targetPoint.Transport; + } + } + return data; } -WorldPacket const* WorldPackets::Spells::SpellGo::Write() +WorldPacket const* SpellStart::Write() { _worldPacket << Cast; + return &_worldPacket; } -WorldPacket const* WorldPackets::Spells::SpellStart::Write() +WorldPacket const* SpellGo::Write() { _worldPacket << Cast; + return &_worldPacket; } -WorldPacket const* WorldPackets::Spells::ResyncRunes::Write() +WorldPacket const* PlaySpellVisualKit::Write() +{ + _worldPacket << Unit; + _worldPacket << int32(KitRecID); + + return &_worldPacket; +} + +void CancelCast::Read() +{ + _worldPacket >> CastID; + _worldPacket >> SpellID; +} + +WorldPacket const* ResyncRunes::Write() { _worldPacket << Count; - for (WorldPackets::Spells::ResyncRune const& rune : Runes) + for (ResyncRune const& rune : Runes) { _worldPacket << rune.RuneType; _worldPacket << rune.Cooldown; } + return &_worldPacket; } -WorldPacket const* WorldPackets::Spells::MountResult::Write() +WorldPacket const* MountResult::Write() { _worldPacket << int32(Result); return &_worldPacket; } +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 764187a4b1e..f714d12f989 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -28,36 +28,32 @@ namespace WorldPackets { namespace Spells { - class CancelCast final : public ClientPacket + class CancelAura final : public ClientPacket { public: - CancelCast(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_CAST, std::move(packet)) { } + CancelAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AURA, std::move(packet)) { } void Read() override; - uint8 CastID = 0; uint32 SpellID = 0; }; - class CancelAura final : public ClientPacket + class CancelAutoRepeatSpell final : public ClientPacket { public: - CancelAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AURA, std::move(packet)) { } - - void Read() override; + CancelAutoRepeatSpell(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AUTO_REPEAT_SPELL, std::move(packet)) { } - uint32 SpellID = 0; + void Read() override { } }; - class PetCancelAura final : public ClientPacket + class CancelChannelling final : public ClientPacket { public: - PetCancelAura(WorldPacket&& packet) : ClientPacket(CMSG_PET_CANCEL_AURA, std::move(packet)) { } + CancelChannelling(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_CHANNELLING, std::move(packet)) { } void Read() override; - ObjectGuid PetGUID; - uint32 SpellID = 0; + uint32 ChannelSpell = 0; }; class CancelGrowthAura final : public ClientPacket @@ -76,22 +72,31 @@ namespace WorldPackets void Read() override { } }; - class CancelAutoRepeatSpell final : public ClientPacket + class PetCancelAura final : public ClientPacket { public: - CancelAutoRepeatSpell(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AUTO_REPEAT_SPELL, std::move(packet)) { } + PetCancelAura(WorldPacket&& packet) : ClientPacket(CMSG_PET_CANCEL_AURA, std::move(packet)) { } - void Read() override { } + void Read() override; + + ObjectGuid PetGUID; + uint32 SpellID = 0; }; - class CancelChannelling final : public ClientPacket + struct TargetLocation { - public: - CancelChannelling(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_CHANNELLING, std::move(packet)) { } - - void Read() override; + ObjectGuid Transport; + Position Location; + }; - uint32 ChannelSpell = 0; + struct SpellTargetData + { + uint32 Flags = 0; + Optional Unit; + Optional Item; + Optional SrcLocation; + Optional DstLocation; + Optional Name; }; struct SpellMissStatus @@ -126,22 +131,6 @@ namespace WorldPackets uint32 Value = 0; }; - struct TargetLocation - { - ObjectGuid Transport; - Position Location; - }; - - struct SpellTargetData - { - uint32 Flags = 0; - Optional Unit; - Optional Item; - Optional SrcLocation; - Optional DstLocation; - Optional Name; - }; - struct SpellCastData { ObjectGuid CasterGUID; @@ -150,38 +139,62 @@ namespace WorldPackets uint32 SpellID = 0; uint32 CastFlags = 0; uint32 CastTime = 0; - mutable Optional> HitTargets; - mutable Optional> MissStatus; + Optional> HitTargets; + Optional> MissStatus; SpellTargetData Target; Optional RemainingPower; Optional RemainingRunes; Optional MissileTrajectory; Optional Ammo; + Optional DestLocSpellCastIndex; + Optional> TargetPoints; Optional Immunities; }; + class SpellStart final : public ServerPacket + { + public: + SpellStart() : ServerPacket(SMSG_SPELL_START) { } + + WorldPacket const* Write() override; + + SpellCastData Cast; + }; + class SpellGo final : public ServerPacket { - public: - SpellGo() : ServerPacket(SMSG_SPELL_GO) - { - Cast.HitTargets.emplace(); - Cast.MissStatus.emplace(); - } + public: + SpellGo() : ServerPacket(SMSG_SPELL_GO) + { + Cast.HitTargets.emplace(); + Cast.MissStatus.emplace(); + } - WorldPacket const* Write() override; + WorldPacket const* Write() override; - SpellCastData Cast; + SpellCastData Cast; }; - class SpellStart final : public ServerPacket + class PlaySpellVisualKit final : public ServerPacket { - public: - SpellStart() : ServerPacket(SMSG_SPELL_START) { } + public: + PlaySpellVisualKit(int32 kitType) : ServerPacket(kitType ? SMSG_PLAY_SPELL_IMPACT : SMSG_PLAY_SPELL_VISUAL, 8 + 4) { } - WorldPacket const* Write() override; + WorldPacket const* Write() override; - SpellCastData Cast; + ObjectGuid Unit; + int32 KitRecID = 0; + }; + + class CancelCast final : public ClientPacket + { + public: + CancelCast(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_CAST, std::move(packet)) { } + + void Read() override; + + uint8 CastID = 0; + uint32 SpellID = 0; }; struct ResyncRune diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 34710741eca..1364387911a 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -662,7 +662,7 @@ void OpcodeTable::Initialize() /*0x213*/ DEFINE_HANDLER(CMSG_UNLEARN_TALENTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x214*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, STATUS_NEVER); /*0x215*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM, STATUS_NEVER); - /*0x216*/ DEFINE_HANDLER(MSG_CORPSE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseQueryOpcode ); + /*0x216*/ DEFINE_HANDLER(MSG_CORPSE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryCorpseLocation ); /*0x217*/ DEFINE_HANDLER(CMSG_GMTICKET_DELETETICKET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketDeleteOpcode ); /*0x218*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_DELETETICKET, STATUS_NEVER); /*0x219*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_WRONG_FACTION, STATUS_NEVER); @@ -851,7 +851,7 @@ void OpcodeTable::Initialize() /*0x2D0*/ DEFINE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck ); /*0x2D1*/ DEFINE_HANDLER(CMSG_MOVE_NOT_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveNotActiveMover ); /*0x2D2*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SOUND, STATUS_NEVER); - /*0x2D3*/ DEFINE_HANDLER(CMSG_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldStatusOpcode ); + /*0x2D3*/ DEFINE_HANDLER(CMSG_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestBattlefieldStatusOpcode); /*0x2D4*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS, STATUS_NEVER); /*0x2D5*/ DEFINE_HANDLER(CMSG_BATTLEFIELD_PORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattleFieldPortOpcode ); /*0x2D6*/ DEFINE_HANDLER(MSG_INSPECT_HONOR_STATS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleInspectHonorStatsOpcode ); @@ -1334,7 +1334,7 @@ void OpcodeTable::Initialize() /*0x4B3*/ DEFINE_HANDLER(CMSG_ITEM_REFUND_INFO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefundInfoRequest ); /*0x4B4*/ DEFINE_HANDLER(CMSG_ITEM_REFUND, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefund ); /*0x4B5*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_RESULT, STATUS_NEVER); - /*0x4B6*/ DEFINE_HANDLER(CMSG_CORPSE_MAP_POSITION_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseMapPositionQuery ); + /*0x4B6*/ DEFINE_HANDLER(CMSG_CORPSE_MAP_POSITION_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryCorpseTransport ); /*0x4B7*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, STATUS_NEVER); /*0x4B8*/ DEFINE_HANDLER(CMSG_UNUSED5, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); /*0x4B9*/ DEFINE_HANDLER(CMSG_UNUSED6, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -1359,7 +1359,7 @@ void OpcodeTable::Initialize() /*0x4CC*/ DEFINE_HANDLER(CMSG_END_BATTLEFIELD_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x4CD*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_NEVER); /*0x4CE*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_DISABLE, STATUS_NEVER); - /*0x4CF*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveGravityDisableAck ); + /*0x4CF*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveGravityDisableAck ); /*0x4D0*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_ENABLE, STATUS_NEVER); /*0x4D1*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_ENABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveGravityEnableAck); /*0x4D2*/ DEFINE_SERVER_OPCODE_HANDLER(MSG_MOVE_GRAVITY_CHNG, STATUS_NEVER); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 15cb8e3830d..182921c1cc8 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -523,15 +523,12 @@ void WorldSession::LogoutPlayer(bool save) if (Battleground* bg = _player->GetBattleground()) bg->EventPlayerLoggedOut(_player); - ///- Teleport to home if the player is in an invalid instance - if (!_player->m_InstanceValid && !_player->IsGameMaster()) - _player->TeleportTo(_player->m_homebindMapId, _player->m_homebindX, _player->m_homebindY, _player->m_homebindZ, _player->GetOrientation()); - sOutdoorPvPMgr->HandlePlayerLeaveZone(_player, _player->GetZoneId()); for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { - if (BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(i)) + BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(i); + if (bgQueueTypeId != BATTLEGROUND_QUEUE_NONE) { // track if player logs out after invited to join BG if (_player->IsInvitedForBattlegroundQueueType(bgQueueTypeId) && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS)) diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 54ef82b4f26..00abbdd7dde 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -88,6 +88,22 @@ namespace WorldPackets class BuyBankSlot; } + namespace Battleground + { + class AreaSpiritHealerQuery; + class AreaSpiritHealerQueue; + class HearthAndResurrect; + class PVPLogDataRequest; + class BattlemasterJoin; + class BattlemasterJoinArena; + class BattlefieldLeave; + class BattlefieldPort; + class BattlefieldListRequest; + class RequestBattlefieldStatus; + class ReportPvPPlayerAFK; + class BattlegroundPlayerPositionsRequest; + } + namespace Calendar { class CalendarAddEvent; @@ -225,6 +241,8 @@ namespace WorldPackets { class QueryCreature; class QueryGameObject; + class QueryCorpseLocationFromClient; + class QueryCorpseTransport; class QueryItemSingle; class QuestPOIQuery; } @@ -541,8 +559,6 @@ class TC_GAME_API WorldSession void SendAttackStop(Unit const* enemy); - void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId = BATTLEGROUND_RB); - void SendTradeStatus(TradeStatusInfo const& status); void SendUpdateTrade(bool trader_data = true); void SendCancelTrade(TradeStatus status); @@ -583,9 +599,21 @@ class TC_GAME_API WorldSession void UpdateInstanceEnterTimes(); //auction void SendAuctionHello(ObjectGuid guid, Unit const* unit); - void SendAuctionCommandResult(uint32 auctionItemId, AuctionAction command, AuctionError errorCode, InventoryResult bagResult = InventoryResult(0)); + + /** + * @fn void WorldSession::SendAuctionCommandResult(uint32 auctionId, uint32 action, uint32 errorCode, uint32 bagError = 0); + * + * @brief Notifies the client of the result of his last auction operation. It is called when the player bids, creates, or deletes an auction + * + * @param auction The relevant auction data + * @param command The action that was performed. + * @param errorCode The resulting error code. + * @param bagResult (Optional) InventoryResult. + */ + void SendAuctionCommandResult(AuctionEntry const* auction, AuctionAction command, AuctionError errorCode, InventoryResult bagResult = InventoryResult(0)); void SendAuctionBidderNotification(uint32 location, uint32 auctionId, ObjectGuid bidder, uint32 bidSum, uint32 diff, uint32 item_template); void SendAuctionOwnerNotification(AuctionEntry* auction); + void SendAuctionRemovedNotification(uint32 auctionId, uint32 itemEntry, int32 randomPropertyId); //Item Enchantment void SendEnchantmentLog(ObjectGuid target, ObjectGuid caster, uint32 itemId, uint32 enchantId); @@ -777,8 +805,6 @@ class TC_GAME_API WorldSession void HandleRequestRaidInfoOpcode(WorldPacket& recvData); - void HandleBattlefieldStatusOpcode(WorldPacket& recvData); - void HandleGroupInviteOpcode(WorldPackets::Party::PartyInviteClient& packet); void HandleGroupAcceptOpcode(WorldPacket& recvPacket); void HandleGroupDeclineOpcode(WorldPacket& recvPacket); @@ -956,8 +982,8 @@ class TC_GAME_API WorldSession void HandleChatIgnoredOpcode(WorldPacket& recvPacket); void HandleReclaimCorpse(WorldPackets::Misc::ReclaimCorpse& packet); - void HandleCorpseQueryOpcode(WorldPacket& recvPacket); - void HandleCorpseMapPositionQuery(WorldPacket& recvPacket); + void HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& packet); + void HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTransport& packet); void HandleResurrectResponse(WorldPackets::Misc::ResurrectResponse& packet); void HandleSummonResponseOpcode(WorldPacket& recvData); @@ -1011,15 +1037,19 @@ class TC_GAME_API WorldSession void HandleDismissCritter(WorldPackets::Pet::DismissCritter& dismissCritter); //Battleground - void HandleBattlemasterHelloOpcode(WorldPacket& recvData); - void HandleBattlemasterJoinOpcode(WorldPacket& recvData); - void HandleBattlegroundPlayerPositionsOpcode(WorldPacket& recvData); - void HandlePVPLogDataOpcode(WorldPacket& recvData); - void HandleBattleFieldPortOpcode(WorldPacket& recvData); - void HandleBattlefieldListOpcode(WorldPacket& recvData); - void HandleBattlefieldLeaveOpcode(WorldPacket& recvData); - void HandleBattlemasterJoinArena(WorldPacket& recvData); - void HandleReportPvPAFK(WorldPacket& recvData); + void HandleBattlemasterHelloOpcode(WorldPackets::NPC::Hello& hello); + void HandleBattlemasterJoinOpcode(WorldPackets::Battleground::BattlemasterJoin& battlemasterJoin); + void HandleBattlegroundPlayerPositionsOpcode(WorldPackets::Battleground::BattlegroundPlayerPositionsRequest& battlegroundPlayerPositionsRequest); + void HandlePVPLogDataOpcode(WorldPackets::Battleground::PVPLogDataRequest& pvpLogDataRequest); + void HandleBattleFieldPortOpcode(WorldPackets::Battleground::BattlefieldPort& battlefieldPort); + void HandleBattlefieldListOpcode(WorldPackets::Battleground::BattlefieldListRequest& battlefieldList); + void HandleBattlefieldLeaveOpcode(WorldPackets::Battleground::BattlefieldLeave& battlefieldLeave); + void HandleBattlemasterJoinArena(WorldPackets::Battleground::BattlemasterJoinArena& packet); + void HandleReportPvPAFK(WorldPackets::Battleground::ReportPvPPlayerAFK& reportPvPPlayerAFK); + void HandleAreaSpiritHealerQueryOpcode(WorldPackets::Battleground::AreaSpiritHealerQuery& areaSpiritHealerQuery); + void HandleAreaSpiritHealerQueueOpcode(WorldPackets::Battleground::AreaSpiritHealerQueue& areaSpiritHealerQueue); + void HandleHearthAndResurrect(WorldPackets::Battleground::HearthAndResurrect& hearthAndResurrect); + void HandleRequestBattlefieldStatusOpcode(WorldPackets::Battleground::RequestBattlefieldStatus& requestBattlefieldStatus); // Battlefield void SendBfInvitePlayerToWar(uint32 battleId, uint32 zoneId, uint32 time); @@ -1043,7 +1073,6 @@ class TC_GAME_API WorldSession void HandleTimeSyncResponse(WorldPacket& recvData); void HandleWhoIsOpcode(WorldPacket& recvData); void HandleResetInstancesOpcode(WorldPacket& recvData); - void HandleHearthAndResurrect(WorldPacket& recvData); void HandleInstanceLockResponse(WorldPacket& recvPacket); // Looking for Dungeon/Raid @@ -1086,8 +1115,6 @@ class TC_GAME_API WorldSession void HandleArenaTeamDisbandOpcode(WorldPacket& recvData); void HandleArenaTeamLeaderOpcode(WorldPacket& recvData); - void HandleAreaSpiritHealerQueryOpcode(WorldPacket& recvData); - void HandleAreaSpiritHealerQueueOpcode(WorldPacket& recvData); void HandleSelfResOpcode(WorldPacket& recvData); void HandleComplainOpcode(WorldPacket& recvData); void HandleRequestPetInfo(WorldPackets::Pet::RequestPetInfo& packet); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index ef2138eb879..f6c0dc170e1 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -353,7 +353,7 @@ enum AuraType : uint32 SPELL_AURA_X_RAY = 273, SPELL_AURA_ABILITY_CONSUME_NO_AMMO = 274, SPELL_AURA_MOD_IGNORE_SHAPESHIFT = 275, - SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC = 276, // NYI + SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC = 276, SPELL_AURA_MOD_MAX_AFFECTED_TARGETS = 277, SPELL_AURA_MOD_DISARM_RANGED = 278, SPELL_AURA_INITIALIZE_IMAGES = 279, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 1346f8682ae..bc6d3677094 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5615,7 +5615,7 @@ void AuraEffect::HandleBreakableCCAuraProc(AuraApplication* aurApp, ProcEventInf void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) { Unit* triggerCaster = aurApp->GetTarget(); - Unit* triggerTarget = eventInfo.GetProcTarget(); + Unit* triggerTarget = triggerCaster == eventInfo.GetActor() ? eventInfo.GetActionTarget() : eventInfo.GetActor(); uint32 triggerSpellId = GetSpellEffectInfo().TriggerSpell; if (triggerSpellId == 0) @@ -5636,7 +5636,7 @@ void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEve void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) { Unit* triggerCaster = aurApp->GetTarget(); - Unit* triggerTarget = eventInfo.GetProcTarget(); + Unit* triggerTarget = triggerCaster == eventInfo.GetActor() ? eventInfo.GetActionTarget() : eventInfo.GetActor(); uint32 triggerSpellId = GetSpellEffectInfo().TriggerSpell; if (triggerSpellId == 0) @@ -5662,7 +5662,7 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv return; Unit* target = aurApp->GetTarget(); - Unit* triggerTarget = eventInfo.GetProcTarget(); + Unit* triggerTarget = target == eventInfo.GetActor() ? eventInfo.GetActionTarget() : eventInfo.GetActor(); if (triggerTarget->HasUnitState(UNIT_STATE_ISOLATED) || triggerTarget->IsImmunedToDamage(GetSpellInfo())) { SendTickImmune(triggerTarget, target); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 7458e62ec94..dcac910c347 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -951,7 +951,7 @@ uint8 Aura::CalcMaxCharges(Unit* caster) const if (Player* modOwner = caster->GetSpellModOwner()) modOwner->ApplySpellMod(GetId(), SPELLMOD_CHARGES, maxProcCharges); - return maxProcCharges; + return uint8(maxProcCharges); } bool Aura::ModCharges(int32 num, AuraRemoveMode removeMode) @@ -2004,8 +2004,8 @@ uint8 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, return 0; // check if aura can proc when spell is triggered (exception for hunter auto shot & wands) - if (spell->IsTriggered() && !(procEntry->AttributesMask & PROC_ATTR_TRIGGERED_CAN_PROC) && !(eventInfo.GetTypeMask() & AUTO_ATTACK_PROC_FLAG_MASK)) - if (!GetSpellInfo()->HasAttribute(SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED)) + if (!GetSpellInfo()->HasAttribute(SPELL_ATTR3_CAN_PROC_FROM_PROCS) && !(procEntry->AttributesMask & PROC_ATTR_TRIGGERED_CAN_PROC) && !(eventInfo.GetTypeMask() & AUTO_ATTACK_PROC_FLAG_MASK)) + if (spell->IsTriggered() && !spell->GetSpellInfo()->HasAttribute(SPELL_ATTR3_NOT_A_PROC)) return 0; if (spell->m_CastItem && (procEntry->AttributesMask & PROC_ATTR_CANT_PROC_FROM_ITEM_CAST)) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index e4a923f51f3..bbf7a39afbb 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1377,7 +1377,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn float ground = m_caster->GetMapHeight(x, y, z); float liquidLevel = VMAP_INVALID_HEIGHT_VALUE; LiquidData liquidData; - if (m_caster->GetMap()->GetLiquidStatus(m_caster->GetPhaseMask(), x, y, z, MAP_ALL_LIQUIDS, &liquidData, m_caster->GetCollisionHeight())) + if (m_caster->GetMap()->GetLiquidStatus(m_caster->GetPhaseMask(), x, y, z, {}, &liquidData, m_caster->GetCollisionHeight())) liquidLevel = liquidData.level; if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level @@ -1891,9 +1891,11 @@ WorldObject* Spell::SearchNearbyTarget(float range, SpellTargetObjectTypes objec uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList); if (!containerTypeMask) return nullptr; + Trinity::WorldObjectSpellNearbyTargetCheck check(range, m_caster, m_spellInfo, selectionType, condList); Trinity::WorldObjectLastSearcher searcher(m_caster, target, check, containerTypeMask); - SearchTargets > (searcher, containerTypeMask, m_caster, m_caster, range); + searcher.i_phaseMask = PHASEMASK_ANYWHERE; + SearchTargets>(searcher, containerTypeMask, m_caster, m_caster, range); return target; } @@ -1906,7 +1908,8 @@ void Spell::SearchAreaTargets(std::list& targets, float range, Pos float extraSearchRadius = range > 0.0f ? EXTRA_CELL_SEARCH_RADIUS : 0.0f; Trinity::WorldObjectSpellAreaTargetCheck check(range, position, m_caster, referer, m_spellInfo, selectionType, condList); Trinity::WorldObjectListSearcher searcher(m_caster, targets, check, containerTypeMask); - SearchTargets > (searcher, containerTypeMask, m_caster, position, range + extraSearchRadius); + searcher.i_phaseMask = PHASEMASK_ANYWHERE; + SearchTargets>(searcher, containerTypeMask, m_caster, position, range + extraSearchRadius); } void Spell::SearchChainTargets(std::list& targets, uint32 chainTargets, WorldObject* target, SpellTargetObjectTypes objectType, SpellTargetCheckTypes selectType, ConditionContainer* condList, bool isChainHeal) @@ -3445,7 +3448,7 @@ void Spell::_cast(bool skipCheck) if (Unit* unitCaster = m_caster->ToUnit()) if (m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET)) - if (Creature* pet = ObjectAccessor::GetCreature(*m_caster, unitCaster->GetPetGUID())) + if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*m_caster, unitCaster->GetPetGUID())) pet->DespawnOrUnsummon(); PrepareTriggersExecutedOnHit(); @@ -4215,7 +4218,7 @@ void Spell::SendSpellStart() //TC_LOG_DEBUG("spells", "Sending SMSG_SPELL_START id={}", m_spellInfo->Id); - uint32 castFlags = CAST_FLAG_UNKNOWN_2; + uint32 castFlags = CAST_FLAG_HAS_TRAJECTORY; uint32 schoolImmunityMask = 0; uint32 mechanicImmunityMask = 0; if (Unit* unitCaster = m_caster->ToUnit()) @@ -4369,10 +4372,13 @@ void Spell::SendSpellGo() } if (castFlags & CAST_FLAG_AMMO) - { - castData.Ammo.emplace(); - UpdateSpellCastDataAmmo(*castData.Ammo); - } + UpdateSpellCastDataAmmo(castData.Ammo.emplace()); + + if (m_targets.GetTargetMask() & TARGET_FLAG_DEST_LOCATION) + castData.DestLocSpellCastIndex.emplace(); + + if (m_targets.GetTargetMask() & TARGET_FLAG_UNUSED20) + castData.TargetPoints.emplace(); // should be sent to self only if (castFlags & CAST_FLAG_POWER_LEFT_SELF && m_caster->IsPlayer()) @@ -5391,13 +5397,13 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint return SPELL_FAILED_ONLY_BATTLEGROUNDS; // do not allow spells to be cast in arenas - // - with greater than 10 min CD without SPELL_ATTR4_USABLE_IN_ARENA flag - // - with SPELL_ATTR4_NOT_USABLE_IN_ARENA flag - if (m_spellInfo->HasAttribute(SPELL_ATTR4_NOT_USABLE_IN_ARENA) || - (m_spellInfo->GetRecoveryTime() > 10 * MINUTE * IN_MILLISECONDS && !m_spellInfo->HasAttribute(SPELL_ATTR4_USABLE_IN_ARENA))) - if (MapEntry const* mapEntry = sMapStore.LookupEntry(m_caster->GetMapId())) - if (mapEntry->IsBattleArena()) - return SPELL_FAILED_NOT_IN_ARENA; + if (Player* player = m_caster->ToPlayer()) + if (player->InArena()) + { + SpellCastResult castResult = CheckArenaCastRules(); + if (castResult != SPELL_CAST_OK) + return castResult; + } // zone check if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_caster->ToPlayer()->IsGameMaster()) @@ -6392,6 +6398,25 @@ int32 Spell::CalculateDamage(SpellEffectInfo const& spellEffectInfo) const return m_caster->CalculateSpellDamage(spellEffectInfo, m_spellValue->EffectBasePoints + spellEffectInfo.EffectIndex); } +SpellCastResult Spell::CheckArenaCastRules() const +{ + // check USABLE attributes + // USABLE takes precedence over NOT_USABLE + if (m_spellInfo->HasAttribute(SPELL_ATTR4_USABLE_IN_ARENA)) + return SPELL_CAST_OK; + + // check NOT_USABLE attributes + if (m_spellInfo->AttributesEx4 & SPELL_ATTR4_NOT_USABLE_IN_ARENA) + return SPELL_FAILED_NOT_IN_ARENA; + + // check cooldowns + uint32 spellCooldown = m_spellInfo->GetRecoveryTime(); + if (spellCooldown > 10 * MINUTE * IN_MILLISECONDS) // not sure if still needed + return SPELL_FAILED_NOT_IN_ARENA; + + return SPELL_CAST_OK; +} + SpellCastResult Spell::CheckMovement() const { if (IsTriggered()) @@ -6821,7 +6846,7 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 / if (spellEffectInfo.IsEffect(SPELL_EFFECT_CREATE_ITEM_2)) if (target->ToPlayer()->GetFreeInventorySpace() == 0) { - player->SendEquipError(EQUIP_ERR_INVENTORY_FULL, nullptr, nullptr, spellEffectInfo.ItemType); + player->SendEquipError(EQUIP_ERR_INV_FULL, nullptr, nullptr, spellEffectInfo.ItemType); return SPELL_FAILED_DONT_REPORT; } @@ -6886,9 +6911,19 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 / if (!targetItem) return SPELL_FAILED_ITEM_NOT_FOUND; - // required level has to be checked also! Exploit fix - if (targetItem->GetTemplate()->ItemLevel < m_spellInfo->BaseLevel || (targetItem->GetTemplate()->RequiredLevel && targetItem->GetTemplate()->RequiredLevel < m_spellInfo->BaseLevel)) - return SPELL_FAILED_LOWLEVEL; + // Apply item level restriction + if (!m_spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF)) + { + uint32 requiredLevel = targetItem->GetTemplate()->RequiredLevel; + if (!requiredLevel) + requiredLevel = targetItem->GetTemplate()->ItemLevel; + + if (requiredLevel < m_spellInfo->BaseLevel) + return SPELL_FAILED_LOWLEVEL; + } + if (m_CastItem + && m_spellInfo->MaxLevel > 0 && targetItem->GetTemplate()->ItemLevel > m_spellInfo->MaxLevel) + return SPELL_FAILED_HIGHLEVEL; bool isItemUsable = false; for (uint8 e = 0; e < MAX_ITEM_PROTO_SPELLS; ++e) @@ -6956,14 +6991,18 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 / return SPELL_FAILED_NOT_TRADEABLE; } - // Apply item level restriction if the enchanting spell has max level restrition set - if (m_CastItem && m_spellInfo->MaxLevel > 0) + // Apply item level restriction + if (!m_spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF)) { - if (item->GetTemplate()->ItemLevel < m_CastItem->GetTemplate()->RequiredLevel) + uint32 requiredLevel = item->GetTemplate()->RequiredLevel; + if (!requiredLevel) + requiredLevel = item->GetTemplate()->ItemLevel; + + if (requiredLevel < m_spellInfo->BaseLevel) return SPELL_FAILED_LOWLEVEL; - if (item->GetTemplate()->ItemLevel > m_spellInfo->MaxLevel) - return SPELL_FAILED_HIGHLEVEL; } + if (m_CastItem && m_spellInfo->MaxLevel > 0 && item->GetTemplate()->ItemLevel > m_spellInfo->MaxLevel) + return SPELL_FAILED_HIGHLEVEL; break; } case SPELL_EFFECT_ENCHANT_HELD_ITEM: diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 7abeb67b13c..fe8b1a54670 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -76,7 +76,7 @@ enum SpellCastFlags { CAST_FLAG_NONE = 0x00000000, CAST_FLAG_PENDING = 0x00000001, // aoe combat log? - CAST_FLAG_UNKNOWN_2 = 0x00000002, + CAST_FLAG_HAS_TRAJECTORY = 0x00000002, CAST_FLAG_UNKNOWN_3 = 0x00000004, CAST_FLAG_UNKNOWN_4 = 0x00000008, // ignore AOE visual CAST_FLAG_UNKNOWN_5 = 0x00000010, @@ -338,6 +338,7 @@ class TC_GAME_API Spell SpellCastResult CheckPower() const; SpellCastResult CheckRuneCost(uint32 runeCostID) const; SpellCastResult CheckCasterAuras(uint32* param1) const; + SpellCastResult CheckArenaCastRules() const; SpellCastResult CheckMovement() const; bool CheckSpellCancelsAuraEffect(AuraType auraType, uint32* param1) const; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 423883689d7..b878dbe45c1 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1109,7 +1109,7 @@ void Spell::EffectPowerDrain() return; Powers powerType = Powers(effectInfo->MiscValue); - if (!unitTarget || !unitTarget->IsAlive() || unitTarget->GetPowerType() != powerType || damage < 0) + if (!unitTarget || !unitTarget->IsAlive() || (unitTarget->GetPowerType() != powerType && powerType != POWER_HAPPINESS) || damage < 0) return; Unit* unitCaster = GetUnitCasterForEffectHandlers(); @@ -1463,7 +1463,7 @@ void Spell::DoCreateItem(uint32 itemId) if (msg != EQUIP_ERR_OK) { // convert to possible store amount - if (msg == EQUIP_ERR_INVENTORY_FULL || msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) + if (msg == EQUIP_ERR_INV_FULL || msg == EQUIP_ERR_ITEM_MAX_COUNT) num_to_add -= no_space; else { @@ -1566,6 +1566,10 @@ void Spell::EffectPersistentAA() if (!unitCaster) return; + // Caster not in world, might be spell triggered from aura removal + if (!unitCaster->IsInWorld()) + return; + // only handle at last effect for (size_t i = effectInfo->EffectIndex + 1; i < m_spellInfo->GetEffects().size(); ++i) if (m_spellInfo->GetEffect(SpellEffIndex(i)).IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA)) @@ -1573,14 +1577,16 @@ void Spell::EffectPersistentAA() ASSERT(!_dynObjAura); - float radius = effectInfo->CalcRadius(unitCaster); - - // Caster not in world, might be spell triggered from aura removal - if (!unitCaster->IsInWorld()) - return; + float radius = 0.0f; + for (size_t i = 0; i <= effectInfo->EffectIndex; ++i) + { + SpellEffectInfo const& spellEffectInfo = m_spellInfo->GetEffect(SpellEffIndex(i)); + if (spellEffectInfo.IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA)) + radius = std::max(radius, spellEffectInfo.CalcRadius(unitCaster)); + } DynamicObject* dynObj = new DynamicObject(false); - if (!dynObj->CreateDynamicObject(unitCaster->GetMap()->GenerateLowGuid(), unitCaster, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL)) + if (!dynObj->CreateDynamicObject(unitCaster->GetMap()->GenerateLowGuid(), unitCaster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL)) { delete dynObj; return; @@ -1600,7 +1606,9 @@ void Spell::EffectPersistentAA() return; ASSERT(_dynObjAura->GetDynobjOwner()); - _dynObjAura->_ApplyEffectForTargets(effectInfo->EffectIndex); + for (size_t i = 0; i < m_spellInfo->GetEffects().size(); ++i) + if (m_spellInfo->GetEffect(SpellEffIndex(i)).IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA)) + _dynObjAura->_ApplyEffectForTargets(i); } void Spell::EffectEnergize() @@ -1972,9 +1980,9 @@ void Spell::EffectSummonChangeItem() InventoryResult msg = player->CanEquipItem(m_CastItem->GetSlot(), dest, pNewItem, true); - if (msg == EQUIP_ERR_OK || msg == EQUIP_ERR_CANT_DO_RIGHT_NOW) + if (msg == EQUIP_ERR_OK || msg == EQUIP_ERR_CLIENT_LOCKED_OUT) { - if (msg == EQUIP_ERR_CANT_DO_RIGHT_NOW) dest = EQUIPMENT_SLOT_MAINHAND; + if (msg == EQUIP_ERR_CLIENT_LOCKED_OUT) dest = EQUIPMENT_SLOT_MAINHAND; // prevent crash at access and unexpected charges counting with item update queue corrupt if (m_CastItem == m_targets.GetItemTarget()) @@ -2038,7 +2046,9 @@ void Spell::EffectSummonType() if (m_originalCaster) caster = m_originalCaster; - bool personalSpawn = (properties->Flags & SUMMON_PROP_FLAG_PERSONAL_SPAWN) != 0; + ObjectGuid privateObjectOwner; + if (properties->Flags & SUMMON_PROP_FLAG_PERSONAL_SPAWN) + privateObjectOwner = m_originalCaster->IsPrivateObject() ? m_originalCaster->GetPrivateObjectOwner() : m_originalCaster->GetGUID(); int32 duration = m_spellInfo->GetDuration(); if (Player* modOwner = caster->GetSpellModOwner()) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration); @@ -2114,7 +2124,7 @@ void Spell::EffectSummonType() if (!unitCaster) return; - summon = unitCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, unitCaster, m_spellInfo->Id, 0, personalSpawn); + summon = unitCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, unitCaster, m_spellInfo->Id, 0, privateObjectOwner); if (!summon || !summon->IsTotem()) return; @@ -2134,7 +2144,7 @@ void Spell::EffectSummonType() if (!unitCaster) return; - summon = unitCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, unitCaster, m_spellInfo->Id, 0, personalSpawn); + summon = unitCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, unitCaster, m_spellInfo->Id, 0, privateObjectOwner); if (!summon || !summon->HasUnitTypeMask(UNIT_MASK_MINION)) return; @@ -2158,7 +2168,7 @@ void Spell::EffectSummonType() // randomize position for multiple summons pos = caster->GetRandomPoint(*destTarget, radius); - summon = caster->SummonCreature(entry, pos, summonType, Milliseconds(duration), 0, m_spellInfo->Id, personalSpawn); + summon = caster->SummonCreature(entry, pos, summonType, Milliseconds(duration), 0, m_spellInfo->Id, privateObjectOwner); if (!summon) continue; @@ -2183,7 +2193,7 @@ void Spell::EffectSummonType() if (!unitCaster) return; - summon = unitCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, unitCaster, m_spellInfo->Id, 0, personalSpawn); + summon = unitCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, unitCaster, m_spellInfo->Id, 0, privateObjectOwner); break; } case SUMMON_CATEGORY_VEHICLE: @@ -2421,7 +2431,7 @@ void Spell::EffectAddFarsight() return; DynamicObject* dynObj = new DynamicObject(true); - if (!dynObj->CreateDynamicObject(player->GetMap()->GenerateLowGuid(), player, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) + if (!dynObj->CreateDynamicObject(player->GetMap()->GenerateLowGuid(), player, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) { delete dynObj; return; @@ -5152,7 +5162,7 @@ void Spell::EffectTitanGrip() return; if (m_caster->GetTypeId() == TYPEID_PLAYER) - m_caster->ToPlayer()->SetCanTitanGrip(true, effectInfo->MiscValue); + m_caster->ToPlayer()->SetCanTitanGrip(true, effectInfo->MiscValue, m_spellInfo->EquippedItemClass, m_spellInfo->EquippedItemSubClassMask); } void Spell::EffectRedirectThreat() diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index d308b1ff023..80f7aa8e87a 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -405,7 +405,7 @@ bool SpellEffectInfo::IsAura() const bool SpellEffectInfo::IsAura(AuraType aura) const { - return IsAura() && ApplyAuraName == uint32(aura); + return IsAura() && ApplyAuraName == aura; } bool SpellEffectInfo::IsTargetingArea() const @@ -1136,23 +1136,23 @@ bool SpellInfo::IsStackableWithRanks() const return false; // All stance spells. if any better way, change it. - for (SpellEffectInfo const& effect : GetEffects()) + switch (SpellFamilyName) { - switch (SpellFamilyName) - { - case SPELLFAMILY_PALADIN: - // Paladin aura Spell - if (effect.Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID) - return false; - break; - case SPELLFAMILY_DRUID: - // Druid form Spell - if (effect.Effect == SPELL_EFFECT_APPLY_AURA && - effect.ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT) - return false; - break; - } + case SPELLFAMILY_PALADIN: + // Paladin aura Spell + if (HasEffect(SPELL_EFFECT_APPLY_AREA_AURA_RAID)) + return false; + // Seal of Righteousness + if (SpellFamilyFlags[1] & 0x20000000) + return false; + break; + case SPELLFAMILY_DRUID: + // Druid form Spell + if (HasAura(SPELL_AURA_MOD_SHAPESHIFT)) + return false; + break; } + return true; } @@ -3361,7 +3361,7 @@ SpellInfo const* SpellInfo::GetAuraRankForLevel(uint8 level) const return this; // Client ignores spell with these attributes (sub_53D9D0) - if (HasAttribute(SPELL_ATTR0_NEGATIVE_1) || HasAttribute(SPELL_ATTR2_UNK3) || HasAttribute(SPELL_ATTR3_DRAIN_SOUL)) + if (HasAttribute(SPELL_ATTR0_NEGATIVE_1) || HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF) || HasAttribute(SPELL_ATTR3_DRAIN_SOUL)) return this; bool needRankSelection = false; diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index e736581fe60..03e909872c9 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -167,6 +167,7 @@ enum SpellCustomAttributes SPELL_ATTR0_CU_DEPRECATED_LIQUID_AURA = 0x00400000, // DO NOT REUSE SPELL_ATTR0_CU_IS_TALENT = 0x00800000, // reserved for master branch SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED = 0x01000000, + SPELL_ATTR0_CU_CAN_TARGET_ANY_PRIVATE_OBJECT = 0x02000000, // reserved for master branch SPELL_ATTR0_CU_NEGATIVE = SPELL_ATTR0_CU_NEGATIVE_EFF0 | SPELL_ATTR0_CU_NEGATIVE_EFF1 | SPELL_ATTR0_CU_NEGATIVE_EFF2 }; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index a789836277e..f5bd8748a44 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -520,22 +520,6 @@ bool SpellMgr::CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcE if (eventInfo.GetTypeMask() & (PROC_FLAG_KILLED | PROC_FLAG_KILL | PROC_FLAG_DEATH)) return true; - // do triggered cast checks - // Do not consider autoattacks as triggered spells - if (!(procEntry.AttributesMask & PROC_ATTR_TRIGGERED_CAN_PROC) && !(eventInfo.GetTypeMask() & AUTO_ATTACK_PROC_FLAG_MASK)) - { - if (Spell const* spell = eventInfo.GetProcSpell()) - { - if (spell->IsTriggered()) - { - SpellInfo const* spellInfo = spell->GetSpellInfo(); - if (!spellInfo->HasAttribute(SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2) && - !spellInfo->HasAttribute(SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC)) - return false; - } - } - } - // check school mask (if set) for other trigger types if (procEntry.SchoolMask && !(eventInfo.GetSchoolMask() & procEntry.SchoolMask)) return false; @@ -1973,6 +1957,10 @@ void SpellMgr::LoadSkillLineAbilityMap() ++count; } + // Don't autolearn secondary variant of Seal of Righteousness - it is learned together with Judgement of Light + if (SkillLineAbilityEntry* sealOfRighteousnessR2 = const_cast(sSkillLineAbilityStore.LookupEntry(11957))) + sealOfRighteousnessR2->AcquireMethod = 0; + TC_LOG_INFO("server.loading", ">> Loaded {} SkillLineAbility MultiMap Data in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); } @@ -3233,7 +3221,7 @@ void SpellMgr::LoadSpellInfoCorrections() { // due to discrepancies between ranks spellInfo->EquippedItemSubClassMask = 0x0000FC33; - spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED; + spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_FROM_PROCS; }); ApplySpellFix({ @@ -3246,7 +3234,7 @@ void SpellMgr::LoadSpellInfoCorrections() }, [](SpellInfo* spellInfo) { // Entries were not updated after spell effect change, we have to do that manually :/ - spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED; + spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_FROM_PROCS; }); ApplySpellFix({ @@ -4912,6 +4900,52 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(5); // 40yd }); + // Pilgrim's Bounty - Candied Sweet Potato + ApplySpellFix({ 65418 }, [](SpellInfo* spellInfo) + { + spellInfo->_GetEffect(EFFECT_2).TriggerSpell = 65410; + }); + + // Pilgrim's Bounty - Spice Bread Stuffing + ApplySpellFix({ 65419 }, [](SpellInfo* spellInfo) + { + spellInfo->_GetEffect(EFFECT_2).TriggerSpell = 65416; + }); + + // Pilgrim's Bounty - Cranberry Chutney + ApplySpellFix({ 65420 }, [](SpellInfo* spellInfo) + { + spellInfo->_GetEffect(EFFECT_2).TriggerSpell = 65412; + }); + + // Pilgrim's Bounty - Pumpkin Pie + ApplySpellFix({ 65421 }, [](SpellInfo* spellInfo) + { + spellInfo->_GetEffect(EFFECT_2).TriggerSpell = 65415; + }); + + // Pilgrim's Bounty - Slow-Roasted Turkey + ApplySpellFix({ 65422 }, [](SpellInfo* spellInfo) + { + spellInfo->_GetEffect(EFFECT_2).TriggerSpell = 65414; + }); + + ApplySpellFix({ + 24869, // Bobbing Apple, Bread of the Dead, Winter Veil Cookie + 61874, // Noblegarden Chocolate + 71068, // Sweet Surprise + 71071, // Very Berry Cream + 71073, // Dark Desire + 71074 // Buttermilk Delight + }, [](SpellInfo* spellInfo) + { + spellInfo->_GetEffect(EFFECT_1).Effect = SPELL_EFFECT_APPLY_AURA; + spellInfo->_GetEffect(EFFECT_1).TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + spellInfo->_GetEffect(EFFECT_1).ApplyAuraName = SPELL_AURA_PERIODIC_TRIGGER_SPELL; + spellInfo->_GetEffect(EFFECT_1).Amplitude = 10 * IN_MILLISECONDS; + spellInfo->_GetEffect(EFFECT_1).TriggerSpell = 24870; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 5f623e22218..6b399c3a59e 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -789,116 +789,116 @@ class TC_GAME_API AuraScript : public _SpellScript // executed when aura effect is applied with specified mode to target // should be used when when effect handler preventing/replacing is needed, do not use this hook for triggering spellcasts/removing auras etc - may be unsafe // example: OnEffectApply += AuraEffectApplyFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier, AuraEffectHandleModes); - // where function is: void function (AuraEffect const* aurEff, AuraEffectHandleModes mode); + // where function is: void function(AuraEffect const* aurEff, AuraEffectHandleModes mode); HookList OnEffectApply; // executed after aura effect is applied with specified mode to target // example: AfterEffectApply += AuraEffectApplyFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier, AuraEffectHandleModes); - // where function is: void function (AuraEffect const* aurEff, AuraEffectHandleModes mode); + // where function is: void function(AuraEffect const* aurEff, AuraEffectHandleModes mode); HookList AfterEffectApply; #define AuraEffectApplyFn(F, I, N, M) EffectApplyHandlerFunction(&F, I, N, M) // executed after aura effect is removed with specified mode from target // should be used when effect handler preventing/replacing is needed, do not use this hook for triggering spellcasts/removing auras etc - may be unsafe // example: OnEffectRemove += AuraEffectRemoveFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier, AuraEffectHandleModes); - // where function is: void function (AuraEffect const* aurEff, AuraEffectHandleModes mode); + // where function is: void function(AuraEffect const* aurEff, AuraEffectHandleModes mode); HookList OnEffectRemove; // executed when aura effect is removed with specified mode from target // example: AfterEffectRemove += AuraEffectRemoveFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier, AuraEffectHandleModes); - // where function is: void function (AuraEffect const* aurEff, AuraEffectHandleModes mode); + // where function is: void function(AuraEffect const* aurEff, AuraEffectHandleModes mode); HookList AfterEffectRemove; #define AuraEffectRemoveFn(F, I, N, M) EffectApplyHandlerFunction(&F, I, N, M) // executed when periodic aura effect ticks on target // example: OnEffectPeriodic += AuraEffectPeriodicFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is: void function (AuraEffect const* aurEff); + // where function is: void function(AuraEffect const* aurEff); HookList OnEffectPeriodic; #define AuraEffectPeriodicFn(F, I, N) EffectPeriodicHandlerFunction(&F, I, N) // executed when periodic aura effect is updated // example: OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is: void function (AuraEffect* aurEff); + // where function is: void function(AuraEffect* aurEff); HookList OnEffectUpdatePeriodic; #define AuraEffectUpdatePeriodicFn(F, I, N) EffectUpdatePeriodicHandlerFunction(&F, I, N) // executed when aura effect calculates amount // example: DoEffectCalcAmount += AuraEffectCalcAmounFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is: void function (AuraEffect* aurEff, int32& amount, bool& canBeRecalculated); + // where function is: void function(AuraEffect* aurEff, int32& amount, bool& canBeRecalculated); HookList DoEffectCalcAmount; #define AuraEffectCalcAmountFn(F, I, N) EffectCalcAmountHandlerFunction(&F, I, N) // executed when aura effect calculates periodic data // example: DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is: void function (AuraEffect const* aurEff, bool& isPeriodic, int32& amplitude); + // where function is: void function(AuraEffect const* aurEff, bool& isPeriodic, int32& amplitude); HookList DoEffectCalcPeriodic; #define AuraEffectCalcPeriodicFn(F, I, N) EffectCalcPeriodicHandlerFunction(&F, I, N) // executed when aura effect calculates spellmod // example: DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is: void function (AuraEffect const* aurEff, SpellModifier*& spellMod); + // where function is: void function(AuraEffect const* aurEff, SpellModifier*& spellMod); HookList DoEffectCalcSpellMod; #define AuraEffectCalcSpellModFn(F, I, N) EffectCalcSpellModHandlerFunction(&F, I, N) // executed when absorb aura effect is going to reduce damage // example: OnEffectAbsorb += AuraEffectAbsorbFn(class::function, EffectIndexSpecifier); - // where function is: void function (AuraEffect const* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); + // where function is: void function(AuraEffect const* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); HookList OnEffectAbsorb; #define AuraEffectAbsorbFn(F, I) EffectAbsorbFunction(&F, I) // executed after absorb aura effect reduced damage to target - absorbAmount is real amount absorbed by aura // example: AfterEffectAbsorb += AuraEffectAbsorbFn(class::function, EffectIndexSpecifier); - // where function is: void function (AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); + // where function is: void function(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); HookList AfterEffectAbsorb; // executed when mana shield aura effect is going to reduce damage // example: OnEffectManaShield += AuraEffectManaShieldFn(class::function, EffectIndexSpecifier); - // where function is: void function (AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); + // where function is: void function(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); HookList OnEffectManaShield; #define AuraEffectManaShieldFn(F, I) EffectManaShieldFunction(&F, I) // executed after mana shield aura effect reduced damage to target - absorbAmount is real amount absorbed by aura // example: AfterEffectManaShield += AuraEffectManaShieldFn(class::function, EffectIndexSpecifier); - // where function is: void function (AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); + // where function is: void function(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount); HookList AfterEffectManaShield; // executed when the caster of some spell with split dmg aura gets damaged through it // example: OnEffectSplit += AuraEffectSplitFn(class::function, EffectIndexSpecifier); - // where function is: void function (AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& splitAmount); + // where function is: void function(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& splitAmount); HookList OnEffectSplit; #define AuraEffectSplitFn(F, I) EffectSplitFunction(&F, I) // executed when aura checks if it can proc // example: DoCheckProc += AuraCheckProcFn(class::function); - // where function is: bool function (ProcEventInfo& eventInfo); + // where function is: bool function(ProcEventInfo& eventInfo); HookList DoCheckProc; #define AuraCheckProcFn(F) CheckProcHandlerFunction(&F) // executed when aura effect checks if it can proc the aura // example: DoCheckEffectProc += AuraCheckEffectProcFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is bool function (AuraEffect const* aurEff, ProcEventInfo& eventInfo); + // where function is bool function(AuraEffect const* aurEff, ProcEventInfo& eventInfo); HookList DoCheckEffectProc; #define AuraCheckEffectProcFn(F, I, N) CheckEffectProcHandlerFunction(&F, I, N) // executed before aura procs (possibility to prevent charge drop/cooldown) // example: DoPrepareProc += AuraProcFn(class::function); - // where function is: void function (ProcEventInfo& eventInfo); + // where function is: void function(ProcEventInfo& eventInfo); HookList DoPrepareProc; // executed when aura procs // example: OnProc += AuraProcFn(class::function); - // where function is: void function (ProcEventInfo& eventInfo); + // where function is: void function(ProcEventInfo& eventInfo); HookList OnProc; // executed after aura proced // example: AfterProc += AuraProcFn(class::function); - // where function is: void function (ProcEventInfo& eventInfo); + // where function is: void function(ProcEventInfo& eventInfo); HookList AfterProc; #define AuraProcFn(F) AuraProcHandlerFunction(&F) // executed when aura effect procs // example: OnEffectProc += AuraEffectProcFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is: void function (AuraEffect const* aurEff, ProcEventInfo& procInfo); + // where function is: void function(AuraEffect const* aurEff, ProcEventInfo& procInfo); HookList OnEffectProc; // executed after aura effect proced // example: AfterEffectProc += AuraEffectProcFn(class::function, EffectIndexSpecifier, EffectAuraNameSpecifier); - // where function is: void function (AuraEffect const* aurEff, ProcEventInfo& procInfo); + // where function is: void function(AuraEffect const* aurEff, ProcEventInfo& procInfo); HookList AfterEffectProc; #define AuraEffectProcFn(F, I, N) EffectProcHandlerFunction(&F, I, N) diff --git a/src/server/game/Time/WowTime.cpp b/src/server/game/Time/WowTime.cpp index b88f0c56a8e..6ad2760dcf0 100644 --- a/src/server/game/Time/WowTime.cpp +++ b/src/server/game/Time/WowTime.cpp @@ -161,10 +161,10 @@ std::strong_ordering operator<=>(WowTime const& left, WowTime const& right) if (std::strong_ordering cmp = compareFieldIfSet(&WowTime::_weekDay); advstd::is_neq(cmp)) return cmp; - if (std::strong_ordering cmp = compareFieldIfSet(&WowTime::_year); advstd::is_neq(cmp)) + if (std::strong_ordering cmp = compareFieldIfSet(&WowTime::_hour); advstd::is_neq(cmp)) return cmp; - if (std::strong_ordering cmp = compareFieldIfSet(&WowTime::_hour); advstd::is_neq(cmp)) + if (std::strong_ordering cmp = compareFieldIfSet(&WowTime::_minute); advstd::is_neq(cmp)) return cmp; return std::strong_ordering::equal; diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp index 85a1bb178b5..43443213743 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp +++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp @@ -16,7 +16,6 @@ */ #include "Common.h" -#include "AchievementMgr.h" #include "CharacterDatabaseCleaner.h" #include "DatabaseEnv.h" #include "DBCStores.h" @@ -108,7 +107,7 @@ void CharacterDatabaseCleaner::CheckUnique(char const* column, char const* table bool CharacterDatabaseCleaner::AchievementProgressCheck(uint32 criteria) { - return sAchievementMgr->GetAchievementCriteria(criteria) != nullptr; + return sAchievementCriteriaStore.LookupEntry(criteria) != nullptr; } void CharacterDatabaseCleaner::CleanCharacterAchievementProgress() diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index b49ef889c1a..41235455857 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -917,6 +917,19 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_START_PLAYER_MONEY] = MAX_MONEY_AMOUNT; } + m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY] = sConfigMgr->GetIntDefault("StartDeathKnightPlayerMoney", 2000); + if (int32(m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY]) < 0) + { + TC_LOG_ERROR("server.loading", "StartDeathKnightPlayerMoney ({}) must be in range 0..{}. Set to {}.", m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY], MAX_MONEY_AMOUNT, 2000); + m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY] = 2000; + } + else if (m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY] > MAX_MONEY_AMOUNT) + { + TC_LOG_ERROR("server.loading", "StartDeathKnightPlayerMoney ({}) must be in range 0..{}. Set to {}.", + m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY], MAX_MONEY_AMOUNT, MAX_MONEY_AMOUNT); + m_int_configs[CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY] = MAX_MONEY_AMOUNT; + } + m_int_configs[CONFIG_MAX_HONOR_POINTS] = sConfigMgr->GetIntDefault("MaxHonorPoints", 75000); if (int32(m_int_configs[CONFIG_MAX_HONOR_POINTS]) < 0) { @@ -2544,7 +2557,7 @@ void World::Update(uint32 diff) { TC_METRIC_TIMER("world_update_time", TC_METRIC_TAG("type", "Ping MySQL")); m_timers[WUPDATE_PINGDB].Reset(); - TC_LOG_DEBUG("misc", "Ping MySQL to keep connection alive"); + TC_LOG_DEBUG("sql.driver", "Ping MySQL to keep connection alive"); CharacterDatabase.KeepAlive(); LoginDatabase.KeepAlive(); WorldDatabase.KeepAlive(); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index c8e7ffd0ff2..18bf66d7e22 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -238,6 +238,7 @@ enum WorldIntConfigs : uint32 CONFIG_START_PLAYER_LEVEL, CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL, CONFIG_START_PLAYER_MONEY, + CONFIG_START_DEATH_KNIGHT_PLAYER_MONEY, CONFIG_MAX_HONOR_POINTS, CONFIG_START_HONOR_POINTS, CONFIG_MAX_ARENA_POINTS, diff --git a/src/server/scripts/Battlefield/BattlefieldWG.cpp b/src/server/scripts/Battlefield/BattlefieldWG.cpp index 529e75c6af9..9aa93d76ca1 100644 --- a/src/server/scripts/Battlefield/BattlefieldWG.cpp +++ b/src/server/scripts/Battlefield/BattlefieldWG.cpp @@ -24,6 +24,7 @@ #include "BattlefieldMgr.h" #include "Battleground.h" #include "CreatureTextMgr.h" +#include "DBCStores.h" #include "GameObject.h" #include "GameTime.h" #include "Log.h" @@ -762,7 +763,7 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer) // ******************************************************* void BattlefieldWG::DoCompleteOrIncrementAchievement(uint32 achievement, Player* player, uint8 /*incrementNumber*/) { - AchievementEntry const* achievementEntry = sAchievementMgr->GetAchievement(achievement); + AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievement); if (!achievementEntry) return; diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp index 25a2b4463c8..6345c118415 100644 --- a/src/server/scripts/Commands/cs_disable.cpp +++ b/src/server/scripts/Commands/cs_disable.cpp @@ -23,8 +23,8 @@ Category: commandscripts EndScriptData */ #include "ScriptMgr.h" -#include "AchievementMgr.h" #include "Chat.h" +#include "DBCStores.h" #include "DatabaseEnv.h" #include "DisableMgr.h" #include "Language.h" @@ -129,7 +129,7 @@ class disable_commandscript : public CommandScript } case DISABLE_TYPE_ACHIEVEMENT_CRITERIA: { - if (!sAchievementMgr->GetAchievementCriteria(entry)) + if (!sAchievementCriteriaStore.LookupEntry(entry)) { handler->PSendSysMessage(LANG_COMMAND_NO_ACHIEVEMENT_CRITERIA_FOUND); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 65c671bef2f..8b26d375c28 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -296,7 +296,7 @@ class misc_commandscript : public CommandScript zoneX, zoneY, groundZ, floorZ, map->GetMinHeight(object->GetPositionX(), object->GetPositionY()), haveMap, haveVMap, haveMMap); LiquidData liquidStatus; - ZLiquidStatus status = map->GetLiquidStatus(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus, object->GetCollisionHeight()); + ZLiquidStatus status = map->GetLiquidStatus(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), {}, &liquidStatus); if (status) handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 158be69baa2..8d89ec6ed40 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -554,12 +554,13 @@ class modify_commandscript : public CommandScript } else { + uint32 moneyToAddMsg = moneyToAdd * -1; if (newmoney > static_cast(MAX_MONEY_AMOUNT)) newmoney = MAX_MONEY_AMOUNT; - handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(moneyToAdd), handler->GetNameLink(target).c_str()); + handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, moneyToAddMsg, handler->GetNameLink(target).c_str()); if (handler->needReportToTarget(target)) - ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), abs(moneyToAdd)); + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), moneyToAddMsg); target->SetMoney(newmoney); } } diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 9e8529f1cb8..15150eea1c5 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -507,6 +507,8 @@ class npc_commandscript : public CommandScript handler->PSendSysMessage(LANG_NPCINFO_ARMOR, target->GetArmor()); handler->PSendSysMessage(LANG_NPCINFO_POSITION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); handler->PSendSysMessage(LANG_OBJECTINFO_AIINFO, target->GetAIName().c_str(), target->GetScriptName().c_str()); + handler->PSendSysMessage(LANG_OBJECTINFO_STRINGIDS, STRING_VIEW_FMT_ARG(target->GetStringId(StringIdType::Template)), + STRING_VIEW_FMT_ARG(target->GetStringId(StringIdType::Spawn)), STRING_VIEW_FMT_ARG(target->GetStringId(StringIdType::Script))); handler->PSendSysMessage(LANG_NPCINFO_REACTSTATE, DescribeReactState(target->GetReactState())); if (CreatureAI const* ai = target->AI()) handler->PSendSysMessage(LANG_OBJECTINFO_AITYPE, Trinity::GetTypeName(*ai).c_str()); diff --git a/src/server/scripts/Custom/cfpve.cpp b/src/server/scripts/Custom/cfpve.cpp new file mode 100644 index 00000000000..6b9ef1a723e --- /dev/null +++ b/src/server/scripts/Custom/cfpve.cpp @@ -0,0 +1,108 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 . + */ + + +#include "ScriptMgr.h" +#include "Player.h" +#include "Group.h" +#include "ObjectAccessor.h" + +enum MiscCrossFactionPVE +{ + ZONE_ICECROWN_CITADEL = 4812, + ICC_MAP_ID = 631, + ZONE_TRIAL_OF_THE_CHAMPION = 4723, + TOCHAMPION_MAP_ID = 650, + ZONE_TRIAL_OF_THE_CRUSADER = 4722, + TOCRUSADER_MAP_ID = 649, + ZONE_PIT_OF_SARON = 4813, + POS_MAP_ID = 658, + ZONE_HALLS_OF_REFLECTION = 4820, + HOR_MAP_ID = 668, + ZONE_FORGE_OF_SOULS = 4809, + FOS_MAP_ID = 632, + ZONE_HALLS_OF_STONE = 4264, + HOS_MAP_ID = 599, + ZONE_THE_NEXUS = 4265, + TN_MAP_ID = 576, + ZONE_WARSONG_GULCH = 3277, + WSG_MAP_ID = 489, + ZONE_ARATHI_BASIN = 3358, + AB_MAP_ID = 529 +}; + +class CfPlayerScript : public PlayerScript +{ +public: + CfPlayerScript() : PlayerScript("CfPlayerScript") {} + + // Called when a player enters the world (logs in or teleports) + void OnLogin(Player* player, bool firstLogin) override + { + HandleFactionChange(player, player->GetMapId()); + } + + // Called when a player changes zones + void OnUpdateZone(Player* player, uint32 newZone, uint32 /*newArea*/) override + { + HandleFactionChange(player, newZone); + } + +private: + // Store the original faction in a map + std::unordered_map originalFactionMap; + + void HandleFactionChange(Player* player, uint32 zoneOrMapId) + { + static const std::set zoneSet = { + ICC_MAP_ID, TOCHAMPION_MAP_ID, TOCRUSADER_MAP_ID, POS_MAP_ID, + HOR_MAP_ID, FOS_MAP_ID, HOS_MAP_ID, TN_MAP_ID, WSG_MAP_ID, AB_MAP_ID + }; + + if (zoneSet.count(zoneOrMapId)) + { + // Change faction to match the group leader + if (Group* group = player->GetGroup()) + { + if (Player* leader = ObjectAccessor::FindPlayer(group->GetLeaderGUID())) + { + if (originalFactionMap.find(player->GetGUID()) == originalFactionMap.end()) + { + // Store the original faction + originalFactionMap[player->GetGUID()] = player->GetFaction(); + } + player->SetFaction(leader->GetFaction()); + } + } + } + else + { + // Restore player's original faction + auto it = originalFactionMap.find(player->GetGUID()); + if (it != originalFactionMap.end()) + { + player->SetFaction(it->second); + originalFactionMap.erase(it); // Clean up the map after restoring + } + } + } +}; + +void AddSC_cfpve() +{ + new CfPlayerScript(); +} diff --git a/src/server/scripts/Custom/custom_script_loader.cpp b/src/server/scripts/Custom/custom_script_loader.cpp index 9e5e9ba2bfd..718f9586f04 100644 --- a/src/server/scripts/Custom/custom_script_loader.cpp +++ b/src/server/scripts/Custom/custom_script_loader.cpp @@ -17,8 +17,11 @@ // This is where scripts' loading functions should be declared: + void AddSC_cfpve(); + // The name of this function should match: // void Add${NameOfDirectory}Scripts() void AddCustomScripts() { + AddSC_cfpve(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 34c5ac42b81..38a066f751c 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -46,11 +46,12 @@ class go_shadowforge_brazier : public GameObjectScript instance->SetData(TYPE_LYCEUM, DONE); else instance->SetData(TYPE_LYCEUM, IN_PROGRESS); - // If used brazier open linked doors (North or South) - if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N)) + // If used both braziers, open linked doors (North and South) + if (instance->GetData(TYPE_LYCEUM) == DONE) + { instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true); - else if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S)) instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true); + } return false; } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 61049c875a2..60437c0eb78 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -1143,6 +1143,32 @@ class spell_chapter1_runeforging_credit : public SpellScript } }; +enum SkyDarkenerAssault +{ + SPELL_SKY_DARKENER_ASSAULT = 52125 +}; + +// 52124 - Sky Darkener Assault +class spell_chapter1_sky_darkener_assault : public SpellScript +{ + PrepareSpellScript(spell_chapter1_sky_darkener_assault); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SKY_DARKENER_ASSAULT }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_SKY_DARKENER_ASSAULT); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_chapter1_sky_darkener_assault::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_the_scarlet_enclave_c1() { new npc_unworthy_initiate(); @@ -1160,4 +1186,5 @@ void AddSC_the_scarlet_enclave_c1() RegisterCreatureAI(npc_scarlet_ghoul); RegisterSpellScript(spell_gift_of_the_harvester); RegisterSpellScript(spell_chapter1_runeforging_credit); + RegisterSpellScript(spell_chapter1_sky_darkener_assault); } diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp index 81219de4fe0..afc58dcfc35 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp @@ -134,7 +134,7 @@ struct npc_scarlet_trainee : public EscortAI void UpdateAI(uint32 diff) override { - if (_startTimer) + if (_startTimer && !me->IsInCombat()) { if (_startTimer <= diff) { diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index f8c7b97cb47..e4ca9095ca4 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -15,13 +15,6 @@ * with this program. If not, see . */ -/* -Name: Boss_Darkmaster_Gandling -%Complete: 90 -Comment: Doors Not yet reopening. -Category: Scholomance -*/ - #include "ScriptMgr.h" #include "GameObject.h" #include "InstanceScript.h" @@ -33,115 +26,106 @@ Category: Scholomance #include "SpellScript.h" #include "TemporarySummon.h" -enum Says +enum GandlingTexts { - YELL_SUMMONED = 0 + SAY_SUMMONED = 0 }; -enum Spells +enum GandlingSpells { - SPELL_ARCANEMISSILES = 15790, - SPELL_SHADOWSHIELD = 12040, + SPELL_ARCANE_MISSILES = 15790, + SPELL_SHADOW_SHIELD = 12040, SPELL_CURSE = 18702, SPELL_SHADOW_PORTAL = 17950 }; -enum Events +enum GandlingEvents { - EVENT_ARCANEMISSILES = 1, - EVENT_SHADOWSHIELD = 2, - EVENT_CURSE = 3, - EVENT_SHADOW_PORTAL = 4 + EVENT_ARCANE_MISSILES = 1, + EVENT_SHADOW_SHIELD, + EVENT_CURSE, + EVENT_SHADOW_PORTAL }; -class boss_darkmaster_gandling : public CreatureScript +// 1853 - Darkmaster Gandling +struct boss_darkmaster_gandling : public BossAI { - public: boss_darkmaster_gandling() : CreatureScript("boss_darkmaster_gandling") { } - - struct boss_darkmaster_gandlingAI : public BossAI + boss_darkmaster_gandling(Creature* creature) : BossAI(creature, DATA_DARKMASTER_GANDLING) { } + + void Reset() override + { + _Reset(); + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_GANDLING))) + gate->SetGoState(GO_STATE_ACTIVE); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_GANDLING))) + gate->SetGoState(GO_STATE_ACTIVE); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_ARCANE_MISSILES, 4500ms); + events.ScheduleEvent(EVENT_SHADOW_SHIELD, 12s); + events.ScheduleEvent(EVENT_CURSE, 2s); + events.ScheduleEvent(EVENT_SHADOW_PORTAL, 15s); + + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_GANDLING))) + gate->SetGoState(GO_STATE_READY); + } + + void IsSummonedBy(WorldObject* /*summoner*/) override + { + Talk(SAY_SUMMONED); + me->GetMotionMaster()->MoveRandom(5); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - boss_darkmaster_gandlingAI(Creature* creature) : BossAI(creature, DATA_DARKMASTER_GANDLING) { } - - void Reset() override - { - _Reset(); - if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_GANDLING))) - gate->SetGoState(GO_STATE_ACTIVE); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_GANDLING))) - gate->SetGoState(GO_STATE_ACTIVE); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_ARCANEMISSILES, 4500ms); - events.ScheduleEvent(EVENT_SHADOWSHIELD, 12s); - events.ScheduleEvent(EVENT_CURSE, 2s); - events.ScheduleEvent(EVENT_SHADOW_PORTAL, 15s); - - if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_GANDLING))) - gate->SetGoState(GO_STATE_READY); - } - - void IsSummonedBy(WorldObject* /*summoner*/) override - { - Talk(YELL_SUMMONED); - me->GetMotionMaster()->MoveRandom(5); - } - - void UpdateAI(uint32 diff) override + switch (eventId) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_ARCANE_MISSILES: + DoCastVictim(SPELL_ARCANE_MISSILES); + events.Repeat(8s); + break; + case EVENT_SHADOW_SHIELD: + DoCastSelf(SPELL_SHADOW_SHIELD); + events.Repeat(14s, 28s); + break; + case EVENT_CURSE: + DoCastVictim(SPELL_CURSE); + events.Repeat(15s, 27s); + break; + case EVENT_SHADOW_PORTAL: + if (HealthAbovePct(3)) { - case EVENT_ARCANEMISSILES: - DoCastVictim(SPELL_ARCANEMISSILES, true); - events.ScheduleEvent(EVENT_ARCANEMISSILES, 8s); - break; - case EVENT_SHADOWSHIELD: - DoCast(me, SPELL_SHADOWSHIELD); - events.ScheduleEvent(EVENT_SHADOWSHIELD, 14s, 28s); - break; - case EVENT_CURSE: - DoCastVictim(SPELL_CURSE, true); - events.ScheduleEvent(EVENT_CURSE, 15s, 27s); - break; - case EVENT_SHADOW_PORTAL: - if (HealthAbovePct(3)) - { - DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_SHADOW_PORTAL, true); - events.ScheduleEvent(EVENT_SHADOW_PORTAL, 17s, 27s); - } + DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_SHADOW_PORTAL); + events.Repeat(17s, 27s); } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; -// Script for Shadow Portal spell 17950 enum Rooms { ROOM_HALL_OF_SECRETS = 0, @@ -163,82 +147,71 @@ enum SPSpells }; // 17950 - Shadow Portal -class spell_shadow_portal : public SpellScriptLoader +class spell_shadow_portal : public SpellScript { - public: - spell_shadow_portal() : SpellScriptLoader("spell_shadow_portal") { } - - class spell_shadow_portal_SpellScript : public SpellScript - { - PrepareSpellScript(spell_shadow_portal_SpellScript); - - bool Load() override - { - _instance = GetCaster()->GetInstanceScript(); - return InstanceHasScript(GetCaster(), ScholomanceScriptName); - } - - void HandleCast(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - uint8 attempts = 0; - uint32 spellId = 0; + PrepareSpellScript(spell_shadow_portal); - while (!spellId) - { - if (attempts++ >= 6) break; + bool Load() override + { + _instance = GetCaster()->GetInstanceScript(); + return InstanceHasScript(GetCaster(), ScholomanceScriptName); + } - switch (urand(0, 5)) - { - case ROOM_HALL_OF_SECRETS: - if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_RAVENIAN))) - if (go->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_HALLOFSECRETS; - break; - case ROOM_HALL_OF_THE_DAMNED: - if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_THEOLEN))) - if (go->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED; - break; - case ROOM_THE_COVEN: - if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_MALICIA))) - if (go->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_THECOVEN; - break; - case ROOM_THE_SHADOW_VAULT: - if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_ILLUCIA))) - if (go->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_THESHADOWVAULT; - break; - case ROOM_BAROV_FAMILY_VAULT: - if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_BAROV))) - if (go->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT; - break; - case ROOM_VAULT_OF_THE_RAVENIAN: - if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_POLKELT))) - if (go->GetGoState() == GO_STATE_ACTIVE) - spellId = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN; - break; - } + void HandleCast(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + uint8 attempts = 0; + uint32 spellId = 0; - if (spellId) - GetHitUnit()->CastSpell(GetHitUnit(), spellId); - } - } + while (!spellId) + { + if (attempts++ >= 6) break; - void Register() override + switch (urand(0, 5)) { - OnEffectHitTarget += SpellEffectFn(spell_shadow_portal_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY); + case ROOM_HALL_OF_SECRETS: + if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_RAVENIAN))) + if (go->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_HALLOFSECRETS; + break; + case ROOM_HALL_OF_THE_DAMNED: + if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_THEOLEN))) + if (go->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED; + break; + case ROOM_THE_COVEN: + if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_MALICIA))) + if (go->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_THECOVEN; + break; + case ROOM_THE_SHADOW_VAULT: + if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_ILLUCIA))) + if (go->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_THESHADOWVAULT; + break; + case ROOM_BAROV_FAMILY_VAULT: + if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_BAROV))) + if (go->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT; + break; + case ROOM_VAULT_OF_THE_RAVENIAN: + if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(GO_GATE_POLKELT))) + if (go->GetGoState() == GO_STATE_ACTIVE) + spellId = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN; + break; } - InstanceScript* _instance = nullptr; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_shadow_portal_SpellScript(); + if (spellId) + GetHitUnit()->CastSpell(GetHitUnit(), spellId); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_shadow_portal::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY); + } + + InstanceScript* _instance = nullptr; }; // Script for Shadow Portal spells 17863, 17939, 17943, 17944, 17946, 17948 @@ -282,100 +255,89 @@ enum ScriptEventId }; // 17863, 17939, 17943, 17944, 17946, 17948 - Shadow Portal -class spell_shadow_portal_rooms : public SpellScriptLoader +class spell_shadow_portal_rooms : public SpellScript { - public: - spell_shadow_portal_rooms() : SpellScriptLoader("spell_shadow_portal_rooms") { } + PrepareSpellScript(spell_shadow_portal_rooms); - class spell_shadow_portal_rooms_SpellScript : public SpellScript - { - PrepareSpellScript(spell_shadow_portal_rooms_SpellScript); - - bool Load() override - { - _instance = GetCaster()->GetInstanceScript(); - return InstanceHasScript(GetCaster(), ScholomanceScriptName); - } + bool Load() override + { + _instance = GetCaster()->GetInstanceScript(); + return InstanceHasScript(GetCaster(), ScholomanceScriptName); + } - void HandleSendEvent(SpellEffIndex /*effIndex*/) - { - // If only one player in threat list fail spell + void HandleSendEvent(SpellEffIndex /*effIndex*/) + { + // If only one player in threat list fail spell - Unit* caster = GetCaster(); + Unit* caster = GetCaster(); - int8 pos_to_summon = 0; - int8 phase_to_set = 0; - int32 gate_to_close = 0; + int8 pos_to_summon = 0; + int8 phase_to_set = 0; + int32 gate_to_close = 0; - switch (GetEffectInfo().MiscValue) - { - case SPELL_EVENT_HALLOFSECRETS: - pos_to_summon = 0; // Not yet spawned - phase_to_set = 1; - gate_to_close = GO_GATE_RAVENIAN; - break; - case SPELL_EVENT_HALLOFTHEDAMNED: - pos_to_summon = 0; - phase_to_set = 2; - gate_to_close = GO_GATE_THEOLEN; - break; - case SPELL_EVENT_THECOVEN: - pos_to_summon = 3; - phase_to_set = 3; - gate_to_close = GO_GATE_MALICIA; - break; - case SPELL_EVENT_THESHADOWVAULT: - pos_to_summon = 6; - phase_to_set = 4; - gate_to_close = GO_GATE_ILLUCIA; - break; - case SPELL_EVENT_BAROVFAMILYVAULT: - pos_to_summon = 9; - phase_to_set = 5; - gate_to_close = GO_GATE_BAROV; - break; - case SPELL_EVENT_VAULTOFTHERAVENIAN: - pos_to_summon = 0; // Not yet spawned - phase_to_set = 6; - gate_to_close = GO_GATE_POLKELT; - break; - default: - break; - } + switch (GetEffectInfo().MiscValue) + { + case SPELL_EVENT_HALLOFSECRETS: + pos_to_summon = 0; // Not yet spawned + phase_to_set = 1; + gate_to_close = GO_GATE_RAVENIAN; + break; + case SPELL_EVENT_HALLOFTHEDAMNED: + pos_to_summon = 0; + phase_to_set = 2; + gate_to_close = GO_GATE_THEOLEN; + break; + case SPELL_EVENT_THECOVEN: + pos_to_summon = 3; + phase_to_set = 3; + gate_to_close = GO_GATE_MALICIA; + break; + case SPELL_EVENT_THESHADOWVAULT: + pos_to_summon = 6; + phase_to_set = 4; + gate_to_close = GO_GATE_ILLUCIA; + break; + case SPELL_EVENT_BAROVFAMILYVAULT: + pos_to_summon = 9; + phase_to_set = 5; + gate_to_close = GO_GATE_BAROV; + break; + case SPELL_EVENT_VAULTOFTHERAVENIAN: + pos_to_summon = 0; // Not yet spawned + phase_to_set = 6; + gate_to_close = GO_GATE_POLKELT; + break; + default: + break; + } - if (gate_to_close) + if (gate_to_close) + { + for (uint8 i = 0; i < 3; ++i) + { + if (Creature* Summoned = caster->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[pos_to_summon++], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2min)) { - for (uint8 i = 0; i < 3; ++i) - { - if (Creature* Summoned = caster->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[pos_to_summon++], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 2min)) - { - Summoned->GetMotionMaster()->MoveRandom(5); - Summoned->AI()->SetData(0, phase_to_set); - } - } - - if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(gate_to_close))) - gate->SetGoState(GO_STATE_READY); + Summoned->GetMotionMaster()->MoveRandom(5); + Summoned->AI()->SetData(0, phase_to_set); } } - void Register() override - { - OnEffectHit += SpellEffectFn(spell_shadow_portal_rooms_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); - } + if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, _instance->GetGuidData(gate_to_close))) + gate->SetGoState(GO_STATE_READY); + } + } - InstanceScript* _instance = nullptr; - }; + void Register() override + { + OnEffectHit += SpellEffectFn(spell_shadow_portal_rooms::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); + } - SpellScript* GetSpellScript() const override - { - return new spell_shadow_portal_rooms_SpellScript(); - } + InstanceScript* _instance = nullptr; }; void AddSC_boss_darkmaster_gandling() { - new boss_darkmaster_gandling(); - new spell_shadow_portal(); - new spell_shadow_portal_rooms(); + RegisterScholomanceCreatureAI(boss_darkmaster_gandling); + RegisterSpellScript(spell_shadow_portal); + RegisterSpellScript(spell_shadow_portal_rooms); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp index 3672bf89ff4..af62380ba0e 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp @@ -15,49 +15,35 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Death_knight_darkreaver -SD%Complete: 100 -SDComment: -SDCategory: Scholomance -EndScriptData */ - #include "ScriptMgr.h" #include "scholomance.h" #include "ScriptedCreature.h" -class boss_death_knight_darkreaver : public CreatureScript +enum DarkreaverSpells { -public: - boss_death_knight_darkreaver() : CreatureScript("boss_death_knight_darkreaver") { } + SUMMON_FALLEN_CHARGER = 23261 +}; - CreatureAI* GetAI(Creature* creature) const override +// 14516 - Death Knight Darkreaver +struct boss_death_knight_darkreaver : public ScriptedAI +{ + boss_death_knight_darkreaver(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override { - return GetScholomanceAI(creature); } - struct boss_death_knight_darkreaverAI : public ScriptedAI + void JustDied(Unit* /*killer*/) override { - boss_death_knight_darkreaverAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - } - - void DamageTaken(Unit* /*done_by*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override - { - if (me->GetHealth() <= damage) - DoCast(me, 23261, true); //Summon Darkreaver's Fallen Charger - } - - void JustEngagedWith(Unit* /*who*/) override - { - } - }; + DoCastSelf(SUMMON_FALLEN_CHARGER, true); + } + void JustEngagedWith(Unit* /*who*/) override + { + } }; void AddSC_boss_death_knight_darkreaver() { - new boss_death_knight_darkreaver(); + RegisterScholomanceCreatureAI(boss_death_knight_darkreaver); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp index 56c78aa4162..74879b5dbd4 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp @@ -15,99 +15,82 @@ * with this program. If not, see . */ -/* -Name: Boss_Doctor_Theolen_Krastinov -%Complete: 100 -Comment: -Category: Scholomance -*/ - #include "ScriptMgr.h" #include "scholomance.h" #include "ScriptedCreature.h" -enum Say +enum TheolenTexts { - EMOTE_FRENZY_KILL = 0, + EMOTE_FRENZY_KILL = 0 }; -enum Spells +enum TheolenSpells { SPELL_REND = 16509, SPELL_BACKHAND = 18103, SPELL_FRENZY = 8269 }; -enum Events +enum TheolenEvents { - EVENT_REND = 1, - EVENT_BACKHAND = 2, - EVENT_FRENZY = 3 + EVENT_REND = 1, + EVENT_BACKHAND, + EVENT_FRENZY }; -class boss_doctor_theolen_krastinov : public CreatureScript +// 11261 - Doctor Theolen Krastinov +struct boss_doctor_theolen_krastinov : public BossAI { - public: boss_doctor_theolen_krastinov() : CreatureScript("boss_doctor_theolen_krastinov") { } - - struct boss_theolenkrastinovAI : public BossAI - { - boss_theolenkrastinovAI(Creature* creature) : BossAI(creature, DATA_DOCTOR_THEOLEN_KRASTINOV) { } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_REND, 8s); - events.ScheduleEvent(EVENT_BACKHAND, 9s); - events.ScheduleEvent(EVENT_FRENZY, 1s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + boss_doctor_theolen_krastinov(Creature* creature) : BossAI(creature, DATA_DOCTOR_THEOLEN_KRASTINOV) { } - events.Update(diff); + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_REND, 8s); + events.ScheduleEvent(EVENT_BACKHAND, 9s); + events.ScheduleEvent(EVENT_FRENZY, 1s); + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_REND: - DoCastVictim(SPELL_REND, true); - events.ScheduleEvent(EVENT_REND, 10s); - break; - case EVENT_BACKHAND: - DoCastVictim(SPELL_BACKHAND, true); - events.ScheduleEvent(EVENT_BACKHAND, 10s); - break; - case EVENT_FRENZY: - DoCast(me, SPELL_FRENZY, true); - Talk(EMOTE_FRENZY_KILL); - events.ScheduleEvent(EVENT_FRENZY, 120s); - break; - default: - break; - } + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - DoMeleeAttackIfReady(); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_REND: + DoCastVictim(SPELL_REND); + events.Repeat(10s); + break; + case EVENT_BACKHAND: + DoCastVictim(SPELL_BACKHAND); + events.Repeat(10s); + break; + case EVENT_FRENZY: + DoCastSelf(SPELL_FRENZY); + Talk(EMOTE_FRENZY_KILL); + events.Repeat(120s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + DoMeleeAttackIfReady(); + } }; void AddSC_boss_theolenkrastinov() { - new boss_doctor_theolen_krastinov(); + RegisterScholomanceCreatureAI(boss_doctor_theolen_krastinov); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp index 28e7529fa54..b9b40ee9aae 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp @@ -15,100 +15,84 @@ * with this program. If not, see . */ -/* -Name: Boss_Illucia_Barov -%Complete: 100 -Comment: -Category: Scholomance -*/ - #include "ScriptMgr.h" #include "scholomance.h" #include "ScriptedCreature.h" -enum Spells +enum IlluciaSpells { - SPELL_CURSEOFAGONY = 18671, + SPELL_CURSE_OF_AGONY = 18671, SPELL_DOMINATE = 7645, // UNUSED YET added for documentation SPELL_FEAR = 12542, - SPELL_SHADOWSHOCK = 17234, + SPELL_SHADOW_SHOCK = 17234, SPELL_SILENCE = 12528 }; -enum Events +enum IlluciaEvents { - EVENT_CURSEOFAGONY = 1, - EVENT_SHADOWSHOCK = 2, - EVENT_SILENCE = 3, - EVENT_FEAR = 4 + EVENT_CURSE_OF_AGONY = 1, + EVENT_SHADOW_SHOCK, + EVENT_SILENCE, + EVENT_FEAR }; -class boss_illucia_barov : public CreatureScript +// 10502 - Lady Illucia Barov +struct boss_illucia_barov : public BossAI { - public: boss_illucia_barov() : CreatureScript("boss_illucia_barov") { } + boss_illucia_barov(Creature* creature) : BossAI(creature, DATA_LADY_ILLUCIA_BAROV) { } - struct boss_illuciabarovAI : public BossAI - { - boss_illuciabarovAI(Creature* creature) : BossAI(creature, DATA_LADY_ILLUCIA_BAROV) { } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_CURSE_OF_AGONY, 18s); + events.ScheduleEvent(EVENT_SHADOW_SHOCK, 9s); + events.ScheduleEvent(EVENT_SILENCE, 5s); + events.ScheduleEvent(EVENT_FEAR, 30s); + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_CURSEOFAGONY, 18s); - events.ScheduleEvent(EVENT_SHADOWSHOCK, 9s); - events.ScheduleEvent(EVENT_SILENCE, 5s); - events.ScheduleEvent(EVENT_FEAR, 30s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CURSEOFAGONY: - DoCastVictim(SPELL_CURSEOFAGONY, true); - events.ScheduleEvent(EVENT_CURSEOFAGONY, 30s); - break; - case EVENT_SHADOWSHOCK: - DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_SHADOWSHOCK, true); - events.ScheduleEvent(EVENT_SHADOWSHOCK, 12s); - break; - case EVENT_SILENCE: - DoCastVictim(SPELL_SILENCE, true); - events.ScheduleEvent(EVENT_SILENCE, 14s); - break; - case EVENT_FEAR: - DoCastVictim(SPELL_FEAR, true); - events.ScheduleEvent(EVENT_FEAR, 30s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CURSE_OF_AGONY: + DoCastVictim(SPELL_CURSE_OF_AGONY); + events.Repeat(30s); + break; + case EVENT_SHADOW_SHOCK: + DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_SHADOW_SHOCK); + events.Repeat(12s); + break; + case EVENT_SILENCE: + DoCastSelf(SPELL_SILENCE); + events.Repeat(14s); + break; + case EVENT_FEAR: + DoCastVictim(SPELL_FEAR); + events.Repeat(30s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_illuciabarov() { - new boss_illucia_barov(); + RegisterScholomanceCreatureAI(boss_illucia_barov); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp index 9a8002b070f..df70433bfeb 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp @@ -15,145 +15,128 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_instructormalicia -SD%Complete: 100 -SDComment: -SDCategory: Scholomance -EndScriptData */ - #include "ScriptMgr.h" #include "scholomance.h" #include "ScriptedCreature.h" -enum Spells +enum MaliciaSpells { - SPELL_CALLOFGRAVES = 17831, + SPELL_CALL_OF_GRAVES = 17831, SPELL_CORRUPTION = 11672, - SPELL_FLASHHEAL = 10917, + SPELL_FLASH_HEAL = 10917, SPELL_RENEW = 10929, - SPELL_HEALINGTOUCH = 9889 + SPELL_HEALING_TOUCH = 9889 }; -enum Events +enum MaliciaEvents { - EVENT_CALLOFGRAVES = 1, - EVENT_CORRUPTION = 2, - EVENT_FLASHHEAL = 3, - EVENT_RENEW = 4, - EVENT_HEALINGTOUCH = 5 + EVENT_CALL_OF_GRAVES = 1, + EVENT_CORRUPTION, + EVENT_FLASH_HEAL, + EVENT_RENEW, + EVENT_HEALING_TOUCH }; -class boss_instructor_malicia : public CreatureScript +// 10505 - Instructor Malicia +struct boss_instructor_malicia : public BossAI { - public: boss_instructor_malicia() : CreatureScript("boss_instructor_malicia") { } - - struct boss_instructormaliciaAI : public BossAI + boss_instructor_malicia(Creature* creature) : BossAI(creature, DATA_INSTRUCTOR_MALICIA) + { + Initialize(); + } + + void Initialize() + { + FlashCounter = 0; + TouchCounter = 0; + } + + uint32 FlashCounter; + uint32 TouchCounter; + + void Reset() override + { + _Reset(); + Initialize(); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_CALL_OF_GRAVES, 4s); + events.ScheduleEvent(EVENT_CORRUPTION, 8s); + events.ScheduleEvent(EVENT_RENEW, 32s); + events.ScheduleEvent(EVENT_FLASH_HEAL, 38s); + events.ScheduleEvent(EVENT_HEALING_TOUCH, 45s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - boss_instructormaliciaAI(Creature* creature) : BossAI(creature, DATA_INSTRUCTOR_MALICIA) - { - Initialize(); - } - - void Initialize() - { - FlashCounter = 0; - TouchCounter = 0; - } - - uint32 FlashCounter; - uint32 TouchCounter; - - void Reset() override + switch (eventId) { - _Reset(); - Initialize(); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_CALLOFGRAVES, 4s); - events.ScheduleEvent(EVENT_CORRUPTION, 8s); - events.ScheduleEvent(EVENT_RENEW, 32s); - events.ScheduleEvent(EVENT_FLASHHEAL, 38s); - events.ScheduleEvent(EVENT_HEALINGTOUCH, 45s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_CALL_OF_GRAVES: + DoCastSelf(SPELL_CALL_OF_GRAVES); + events.Repeat(65s); + break; + case EVENT_CORRUPTION: + DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_CORRUPTION); + events.Repeat(24s); + break; + case EVENT_RENEW: + DoCastSelf(SPELL_RENEW); + events.Repeat(10s); + break; + case EVENT_FLASH_HEAL: + // 5 Flash Heal will be cast + DoCastSelf(SPELL_FLASH_HEAL); + if (FlashCounter < 2) { - case EVENT_CALLOFGRAVES: - DoCastVictim(SPELL_CALLOFGRAVES, true); - events.ScheduleEvent(EVENT_CALLOFGRAVES, 65s); - break; - case EVENT_CORRUPTION: - DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_CORRUPTION, true); - events.ScheduleEvent(EVENT_CORRUPTION, 24s); - break; - case EVENT_RENEW: - DoCast(me, SPELL_RENEW); - events.ScheduleEvent(EVENT_RENEW, 10s); - break; - case EVENT_FLASHHEAL: - //5 Flashheals will be cast - DoCast(me, SPELL_FLASHHEAL); - if (FlashCounter < 2) - { - events.ScheduleEvent(EVENT_FLASHHEAL, 5s); - ++FlashCounter; - } - else - { - FlashCounter=0; - events.ScheduleEvent(EVENT_FLASHHEAL, 30s); - } - break; - case EVENT_HEALINGTOUCH: - //3 Healing Touch will be cast - DoCast(me, SPELL_HEALINGTOUCH); - if (TouchCounter < 2) - { - events.ScheduleEvent(EVENT_HEALINGTOUCH, 5500ms); - ++TouchCounter; - } - else - { - TouchCounter=0; - events.ScheduleEvent(EVENT_HEALINGTOUCH, 30s); - } - break; - default: - break; + events.ScheduleEvent(EVENT_FLASH_HEAL, 5s); + ++FlashCounter; } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + else + { + FlashCounter=0; + events.ScheduleEvent(EVENT_FLASH_HEAL, 30s); + } + break; + case EVENT_HEALING_TOUCH: + // 3 Healing Touch will be cast + DoCastSelf(SPELL_HEALING_TOUCH); + if (TouchCounter < 2) + { + events.ScheduleEvent(EVENT_HEALING_TOUCH, 5500ms); + ++TouchCounter; + } + else + { + TouchCounter=0; + events.ScheduleEvent(EVENT_HEALING_TOUCH, 30s); + } + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + DoMeleeAttackIfReady(); + } }; void AddSC_boss_instructormalicia() { - new boss_instructor_malicia(); + RegisterScholomanceCreatureAI(boss_instructor_malicia); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp index 97a0d1fa435..32f7e0cd2cb 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp @@ -19,14 +19,14 @@ #include "scholomance.h" #include "ScriptedCreature.h" -enum Spells +enum JandiceSpells { SPELL_CURSE_OF_BLOOD = 24673, SPELL_ILLUSION = 17773, SPELL_DROP_JOURNAL = 26096 }; -enum Events +enum JandiceEvents { EVENT_CURSE_OF_BLOOD = 1, EVENT_ILLUSION, @@ -34,95 +34,85 @@ enum Events EVENT_SET_VISIBILITY }; -class boss_jandice_barov : public CreatureScript +// 10503 - Jandice Barov +struct boss_jandice_barov : public ScriptedAI { -public: - boss_jandice_barov() : CreatureScript("boss_jandice_barov") { } + boss_jandice_barov(Creature* creature) : ScriptedAI(creature), _summons(me) { } - struct boss_jandicebarovAI : public ScriptedAI + void Reset() override { - boss_jandicebarovAI(Creature* creature) : ScriptedAI(creature), Summons(me) { } - - void Reset() override - { - events.Reset(); - Summons.DespawnAll(); - } + _events.Reset(); + _summons.DespawnAll(); + } - void JustSummoned(Creature* summoned) override - { - // Illusions should attack a random target. - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - summoned->AI()->AttackStart(target); + void JustSummoned(Creature* summoned) override + { + // Illusions should attack a random target. + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + summoned->AI()->AttackStart(target); - Summons.Summon(summoned); - } + _summons.Summon(summoned); + } - void JustEngagedWith(Unit* /*who*/) override - { - events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 15s); - events.ScheduleEvent(EVENT_ILLUSION, 30s); - } + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 15s); + _events.ScheduleEvent(EVENT_ILLUSION, 30s); + } - void JustDied(Unit* /*killer*/) override - { - Summons.DespawnAll(); - DoCastSelf(SPELL_DROP_JOURNAL, true); - } + void JustDied(Unit* /*killer*/) override + { + _summons.DespawnAll(); + DoCastSelf(SPELL_DROP_JOURNAL, true); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_CURSE_OF_BLOOD: - DoCastVictim(SPELL_CURSE_OF_BLOOD); - events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 30s); - break; - case EVENT_ILLUSION: - DoCast(SPELL_ILLUSION); - me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE); - me->SetDisplayId(11686); // Invisible Model - ModifyThreatByPercent(me->GetVictim(), -99); - events.ScheduleEvent(EVENT_SET_VISIBILITY, 3s); - events.ScheduleEvent(EVENT_ILLUSION, 25s); - break; - case EVENT_SET_VISIBILITY: - me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE); - me->SetDisplayId(11073); //Jandice Model - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + case EVENT_CURSE_OF_BLOOD: + DoCastVictim(SPELL_CURSE_OF_BLOOD); + _events.Repeat(30s); + break; + case EVENT_ILLUSION: + DoCast(SPELL_ILLUSION); + me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE); + me->SetDisplayId(11686); // Invisible Model + ModifyThreatByPercent(me->GetVictim(), -99); + _events.ScheduleEvent(EVENT_SET_VISIBILITY, 3s); + _events.Repeat(25s); + break; + case EVENT_SET_VISIBILITY: + me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE); + me->SetDisplayId(11073); // Jandice Model + break; + default: + break; } - DoMeleeAttackIfReady(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - private: - EventMap events; - SummonList Summons; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + DoMeleeAttackIfReady(); } + +private: + EventMap _events; + SummonList _summons; }; void AddSC_boss_jandicebarov() { - new boss_jandice_barov(); + RegisterScholomanceCreatureAI(boss_jandice_barov); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index 05ec449e8d1..7e2640da7c3 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -26,12 +26,12 @@ #include "scholomance.h" #include "ScriptedCreature.h" -enum Says +enum KirtonosTexts { EMOTE_SUMMONED = 0 }; -enum Spells +enum KirtonosSpells { SPELL_SWOOP = 18144, SPELL_WING_FLAP = 12882, @@ -43,7 +43,7 @@ enum Spells SPELL_DOMINATE_MIND = 14515 }; -enum Events +enum KirtonosEvents { INTRO_1 = 1, INTRO_2 = 2, @@ -61,7 +61,7 @@ enum Events EVENT_KIRTONOS_TRANSFORM = 14 }; -enum Misc +enum KirtonosMisc { WEAPON_KIRTONOS_STAFF = 11365, POINT_KIRTONOS_LAND = 13, @@ -74,197 +74,184 @@ Position const PosMove[2] = { 314.8673f, 90.30210f, 101.6459f, 0.0f } }; -class boss_kirtonos_the_herald : public CreatureScript +// 10506 - Kirtonos the Herald +struct boss_kirtonos_the_herald : public BossAI { - public: boss_kirtonos_the_herald() : CreatureScript("boss_kirtonos_the_herald") { } + boss_kirtonos_the_herald(Creature* creature) : BossAI(creature, DATA_KIRTONOS) { } - struct boss_kirtonos_the_heraldAI : public BossAI + void Reset() override + { + _Reset(); + } + + void JustEngagedWith(Unit* who) override + { + events.ScheduleEvent(EVENT_SWOOP, 8s, 8s); + events.ScheduleEvent(EVENT_WING_FLAP, 15s, 15s); + events.ScheduleEvent(EVENT_PIERCE_ARMOR, 18s, 18s); + events.ScheduleEvent(EVENT_DISARM, 22s, 22s); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 42s, 42s); + events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 53s, 53s); + events.ScheduleEvent(EVENT_DOMINATE_MIND, 34s, 48s); + events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 20s, 20s); + BossAI::JustEngagedWith(who); + } + + void JustDied(Unit* /*killer*/) override + { + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS))) + gate->SetGoState(GO_STATE_ACTIVE); + if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD))) { - boss_kirtonos_the_heraldAI(Creature* creature) : BossAI(creature, DATA_KIRTONOS) { } + brazier->ResetDoorOrButton(); + brazier->SetGoState(GO_STATE_READY); + } + _JustDied(); + } - void Reset() override - { - _Reset(); - } + void EnterEvadeMode(EvadeReason /*why*/) override + { + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS))) + gate->SetGoState(GO_STATE_ACTIVE); + if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD))) + { + brazier->ResetDoorOrButton(); + brazier->SetGoState(GO_STATE_READY); + } + me->DespawnOrUnsummon(5s); + } - void JustEngagedWith(Unit* who) override - { - events.ScheduleEvent(EVENT_SWOOP, 8s, 8s); - events.ScheduleEvent(EVENT_WING_FLAP, 15s, 15s); - events.ScheduleEvent(EVENT_PIERCE_ARMOR, 18s, 18s); - events.ScheduleEvent(EVENT_DISARM, 22s, 22s); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 42s, 42s); - events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 53s, 53s); - events.ScheduleEvent(EVENT_DOMINATE_MIND, 34s, 48s); - events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 20s, 20s); - BossAI::JustEngagedWith(who); - } + void IsSummonedBy(WorldObject* /*summoner*/) override + { + events.ScheduleEvent(INTRO_1, 500ms); + me->SetDisableGravity(true); + me->SetReactState(REACT_PASSIVE); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_UNINTERACTIBLE); + Talk(EMOTE_SUMMONED); + } - void JustDied(Unit* /*killer*/) override - { - if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS))) - gate->SetGoState(GO_STATE_ACTIVE); - if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD))) - { - brazier->ResetDoorOrButton(); - brazier->SetGoState(GO_STATE_READY); - } - _JustDied(); - } + void JustSummoned(Creature* summon) override + { + BossAI::JustSummoned(summon); + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND) + events.ScheduleEvent(INTRO_2, 1500ms); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); - void EnterEvadeMode(EvadeReason /*why*/) override + if (!UpdateVictim()) + { + while (uint32 eventId = events.ExecuteEvent()) { - if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS))) - gate->SetGoState(GO_STATE_ACTIVE); - if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD))) + switch (eventId) { - brazier->ResetDoorOrButton(); - brazier->SetGoState(GO_STATE_READY); + case INTRO_1: + me->GetMotionMaster()->MovePath(KIRTONOS_PATH, false); + break; + case INTRO_2: + me->GetMotionMaster()->MovePoint(0, PosMove[0]); + events.ScheduleEvent(INTRO_3, 1s); + break; + case INTRO_3: + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS))) + gate->SetGoState(GO_STATE_READY); + me->SetFacingTo(0.01745329f); + events.ScheduleEvent(INTRO_4, 3s); + break; + case INTRO_4: + if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD))) + brazier->SetGoState(GO_STATE_READY); + me->SetWalk(true); + me->SetDisableGravity(false); + DoCast(me, SPELL_KIRTONOS_TRANSFORM); + me->SetCanFly(false); + events.ScheduleEvent(INTRO_5, 1s); + break; + case INTRO_5: + me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + me->SetVirtualItem(0, uint32(WEAPON_KIRTONOS_STAFF)); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_UNINTERACTIBLE); + me->SetReactState(REACT_AGGRESSIVE); + events.ScheduleEvent(INTRO_6, 5s); + break; + case INTRO_6: + me->GetMotionMaster()->MovePoint(0, PosMove[1]); + break; + default: + break; } - me->DespawnOrUnsummon(5s); } - void IsSummonedBy(WorldObject* /*summoner*/) override - { - events.ScheduleEvent(INTRO_1, 500ms); - me->SetDisableGravity(true); - me->SetReactState(REACT_PASSIVE); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_UNINTERACTIBLE); - Talk(EMOTE_SUMMONED); - } + return; + } - void JustSummoned(Creature* summon) override - { - BossAI::JustSummoned(summon); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void MovementInform(uint32 type, uint32 id) override - { - if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND) - events.ScheduleEvent(INTRO_2, 1500ms); - } - - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - events.Update(diff); - - if (!UpdateVictim()) - { - while (uint32 eventId = events.ExecuteEvent()) + case EVENT_SWOOP: + DoCastVictim(SPELL_SWOOP); + events.Repeat(15s); + break; + case EVENT_WING_FLAP: + DoCastSelf(SPELL_WING_FLAP); + events.Repeat(13s); + break; + case EVENT_PIERCE_ARMOR: + DoCastVictim(SPELL_PIERCE_ARMOR); + events.Repeat(12s); + break; + case EVENT_DISARM: + DoCastVictim(SPELL_DISARM); + events.Repeat(11s); + break; + case EVENT_SHADOW_BOLT: + DoCastVictim(SPELL_SHADOW_BOLT); + events.Repeat(42s); + break; + case EVENT_CURSE_OF_TONGUES: + DoCastVictim(SPELL_CURSE_OF_TONGUES); + events.Repeat(35s); + break; + case EVENT_DOMINATE_MIND: + DoCastVictim(SPELL_DOMINATE_MIND); + events.Repeat(44s, 48s); + break; + case EVENT_KIRTONOS_TRANSFORM: + if (me->HasAura(SPELL_KIRTONOS_TRANSFORM)) { - switch (eventId) - { - case INTRO_1: - me->GetMotionMaster()->MovePath(KIRTONOS_PATH, false); - break; - case INTRO_2: - me->GetMotionMaster()->MovePoint(0, PosMove[0]); - events.ScheduleEvent(INTRO_3, 1s); - break; - case INTRO_3: - if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS))) - gate->SetGoState(GO_STATE_READY); - me->SetFacingTo(0.01745329f); - events.ScheduleEvent(INTRO_4, 3s); - break; - case INTRO_4: - if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD))) - brazier->SetGoState(GO_STATE_READY); - me->SetWalk(true); - me->SetDisableGravity(false); - DoCast(me, SPELL_KIRTONOS_TRANSFORM); - me->SetCanFly(false); - events.ScheduleEvent(INTRO_5, 1s); - break; - case INTRO_5: - me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - me->SetVirtualItem(0, uint32(WEAPON_KIRTONOS_STAFF)); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_UNINTERACTIBLE); - me->SetReactState(REACT_AGGRESSIVE); - events.ScheduleEvent(INTRO_6, 5s); - break; - case INTRO_6: - me->GetMotionMaster()->MovePoint(0, PosMove[1]); - break; - default: - break; - } + me->RemoveAura(SPELL_KIRTONOS_TRANSFORM); + me->SetVirtualItem(0, uint32(0)); + me->SetCanFly(false); } - - return; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + else { - case EVENT_SWOOP: - DoCast(me, SPELL_SWOOP); - events.ScheduleEvent(EVENT_SWOOP, 15s); - break; - case EVENT_WING_FLAP: - DoCast(me, SPELL_WING_FLAP); - events.ScheduleEvent(EVENT_WING_FLAP, 13s); - break; - case EVENT_PIERCE_ARMOR: - DoCastVictim(SPELL_PIERCE_ARMOR, true); - events.ScheduleEvent(EVENT_PIERCE_ARMOR, 12s); - break; - case EVENT_DISARM: - DoCastVictim(SPELL_DISARM, true); - events.ScheduleEvent(EVENT_DISARM, 11s); - break; - case EVENT_SHADOW_BOLT: - DoCastVictim(SPELL_SHADOW_BOLT, true); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 42s); - break; - case EVENT_CURSE_OF_TONGUES: - DoCastVictim(SPELL_CURSE_OF_TONGUES, true); - events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 35s); - break; - case EVENT_DOMINATE_MIND: - DoCastVictim(SPELL_DOMINATE_MIND, true); - events.ScheduleEvent(EVENT_DOMINATE_MIND, 44s, 48s); - break; - case EVENT_KIRTONOS_TRANSFORM: - if (me->HasAura(SPELL_KIRTONOS_TRANSFORM)) - { - me->RemoveAura(SPELL_KIRTONOS_TRANSFORM); - me->SetVirtualItem(0, uint32(0)); - me->SetCanFly(false); - } - else - { - DoCast(me, SPELL_KIRTONOS_TRANSFORM); - me->SetVirtualItem(0, uint32(WEAPON_KIRTONOS_STAFF)); - me->SetCanFly(true); - } - events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 16s, 18s); - break; - default: - break; + DoCast(me, SPELL_KIRTONOS_TRANSFORM); + me->SetVirtualItem(0, uint32(WEAPON_KIRTONOS_STAFF)); + me->SetCanFly(true); } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + events.Repeat(16s, 18s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } -}; -/*###### -## go_brazier_of_the_herald -######*/ + DoMeleeAttackIfReady(); + } +}; enum Brazier_Of_The_Herald { @@ -277,32 +264,21 @@ Position const PosSummon[1] = { 315.028f, 70.53845f, 102.1496f, 0.3859715f } }; -class go_brazier_of_the_herald : public GameObjectScript +struct go_brazier_of_the_herald : public GameObjectAI { - public: - go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { } - - struct go_brazier_of_the_heraldAI : public GameObjectAI - { - go_brazier_of_the_heraldAI(GameObject* go) : GameObjectAI(go) { } + go_brazier_of_the_herald(GameObject* go) : GameObjectAI(go) { } - bool OnGossipHello(Player* player) override - { - me->UseDoorOrButton(); - me->PlayDirectSound(SOUND_SCREECH, 0); - player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 15min); - return true; - } - }; - - GameObjectAI* GetAI(GameObject* go) const override - { - return GetScholomanceAI(go); - } + bool OnGossipHello(Player* player) override + { + me->UseDoorOrButton(); + me->PlayDirectSound(SOUND_SCREECH, 0); + player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 15min); + return true; + } }; void AddSC_boss_kirtonos_the_herald() { - new boss_kirtonos_the_herald(); - new go_brazier_of_the_herald; + RegisterScholomanceCreatureAI(boss_kirtonos_the_herald); + RegisterScholomanceGameObjectAI(go_brazier_of_the_herald); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp index b5fd8141e25..e9f35b087fb 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp @@ -20,201 +20,167 @@ #include "ScriptedCreature.h" #include "SpellScript.h" -enum Spells +enum KormokSpells { SPELL_SHADOWBOLT_VOLLEY = 20741, SPELL_BONE_SHIELD = 27688, SPELL_SUMMON_BONE_MAGES = 27695, - SPELL_SUMMON_BONE_MAGE_FRONT_LEFT = 27696, SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT = 27697, SPELL_SUMMON_BONE_MAGE_BACK_RIGHT = 27698, SPELL_SUMMON_BONE_MAGE_BACK_LEFT = 27699, - SPELL_SUMMON_BONE_MINIONS = 27687 + SPELL_SUMMON_BONE_MINIONS = 27687, + SPELL_SUMMON_BONE_MINION_FRONT = 27690, + SPELL_SUMMON_BONE_MINION_BACK = 27691, + SPELL_SUMMON_BONE_MINION_LEFT = 27692, + SPELL_SUMMON_BONE_MINION_RIGHT = 27693 }; -enum Events +enum KormokEvents { EVENT_SHADOWBOLT_VOLLEY = 1, EVENT_BONE_SHIELD, + EVENT_SUMMON_MAGES, EVENT_SUMMON_MINIONS }; -class boss_kormok : public CreatureScript +// 16118 - Kormok +struct boss_kormok : public ScriptedAI { -public: - boss_kormok() : CreatureScript("boss_kormok") { } + boss_kormok(Creature* creature) : ScriptedAI(creature) { } - struct boss_kormokAI : public ScriptedAI + void Reset() override { - boss_kormokAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + _events.Reset(); + } - void Initialize() - { - Mages = false; - } + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 10s); + _events.ScheduleEvent(EVENT_BONE_SHIELD, 2s); + _events.ScheduleEvent(EVENT_SUMMON_MAGES, 10s, 15s); + _events.ScheduleEvent(EVENT_SUMMON_MINIONS, 5s, 10s); + } - void Reset() override - { - Initialize(); - events.Reset(); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void JustEngagedWith(Unit* /*who*/) override - { - events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 10s); - events.ScheduleEvent(EVENT_BONE_SHIELD, 2s); - events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15s); - } + _events.Update(diff); - void JustSummoned(Creature* summoned) override - { - summoned->AI()->AttackStart(me->GetVictim()); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + while (uint32 eventId = _events.ExecuteEvent()) { - if (me->HealthBelowPctDamaged(25, damage) && !Mages) + switch (eventId) { - DoCast(SPELL_SUMMON_BONE_MAGES); - Mages = true; + case EVENT_SHADOWBOLT_VOLLEY: + DoCastSelf(SPELL_SHADOWBOLT_VOLLEY); + _events.Repeat(15s); + break; + case EVENT_BONE_SHIELD: + DoCastSelf(SPELL_BONE_SHIELD); + _events.Repeat(45s); + break; + case EVENT_SUMMON_MAGES: + DoCastSelf(SPELL_SUMMON_BONE_MAGES); + _events.Repeat(10s, 15s); + break; + case EVENT_SUMMON_MINIONS: + DoCastSelf(SPELL_SUMMON_BONE_MINIONS); + _events.Repeat(20s, 25s); + break; + default: + break; } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SHADOWBOLT_VOLLEY: - DoCastVictim(SPELL_SHADOWBOLT_VOLLEY); - events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 15s); - break; - case EVENT_BONE_SHIELD: - DoCastVictim(SPELL_BONE_SHIELD); - events.ScheduleEvent(EVENT_BONE_SHIELD, 45s); - break; - case EVENT_SUMMON_MINIONS: - DoCast(SPELL_SUMMON_BONE_MINIONS); - events.ScheduleEvent(EVENT_SUMMON_MINIONS, 12s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); } - private: - EventMap events; - bool Mages; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + DoMeleeAttackIfReady(); } -}; -uint32 const SummonMageSpells[4] = -{ - SPELL_SUMMON_BONE_MAGE_FRONT_LEFT, - SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT, - SPELL_SUMMON_BONE_MAGE_BACK_RIGHT, - SPELL_SUMMON_BONE_MAGE_BACK_LEFT, +private: + EventMap _events; }; // 27695 - Summon Bone Mages -class spell_kormok_summon_bone_mages : SpellScriptLoader +class spell_kormok_summon_bone_mages : public SpellScript { - public: - spell_kormok_summon_bone_mages() : SpellScriptLoader("spell_kormok_summon_bone_mages") { } + PrepareSpellScript(spell_kormok_summon_bone_mages); - class spell_kormok_summon_bone_magesSpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( { - PrepareSpellScript(spell_kormok_summon_bone_magesSpellScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo(SummonMageSpells); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - for (uint32 i = 0; i < 2; ++i) - GetCaster()->CastSpell(GetCaster(), SummonMageSpells[urand(0, 3)], true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_magesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + SPELL_SUMMON_BONE_MAGE_FRONT_LEFT, + SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT, + SPELL_SUMMON_BONE_MAGE_BACK_RIGHT, + SPELL_SUMMON_BONE_MAGE_BACK_LEFT + }); + } - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + switch (urand(0, 1)) { - return new spell_kormok_summon_bone_magesSpellScript(); + case 0: + caster->CastSpell(caster, SPELL_SUMMON_BONE_MAGE_FRONT_LEFT); + caster->CastSpell(caster, SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT); + break; + case 1: + caster->CastSpell(caster, SPELL_SUMMON_BONE_MAGE_BACK_RIGHT); + caster->CastSpell(caster, SPELL_SUMMON_BONE_MAGE_BACK_LEFT); + break; } + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_kormok_summon_bone_mages::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 27687 - Summon Bone Minions -class spell_kormok_summon_bone_minions : SpellScriptLoader +class spell_kormok_summon_bone_minions : public SpellScript { - public: - spell_kormok_summon_bone_minions() : SpellScriptLoader("spell_kormok_summon_bone_minions") { } + PrepareSpellScript(spell_kormok_summon_bone_minions); - class spell_kormok_summon_bone_minionsSpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript); - - bool Validate(SpellInfo const* /*spell*/) override + return ValidateSpellInfo( { - return ValidateSpellInfo({ SPELL_SUMMON_BONE_MINIONS }); - } - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - // Possible spells to handle this not found. - for (uint32 i = 0; i < 4; ++i) - GetCaster()->SummonCreature(NPC_BONE_MINION, GetCaster()->GetPositionX() + float(irand(-7, 7)), GetCaster()->GetPositionY() + float(irand(-7, 7)), GetCaster()->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 2min); - } + SPELL_SUMMON_BONE_MINION_FRONT, + SPELL_SUMMON_BONE_MINION_BACK, + SPELL_SUMMON_BONE_MINION_LEFT, + SPELL_SUMMON_BONE_MINION_RIGHT + }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_SUMMON_BONE_MINION_FRONT); + caster->CastSpell(caster, SPELL_SUMMON_BONE_MINION_BACK); + caster->CastSpell(caster, SPELL_SUMMON_BONE_MINION_LEFT); + caster->CastSpell(caster, SPELL_SUMMON_BONE_MINION_RIGHT); + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_kormok_summon_bone_minionsSpellScript(); + OnEffectHit += SpellEffectFn(spell_kormok_summon_bone_minions::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; void AddSC_boss_kormok() { - new boss_kormok(); - new spell_kormok_summon_bone_mages(); - new spell_kormok_summon_bone_minions(); + RegisterScholomanceCreatureAI(boss_kormok); + RegisterSpellScript(spell_kormok_summon_bone_mages); + RegisterSpellScript(spell_kormok_summon_bone_minions); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp index 22ed088934c..bd678b8e71a 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp @@ -15,94 +15,78 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Lord_Alexei_Barov -SD%Complete: 100 -SDComment: aura applied/defined in database -SDCategory: Scholomance -EndScriptData */ - #include "scholomance.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" -enum Spells +enum AlexeiSpells { SPELL_IMMOLATE = 20294, - SPELL_VEILOFSHADOW = 17820, + SPELL_VEIL_OF_SHADOW = 17820, SPELL_UNHOLY_AURA = 17467 }; -enum Events +enum AlexeiEvents { - EVENT_IMMOLATE = 1, - EVENT_VEILOFSHADOW = 2 + EVENT_IMMOLATE = 1, + EVENT_VEIL_OF_SHADOW }; -class boss_lord_alexei_barov : public CreatureScript +// 10504 - Lord Alexei Barov +struct boss_lord_alexei_barov : public BossAI { - public: boss_lord_alexei_barov() : CreatureScript("boss_lord_alexei_barov") { } - - struct boss_lordalexeibarovAI : public BossAI - { - boss_lordalexeibarovAI(Creature* creature) : BossAI(creature, DATA_LORD_ALEXEI_BAROV) { } - - void Reset() override - { - _Reset(); - - if (!me->HasAura(SPELL_UNHOLY_AURA)) - DoCast(me, SPELL_UNHOLY_AURA); - } + boss_lord_alexei_barov(Creature* creature) : BossAI(creature, DATA_LORD_ALEXEI_BAROV) { } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_IMMOLATE, 7s); - events.ScheduleEvent(EVENT_VEILOFSHADOW, 15s); - } + void Reset() override + { + _Reset(); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + if (!me->HasAura(SPELL_UNHOLY_AURA)) + DoCastSelf(SPELL_UNHOLY_AURA); + } - events.Update(diff); + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_IMMOLATE, 7s); + events.ScheduleEvent(EVENT_VEIL_OF_SHADOW, 15s); + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_IMMOLATE: - DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_IMMOLATE, true); - events.ScheduleEvent(EVENT_IMMOLATE, 12s); - break; - case EVENT_VEILOFSHADOW: - DoCastVictim(SPELL_VEILOFSHADOW, true); - events.ScheduleEvent(EVENT_VEILOFSHADOW, 20s); - break; - default: - break; - } + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - DoMeleeAttackIfReady(); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_IMMOLATE: + DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_IMMOLATE); + events.Repeat(12s); + break; + case EVENT_VEIL_OF_SHADOW: + DoCastVictim(SPELL_VEIL_OF_SHADOW); + events.Repeat(20s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_lordalexeibarov() { - new boss_lord_alexei_barov(); + RegisterScholomanceCreatureAI(boss_lord_alexei_barov); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp index 07615837321..4accabc4746 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp @@ -15,99 +15,83 @@ * with this program. If not, see . */ -/* -Name: Boss_Lorekeeper_Polkelt -%Complete: 100 -Comment: -Category: Scholomance -*/ - #include "scholomance.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" -enum Spells +enum PolkeltSpells { - SPELL_VOLATILEINFECTION = 24928, - SPELL_DARKPLAGUE = 18270, - SPELL_CORROSIVEACID = 23313, - SPELL_NOXIOUSCATALYST = 18151 + SPELL_VOLATILE_INFECTION = 24928, + SPELL_DARK_PLAGUE = 18270, + SPELL_CORROSIVE_ACID = 23313, + SPELL_NOXIOUS_CATALYST = 18151 }; -enum Events +enum PolkeltEvents { - EVENT_VOLATILEINFECTION = 1, - EVENT_DARKPLAGUE = 2, - EVENT_CORROSIVEACID = 3, - EVENT_NOXIOUSCATALYST = 4 + EVENT_VOLATILE_INFECTION = 1, + EVENT_DARK_PLAGUE, + EVENT_CORROSIVE_ACID, + EVENT_NOXIOUS_CATALYST }; -class boss_lorekeeper_polkelt : public CreatureScript +// 10901 - Lorekeeper Polkelt +struct boss_lorekeeper_polkelt : public BossAI { - public: boss_lorekeeper_polkelt() : CreatureScript("boss_lorekeeper_polkelt") { } + boss_lorekeeper_polkelt(Creature* creature) : BossAI(creature, DATA_LOREKEEPER_POLKELT) { } - struct boss_lorekeeperpolkeltAI : public BossAI - { - boss_lorekeeperpolkeltAI(Creature* creature) : BossAI(creature, DATA_LOREKEEPER_POLKELT) { } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 38s); + events.ScheduleEvent(EVENT_DARK_PLAGUE, 8s); + events.ScheduleEvent(EVENT_CORROSIVE_ACID, 45s); + events.ScheduleEvent(EVENT_NOXIOUS_CATALYST, 35s); + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_VOLATILEINFECTION, 38s); - events.ScheduleEvent(EVENT_DARKPLAGUE, 8s); - events.ScheduleEvent(EVENT_CORROSIVEACID, 45s); - events.ScheduleEvent(EVENT_NOXIOUSCATALYST, 35s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_VOLATILEINFECTION: - DoCastVictim(SPELL_VOLATILEINFECTION, true); - events.ScheduleEvent(EVENT_VOLATILEINFECTION, 32s); - break; - case EVENT_DARKPLAGUE: - DoCastVictim(SPELL_DARKPLAGUE, true); - events.ScheduleEvent(EVENT_DARKPLAGUE, 8s); - break; - case EVENT_CORROSIVEACID: - DoCastVictim(SPELL_CORROSIVEACID, true); - events.ScheduleEvent(EVENT_CORROSIVEACID, 25s); - break; - case EVENT_NOXIOUSCATALYST: - DoCastVictim(SPELL_NOXIOUSCATALYST, true); - events.ScheduleEvent(EVENT_NOXIOUSCATALYST, 38s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_VOLATILE_INFECTION: + DoCastVictim(SPELL_VOLATILE_INFECTION); + events.Repeat(32s); + break; + case EVENT_DARK_PLAGUE: + DoCastVictim(SPELL_DARK_PLAGUE); + events.Repeat(8s); + break; + case EVENT_CORROSIVE_ACID: + DoCastSelf(SPELL_CORROSIVE_ACID); + events.Repeat(25s); + break; + case EVENT_NOXIOUS_CATALYST: + DoCastVictim(SPELL_NOXIOUS_CATALYST); + events.Repeat(38s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_lorekeeperpolkelt() { - new boss_lorekeeper_polkelt(); + RegisterScholomanceCreatureAI(boss_lorekeeper_polkelt); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp index 6aa017d5174..8581e5f66aa 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp @@ -19,17 +19,17 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" -enum Spells +enum RasSpells { SPELL_FROSTBOLT = 21369, SPELL_ICE_ARMOR = 18100, // This is actually a buff he gives himself SPELL_FREEZE = 18763, SPELL_FEAR = 26070, SPELL_CHILL_NOVA = 18099, - SPELL_FROSTVOLLEY = 8398 + SPELL_FROSTBOLT_VOLLEY = 8398 }; -enum Events +enum RasEvents { EVENT_FROSTBOLT = 1, EVENT_ICE_ARMOR, @@ -39,91 +39,81 @@ enum Events EVENT_FROSTVOLLEY }; -class boss_boss_ras_frostwhisper : public CreatureScript +// 10508 - Ras Frostwhisper +struct boss_boss_ras_frostwhisper : public ScriptedAI { -public: - boss_boss_ras_frostwhisper() : CreatureScript("boss_boss_ras_frostwhisper") { } + boss_boss_ras_frostwhisper(Creature* creature) : ScriptedAI(creature) { } - struct boss_rasfrostAI : public ScriptedAI + void Reset() override { - boss_rasfrostAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - events.Reset(); - DoCast(me, SPELL_ICE_ARMOR); - } + _events.Reset(); + DoCastSelf(SPELL_ICE_ARMOR); + } - void JustEngagedWith(Unit* /*who*/) override - { - events.ScheduleEvent(EVENT_ICE_ARMOR, 2s); - events.ScheduleEvent(EVENT_FROSTBOLT, 8s); - events.ScheduleEvent(EVENT_CHILL_NOVA, 12s); - events.ScheduleEvent(EVENT_FREEZE, 18s); - events.ScheduleEvent(EVENT_FEAR, 45s); - } + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_ICE_ARMOR, 2s); + _events.ScheduleEvent(EVENT_FROSTBOLT, 8s); + _events.ScheduleEvent(EVENT_CHILL_NOVA, 12s); + _events.ScheduleEvent(EVENT_FREEZE, 18s); + _events.ScheduleEvent(EVENT_FEAR, 45s); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_ICE_ARMOR: - DoCast(me, SPELL_ICE_ARMOR); - events.ScheduleEvent(EVENT_ICE_ARMOR, 3min); - break; - case EVENT_FROSTBOLT: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) - DoCast(target, SPELL_FROSTBOLT); - events.ScheduleEvent(EVENT_FROSTBOLT, 8s); - break; - case EVENT_FREEZE: - DoCastVictim(SPELL_FREEZE); - events.ScheduleEvent(EVENT_FREEZE, 24s); - break; - case EVENT_FEAR: - DoCastVictim(SPELL_FEAR); - events.ScheduleEvent(EVENT_FEAR, 30s); - break; - case EVENT_CHILL_NOVA: - DoCastVictim(SPELL_CHILL_NOVA); - events.ScheduleEvent(EVENT_CHILL_NOVA, 14s); - break; - case EVENT_FROSTVOLLEY: - DoCastVictim(SPELL_FROSTVOLLEY); - events.ScheduleEvent(EVENT_FROSTVOLLEY, 15s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + case EVENT_ICE_ARMOR: + DoCastSelf(SPELL_ICE_ARMOR); + _events.Repeat(3min); + break; + case EVENT_FROSTBOLT: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) + DoCast(target, SPELL_FROSTBOLT); + _events.Repeat(8s); + break; + case EVENT_FREEZE: + DoCastVictim(SPELL_FREEZE); + _events.Repeat(24s); + break; + case EVENT_FEAR: + DoCastSelf(SPELL_FEAR); + _events.Repeat(30s); + break; + case EVENT_CHILL_NOVA: + DoCastSelf(SPELL_CHILL_NOVA); + _events.Repeat(14s); + break; + case EVENT_FROSTVOLLEY: + DoCastVictim(SPELL_FROSTBOLT_VOLLEY); + _events.Repeat(15s); + break; + default: + break; } - DoMeleeAttackIfReady(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + DoMeleeAttackIfReady(); } + +private: + EventMap _events; }; void AddSC_boss_rasfrost() { - new boss_boss_ras_frostwhisper(); + RegisterScholomanceCreatureAI(boss_boss_ras_frostwhisper); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp index 3b6965f7582..5965e8bf9d3 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp @@ -15,99 +15,83 @@ * with this program. If not, see . */ -/* -Name: Boss_the_ravenian -%Complete: 100 -Comment: -Category: Scholomance -*/ - #include "scholomance.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" -enum Spells +enum RavenianSpells { SPELL_TRAMPLE = 15550, SPELL_CLEAVE = 20691, - SPELL_SUNDERINCLEAVE = 25174, - SPELL_KNOCKAWAY = 10101 + SPELL_SUNDERING_CLEAVE = 25174, + SPELL_KNOCK_AWAY = 10101 }; -enum Events +enum RavenianEvents { - EVENT_TRAMPLE = 1, - EVENT_CLEAVE = 2, - EVENT_SUNDERINCLEAVE = 3, - EVENT_KNOCKAWAY = 4 + EVENT_TRAMPLE = 1, + EVENT_CLEAVE, + EVENT_SUNDERING_CLEAVE, + EVENT_KNOCK_AWAY }; -class boss_the_ravenian : public CreatureScript +// 10507 - The Ravenian +struct boss_the_ravenian : public BossAI { - public: boss_the_ravenian() : CreatureScript("boss_the_ravenian") { } + boss_the_ravenian(Creature* creature) : BossAI(creature, DATA_THE_RAVENIAN) { } - struct boss_theravenianAI : public BossAI - { - boss_theravenianAI(Creature* creature) : BossAI(creature, DATA_THE_RAVENIAN) { } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_TRAMPLE, 24s); + events.ScheduleEvent(EVENT_CLEAVE, 15s); + events.ScheduleEvent(EVENT_SUNDERING_CLEAVE, 40s); + events.ScheduleEvent(EVENT_KNOCK_AWAY, 32s); + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_TRAMPLE, 24s); - events.ScheduleEvent(EVENT_CLEAVE, 15s); - events.ScheduleEvent(EVENT_SUNDERINCLEAVE, 40s); - events.ScheduleEvent(EVENT_KNOCKAWAY, 32s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_TRAMPLE: - DoCastVictim(SPELL_TRAMPLE, true); - events.ScheduleEvent(EVENT_TRAMPLE, 10s); - break; - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE, true); - events.ScheduleEvent(EVENT_CLEAVE, 7s); - break; - case EVENT_SUNDERINCLEAVE: - DoCastVictim(SPELL_SUNDERINCLEAVE, true); - events.ScheduleEvent(EVENT_SUNDERINCLEAVE, 20s); - break; - case EVENT_KNOCKAWAY: - DoCastVictim(SPELL_KNOCKAWAY, true); - events.ScheduleEvent(EVENT_KNOCKAWAY, 12s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_TRAMPLE: + DoCastSelf(SPELL_TRAMPLE); + events.Repeat(10s); + break; + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.Repeat(7s); + break; + case EVENT_SUNDERING_CLEAVE: + DoCastVictim(SPELL_SUNDERING_CLEAVE); + events.Repeat(20s); + break; + case EVENT_KNOCK_AWAY: + DoCastVictim(SPELL_KNOCK_AWAY); + events.Repeat(12s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_theravenian() { - new boss_the_ravenian(); + RegisterScholomanceCreatureAI(boss_the_ravenian); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp index 6558325f19d..768e96b3c8a 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp @@ -19,12 +19,12 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" -enum Emotes +enum VectusTexts { EMOTE_FRENZY = 0 }; -enum Spells +enum VectusSpells { SPELL_FLAMESTRIKE = 18399, SPELL_BLAST_WAVE = 16046, @@ -32,92 +32,78 @@ enum Spells SPELL_FRENZY = 8269 // 28371 }; -enum Events +enum VectusEvents { EVENT_FIRE_SHIELD = 1, EVENT_BLAST_WAVE, EVENT_FRENZY }; -class boss_vectus : public CreatureScript +// 10432 - Vectus +struct boss_vectus : public ScriptedAI { -public: - boss_vectus() : CreatureScript("boss_vectus") { } + boss_vectus(Creature* creature) : ScriptedAI(creature) { } - struct boss_vectusAI : public ScriptedAI + void Reset() override { - boss_vectusAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - events.Reset(); - } + _events.Reset(); + } - void JustEngagedWith(Unit* /*who*/) override - { - events.ScheduleEvent(EVENT_FIRE_SHIELD, 2s); - events.ScheduleEvent(EVENT_BLAST_WAVE, 14s); - } + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_FIRE_SHIELD, 2s); + _events.ScheduleEvent(EVENT_BLAST_WAVE, 14s); + } - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override - { - if (me->HealthBelowPctDamaged(25, damage)) - { - DoCast(me, SPELL_FRENZY); - Talk(EMOTE_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, 24s); - } - } + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (!me->HasAura(SPELL_FRENZY) && me->HealthBelowPctDamaged(25, damage)) + _events.ScheduleEvent(EVENT_FRENZY, 0s); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_FIRE_SHIELD: - DoCast(me, SPELL_FIRE_SHIELD); - events.ScheduleEvent(EVENT_FIRE_SHIELD, 90s); - break; - case EVENT_BLAST_WAVE: - DoCast(me, SPELL_BLAST_WAVE); - events.ScheduleEvent(EVENT_BLAST_WAVE, 12s); - break; - case EVENT_FRENZY: - DoCast(me, SPELL_FRENZY); - Talk(EMOTE_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, 24s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + case EVENT_FIRE_SHIELD: + DoCastSelf(SPELL_FIRE_SHIELD); + _events.Repeat(90s); + break; + case EVENT_BLAST_WAVE: + DoCastSelf(SPELL_BLAST_WAVE); + _events.Repeat(12s); + break; + case EVENT_FRENZY: + DoCastSelf(SPELL_FRENZY); + Talk(EMOTE_FRENZY); + _events.Repeat(24s); + break; + default: + break; } - DoMeleeAttackIfReady(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetScholomanceAI(creature); + DoMeleeAttackIfReady(); } + +private: + EventMap _events; }; void AddSC_boss_vectus() { - new boss_vectus(); + RegisterScholomanceCreatureAI(boss_vectus); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h index 42b075eb4b5..a4a8aa58631 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h +++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h @@ -62,4 +62,7 @@ inline AI* GetScholomanceAI(T* obj) return GetInstanceAI(obj, ScholomanceScriptName); } +#define RegisterScholomanceCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetScholomanceAI) +#define RegisterScholomanceGameObjectAI(ai_name) RegisterGameObjectAIWithFactory(ai_name, GetScholomanceAI) + #endif diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp index e3a7dcad6c6..7e18585817f 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp @@ -174,7 +174,11 @@ class instance_shadowfang_keep : public InstanceMapScript break; case TYPE_NANDOS: if (data == DONE) - DoUseDoorOrButton(DoorArugalGUID); + { + if (GameObject* go = instance->GetGameObject(DoorArugalGUID)) + if (go->GetGoState() == GO_STATE_READY) + DoUseDoorOrButton(DoorArugalGUID); + } m_auiEncounter[3] = data; break; case DATA_SPAWN_VALENTINE_ADDS: diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index a892e1ae0fe..44c339f8310 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -53,6 +53,7 @@ enum Spells SPELL_ENTROPIUS_COSMETIC_SPAWN = 46223, SPELL_DARKNESS_E = 46269, SPELL_NEGATIVE_ENERGY_PERIODIC_E = 46284, + SPELL_NEGATIVE_ENERGY_DAMAGE = 46285, SPELL_BLACKHOLE = 46282, SPELL_SUMMON_DARKFIEND_E = 46263, @@ -635,6 +636,27 @@ class spell_muru_negative_energy_periodic : public AuraScript } }; +// 46289 - Negative Energy +class spell_muru_negative_energy : public SpellScript +{ + PrepareSpellScript(spell_muru_negative_energy); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_NEGATIVE_ENERGY_DAMAGE }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_NEGATIVE_ENERGY_DAMAGE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_muru_negative_energy::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_boss_muru() { RegisterSunwellPlateauCreatureAI(boss_muru); @@ -649,4 +671,5 @@ void AddSC_boss_muru() RegisterSpellScript(spell_transform_visual_missile_periodic); RegisterSpellScript(spell_summon_blood_elves_periodic); RegisterSpellScript(spell_muru_negative_energy_periodic); + RegisterSpellScript(spell_muru_negative_energy); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.cpp index 9a641317d36..940e7981c1d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.cpp @@ -16,10 +16,12 @@ */ #include "ScriptMgr.h" +#include "SpellScript.h" #include "zulgurub.h" #include "GameEventMgr.h" #include "GameObject.h" #include "GameObjectAI.h" +#include "Unit.h" /*###### ## go_brazier_of_madness @@ -74,7 +76,34 @@ class go_brazier_of_madness : public GameObjectScript } }; +enum PoisonousBlood +{ + SPELL_POISONOUS_BLOOD = 24321 +}; + +// 24320 - Poisonous Blood +class spell_zulgurub_poisonous_blood : public SpellScript +{ + PrepareSpellScript(spell_zulgurub_poisonous_blood); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_POISONOUS_BLOOD }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_POISONOUS_BLOOD); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_zulgurub_poisonous_blood::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_zulgurub() { new go_brazier_of_madness(); + RegisterSpellScript(spell_zulgurub_poisonous_blood); } diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms.cpp new file mode 100644 index 00000000000..4e36f5e5c39 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms.cpp @@ -0,0 +1,175 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 . + */ + +#include "DBCStores.h" +#include "ScriptMgr.h" +#include "SpellScript.h" +#include "Unit.h" + +enum Translocation +{ + SPELL_TRANSLOCATION_DUSKWITHER_SPIRE_UP = 26566, + SPELL_TRANSLOCATION_DUSKWITHER_SPIRE_DOWN = 26572, + SPELL_TRANSLOCATION_SILVERMOON_TO_UNDERCITY = 25649, + SPELL_TRANSLOCATION_UNDERCITY_TO_SILVERMOON = 35730 +}; + +// 34448 - Translocate +class spell_eastern_kingdoms_duskwither_spire_up : public SpellScript +{ + PrepareSpellScript(spell_eastern_kingdoms_duskwither_spire_up); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TRANSLOCATION_DUSKWITHER_SPIRE_UP }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_TRANSLOCATION_DUSKWITHER_SPIRE_UP); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_eastern_kingdoms_duskwither_spire_up::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 34452 - Translocate +class spell_eastern_kingdoms_duskwither_spire_down : public SpellScript +{ + PrepareSpellScript(spell_eastern_kingdoms_duskwither_spire_down); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TRANSLOCATION_DUSKWITHER_SPIRE_DOWN }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_TRANSLOCATION_DUSKWITHER_SPIRE_DOWN); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_eastern_kingdoms_duskwither_spire_down::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 35376 - Translocate +class spell_eastern_kingdoms_silvermoon_to_undercity : public SpellScript +{ + PrepareSpellScript(spell_eastern_kingdoms_silvermoon_to_undercity); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TRANSLOCATION_SILVERMOON_TO_UNDERCITY }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_TRANSLOCATION_SILVERMOON_TO_UNDERCITY); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_eastern_kingdoms_silvermoon_to_undercity::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 35727 - Translocate +class spell_eastern_kingdoms_undercity_to_silvermoon : public SpellScript +{ + PrepareSpellScript(spell_eastern_kingdoms_undercity_to_silvermoon); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TRANSLOCATION_UNDERCITY_TO_SILVERMOON }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_TRANSLOCATION_UNDERCITY_TO_SILVERMOON); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_eastern_kingdoms_undercity_to_silvermoon::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +enum DeadScarBombingRun +{ + SOUND_ID_BOMBING_RUN = 12318 +}; + +// 45071 - Quest - Sunwell Daily - Dead Scar Bombing Run +class spell_eastern_kingdoms_dead_scar_bombing_run : public SpellScript +{ + PrepareSpellScript(spell_eastern_kingdoms_dead_scar_bombing_run); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return sSoundEntriesStore.LookupEntry(SOUND_ID_BOMBING_RUN); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->PlayDirectSound(SOUND_ID_BOMBING_RUN); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_eastern_kingdoms_dead_scar_bombing_run::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +enum DawnbladeAttack +{ + SPELL_DAWNBLADE_ATTACK = 45189 +}; + +// 45188 - Dawnblade Attack +class spell_eastern_kingdoms_dawnblade_attack : public SpellScript +{ + PrepareSpellScript(spell_eastern_kingdoms_dawnblade_attack); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DAWNBLADE_ATTACK }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_DAWNBLADE_ATTACK); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_eastern_kingdoms_dawnblade_attack::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +void AddSC_eastern_kingdoms() +{ + RegisterSpellScript(spell_eastern_kingdoms_duskwither_spire_up); + RegisterSpellScript(spell_eastern_kingdoms_duskwither_spire_down); + RegisterSpellScript(spell_eastern_kingdoms_silvermoon_to_undercity); + RegisterSpellScript(spell_eastern_kingdoms_undercity_to_silvermoon); + RegisterSpellScript(spell_eastern_kingdoms_dead_scar_bombing_run); + RegisterSpellScript(spell_eastern_kingdoms_dawnblade_attack); +} diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp index ef2c5c36bb3..56b5438747d 100644 --- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -174,6 +174,7 @@ void AddSC_boss_renataki(); void AddSC_boss_wushoolay(); void AddSC_instance_zulgurub(); void AddSC_zulgurub(); +void AddSC_eastern_kingdoms(); //void AddSC_alterac_mountains(); //void AddSC_arathi_highlands(); void AddSC_blasted_lands(); @@ -354,6 +355,7 @@ void AddEasternKingdomsScripts() AddSC_boss_wushoolay(); AddSC_instance_zulgurub(); AddSC_zulgurub(); + AddSC_eastern_kingdoms(); //AddSC_alterac_mountains(); //AddSC_arathi_highlands(); AddSC_blasted_lands(); diff --git a/src/server/scripts/Events/brewfest.cpp b/src/server/scripts/Events/brewfest.cpp index b4698876f33..1894dcb1110 100644 --- a/src/server/scripts/Events/brewfest.cpp +++ b/src/server/scripts/Events/brewfest.cpp @@ -663,6 +663,32 @@ class spell_brewfest_botm_empty_bottle_throw_resolve : public SpellScript } }; +enum MoleMachine +{ + SPELL_PORT_TO_GRIM_GUZZLER = 47523 +}; + +// 49466 - Mole Machine Portal Schedule +class spell_brewfest_mole_machine_portal_schedule : public SpellScript +{ + PrepareSpellScript(spell_brewfest_mole_machine_portal_schedule); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PORT_TO_GRIM_GUZZLER }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PORT_TO_GRIM_GUZZLER); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_brewfest_mole_machine_portal_schedule::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_event_brewfest() { RegisterSpellScript(spell_brewfest_giddyup); @@ -683,4 +709,5 @@ void AddSC_event_brewfest() RegisterSpellScript(spell_brewfest_botm_teach_language); RegisterSpellScript(spell_brewfest_botm_weak_alcohol); RegisterSpellScript(spell_brewfest_botm_empty_bottle_throw_resolve); + RegisterSpellScript(spell_brewfest_mole_machine_portal_schedule); } diff --git a/src/server/scripts/Events/love_is_in_the_air.cpp b/src/server/scripts/Events/love_is_in_the_air.cpp index c79aea25f16..2eb6c184f62 100644 --- a/src/server/scripts/Events/love_is_in_the_air.cpp +++ b/src/server/scripts/Events/love_is_in_the_air.cpp @@ -158,27 +158,6 @@ enum SomethingStinks SPELL_HEAVILY_PERFUMED = 71507 }; -// 70192 - Fragrant Air Analysis -class spell_love_is_in_the_air_fragrant_air_analysis : public SpellScript -{ - PrepareSpellScript(spell_love_is_in_the_air_fragrant_air_analysis); - - bool Validate(SpellInfo const* spellInfo) override - { - return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_love_is_in_the_air_fragrant_air_analysis::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } -}; - // 71507 - Heavily Perfumed class spell_love_is_in_the_air_heavily_perfumed : public AuraScript { @@ -346,7 +325,6 @@ void AddSC_event_love_is_in_the_air() { RegisterSpellScript(spell_love_is_in_the_air_romantic_picnic); RegisterSpellScript(spell_love_is_in_the_air_create_heart_candy); - RegisterSpellScript(spell_love_is_in_the_air_fragrant_air_analysis); RegisterSpellScript(spell_love_is_in_the_air_heavily_perfumed); RegisterSpellScript(spell_love_is_in_the_air_recently_analyzed); RegisterSpellScript(spell_love_is_in_the_air_sample_satisfaction); diff --git a/src/server/scripts/Events/lunar_festival.cpp b/src/server/scripts/Events/lunar_festival.cpp index 1ee9faa5172..de4690a5a98 100644 --- a/src/server/scripts/Events/lunar_festival.cpp +++ b/src/server/scripts/Events/lunar_festival.cpp @@ -476,10 +476,37 @@ class spell_lunar_festival_elune_candle : public SpellScript } }; +enum ElunesBlessing +{ + SPELL_ELUNES_BLESSING_QUEST_CREDIT = 26394 +}; + +// 26393 - Elune's Blessing +class spell_lunar_festival_elunes_blessing : public SpellScript +{ + PrepareSpellScript(spell_lunar_festival_elunes_blessing); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_ELUNES_BLESSING_QUEST_CREDIT }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_ELUNES_BLESSING_QUEST_CREDIT); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_lunar_festival_elunes_blessing::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_event_lunar_festival() { RegisterCreatureAI(npc_firework); RegisterCreatureAI(npc_omen); RegisterCreatureAI(npc_giant_spotlight); RegisterSpellScript(spell_lunar_festival_elune_candle); + RegisterSpellScript(spell_lunar_festival_elunes_blessing); } diff --git a/src/server/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp index 2e28d3f18c3..aff921d63ba 100644 --- a/src/server/scripts/Events/midsummer.cpp +++ b/src/server/scripts/Events/midsummer.cpp @@ -445,6 +445,51 @@ class spell_midsummer_fling_torch_missed : public SpellScript } }; +enum CleansingFlames +{ + SPELL_CREATE_FLAME_OF_DARNASSUS = 29099, + SPELL_CREATE_FLAME_OF_STORMWIND = 29101, + SPELL_CREATE_FLAME_OF_IRONFORGE = 29102, + SPELL_CREATE_FLAME_OF_ORGRIMMAR = 29130, + SPELL_CREATE_FLAME_OF_THUNDER_BLUFF = 29132, + SPELL_CREATE_FLAME_OF_THE_UNDERCITY = 29133, + SPELL_CREATE_FLAME_OF_SILVERMOON = 46689, + SPELL_CREATE_FLAME_OF_THE_EXODAR = 46690 +}; + +// 29126 - Cleansing Flames +// 29137 - Cleansing Flames +// 29135 - Cleansing Flames +// 29136 - Cleansing Flames +// 29138 - Cleansing Flames +// 29139 - Cleansing Flames +// 46672 - Cleansing Flames +// 46671 - Cleansing Flames +class spell_midsummer_cleansing_flames : public SpellScript +{ + PrepareSpellScript(spell_midsummer_cleansing_flames); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ _triggeredSpell }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), _triggeredSpell); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_midsummer_cleansing_flames::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + + uint32 _triggeredSpell; + +public: + explicit spell_midsummer_cleansing_flames(CleansingFlames triggeredSpell) : _triggeredSpell(triggeredSpell) { } +}; + void AddSC_event_midsummer() { RegisterSpellScript(spell_midsummer_braziers_hit); @@ -458,4 +503,12 @@ void AddSC_event_midsummer() RegisterSpellScript(spell_midsummer_fling_torch_triggered); RegisterSpellScript(spell_midsummer_fling_torch_catch); RegisterSpellScript(spell_midsummer_fling_torch_missed); + RegisterSpellScriptWithArgs(spell_midsummer_cleansing_flames, "spell_midsummer_cleansing_flames_darnassus", SPELL_CREATE_FLAME_OF_DARNASSUS); + RegisterSpellScriptWithArgs(spell_midsummer_cleansing_flames, "spell_midsummer_cleansing_flames_stormwind", SPELL_CREATE_FLAME_OF_STORMWIND); + RegisterSpellScriptWithArgs(spell_midsummer_cleansing_flames, "spell_midsummer_cleansing_flames_ironforge", SPELL_CREATE_FLAME_OF_IRONFORGE); + RegisterSpellScriptWithArgs(spell_midsummer_cleansing_flames, "spell_midsummer_cleansing_flames_orgrimmar", SPELL_CREATE_FLAME_OF_ORGRIMMAR); + RegisterSpellScriptWithArgs(spell_midsummer_cleansing_flames, "spell_midsummer_cleansing_flames_thunder_bluff", SPELL_CREATE_FLAME_OF_THUNDER_BLUFF); + RegisterSpellScriptWithArgs(spell_midsummer_cleansing_flames, "spell_midsummer_cleansing_flames_the_undercity", SPELL_CREATE_FLAME_OF_THE_UNDERCITY); + RegisterSpellScriptWithArgs(spell_midsummer_cleansing_flames, "spell_midsummer_cleansing_flames_silvermoon", SPELL_CREATE_FLAME_OF_SILVERMOON); + RegisterSpellScriptWithArgs(spell_midsummer_cleansing_flames, "spell_midsummer_cleansing_flames_the_exodar", SPELL_CREATE_FLAME_OF_THE_EXODAR); } diff --git a/src/server/scripts/Events/pilgrims_bounty.cpp b/src/server/scripts/Events/pilgrims_bounty.cpp index b61bb81f6e0..b078fbf0d40 100644 --- a/src/server/scripts/Events/pilgrims_bounty.cpp +++ b/src/server/scripts/Events/pilgrims_bounty.cpp @@ -33,36 +33,6 @@ enum PilgrimsBountyBuffFood SPELL_WELL_FED_SPIRIT_TRIGGER = 65415 }; -class spell_pilgrims_bounty_buff_food : public AuraScript -{ - PrepareAuraScript(spell_pilgrims_bounty_buff_food); -private: - uint32 const _triggeredSpellId; - -public: - spell_pilgrims_bounty_buff_food(uint32 triggeredSpellId) : AuraScript(), _triggeredSpellId(triggeredSpellId) - { - _handled = false; - } - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (_handled) - return; - - _handled = true; - GetTarget()->CastSpell(GetTarget(), _triggeredSpellId, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_pilgrims_bounty_buff_food::HandleTriggerSpell, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - - bool _handled; -}; - enum FeastOnSpells { FEAST_ON_TURKEY = 61784, @@ -449,11 +419,6 @@ class spell_pilgrims_bounty_a_serving_of : public AuraScript void AddSC_event_pilgrims_bounty() { - RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_slow_roasted_turkey", SPELL_WELL_FED_AP_TRIGGER); - RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_cranberry_chutney", SPELL_WELL_FED_ZM_TRIGGER); - RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_spice_bread_stuffing", SPELL_WELL_FED_HIT_TRIGGER); - RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_pumpkin_pie", SPELL_WELL_FED_SPIRIT_TRIGGER); - RegisterSpellScriptWithArgs(spell_pilgrims_bounty_buff_food, "spell_gen_candied_sweet_potato", SPELL_WELL_FED_HASTE_TRIGGER); RegisterSpellScript(spell_pilgrims_bounty_feast_on); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_well_fed, "spell_pilgrims_bounty_well_fed_turkey", SPELL_WELL_FED_AP_TRIGGER); RegisterSpellScriptWithArgs(spell_pilgrims_bounty_well_fed, "spell_pilgrims_bounty_well_fed_cranberry", SPELL_WELL_FED_ZM_TRIGGER); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp index 238739fd9f0..6cdd8dc843e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -87,8 +87,9 @@ class boss_mal_ganis : public CreatureScript _defeated = true; // @todo hack most likely - if (InstanceMap* map = instance->instance->ToInstanceMap()) - map->PermBindAllPlayers(); + if (instance->instance->IsHeroic()) + if (InstanceMap* map = instance->instance->ToInstanceMap()) + map->PermBindAllPlayers(); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp index 9fe7aa25a57..52da9ed0f33 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp @@ -15,30 +15,24 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Captain_Skarloc -SD%Complete: 75 -SDComment: Missing adds, missing waypoints to move up to Thrall once spawned + speech before enter combat. -SDCategory: Caverns of Time, Old Hillsbrad Foothills -EndScriptData */ +/* Missing adds, missing waypoints to move up to Thrall once spawned + speech before enter combat */ #include "ScriptMgr.h" #include "InstanceScript.h" #include "ScriptedCreature.h" #include "old_hillsbrad.h" -/*###################### -# boss_captain_skarloc # -#######################*/ - -enum CaptainSkarloc +enum SkarlocTexts { SAY_ENTER = 0, SAY_TAUNT1 = 1, SAY_TAUNT2 = 2, SAY_SLAY = 3, SAY_DEATH = 4, +}; +enum SkarlocSpells +{ SPELL_HOLY_LIGHT = 29427, SPELL_CLEANSE = 29380, SPELL_HAMMER_OF_JUSTICE = 13005, @@ -47,34 +41,24 @@ enum CaptainSkarloc SPELL_CONSECRATION = 38385 }; -struct boss_captain_skarloc : public BossAI +enum SkarlocEvents { - boss_captain_skarloc(Creature* creature) : BossAI(creature, DATA_CAPTAIN_SKARLOC) - { - Initialize(); - } - - void Initialize() - { - Holy_Light_Timer = urand(20000, 30000); - Cleanse_Timer = 10000; - HammerOfJustice_Timer = urand(20000, 35000); - HolyShield_Timer = 240000; - DevotionAura_Timer = 3000; - Consecration_Timer = 8000; - } + EVENT_HOLY_LIGHT = 1, + EVENT_CLEANSE, + EVENT_HAMMER_OF_JUSTICE, + EVENT_HOLY_SHIELD, + EVENT_DEVOTION_AURA, + EVENT_CONSECRATION +}; - uint32 Holy_Light_Timer; - uint32 Cleanse_Timer; - uint32 HammerOfJustice_Timer; - uint32 HolyShield_Timer; - uint32 DevotionAura_Timer; - uint32 Consecration_Timer; +// 17862 - Captain Skarloc +struct boss_captain_skarloc : public BossAI +{ + boss_captain_skarloc(Creature* creature) : BossAI(creature, DATA_CAPTAIN_SKARLOC) { } void Reset() override { BossAI::Reset(); - Initialize(); } void JustEngagedWith(Unit* who) override @@ -83,6 +67,12 @@ struct boss_captain_skarloc : public BossAI //This is not correct. Should taunt Thrall before engage in combat Talk(SAY_TAUNT1); Talk(SAY_TAUNT2); + events.ScheduleEvent(EVENT_HOLY_LIGHT, 20s, 30s); + events.ScheduleEvent(EVENT_CLEANSE, 10s); + events.ScheduleEvent(EVENT_HAMMER_OF_JUSTICE, 20s, 35s); + events.ScheduleEvent(EVENT_HOLY_SHIELD, 240s); + events.ScheduleEvent(EVENT_DEVOTION_AURA, 3s); + events.ScheduleEvent(EVENT_CONSECRATION, 8s); } void KilledUnit(Unit* /*victim*/) override @@ -100,51 +90,49 @@ struct boss_captain_skarloc : public BossAI void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; - //Holy_Light - if (Holy_Light_Timer <= diff) - { - DoCast(me, SPELL_HOLY_LIGHT); - Holy_Light_Timer = 30000; - } else Holy_Light_Timer -= diff; - - //Cleanse - if (Cleanse_Timer <= diff) - { - DoCast(me, SPELL_CLEANSE); - Cleanse_Timer = 10000; - } else Cleanse_Timer -= diff; - - //Hammer of Justice - if (HammerOfJustice_Timer <= diff) - { - DoCastVictim(SPELL_HAMMER_OF_JUSTICE); - HammerOfJustice_Timer = 60000; - } else HammerOfJustice_Timer -= diff; - - //Holy Shield - if (HolyShield_Timer <= diff) - { - DoCast(me, SPELL_HOLY_SHIELD); - HolyShield_Timer = 240000; - } else HolyShield_Timer -= diff; + events.Update(diff); - //Devotion_Aura - if (DevotionAura_Timer <= diff) - { - DoCast(me, SPELL_DEVOTION_AURA); - DevotionAura_Timer = urand(45000, 55000); - } else DevotionAura_Timer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - //Consecration - if (Consecration_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - //DoCastVictim(SPELL_CONSECRATION); - Consecration_Timer = urand(5000, 10000); - } else Consecration_Timer -= diff; + switch (eventId) + { + case EVENT_HOLY_LIGHT: + DoCastSelf(SPELL_HOLY_LIGHT); + events.Repeat(30s); + break; + case EVENT_CLEANSE: + DoCastSelf(SPELL_CLEANSE); + events.Repeat(10s); + break; + case EVENT_HAMMER_OF_JUSTICE: + DoCastVictim(SPELL_HAMMER_OF_JUSTICE); + events.Repeat(60s); + break; + case EVENT_HOLY_SHIELD: + DoCastSelf(SPELL_HOLY_SHIELD); + events.Repeat(240s); + break; + case EVENT_DEVOTION_AURA: + DoCastSelf(SPELL_DEVOTION_AURA); + events.Repeat(45s, 55s); + break; + case EVENT_CONSECRATION: + DoCastSelf(SPELL_CONSECRATION); + events.Repeat(5s, 10s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp index 25c5b0345f0..67a5aac1491 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp @@ -15,66 +15,56 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Epoch_Hunter -SD%Complete: 60 -SDComment: Missing spawns pre-event, missing speech to be coordinated with rest of escort event. -SDCategory: Caverns of Time, Old Hillsbrad Foothills -EndScriptData */ +/* Missing spawns pre-event, missing speech to be coordinated with rest of escort event */ #include "ScriptMgr.h" #include "InstanceScript.h" #include "old_hillsbrad.h" #include "ScriptedCreature.h" -/*################### -# boss_epoch_hunter # -####################*/ - -enum EpochHunter +enum EpochHunterTexts { SAY_ENTER = 0, SAY_AGGRO = 1, SAY_SLAY = 2, SAY_BREATH = 3, - SAY_DEATH = 4, + SAY_DEATH = 4 +}; +enum EpochHunterSpells +{ SPELL_SAND_BREATH = 31914, SPELL_IMPENDING_DEATH = 31916, SPELL_MAGIC_DISRUPTION_AURA = 33834, SPELL_WING_BUFFET = 31475 }; -struct boss_epoch_hunter : public BossAI +enum EpochHunterEvents { - boss_epoch_hunter(Creature* creature) : BossAI(creature, DATA_EPOCH_HUNTER) - { - Initialize(); - } - - void Initialize() - { - SandBreath_Timer = urand(8000, 16000); - ImpendingDeath_Timer = urand(25000, 30000); - WingBuffet_Timer = 35000; - Mda_Timer = 40000; - } + EVENT_SAND_BREATH = 1, + EVENT_IMPENDING_DEATH, + EVENT_MAGIC_DISRUPTION_AURA, + EVENT_WING_BUFFET +}; - uint32 SandBreath_Timer; - uint32 ImpendingDeath_Timer; - uint32 WingBuffet_Timer; - uint32 Mda_Timer; +// 18096 - Epoch Hunter +struct boss_epoch_hunter : public BossAI +{ + boss_epoch_hunter(Creature* creature) : BossAI(creature, DATA_EPOCH_HUNTER) { } void Reset() override { BossAI::Reset(); - Initialize(); } void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_SAND_BREATH, 8s, 16s); + events.ScheduleEvent(EVENT_IMPENDING_DEATH, 25s, 30s); + events.ScheduleEvent(EVENT_MAGIC_DISRUPTION_AURA, 40s); + events.ScheduleEvent(EVENT_WING_BUFFET, 35s); } void KilledUnit(Unit* /*victim*/) override @@ -92,41 +82,42 @@ struct boss_epoch_hunter : public BossAI void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; - //Sand Breath - if (SandBreath_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(false); - - DoCastVictim(SPELL_SAND_BREATH); - - Talk(SAY_BREATH); + events.Update(diff); - SandBreath_Timer = urand(10000, 20000); - } else SandBreath_Timer -= diff; - - if (ImpendingDeath_Timer <= diff) - { - DoCastVictim(SPELL_IMPENDING_DEATH); - ImpendingDeath_Timer = 25000 + rand32() % 5000; - } else ImpendingDeath_Timer -= diff; - - if (WingBuffet_Timer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_WING_BUFFET); - WingBuffet_Timer = 25000 + rand32() % 10000; - } else WingBuffet_Timer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (Mda_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - DoCast(me, SPELL_MAGIC_DISRUPTION_AURA); - Mda_Timer = 15000; - } else Mda_Timer -= diff; + switch (eventId) + { + case EVENT_SAND_BREATH: + DoCastVictim(SPELL_SAND_BREATH); + Talk(SAY_BREATH); + events.Repeat(10s, 20s); + break; + case EVENT_IMPENDING_DEATH: + DoCastVictim(SPELL_IMPENDING_DEATH); + events.Repeat(25s, 30s); + break; + case EVENT_MAGIC_DISRUPTION_AURA: + DoCastSelf(SPELL_MAGIC_DISRUPTION_AURA); + events.Repeat(15s); + break; + case EVENT_WING_BUFFET: + DoCastSelf(SPELL_WING_BUFFET); + events.Repeat(25s, 35s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp index 8858d954fcb..2be921ef73f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp @@ -15,12 +15,7 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Luetenant_Drake -SD%Complete: 70 -SDComment: Missing proper code for patrolling area after being spawned. Script for GO (barrels) quest 10283 -SDCategory: Caverns of Time, Old Hillsbrad Foothills -EndScriptData */ +/* Missing proper code for patrolling area after being spawned */ #include "ScriptMgr.h" #include "GameObject.h" @@ -30,11 +25,7 @@ EndScriptData */ #include "old_hillsbrad.h" #include "ScriptedEscortAI.h" -/*###### -## boss_lieutenant_drake -######*/ - -enum LieutenantDrake +enum DrakeTexts { SAY_ENTER = 0, SAY_AGGRO = 1, @@ -42,13 +33,24 @@ enum LieutenantDrake SAY_MORTAL = 3, SAY_SHOUT = 4, SAY_DEATH = 5, +}; +enum DrakeSpells +{ SPELL_WHIRLWIND = 31909, SPELL_HAMSTRING = 9080, SPELL_MORTAL_STRIKE = 31911, SPELL_FRIGHTENING_SHOUT = 33789 }; +enum DrakeEvents +{ + EVENT_WHIRLWIND = 1, + EVENT_HAMSTRING, + EVENT_MORTAL_STRIKE, + EVENT_FRIGHTENING_SHOUT +}; + Position const DrakeWP[]= { { 2125.84f, 88.2535f, 54.8830f }, @@ -72,6 +74,7 @@ Position const DrakeWP[]= { 2128.20f, 70.9763f, 64.4221f } }; +// 17848 - Lieutenant Drake struct boss_lieutenant_drake : public BossAI { boss_lieutenant_drake(Creature* creature) : BossAI(creature, DATA_LIEUTENANT_DRAKE) @@ -83,21 +86,11 @@ struct boss_lieutenant_drake : public BossAI { CanPatrol = true; wpId = 0; - - Whirlwind_Timer = 20000; - Fear_Timer = 30000; - MortalStrike_Timer = 45000; - ExplodingShout_Timer = 25000; } bool CanPatrol; uint32 wpId; - uint32 Whirlwind_Timer; - uint32 Fear_Timer; - uint32 MortalStrike_Timer; - uint32 ExplodingShout_Timer; - void Reset() override { BossAI::Reset(); @@ -108,6 +101,10 @@ struct boss_lieutenant_drake : public BossAI { BossAI::JustEngagedWith(who); Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_WHIRLWIND, 20s); + events.ScheduleEvent(EVENT_HAMSTRING, 30s); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, 45s); + events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 25s); } void KilledUnit(Unit* /*victim*/) override @@ -130,41 +127,48 @@ struct boss_lieutenant_drake : public BossAI ++wpId; } - //Return since we have no target if (!UpdateVictim()) return; - //Whirlwind - if (Whirlwind_Timer <= diff) - { - DoCastVictim(SPELL_WHIRLWIND); - Whirlwind_Timer = 20000 + rand32() % 5000; - } else Whirlwind_Timer -= diff; + events.Update(diff); - //Fear - if (Fear_Timer <= diff) - { - Talk(SAY_SHOUT); - DoCastVictim(SPELL_FRIGHTENING_SHOUT); - Fear_Timer = 25000 + rand32() % 10000; - } else Fear_Timer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - //Mortal Strike - if (MortalStrike_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - Talk(SAY_MORTAL); - DoCastVictim(SPELL_MORTAL_STRIKE); - MortalStrike_Timer = 20000 + rand32() % 10000; - } else MortalStrike_Timer -= diff; + switch (eventId) + { + case EVENT_WHIRLWIND: + DoCastSelf(SPELL_WHIRLWIND); + events.Repeat(20s, 25s); + break; + case EVENT_HAMSTRING: + DoCastVictim(SPELL_HAMSTRING); + events.Repeat(15s, 20s); + break; + case EVENT_MORTAL_STRIKE: + Talk(SAY_MORTAL); + DoCastVictim(SPELL_MORTAL_STRIKE); + events.Repeat(20s, 30s); + break; + case EVENT_FRIGHTENING_SHOUT: + Talk(SAY_SHOUT); + DoCastVictim(SPELL_FRIGHTENING_SHOUT); + events.Repeat(25s, 35s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } DoMeleeAttackIfReady(); } }; -/*###### -## go_barrel_old_hillsbrad -######*/ - struct go_barrel_old_hillsbrad : public GameObjectAI { go_barrel_old_hillsbrad(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index 03d392dd2f4..b0f383e1a14 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -440,11 +440,10 @@ struct npc_thrall_old_hillsbrad : public EscortAI DoUnmount(); } - void JustReachedHome() override + void EnterEvadeMode(EvadeReason why) override { - EscortAI::JustReachedHome(); - if (HadMount) - DoMount(); + EscortAI::EnterEvadeMode(why); + Reset(); } void JustSummoned(Creature* summoned) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp index 5958ae3f5e6..ab68a65a87d 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp @@ -15,41 +15,37 @@ * with this program. If not, see . */ -/* -Name: Boss_Aeonus -%Complete: 80 -Comment: Some spells not implemented -Category: Caverns of Time, The Dark Portal -*/ - #include "ScriptMgr.h" #include "InstanceScript.h" #include "ScriptedCreature.h" #include "the_black_morass.h" -enum Enums +enum AeonusTexts { SAY_ENTER = 0, SAY_AGGRO = 1, SAY_BANISH = 2, SAY_SLAY = 3, SAY_DEATH = 4, - EMOTE_FRENZY = 5, + EMOTE_FRENZY = 5 +}; +enum AeonusSpells +{ SPELL_CLEAVE = 40504, SPELL_TIME_STOP = 31422, SPELL_ENRAGE = 37605, - SPELL_SAND_BREATH = 31473, - H_SPELL_SAND_BREATH = 39049 + SPELL_SAND_BREATH = 31473 }; -enum Events +enum AeonusEvents { EVENT_SANDBREATH = 1, - EVENT_TIMESTOP = 2, - EVENT_FRENZY = 3 + EVENT_TIMESTOP, + EVENT_FRENZY }; +// 17881 - Aeonus struct boss_aeonus : public BossAI { boss_aeonus(Creature* creature) : BossAI(creature, TYPE_AEONUS) { } @@ -66,7 +62,6 @@ struct boss_aeonus : public BossAI } void MoveInLineOfSight(Unit* who) override - { //Despawn Time Keeper if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER) @@ -97,7 +92,6 @@ struct boss_aeonus : public BossAI void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; @@ -112,16 +106,16 @@ struct boss_aeonus : public BossAI { case EVENT_SANDBREATH: DoCastVictim(SPELL_SAND_BREATH); - events.ScheduleEvent(EVENT_SANDBREATH, 15s, 25s); + events.Repeat(15s, 25s); break; case EVENT_TIMESTOP: - DoCastVictim(SPELL_TIME_STOP); - events.ScheduleEvent(EVENT_TIMESTOP, 20s, 35s); + DoCastSelf(SPELL_TIME_STOP); + events.Repeat(20s, 35s); break; case EVENT_FRENZY: - Talk(EMOTE_FRENZY); - DoCast(me, SPELL_ENRAGE); - events.ScheduleEvent(EVENT_FRENZY, 20s, 35s); + Talk(EMOTE_FRENZY); + DoCastSelf(SPELL_ENRAGE); + events.Repeat(20s, 35s); break; default: break; @@ -130,6 +124,7 @@ struct boss_aeonus : public BossAI if (me->HasUnitState(UNIT_STATE_CASTING)) return; } + DoMeleeAttackIfReady(); } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp index 752cf85b370..22c116852fc 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp @@ -15,42 +15,37 @@ * with this program. If not, see . */ -/* -Name: Boss_Chrono_Lord_Deja -%Complete: 65 -Comment: All abilities not implemented -Category: Caverns of Time, The Black Morass -*/ - #include "ScriptMgr.h" #include "InstanceScript.h" #include "ScriptedCreature.h" #include "the_black_morass.h" -enum Enums +enum DejaTexts { SAY_ENTER = 0, SAY_AGGRO = 1, SAY_BANISH = 2, SAY_SLAY = 3, - SAY_DEATH = 4, + SAY_DEATH = 4 +}; +enum DejaSpells +{ SPELL_ARCANE_BLAST = 31457, - H_SPELL_ARCANE_BLAST = 38538, SPELL_ARCANE_DISCHARGE = 31472, - H_SPELL_ARCANE_DISCHARGE = 38539, SPELL_TIME_LAPSE = 31467, SPELL_ATTRACTION = 38540 //Not Implemented (Heroic mode) }; -enum Events +enum DejaEvents { EVENT_ARCANE_BLAST = 1, - EVENT_TIME_LAPSE = 2, - EVENT_ARCANE_DISCHARGE = 3, - EVENT_ATTRACTION = 4 + EVENT_TIME_LAPSE, + EVENT_ARCANE_DISCHARGE, + EVENT_ATTRACTION }; +// 17879 - Chrono Lord Deja struct boss_chrono_lord_deja : public BossAI { boss_chrono_lord_deja(Creature* creature) : BossAI(creature, TYPE_CRONO_LORD_DEJA) { } @@ -69,7 +64,6 @@ struct boss_chrono_lord_deja : public BossAI } void MoveInLineOfSight(Unit* who) override - { //Despawn Time Keeper if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER) @@ -112,21 +106,20 @@ struct boss_chrono_lord_deja : public BossAI { case EVENT_ARCANE_BLAST: DoCastVictim(SPELL_ARCANE_BLAST); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 15s, 25s); + events.Repeat(15s, 25s); break; case EVENT_TIME_LAPSE: Talk(SAY_BANISH); - DoCast(me, SPELL_TIME_LAPSE); - events.ScheduleEvent(EVENT_TIME_LAPSE, 15s, 25s); + DoCastSelf(SPELL_TIME_LAPSE); + events.Repeat(15s, 25s); break; case EVENT_ARCANE_DISCHARGE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_ARCANE_DISCHARGE); - events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 20s, 30s); + DoCastSelf(SPELL_ARCANE_DISCHARGE); + events.Repeat(20s, 30s); break; - case EVENT_ATTRACTION: // Only in Heroic - DoCast(me, SPELL_ATTRACTION); - events.ScheduleEvent(EVENT_ATTRACTION, 25s, 35s); + case EVENT_ATTRACTION: + DoCastSelf(SPELL_ATTRACTION); + events.Repeat(25s, 35s); break; default: break; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp index 03ced5fb1ff..d658ad918ba 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp @@ -15,41 +15,37 @@ * with this program. If not, see . */ -/* -Name: Boss_Temporus -%Complete: 75 -Comment: More abilities need to be implemented -Category: Caverns of Time, The Black Morass -*/ - #include "ScriptMgr.h" #include "InstanceScript.h" #include "ScriptedCreature.h" #include "the_black_morass.h" -enum Enums +enum TemporusTexts { SAY_ENTER = 0, SAY_AGGRO = 1, SAY_BANISH = 2, SAY_SLAY = 3, - SAY_DEATH = 4, + SAY_DEATH = 4 +}; +enum TemporusSpells +{ SPELL_HASTE = 31458, SPELL_MORTAL_WOUND = 31464, SPELL_WING_BUFFET = 31475, - H_SPELL_WING_BUFFET = 38593, - SPELL_REFLECT = 38592 //Not Implemented (Heroic mod) + SPELL_REFLECT = 38592 }; -enum Events +enum TemporusEvents { EVENT_HASTE = 1, - EVENT_MORTAL_WOUND = 2, - EVENT_WING_BUFFET = 3, - EVENT_SPELL_REFLECTION = 4 + EVENT_MORTAL_WOUND, + EVENT_WING_BUFFET, + EVENT_SPELL_REFLECTION }; +// 17880 - Temporus struct boss_temporus : public BossAI { boss_temporus(Creature* creature) : BossAI(creature, TYPE_TEMPORUS) { } @@ -97,7 +93,6 @@ struct boss_temporus : public BossAI void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; @@ -111,20 +106,20 @@ struct boss_temporus : public BossAI switch (eventId) { case EVENT_HASTE: - DoCast(me, SPELL_HASTE); - events.ScheduleEvent(EVENT_HASTE, 20s, 25s); + DoCastSelf(SPELL_HASTE); + events.Repeat(20s, 25s); break; case EVENT_MORTAL_WOUND: - DoCast(me, SPELL_MORTAL_WOUND); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 10s, 20s); + DoCastVictim(SPELL_MORTAL_WOUND); + events.Repeat(10s, 20s); break; case EVENT_WING_BUFFET: - DoCast(me, SPELL_WING_BUFFET); - events.ScheduleEvent(EVENT_WING_BUFFET, 20s, 30s); + DoCastSelf(SPELL_WING_BUFFET); + events.Repeat(20s, 30s); break; - case EVENT_SPELL_REFLECTION: // Only in Heroic - DoCast(me, SPELL_REFLECT); - events.ScheduleEvent(EVENT_SPELL_REFLECTION, 25s, 35s); + case EVENT_SPELL_REFLECTION: + DoCastSelf(SPELL_REFLECT); + events.Repeat(25s, 35s); break; default: break; @@ -133,6 +128,7 @@ struct boss_temporus : public BossAI if (me->HasUnitState(UNIT_STATE_CASTING)) return; } + DoMeleeAttackIfReady(); } }; diff --git a/src/server/scripts/Kalimdor/DireMaul/diremaul.h b/src/server/scripts/Kalimdor/DireMaul/diremaul.h index 923b26be422..12be787074f 100644 --- a/src/server/scripts/Kalimdor/DireMaul/diremaul.h +++ b/src/server/scripts/Kalimdor/DireMaul/diremaul.h @@ -48,7 +48,8 @@ enum DMGameobjectIds GO_CRYSTAL_02 = 177257, GO_CRYSTAL_03 = 177258, GO_CRYSTAL_04 = 179504, - GO_CRYSTAL_05 = 179505 + GO_CRYSTAL_05 = 179505, + GO_PRINCE_CHEST = 179545 }; template diff --git a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp index 0dce5d2e81f..06a04bff057 100644 --- a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp +++ b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp @@ -127,6 +127,9 @@ class instance_dire_maul : public InstanceMapScript if (GetBossState(DATA_FORCEFIELD) != DONE) _events.ScheduleEvent(EVENT_CRYSTAL_CREATURE_STORE, 1s); break; + case GO_PRINCE_CHEST: + _princechestGUID = go->GetGUID(); + break; default: break; } @@ -148,6 +151,8 @@ class instance_dire_maul : public InstanceMapScript return _crystalGUIDs[4]; case GO_FORCEFIELD: return _forcefieldGUID; + case GO_PRINCE_CHEST: + return _princechestGUID; case NPC_IMMOLTHAR: return _immoGUID; case NPC_TORTHELDRIN: @@ -278,6 +283,12 @@ class instance_dire_maul : public InstanceMapScript if (Creature* tortheldrin = instance->GetCreature(_tortheldrinGUID)) tortheldrin->SetFaction(FACTION_ENEMY); } + + if (unit->GetGUID() == _tortheldrinGUID) + { + if (GameObject* chest = instance->GetGameObject(_princechestGUID)) + chest->RemoveFlag(GO_FLAG_NOT_SELECTABLE); + } } protected: @@ -285,6 +296,7 @@ class instance_dire_maul : public InstanceMapScript std::array _crystalGUIDs; std::array, 5> _crystalCreatureGUIDs; // 5 different Crystals, maximum of 4 Creatures ObjectGuid _forcefieldGUID; + ObjectGuid _princechestGUID; ObjectGuid _immoGUID; ObjectGuid _tortheldrinGUID; }; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp new file mode 100644 index 00000000000..998138c40d7 --- /dev/null +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp @@ -0,0 +1,74 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 . + */ + +#include "ScriptMgr.h" +#include "SpellScript.h" +#include "Unit.h" + +enum Spells +{ + SPELL_TELEPORT_TO_TWIN_EMPS_EFFECT = 29181, + SPELL_TELEPORT_TO_FINAL_CHAMBER_EFFECT = 29190 +}; + +// 29182 - Teleport to Twin Emperors +class spell_temple_of_ahnqiraj_teleport_to_twin_emperors : public SpellScript +{ + PrepareSpellScript(spell_temple_of_ahnqiraj_teleport_to_twin_emperors); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TELEPORT_TO_TWIN_EMPS_EFFECT }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_TELEPORT_TO_TWIN_EMPS_EFFECT); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_temple_of_ahnqiraj_teleport_to_twin_emperors::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 29188 - Teleport to Final Chamber +class spell_temple_of_ahnqiraj_teleport_to_final_chamber : public SpellScript +{ + PrepareSpellScript(spell_temple_of_ahnqiraj_teleport_to_final_chamber); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TELEPORT_TO_FINAL_CHAMBER_EFFECT }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_TELEPORT_TO_FINAL_CHAMBER_EFFECT); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_temple_of_ahnqiraj_teleport_to_final_chamber::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +void AddSC_temple_of_ahnqiraj() +{ + RegisterSpellScript(spell_temple_of_ahnqiraj_teleport_to_twin_emperors); + RegisterSpellScript(spell_temple_of_ahnqiraj_teleport_to_final_chamber); +} diff --git a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp index 7f0d324e920..4506c2e4b7f 100644 --- a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp +++ b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp @@ -95,6 +95,7 @@ void AddSC_boss_twinemperors(); void AddSC_boss_ouro(); void AddSC_npc_anubisath_sentinel(); void AddSC_instance_temple_of_ahnqiraj(); +void AddSC_temple_of_ahnqiraj(); // Wailing caverns void AddSC_wailing_caverns(); void AddSC_instance_wailing_caverns(); @@ -208,6 +209,7 @@ void AddKalimdorScripts() AddSC_boss_ouro(); AddSC_npc_anubisath_sentinel(); AddSC_instance_temple_of_ahnqiraj(); + AddSC_temple_of_ahnqiraj(); // Wailing caverns AddSC_wailing_caverns(); AddSC_instance_wailing_caverns(); diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 3913560d859..78448c14103 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -91,7 +91,7 @@ class npc_draenei_survivor : public CreatureScript DoCast(me, SPELL_IRRIDATION, true); - me->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); + me->SetPvP(true); me->SetUnitFlag(UNIT_FLAG_IN_COMBAT); me->SetHealth(me->CountPctFromMaxHealth(10)); me->SetStandState(UNIT_STAND_STATE_SLEEP); @@ -115,7 +115,7 @@ class npc_draenei_survivor : public CreatureScript { if (spellInfo->SpellFamilyFlags[2] & 0x080000000) { - me->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); + me->SetPvP(false); me->SetStandState(UNIT_STAND_STATE_STAND); DoCast(me, SPELL_STUNNED, true); diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index 75b55d566d5..04098b968b7 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -50,11 +50,12 @@ enum Spells enum Events { - EVENT_MAGIC_BANE = 1, - EVENT_SHADOW_BOLT = 2, - EVENT_CORRUPT_SOUL = 3, - EVENT_SOULSTORM = 4, - EVENT_FEAR = 5 + EVENT_MAGIC_BANE = 1, + EVENT_SHADOW_BOLT, + EVENT_CORRUPT_SOUL, + EVENT_SOULSTORM, + EVENT_FEAR, + EVENT_TELEPORT }; enum CombatPhases @@ -114,9 +115,7 @@ struct boss_bronjahm : public BossAI if (events.IsInPhase(PHASE_1) && !HealthAbovePct(30)) { events.SetPhase(PHASE_2); - DoCast(me, SPELL_TELEPORT); - events.ScheduleEvent(EVENT_FEAR, 12s, 16s, 0, PHASE_2); - events.ScheduleEvent(EVENT_SOULSTORM, 100ms, 0, PHASE_2); + events.ScheduleEvent(EVENT_TELEPORT, 1ms, 0, PHASE_2); } } @@ -196,6 +195,11 @@ struct boss_bronjahm : public BossAI me->CastSpell(nullptr, SPELL_FEAR, { SPELLVALUE_MAX_TARGETS, 1 }); events.ScheduleEvent(EVENT_FEAR, 8s, 12s, 0, PHASE_2); break; + case EVENT_TELEPORT: + DoCastSelf(SPELL_TELEPORT); + events.ScheduleEvent(EVENT_FEAR, 12s, 16s, 0, PHASE_2); + events.ScheduleEvent(EVENT_SOULSTORM, 100ms, 0, PHASE_2); + break; default: break; } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index fae90261770..33ad236f791 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -547,22 +547,20 @@ class spell_ick_explosive_barrage : public AuraScript void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_UNIT) + Creature* target = GetTarget()->ToCreature(); + if (!target) return; - caster->GetMotionMaster()->MoveIdle(); - caster->GetMotionMaster()->Clear(MOTION_PRIORITY_NORMAL); + target->SetReactState(REACT_PASSIVE); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_UNIT) + Creature* target = GetTarget()->ToCreature(); + if (!target) return; - if (Unit* victim = caster->GetVictim()) - caster->GetMotionMaster()->MoveChase(victim); + target->SetReactState(REACT_AGGRESSIVE); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 209dd71150b..6b26046ca7d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -1101,7 +1101,7 @@ class spell_deathbringer_blood_beast_blood_link : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetProcTarget()->CastSpell(nullptr, SPELL_BLOOD_LINK_DUMMY, CastSpellExtraArgs(aurEff).AddSpellBP0(3)); + eventInfo.GetActionTarget()->CastSpell(nullptr, SPELL_BLOOD_LINK_DUMMY, CastSpellExtraArgs(aurEff).AddSpellBP0(3)); } void Register() override @@ -1222,23 +1222,6 @@ class spell_deathbringer_boiling_blood : public SpellScript } }; -// 72257 - Remove Marks of the Fallen Champion -class spell_deathbringer_remove_marks : public SpellScript -{ - PrepareSpellScript(spell_deathbringer_remove_marks); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_deathbringer_remove_marks::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } -}; - class achievement_ive_gone_and_made_a_mess : public AchievementCriteriaScript { public: @@ -1272,7 +1255,6 @@ void AddSC_boss_deathbringer_saurfang() RegisterSpellScript(spell_deathbringer_blood_nova); RegisterSpellScript(spell_deathbringer_blood_nova_targeting); RegisterSpellScript(spell_deathbringer_boiling_blood); - RegisterSpellScript(spell_deathbringer_remove_marks); // Achievements new achievement_ive_gone_and_made_a_mess(); diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp index daba4bfc3db..258736a4aa4 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp @@ -112,7 +112,7 @@ class spell_koralon_meteor_fists : public AuraScript void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_METEOR_FISTS_DAMAGE, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_METEOR_FISTS_DAMAGE, aurEff); } void Register() override @@ -168,7 +168,7 @@ class spell_flame_warder_meteor_fists : public AuraScript void TriggerFists(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_FW_METEOR_FISTS_DAMAGE, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_FW_METEOR_FISTS_DAMAGE, aurEff); } void Register() override diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 2c7870b4834..1678b4867b5 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -1729,6 +1729,67 @@ class spell_borean_tundra_arcane_prisoner_rescue : public SpellScript } }; +/*###### +## Quest 11896: Weakness to Lightning +######*/ + +enum WeaknessToLightning +{ + SPELL_POWER_OF_THE_STORM = 46424 +}; + +// 46550 - Weakness to Lightning: On Quest Complete +class spell_borean_tundra_weakness_to_lightning_on_quest_complete : public SpellScript +{ + PrepareSpellScript(spell_borean_tundra_weakness_to_lightning_on_quest_complete); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_POWER_OF_THE_STORM }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(SPELL_POWER_OF_THE_STORM); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_borean_tundra_weakness_to_lightning_on_quest_complete::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +/*###### +## Quest 11711: Coward Delivery... Under 30 Minutes or it's Free +######*/ + +// 45958 - Signal Alliance +class spell_borean_tundra_signal_alliance : public SpellScript +{ + PrepareSpellScript(spell_borean_tundra_signal_alliance); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo( + { + uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()), + uint32(spellInfo->GetEffect(EFFECT_1).CalcValue()) + }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (caster->HasAura(uint32(GetEffectInfo(EFFECT_0).CalcValue()))) + caster->CastSpell(caster, uint32(GetEffectValue())); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_borean_tundra_signal_alliance::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + } +}; + void AddSC_borean_tundra() { RegisterCreatureAI(npc_beryl_sorcerer); @@ -1756,4 +1817,6 @@ void AddSC_borean_tundra() RegisterSpellScript(spell_borean_tundra_neural_needle); RegisterSpellScript(spell_borean_tundra_prototype_neural_needle); RegisterSpellScript(spell_borean_tundra_arcane_prisoner_rescue); + RegisterSpellScript(spell_borean_tundra_weakness_to_lightning_on_quest_complete); + RegisterSpellScript(spell_borean_tundra_signal_alliance); } diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index f07d65e94f5..0634794a35e 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -32,6 +32,7 @@ Script Data End */ #include "Player.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "SpellScript.h" #include "WorldSession.h" /******************************************************* @@ -255,8 +256,46 @@ struct npc_minigob_manabonk : public ScriptedAI EventMap events; }; +// 54620 - Teleport Crystal: Teleport to Dalaran AICast Script +class spell_dalaran_teleport_to_dalaran : public SpellScript +{ + PrepareSpellScript(spell_dalaran_teleport_to_dalaran); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + /// @todo: replace this with spell + if (Player* target = GetHitUnit()->ToPlayer()) + target->TeleportTo(571, 5807.75f, 588.063f, 660.939f, 1.64659f); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dalaran_teleport_to_dalaran::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 58622 - Teleport to Lake Wintergrasp +class spell_dalaran_teleport_to_lake_wintergrasp : public SpellScript +{ + PrepareSpellScript(spell_dalaran_teleport_to_lake_wintergrasp); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + /// @todo: replace this with spell + if (Player* target = GetHitUnit()->ToPlayer()) + target->TeleportTo(571, 5386.05f, 2840.97f, 418.675f, 3.14159f); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dalaran_teleport_to_lake_wintergrasp::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_dalaran() { RegisterCreatureAI(npc_mageguard_dalaran); RegisterCreatureAI(npc_minigob_manabonk); + RegisterSpellScript(spell_dalaran_teleport_to_dalaran); + RegisterSpellScript(spell_dalaran_teleport_to_lake_wintergrasp); } diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 18d74441370..537d80d6bb7 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -974,6 +974,96 @@ class spell_dragonblight_corrosive_spit : public AuraScript } }; +/*###### +## Quest 12065, 12066: The Focus on the Beach +######*/ + +enum TheFocusOnTheBeach +{ + SPELL_LEY_LINE_INFORMATION_01 = 47391 +}; + +// 47393 - The Focus on the Beach: Quest Completion Script +class spell_dragonblight_focus_on_the_beach_quest_completion_script : public SpellScript +{ + PrepareSpellScript(spell_dragonblight_focus_on_the_beach_quest_completion_script); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_LEY_LINE_INFORMATION_01 }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->RemoveAurasDueToSpell(SPELL_LEY_LINE_INFORMATION_01); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_dragonblight_focus_on_the_beach_quest_completion_script::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +/*###### +## Quest 12083, 12084: Atop the Woodlands +######*/ + +enum AtopTheWoodlands +{ + SPELL_LEY_LINE_INFORMATION_02 = 47473 +}; + +// 47615 - Atop the Woodlands: Quest Completion Script +class spell_dragonblight_atop_the_woodlands_quest_completion_script : public SpellScript +{ + PrepareSpellScript(spell_dragonblight_atop_the_woodlands_quest_completion_script); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_LEY_LINE_INFORMATION_02 }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->RemoveAurasDueToSpell(SPELL_LEY_LINE_INFORMATION_02); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_dragonblight_atop_the_woodlands_quest_completion_script::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +/*###### +## Quest 12107, 12110: The End of the Line +######*/ + +enum TheEndOfTheLine +{ + SPELL_LEY_LINE_INFORMATION_03 = 47636 +}; + +// 47638 - The End of the Line: Quest Completion Script +class spell_dragonblight_end_of_the_line_quest_completion_script : public SpellScript +{ + PrepareSpellScript(spell_dragonblight_end_of_the_line_quest_completion_script); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_LEY_LINE_INFORMATION_03 }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->RemoveAurasDueToSpell(SPELL_LEY_LINE_INFORMATION_03); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_dragonblight_end_of_the_line_quest_completion_script::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_dragonblight() { RegisterCreatureAI(npc_commander_eligor_dawnbringer); @@ -992,4 +1082,7 @@ void AddSC_dragonblight() RegisterSpellScript(spell_dragonblight_surge_needle_teleporter); RegisterSpellScript(spell_dragonblight_fill_blood_unholy_frost_gem); RegisterSpellScript(spell_dragonblight_corrosive_spit); + RegisterSpellScript(spell_dragonblight_focus_on_the_beach_quest_completion_script); + RegisterSpellScript(spell_dragonblight_atop_the_woodlands_quest_completion_script); + RegisterSpellScript(spell_dragonblight_end_of_the_line_quest_completion_script); } diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 040dae075e1..29153f0ef0a 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -953,6 +953,45 @@ class spell_warhead_fuse : public AuraScript } }; +enum +{ + SPELL_ENVISION_DRAKURU_01 = 47118, + SPELL_ENVISION_DRAKURU_02 = 47150, + SPELL_ENVISION_DRAKURU_03 = 47317, + SPELL_ENVISION_DRAKURU_04 = 47406, + SPELL_ENVISION_DRAKURU_05 = 50440 +}; + +// 47117 - Script Cast Summon Image of Drakuru +// 47149 - Script Cast Summon Image of Drakuru 02 +// 47316 - Script Cast Summon Image of Drakuru 03 +// 47405 - Script Cast Summon Image of Drakuru 04 +// 50439 - Script Cast Summon Image of Drakuru 05 +class spell_grizzly_hills_script_cast_summon_image_of_drakuru : public SpellScript +{ + PrepareSpellScript(spell_grizzly_hills_script_cast_summon_image_of_drakuru); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ _triggeredSpellId }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), _triggeredSpellId); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_grizzly_hills_script_cast_summon_image_of_drakuru::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + + uint32 _triggeredSpellId; + +public: + explicit spell_grizzly_hills_script_cast_summon_image_of_drakuru(uint32 triggeredSpellId) : _triggeredSpellId(triggeredSpellId) { } +}; + void AddSC_grizzly_hills() { RegisterCreatureAI(npc_emily); @@ -970,4 +1009,9 @@ void AddSC_grizzly_hills() RegisterSpellScript(spell_warhead_detonate); RegisterSpellScript(spell_vehicle_warhead_fuse); RegisterSpellScript(spell_warhead_fuse); + RegisterSpellScriptWithArgs(spell_grizzly_hills_script_cast_summon_image_of_drakuru, "spell_grizzly_hills_script_cast_summon_image_of_drakuru_01", SPELL_ENVISION_DRAKURU_01); + RegisterSpellScriptWithArgs(spell_grizzly_hills_script_cast_summon_image_of_drakuru, "spell_grizzly_hills_script_cast_summon_image_of_drakuru_02", SPELL_ENVISION_DRAKURU_02); + RegisterSpellScriptWithArgs(spell_grizzly_hills_script_cast_summon_image_of_drakuru, "spell_grizzly_hills_script_cast_summon_image_of_drakuru_03", SPELL_ENVISION_DRAKURU_03); + RegisterSpellScriptWithArgs(spell_grizzly_hills_script_cast_summon_image_of_drakuru, "spell_grizzly_hills_script_cast_summon_image_of_drakuru_04", SPELL_ENVISION_DRAKURU_04); + RegisterSpellScriptWithArgs(spell_grizzly_hills_script_cast_summon_image_of_drakuru, "spell_grizzly_hills_script_cast_summon_image_of_drakuru_05", SPELL_ENVISION_DRAKURU_05); } diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 0d4481cb673..1e0d24e7717 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -937,6 +937,84 @@ class spell_icecrown_summon_freed_crusader : public SpellScript } }; +/*###### +## Quest 13236, 13395: Army of the Damned +######*/ + +enum ArmyOfTheDamned +{ + SPELL_GIFT_OF_THE_LICH_KING = 58915, + SPELL_CONSUME_MINIONS = 58919 +}; + +// 58916 - Gift of the Lich King +class spell_icecrown_gift_of_the_lich_king : public SpellScript +{ + PrepareSpellScript(spell_icecrown_gift_of_the_lich_king); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_GIFT_OF_THE_LICH_KING }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_GIFT_OF_THE_LICH_KING); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_icecrown_gift_of_the_lich_king::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 58917 - Consume Minions +class spell_icecrown_consume_minions : public SpellScript +{ + PrepareSpellScript(spell_icecrown_consume_minions); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_CONSUME_MINIONS }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_CONSUME_MINIONS); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_icecrown_consume_minions::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +/*###### +## Quest 12995: Leave Our Mark +######*/ + +enum LeaveOurMark +{ + NPC_LEAVE_OUR_MARK_KILL_CREDIT_BUNNY = 30220 +}; + +// 23301 - Ebon Blade Banner +class spell_icecrown_ebon_blade_banner : public SpellScript +{ + PrepareSpellScript(spell_icecrown_ebon_blade_banner); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* caster = GetCaster()->ToPlayer()) + caster->KilledMonsterCredit(NPC_LEAVE_OUR_MARK_KILL_CREDIT_BUNNY); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_icecrown_ebon_blade_banner::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_icecrown() { RegisterCreatureAI(npc_argent_valiant); @@ -951,4 +1029,7 @@ void AddSC_icecrown() RegisterSpellScript(spell_icecrown_through_the_eye_the_eye_of_the_lk); RegisterSpellScript(spell_icecrown_through_the_eye_kill_credit_to_master); RegisterSpellScript(spell_icecrown_summon_freed_crusader); + RegisterSpellScript(spell_icecrown_gift_of_the_lich_king); + RegisterSpellScript(spell_icecrown_consume_minions); + RegisterSpellScript(spell_icecrown_ebon_blade_banner); } diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index f2052873bf5..8011dee62a3 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -1047,31 +1047,6 @@ class spell_player_mount_wyrm : public AuraScript } }; -/*###### -## Quest 12823: A Flawless Plan -######*/ - -// 55693 - Remove Collapsing Cave Aura -class spell_storm_peaks_remove_collapsing_cave_aura : public SpellScript -{ - PrepareSpellScript(spell_storm_peaks_remove_collapsing_cave_aura); - - bool Validate(SpellInfo const* spellInfo) override - { - return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_storm_peaks_remove_collapsing_cave_aura::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } -}; - /*###### ## Quest 12987: Mounting Hodir's Helm ######*/ @@ -1293,7 +1268,6 @@ void AddSC_storm_peaks() RegisterSpellScript(spell_claw_swipe_check); RegisterSpellScript(spell_fatal_strike); RegisterSpellScript(spell_player_mount_wyrm); - RegisterSpellScript(spell_storm_peaks_remove_collapsing_cave_aura); RegisterSpellScript(spell_storm_peaks_read_pronouncement); RegisterSpellScript(spell_storm_peaks_bear_flank_master); RegisterSpellScript(spell_storm_peaks_bear_flank_fail); diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 389ebc14da4..04be09d4f51 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -906,6 +906,153 @@ class spell_zuldrak_chains_of_the_scourge : public SpellScript } }; +/*###### +## Quest 12721: Rampage +######*/ + +enum Rampage +{ + SPELL_RAMPAGE_SUMMON_AKILZON = 52934, + SPELL_RAMPAGE_SUMMON_HALAZZI = 52935, + SPELL_RAMPAGE_SUMMON_JANALAI = 52936, + SPELL_RAMPAGE_SUMMON_NALORAKK = 52937 +}; + +// 52933 - Rampage: Summon Zul'Aman Gods Master +class spell_zuldrak_rampage_summon_zulaman_gods_master : public SpellScript +{ + PrepareSpellScript(spell_zuldrak_rampage_summon_zulaman_gods_master); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_RAMPAGE_SUMMON_AKILZON, + SPELL_RAMPAGE_SUMMON_HALAZZI, + SPELL_RAMPAGE_SUMMON_JANALAI, + SPELL_RAMPAGE_SUMMON_NALORAKK + }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_RAMPAGE_SUMMON_AKILZON); + caster->CastSpell(caster, SPELL_RAMPAGE_SUMMON_HALAZZI); + caster->CastSpell(caster, SPELL_RAMPAGE_SUMMON_JANALAI); + caster->CastSpell(caster, SPELL_RAMPAGE_SUMMON_NALORAKK); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_zuldrak_rampage_summon_zulaman_gods_master::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +/*###### +## Quest 12627: Breaking Through Jin'Alai +######*/ + +enum BreakingThroughJinAlai +{ + SPELL_BREAKING_THROUGH_SUMMON_AKILZON = 51861, + SPELL_BREAKING_THROUGH_SUMMON_JANALAI = 52452, + SPELL_BREAKING_THROUGH_SUMMON_HALAZZI = 52453, + SPELL_BREAKING_THROUGH_SUMMON_NALORAKK = 52454 +}; + +// 51862 - Breaking Through Jin'Alai: Summon Zul'Aman Gods Master +class spell_zuldrak_breaking_through_summon_zulaman_gods_master : public SpellScript +{ + PrepareSpellScript(spell_zuldrak_breaking_through_summon_zulaman_gods_master); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_BREAKING_THROUGH_SUMMON_AKILZON, + SPELL_BREAKING_THROUGH_SUMMON_JANALAI, + SPELL_BREAKING_THROUGH_SUMMON_HALAZZI, + SPELL_BREAKING_THROUGH_SUMMON_NALORAKK + }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_BREAKING_THROUGH_SUMMON_AKILZON); + caster->CastSpell(caster, SPELL_BREAKING_THROUGH_SUMMON_JANALAI); + caster->CastSpell(caster, SPELL_BREAKING_THROUGH_SUMMON_HALAZZI); + caster->CastSpell(caster, SPELL_BREAKING_THROUGH_SUMMON_NALORAKK); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_zuldrak_breaking_through_summon_zulaman_gods_master::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +/*###### +## Quest 12630: Kickin' Nass and Takin' Manes +######*/ + +enum KickinNassAndTakinManes +{ + SPELL_SUMMON_NASS = 51865 +}; + +// 51864 - Player Summon Nass +// 51889 - Quest Accept Summon Nass +class spell_zuldrak_summon_nass : public SpellScript +{ + PrepareSpellScript(spell_zuldrak_summon_nass); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SUMMON_NASS }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUMMON_NASS); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_zuldrak_summon_nass::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +/*###### +## Quest 12730: Convocation at Zol'Heb +######*/ + +enum ConvocationAtZolHeb +{ + SPELL_AKALIS_STUN = 52989 +}; + +// 53010 - Convocation at Zol'Heb: Removef Akali's Stun +class spell_zuldrak_remove_akalis_stun : public SpellScript +{ + PrepareSpellScript(spell_zuldrak_remove_akalis_stun); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_AKALIS_STUN }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(SPELL_AKALIS_STUN); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_zuldrak_remove_akalis_stun::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_zuldrak() { RegisterCreatureAI(npc_released_offspring_harkoa); @@ -925,4 +1072,8 @@ void AddSC_zuldrak() RegisterSpellScript(spell_zuldrak_cocooned_on_quest); RegisterSpellScript(spell_zuldrak_scourgewagon_explosion); RegisterSpellScript(spell_zuldrak_chains_of_the_scourge); + RegisterSpellScript(spell_zuldrak_rampage_summon_zulaman_gods_master); + RegisterSpellScript(spell_zuldrak_breaking_through_summon_zulaman_gods_master); + RegisterSpellScript(spell_zuldrak_summon_nass); + RegisterSpellScript(spell_zuldrak_remove_akalis_stun); } diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp index 5fecee52b14..fdb5e694f66 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp @@ -23,7 +23,7 @@ #include "SpellInfo.h" #include "SpellScript.h" -enum Texts +enum MaladaarTexts { SAY_ROAR = 0, SAY_SOUL_CLEAVE = 1, @@ -33,7 +33,7 @@ enum Texts SAY_DEATH = 5 }; -enum Spells +enum MaladaarSpells { SPELL_SOUL_SCREAM = 32421, SPELL_RIBBON_OF_SOULS = 32422, @@ -57,7 +57,7 @@ enum Spells SPELL_PLAGUE_STRIKE = 58839 }; -enum Events +enum MaladaarEvents { EVENT_SOUL_SCREAM = 1, EVENT_RIBBON_OF_SOULS, @@ -65,7 +65,7 @@ enum Events EVENT_SUMMON_AVATAR }; -enum Misc +enum MaladaarMisc { NPC_DORE = 19412, @@ -93,6 +93,7 @@ enum Misc Position const DoreSpawnPos = { -4.40722f, -387.277f, 40.6294f, 6.26573f }; +// 18373 - Exarch Maladaar struct boss_exarch_maladaar : public BossAI { boss_exarch_maladaar(Creature* creature) : BossAI(creature, DATA_EXARCH_MALADAAR), _avatarSummoned(false) { } @@ -123,9 +124,19 @@ struct boss_exarch_maladaar : public BossAI void OnSpellCast(SpellInfo const* spell) override { - if (spell->Id == SPELL_STOLEN_SOUL) - if (roll_chance_i(25)) - Talk(SAY_SOUL_CLEAVE); + switch (spell->Id) + { + case SPELL_STOLEN_SOUL: + if (roll_chance_i(25)) + Talk(SAY_SOUL_CLEAVE); + break; + case SPELL_SOUL_SCREAM: + if (roll_chance_i(25)) + Talk(SAY_ROAR); + break; + default: + break; + } } void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override @@ -164,8 +175,6 @@ struct boss_exarch_maladaar : public BossAI switch (eventId) { case EVENT_SOUL_SCREAM: - if (roll_chance_i(25)) - Talk(SAY_ROAR); DoCastSelf(SPELL_SOUL_SCREAM); events.Repeat(RAND(15s, 20s)); break; @@ -197,6 +206,7 @@ struct boss_exarch_maladaar : public BossAI bool _avatarSummoned; }; +// 18441 - Stolen Soul struct npc_stolen_soul : public ScriptedAI { npc_stolen_soul(Creature* creature) : ScriptedAI(creature), _summonerClass(CLASS_NONE) { } diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp index 14458a22ce0..375e9ad682c 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp @@ -15,184 +15,197 @@ * with this program. If not, see . */ -/* ScriptData -Name: Boss_Shirrak_the_dead_watcher -%Complete: 80 -Comment: InhibitMagic should stack slower far from the boss, proper Visual for Focus Fire, heroic implemented -Category: Auchindoun, Auchenai Crypts -EndScriptData */ - +#include "ScriptedCreature.h" #include "ScriptMgr.h" +#include "Spell.h" +#include "SpellScript.h" +#include "SpellInfo.h" #include "auchenai_crypts.h" -#include "Map.h" -#include "ObjectAccessor.h" -#include "Player.h" -#include "ScriptedCreature.h" -enum Spells +enum ShirrakTexts { - SPELL_INHIBITMAGIC = 32264, - SPELL_ATTRACTMAGIC = 32265, - SPELL_CARNIVOROUSBITE = 36383, - - SPELL_FIERY_BLAST = 32302, - - SPELL_FOCUS_FIRE_VISUAL = 42075 //need to find better visual + EMOTE_FOCUSED = 0 }; -enum Say +enum ShirrakSpells { - EMOTE_FOCUSED = 0 + SPELL_INHIBIT_MAGIC_PERIODIC = 33460, + SPELL_INHIBIT_MAGIC = 32264, + + SPELL_ATTRACT_MAGIC = 32265, + SPELL_CARNIVOROUS_BITE = 36383, + SPELL_FOCUS_FIRE_AURA = 32291, + + SPELL_BIRTH = 26262, + SPELL_FOCUS_TARGET_VISUAL = 32286, + SPELL_FIERY_BLAST = 32302, + + SPELL_FOCUS_FIRE_DUMMY = 32300, + SPELL_PING_SHIRRAK = 32301 }; -enum Creatures +enum ShirrakEvents { - NPC_FOCUS_FIRE = 18374 + EVENT_ATTRACT_MAGIC = 1, + EVENT_CARNIVOROUS_BITE, + EVENT_FOCUS_FIRE }; +// 18371 - Shirrak the Dead Watcher struct boss_shirrak_the_dead_watcher : public BossAI { - boss_shirrak_the_dead_watcher(Creature* creature) : BossAI(creature, DATA_SHIRRAK_THE_DEAD_WATCHER) - { - Initialize(); - } - - void Initialize() - { - Inhibitmagic_Timer = 0; - Attractmagic_Timer = 28000; - Carnivorousbite_Timer = 10000; - FocusFire_Timer = 17000; - FocusedTargetGUID.Clear(); - } - - uint32 Inhibitmagic_Timer; - uint32 Attractmagic_Timer; - uint32 Carnivorousbite_Timer; - uint32 FocusFire_Timer; - - ObjectGuid FocusedTargetGUID; + boss_shirrak_the_dead_watcher(Creature* creature) : BossAI(creature, DATA_SHIRRAK_THE_DEAD_WATCHER) { } void Reset() override { - Initialize(); + DoCastSelf(SPELL_INHIBIT_MAGIC_PERIODIC); _Reset(); } - void JustSummoned(Creature* summoned) override + void JustEngagedWith(Unit* who) override { - if (summoned && summoned->GetEntry() == NPC_FOCUS_FIRE) - { - summoned->CastSpell(summoned, SPELL_FOCUS_FIRE_VISUAL, false); - summoned->SetFaction(me->GetFaction()); - summoned->SetLevel(me->GetLevel()); - summoned->AddUnitState(UNIT_STATE_ROOT); - - if (Unit* pFocusedTarget = ObjectAccessor::GetUnit(*me, FocusedTargetGUID)) - summoned->AI()->AttackStart(pFocusedTarget); - } - BossAI::JustSummoned(summoned); + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_ATTRACT_MAGIC, 30s); + events.ScheduleEvent(EVENT_CARNIVOROUS_BITE, 5s, 10s); + events.ScheduleEvent(EVENT_FOCUS_FIRE, 20s, 30s); } void UpdateAI(uint32 diff) override { - //Inhibitmagic_Timer - if (Inhibitmagic_Timer <= diff) - { - float dist; - Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (Player* i_pl = i->GetSource()) - if (i_pl->IsAlive() && (dist = i_pl->GetDistance(me)) < 45) - { - i_pl->RemoveAurasDueToSpell(SPELL_INHIBITMAGIC); - me->AddAura(SPELL_INHIBITMAGIC, i_pl); - if (dist < 35) - me->AddAura(SPELL_INHIBITMAGIC, i_pl); - if (dist < 25) - me->AddAura(SPELL_INHIBITMAGIC, i_pl); - if (dist < 15) - me->AddAura(SPELL_INHIBITMAGIC, i_pl); - } - Inhibitmagic_Timer = 3000 + (rand32() % 1000); - } else Inhibitmagic_Timer -= diff; - - //Return since we have no target if (!UpdateVictim()) return; - //Attractmagic_Timer - if (Attractmagic_Timer <= diff) - { - DoCast(me, SPELL_ATTRACTMAGIC); - Attractmagic_Timer = 30000; - Carnivorousbite_Timer = 1500; - } else Attractmagic_Timer -= diff; + events.Update(diff); - //Carnivorousbite_Timer - if (Carnivorousbite_Timer <= diff) - { - DoCast(me, SPELL_CARNIVOROUSBITE); - Carnivorousbite_Timer = 10000; - } else Carnivorousbite_Timer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - //FocusFire_Timer - if (FocusFire_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - // Summon Focus Fire & Emote - Unit* target = SelectTarget(SelectTargetMethod::Random, 1); - if (target && target->GetTypeId() == TYPEID_PLAYER && target->IsAlive()) + switch (eventId) { - FocusedTargetGUID = target->GetGUID(); - me->SummonCreature(NPC_FOCUS_FIRE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 5500ms); - Talk(EMOTE_FOCUSED, target); + case EVENT_ATTRACT_MAGIC: + DoCastSelf(SPELL_ATTRACT_MAGIC); + events.Repeat(30s); + break; + case EVENT_CARNIVOROUS_BITE: + DoCastSelf(SPELL_CARNIVOROUS_BITE); + events.Repeat(5s, 10s); + break; + case EVENT_FOCUS_FIRE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 50, true)) + { + DoCast(target, SPELL_FOCUS_FIRE_AURA); + Talk(EMOTE_FOCUSED, target); + } + events.Repeat(15s, 25s); + break; + default: + break; } - FocusFire_Timer = 15000 + (rand32() % 5000); - } else FocusFire_Timer -= diff; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } DoMeleeAttackIfReady(); } }; +// 18374 - Focus Fire struct npc_focus_fire : public ScriptedAI { - npc_focus_fire(Creature* creature) : ScriptedAI(creature) + npc_focus_fire(Creature* creature) : ScriptedAI(creature) { } + + void InitializeAI() override { - Initialize(); + me->SetReactState(REACT_PASSIVE); } - void Initialize() + void JustAppeared() override { - FieryBlast_Timer = 3000 + (rand32() % 1000); - fiery1 = fiery2 = true; - } + // Should be in this sniffed order but makes it ignore other spell casts, so disabled + // DoCastSelf(SPELL_BIRTH); + DoCastSelf(SPELL_FOCUS_TARGET_VISUAL); - uint32 FieryBlast_Timer; - bool fiery1, fiery2; + _scheduler.Schedule(5s, [this](TaskContext /*task*/) + { + DoCastSelf(SPELL_PING_SHIRRAK); + }); + } - void Reset() override + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override { - Initialize(); + if (spellInfo->Id == SPELL_FOCUS_FIRE_DUMMY) + DoCastSelf(SPELL_FIERY_BLAST); } void UpdateAI(uint32 diff) override { - //Return since we have no target - if (!UpdateVictim()) + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 32301 - Ping Shirrak +class spell_shirrak_ping_shirrak : public SpellScript +{ + PrepareSpellScript(spell_shirrak_ping_shirrak); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FOCUS_FIRE_DUMMY }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetCaster(), SPELL_FOCUS_FIRE_DUMMY); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_shirrak_ping_shirrak::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 32264 - Inhibit Magic +class spell_shirrak_inhibit_magic : public SpellScript +{ + PrepareSpellScript(spell_shirrak_inhibit_magic); + + void RemoveOldAura(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Id); + } + + void TriggerNext() + { + int32 castIndex = GetCastIndex(); + if (castIndex >= 3) return; - //FieryBlast_Timer - if (fiery2 && FieryBlast_Timer <= diff) - { - DoCast(me, SPELL_FIERY_BLAST); + float radiusMod = GetSpellValue()->RadiusMod * 0.66f; + + GetCaster()->CastSpell(nullptr, GetSpellInfo()->Id, CastSpellExtraArgs() + .SetTriggerFlags(TRIGGERED_FULL_MASK) + .AddSpellMod(SPELLVALUE_BASE_POINT1, castIndex + 1) + .AddSpellMod(SPELLVALUE_RADIUS_MOD, int32(radiusMod * 10000))); + } - if (fiery1) fiery1 = false; - else if (fiery2) fiery2 = false; + int32 GetCastIndex() const + { + // we are storing number of casts in a non-effect SPELLVALUE_BASE_POINT1 + return GetSpellValue()->EffectBasePoints[EFFECT_1]; + } - FieryBlast_Timer = 1000; - } else FieryBlast_Timer -= diff; + void Register() override + { + if (!GetSpell() || GetCastIndex() == 0) + OnEffectLaunchTarget += SpellEffectFn(spell_shirrak_inhibit_magic::RemoveOldAura, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - DoMeleeAttackIfReady(); + AfterCast += SpellCastFn(spell_shirrak_inhibit_magic::TriggerNext); } }; @@ -200,4 +213,6 @@ void AddSC_boss_shirrak_the_dead_watcher() { RegisterAuchenaiCryptsCreatureAI(boss_shirrak_the_dead_watcher); RegisterAuchenaiCryptsCreatureAI(npc_focus_fire); + RegisterSpellScript(spell_shirrak_ping_shirrak); + RegisterSpellScript(spell_shirrak_inhibit_magic); } diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.cpp new file mode 100644 index 00000000000..c52b5a398a7 --- /dev/null +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.cpp @@ -0,0 +1,58 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 . + */ + +#include "ScriptMgr.h" +#include "SpellScript.h" +#include "Unit.h" + +enum +{ + SPELL_SUMMON_ARCANE_FIEND_1 = 32349, + SPELL_SUMMON_ARCANE_FIEND_2 = 32353 +}; + +// 32348 - Summon Arcane Fiends +class spell_mana_tombs_summon_arcane_fiends : public SpellScript +{ + PrepareSpellScript(spell_mana_tombs_summon_arcane_fiends); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_SUMMON_ARCANE_FIEND_1, + SPELL_SUMMON_ARCANE_FIEND_2 + }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_SUMMON_ARCANE_FIEND_1); + caster->CastSpell(caster, SPELL_SUMMON_ARCANE_FIEND_2); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_mana_tombs_summon_arcane_fiends::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +void AddSC_mana_tombs() +{ + RegisterSpellScript(spell_mana_tombs_summon_arcane_fiends); +} diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp index db3559a32de..b380d9b2cbb 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp @@ -15,38 +15,37 @@ * with this program. If not, see . */ -/* -Name: Boss_Anzu -%Complete: 80% -Comment: -Category: Auchindoun, Sethekk Halls -*/ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "sethekk_halls.h" -enum Says +enum AnzuTexts { SAY_SUMMON_BROOD = 0, SAY_SPELL_BOMB = 1 }; -enum Spells +enum AnzuSpells { SPELL_PARALYZING_SCREECH = 40184, SPELL_SPELL_BOMB = 40303, SPELL_CYCLONE_OF_FEATHERS = 40321, - SPELL_BANISH_SELF = 42354, - SPELL_FLESH_RIP = 40199 + SPELL_BANISH_SELF = 42354 }; -enum Events +enum AnzuEvents { EVENT_PARALYZING_SCREECH = 1, - EVENT_SPELL_BOMB = 2, - EVENT_CYCLONE_OF_FEATHERS = 3, - EVENT_SUMMON = 4 + EVENT_SPELL_BOMB, + EVENT_CYCLONE_OF_FEATHERS, + EVENT_SUMMON +}; + +enum AnzuPhases : uint8 +{ + PHASE_NONE = 0, + PHASE_HEALTH_66, + PHASE_HEALTH_33 }; Position const PosSummonBrood[7] = @@ -60,24 +59,16 @@ Position const PosSummonBrood[7] = { -81.70527f, 280.8776f, 44.58830f, 0.526849f } }; +// 23035 - Anzu struct boss_anzu : public BossAI { - boss_anzu(Creature* creature) : BossAI(creature, DATA_ANZU) - { - Initialize(); - } - - void Initialize() - { - _under33Percent = false; - _under66Percent = false; - } + boss_anzu(Creature* creature) : BossAI(creature, DATA_ANZU), _phase(PHASE_NONE) { } void Reset() override { //_Reset(); events.Reset(); - Initialize(); + _phase = PHASE_NONE; } void JustEngagedWith(Unit* who) override @@ -87,23 +78,18 @@ struct boss_anzu : public BossAI events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 5s); } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - } - void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override { - if (me->HealthBelowPctDamaged(33, damage) && !_under33Percent) + if (_phase < PHASE_HEALTH_66 && me->HealthBelowPctDamaged(66, damage)) { - _under33Percent = true; + _phase++; Talk(SAY_SUMMON_BROOD); events.ScheduleEvent(EVENT_SUMMON, 3s); } - if (me->HealthBelowPctDamaged(66, damage) && !_under66Percent) + if (_phase < PHASE_HEALTH_33 && me->HealthBelowPctDamaged(33, damage)) { - _under66Percent = true; + _phase++; Talk(SAY_SUMMON_BROOD); events.ScheduleEvent(EVENT_SUMMON, 3s); } @@ -122,19 +108,19 @@ struct boss_anzu : public BossAI { case EVENT_PARALYZING_SCREECH: DoCastVictim(SPELL_PARALYZING_SCREECH); - events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 25s); + events.Repeat(25s); break; case EVENT_CYCLONE_OF_FEATHERS: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) DoCast(target, SPELL_CYCLONE_OF_FEATHERS); - events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 21s); + events.Repeat(21s); break; case EVENT_SUMMON: // TODO: Add pathing for Brood of Anzu for (uint8 i = 0; i < 7; i++) me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46s); - DoCast(me, SPELL_BANISH_SELF); + DoCastSelf(SPELL_BANISH_SELF); events.ScheduleEvent(EVENT_SPELL_BOMB, 12s); break; case EVENT_SPELL_BOMB: @@ -155,9 +141,8 @@ struct boss_anzu : public BossAI DoMeleeAttackIfReady(); } - private: - bool _under33Percent; - bool _under66Percent; +private: + uint8 _phase; }; void AddSC_boss_anzu() diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp index 0206f61eba0..ba1dbdc87ed 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp @@ -15,18 +15,13 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Darkweaver_Syth -SD%Complete: 85 -SDComment: Shock spells/times need more work. Heroic partly implemented. -SDCategory: Auchindoun, Sethekk Halls -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellInfo.h" #include "sethekk_halls.h" -enum Says +enum SythTexts { SAY_SUMMON = 0, SAY_AGGRO = 1, @@ -34,59 +29,56 @@ enum Says SAY_DEATH = 3 }; -enum Spells +enum SythSpells { - SPELL_FROST_SHOCK = 21401, //37865 + SPELL_FROST_SHOCK = 21401, SPELL_FLAME_SHOCK = 34354, SPELL_SHADOW_SHOCK = 30138, SPELL_ARCANE_SHOCK = 37132, - SPELL_CHAIN_LIGHTNING = 15659, //15305 + SPELL_CHAIN_LIGHTNING = 15659, - SPELL_SUMMON_SYTH_FIRE = 33537, // Spawns 19203 - SPELL_SUMMON_SYTH_ARCANE = 33538, // Spawns 19205 - SPELL_SUMMON_SYTH_FROST = 33539, // Spawns 19204 - SPELL_SUMMON_SYTH_SHADOW = 33540, // Spawns 19206 + SPELL_SUMMON_ELEMENTALS = 33595, - SPELL_FLAME_BUFFET = 33526, - SPELL_ARCANE_BUFFET = 33527, - SPELL_FROST_BUFFET = 33528, - SPELL_SHADOW_BUFFET = 33529 + SPELL_SUMMON_SYTH_FIRE = 33537, + SPELL_SUMMON_SYTH_ARCANE = 33538, + SPELL_SUMMON_SYTH_FROST = 33539, + SPELL_SUMMON_SYTH_SHADOW = 33540 }; -enum Events +enum SythEvents { EVENT_FLAME_SHOCK = 1, - EVENT_ARCANE_SHOCK = 2, - EVENT_FROST_SHOCK = 3, - EVENT_SHADOW_SHOCK = 4, - EVENT_CHAIN_LIGHTNING = 5 + EVENT_ARCANE_SHOCK, + EVENT_FROST_SHOCK, + EVENT_SHADOW_SHOCK, + EVENT_CHAIN_LIGHTNING, + EVENT_SUMMON }; -enum Lakka +enum SythMisc { - NPC_LAKKA = 18956, - SAY_LAKKA_FREE = 1 + NPC_LAKKA = 18956, + SAY_LAKKA_FREE = 1 }; -struct boss_darkweaver_syth : public BossAI +enum SythPhases : uint8 { - boss_darkweaver_syth(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH) - { - Initialize(); - } + PHASE_NONE = 0, + PHASE_HEALTH_90, + PHASE_HEALTH_55, + PHASE_HEALTH_10 +}; - void Initialize() - { - _summon90 = false; - _summon50 = false; - _summon10 = false; - } +// 18472 - Darkweaver Syth +struct boss_darkweaver_syth : public BossAI +{ + boss_darkweaver_syth(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH), _phase(PHASE_NONE) { } void Reset() override { - Initialize(); _Reset(); + _phase = PHASE_NONE; } void JustEngagedWith(Unit* who) override @@ -96,7 +88,7 @@ struct boss_darkweaver_syth : public BossAI events.ScheduleEvent(EVENT_ARCANE_SHOCK, 4s); events.ScheduleEvent(EVENT_FROST_SHOCK, 6s); events.ScheduleEvent(EVENT_SHADOW_SHOCK, 8s); - events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 15s); + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 10s, 15s); Talk(SAY_AGGRO); } @@ -124,81 +116,102 @@ struct boss_darkweaver_syth : public BossAI summons.Summon(summoned); } + void OnSpellCast(SpellInfo const* spell) override + { + if (spell->Id == SPELL_SUMMON_ELEMENTALS) + Talk(SAY_SUMMON); + } + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override { - if (me->HealthBelowPctDamaged(90, damage) && !_summon90) + if (_phase < PHASE_HEALTH_90 && me->HealthBelowPctDamaged(90, damage)) { - SythSummoning(); - _summon90 = true; + _phase++; + events.ScheduleEvent(EVENT_SUMMON, 0s); } - if (me->HealthBelowPctDamaged(50, damage) && !_summon50) + if (_phase < PHASE_HEALTH_55 && me->HealthBelowPctDamaged(55, damage)) { - SythSummoning(); - _summon50 = true; + _phase++; + events.ScheduleEvent(EVENT_SUMMON, 0s); } - if (me->HealthBelowPctDamaged(10, damage) && !_summon10) + if (_phase < PHASE_HEALTH_10 && me->HealthBelowPctDamaged(10, damage)) { - SythSummoning(); - _summon10 = true; + _phase++; + events.ScheduleEvent(EVENT_SUMMON, 0s); } } - void SythSummoning() - { - Talk(SAY_SUMMON); - - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(false); - - DoCast(me, SPELL_SUMMON_SYTH_ARCANE, true); //front - DoCast(me, SPELL_SUMMON_SYTH_FIRE, true); //back - DoCast(me, SPELL_SUMMON_SYTH_FROST, true); //left - DoCast(me, SPELL_SUMMON_SYTH_SHADOW, true); //right - } - void ExecuteEvent(uint32 eventId) override { switch (eventId) { case EVENT_FLAME_SHOCK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_FLAME_SHOCK); - events.ScheduleEvent(EVENT_FLAME_SHOCK, 10s, 15s); + DoCastVictim(SPELL_FLAME_SHOCK); + events.Repeat(10s, 15s); break; case EVENT_ARCANE_SHOCK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_ARCANE_SHOCK); - events.ScheduleEvent(EVENT_ARCANE_SHOCK, 10s, 15s); + DoCastVictim(SPELL_ARCANE_SHOCK); + events.Repeat(10s, 15s); break; case EVENT_FROST_SHOCK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_FROST_SHOCK); - events.ScheduleEvent(EVENT_FROST_SHOCK, 10s, 15s); + DoCastVictim(SPELL_FROST_SHOCK); + events.Repeat(10s, 15s); break; case EVENT_SHADOW_SHOCK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_SHADOW_SHOCK); - events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s); + DoCastVictim(SPELL_SHADOW_SHOCK); + events.Repeat(10s, 15s); break; case EVENT_CHAIN_LIGHTNING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_CHAIN_LIGHTNING); - events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25s); + DoCastVictim(SPELL_CHAIN_LIGHTNING); + events.Repeat(25s); + break; + case EVENT_SUMMON: + DoCastSelf(SPELL_SUMMON_ELEMENTALS); break; default: break; } } - private: - bool _summon90; - bool _summon50; - bool _summon10; +private: + uint8 _phase; +}; + +// 33595 - Summon Elementals +class spell_darkweaver_syth_summon_elementals : public SpellScript +{ + PrepareSpellScript(spell_darkweaver_syth_summon_elementals); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_SUMMON_SYTH_ARCANE, + SPELL_SUMMON_SYTH_FIRE, + SPELL_SUMMON_SYTH_FROST, + SPELL_SUMMON_SYTH_SHADOW + }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_SUMMON_SYTH_ARCANE, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD); + caster->CastSpell(caster, SPELL_SUMMON_SYTH_FIRE, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD); + caster->CastSpell(caster, SPELL_SUMMON_SYTH_FROST, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD); + caster->CastSpell(caster, SPELL_SUMMON_SYTH_SHADOW, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_darkweaver_syth_summon_elementals::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; void AddSC_boss_darkweaver_syth() { RegisterSethekkHallsCreatureAI(boss_darkweaver_syth); + RegisterSpellScript(spell_darkweaver_syth_summon_elementals); } diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp index 06b5676e72e..1f53f1c02a6 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp @@ -21,7 +21,7 @@ #include "SpellScript.h" #include "sethekk_halls.h" -enum Says +enum IkissTexts { SAY_INTRO = 0, SAY_AGGRO = 1, @@ -30,7 +30,7 @@ enum Says EMOTE_ARCANE_EXPLOSION = 4 }; -enum Spells +enum IkissSpells { SPELL_BLINK = 38194, SPELL_BLINK_TELEPORT = 38203, @@ -42,7 +42,7 @@ enum Spells SPELL_ARCANE_EXPLOSION = 38197, }; -enum Events +enum IkissEvents { EVENT_POLYMORPH = 1, EVENT_BLINK, @@ -51,26 +51,23 @@ enum Events EVENT_ARCANE_EXPLOSION }; +// 18473 - Talon King Ikiss struct boss_talon_king_ikiss : public BossAI { - boss_talon_king_ikiss(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS) - { - Intro = false; - ManaShield = false; - } + boss_talon_king_ikiss(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS), _introDone(false), _manaShieldTriggered(false) { } void Reset() override { _Reset(); - Intro = false; - ManaShield = false; + _introDone = false; + _manaShieldTriggered = false; } void MoveInLineOfSight(Unit* who) override { - if (!Intro && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f)) + if (!_introDone && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f)) { - Intro = true; + _introDone = true; Talk(SAY_INTRO); } @@ -88,6 +85,27 @@ struct boss_talon_king_ikiss : public BossAI events.ScheduleEvent(EVENT_SLOW, 15s, 30s); } + void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (!_manaShieldTriggered && me->HealthBelowPctDamaged(20, damage)) + { + DoCastSelf(SPELL_MANA_SHIELD); + _manaShieldTriggered = true; + } + } + + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + void ExecuteEvent(uint32 eventId) override { switch (eventId) @@ -98,57 +116,34 @@ struct boss_talon_king_ikiss : public BossAI DoCast(SelectTarget(SelectTargetMethod::Random, 0), SPELL_POLYMORPH); else DoCast(SelectTarget(SelectTargetMethod::MaxThreat, 1), SPELL_POLYMORPH); - events.ScheduleEvent(EVENT_POLYMORPH, 15s, 17500ms); + events.Repeat(15s, 17500ms); break; case EVENT_ARCANE_VOLLEY: - DoCast(me, SPELL_ARCANE_VOLLEY); - events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 7s, 12s); + DoCastSelf(SPELL_ARCANE_VOLLEY); + events.Repeat(7s, 12s); break; case EVENT_SLOW: - DoCast(me, SPELL_SLOW); - events.ScheduleEvent(EVENT_SLOW, 15s, 40s); + DoCastSelf(SPELL_SLOW); + events.Repeat(15s, 40s); break; case EVENT_BLINK: - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(false); Talk(EMOTE_ARCANE_EXPLOSION); DoCastAOE(SPELL_BLINK); events.ScheduleEvent(EVENT_BLINK, 35s, 40s); events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 1s); break; case EVENT_ARCANE_EXPLOSION: - DoCast(me, SPELL_ARCANE_EXPLOSION); - DoCast(me, SPELL_ARCANE_BUBBLE, true); + DoCastSelf(SPELL_ARCANE_EXPLOSION); + DoCastSelf(SPELL_ARCANE_BUBBLE, true); break; default: break; } } - void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override - { - if (!ManaShield && me->HealthBelowPctDamaged(20, damage)) - { - DoCast(me, SPELL_MANA_SHIELD); - ManaShield = true; - } - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } - - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - private: - bool ManaShield; - bool Intro; +private: + bool _introDone; + bool _manaShieldTriggered; }; // 38194 - Blink diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 952fa800a05..1255bfc4dbd 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1952,8 +1952,8 @@ class spell_illidan_parasitic_shadowfiend_proc : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - Unit* target = eventInfo.GetProcTarget(); - return target && !target->HasAura(SPELL_PARASITIC_SHADOWFIEND) && !target->HasAura(SPELL_PARASITIC_SHADOWFIEND_2); + Unit* target = eventInfo.GetActionTarget(); + return !target->HasAura(SPELL_PARASITIC_SHADOWFIEND) && !target->HasAura(SPELL_PARASITIC_SHADOWFIEND_2); } void Register() override @@ -2062,7 +2062,7 @@ class spell_illidan_return_glaives : public SpellScript void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - GetHitUnit()->SendPlaySpellVisual(SPELL_GLAIVE_VISUAL_KIT); + GetHitUnit()->SendPlaySpellVisualKit(SPELL_GLAIVE_VISUAL_KIT, 0); if (Creature* caster = GetCaster()->ToCreature()) caster->DespawnOrUnsummon(); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp index ce61bc7e4bc..da6666a59a7 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp @@ -15,172 +15,123 @@ * with this program. If not, see . */ +/* Timers requires update */ + #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "steam_vault.h" -enum Yells +enum ThespiaTexts { SAY_SUMMON = 0, SAY_AGGRO = 1, SAY_SLAY = 2, - SAY_DEAD = 3, + SAY_DEATH = 3 }; -enum Spells +enum ThespiaSpells { SPELL_LIGHTNING_CLOUD = 25033, SPELL_LUNG_BURST = 31481, - SPELL_ENVELOPING_WINDS = 31718 + SPELL_ENVELOPING_WINDS = 31718, + + SPELL_WATER_BOLT_VOLLEY = 34449 }; -enum Events +enum ThespiaEvents { EVENT_LIGHTNING_CLOUD = 1, EVENT_LUNG_BURST, EVENT_ENVELOPING_WINDS }; -class boss_hydromancer_thespia : public CreatureScript +// 17797 - Hydromancer Thespia +struct boss_hydromancer_thespia : public BossAI { - public: - boss_hydromancer_thespia() : CreatureScript("boss_hydromancer_thespia") { } - - struct boss_thespiaAI : public BossAI + boss_hydromancer_thespia(Creature* creature) : BossAI(creature, DATA_HYDROMANCER_THESPIA) { } + + void JustEngagedWith(Unit* who) override + { + Talk(SAY_AGGRO); + BossAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_LIGHTNING_CLOUD, 10s, 15s); + events.ScheduleEvent(EVENT_LUNG_BURST, 7s, 12s); + events.ScheduleEvent(EVENT_ENVELOPING_WINDS, 10s, 15s); + } + + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + } + + void ExecuteEvent(uint32 eventId) override + { + switch (eventId) { - boss_thespiaAI(Creature* creature) : BossAI(creature, DATA_HYDROMANCER_THESPIA) { } - - void Reset() override - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEAD); - _JustDied(); - } - - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustEngagedWith(Unit* who) override - { - Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_LIGHTNING_CLOUD, 15s); - events.ScheduleEvent(EVENT_LUNG_BURST, 7s); - events.ScheduleEvent(EVENT_ENVELOPING_WINDS, 9s); - } - - void ExecuteEvent(uint32 eventId) override - { - switch (eventId) - { - case EVENT_LIGHTNING_CLOUD: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) - DoCast(target, SPELL_LIGHTNING_CLOUD); - // cast twice in Heroic mode - if (IsHeroic()) - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) - DoCast(target, SPELL_LIGHTNING_CLOUD); - - events.ScheduleEvent(EVENT_LIGHTNING_CLOUD, 15s, 25s); - break; - case EVENT_LUNG_BURST: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) - DoCast(target, SPELL_LUNG_BURST); - events.ScheduleEvent(EVENT_LUNG_BURST, 7s, 12s); - break; - case EVENT_ENVELOPING_WINDS: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f, true)) - DoCast(target, SPELL_ENVELOPING_WINDS); - // cast twice in Heroic mode - if (IsHeroic()) - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f, true)) - DoCast(target, SPELL_ENVELOPING_WINDS); - - events.ScheduleEvent(EVENT_ENVELOPING_WINDS, 10s, 15s); - break; - default: - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetSteamVaultAI(creature); + case EVENT_LIGHTNING_CLOUD: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) + DoCast(target, SPELL_LIGHTNING_CLOUD); + events.Repeat(15s, 25s); + break; + case EVENT_LUNG_BURST: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) + DoCast(target, SPELL_LUNG_BURST); + events.Repeat(7s, 12s); + break; + case EVENT_ENVELOPING_WINDS: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f, true)) + DoCast(target, SPELL_ENVELOPING_WINDS); + events.Repeat(10s, 15s); + break; + default: + break; } + } }; -enum CoilfangWaterElemental +// 17917 - Coilfang Water Elemental +struct npc_coilfang_waterelemental : public ScriptedAI { - EVENT_WATER_BOLT_VOLLEY = 1, - SPELL_WATER_BOLT_VOLLEY = 34449 -}; + npc_coilfang_waterelemental(Creature* creature) : ScriptedAI(creature) { } -class npc_coilfang_waterelemental : public CreatureScript -{ - public: - npc_coilfang_waterelemental() : CreatureScript("npc_coilfang_waterelemental") { } + void Reset() override + { + _scheduler.CancelAll(); + } - struct npc_coilfang_waterelementalAI : public ScriptedAI - { - npc_coilfang_waterelementalAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - _events.Reset(); - } - - void JustEngagedWith(Unit* /*who*/) override - { - _events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, 3s, 6s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_WATER_BOLT_VOLLEY: - DoCast(me, SPELL_WATER_BOLT_VOLLEY); - _events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, 7s, 12s); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* /*who*/) override + { + _scheduler.Schedule(4s, 12s, [this](TaskContext task) { - return GetSteamVaultAI(creature); - } + DoCastSelf(SPELL_WATER_BOLT_VOLLEY); + task.Repeat(8s, 15s); + }); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _scheduler.Update(diff); + + DoMeleeAttackIfReady(); + } + +private: + TaskScheduler _scheduler; }; void AddSC_boss_hydromancer_thespia() { - new boss_hydromancer_thespia(); - new npc_coilfang_waterelemental(); + RegisterSteamVaultCreatureAI(boss_hydromancer_thespia); + RegisterSteamVaultCreatureAI(npc_coilfang_waterelemental); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp index c28fab71823..dbd8522c400 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp @@ -15,19 +15,16 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Mekgineer_Steamrigger -SD%Complete: 60 -SDComment: Mechanics' interrrupt heal doesn't work very well, also a proper movement needs to be implemented -> summon further away and move towards target to repair. -SDCategory: Coilfang Resevoir, The Steamvault -EndScriptData */ +/* Timers requires update */ #include "ScriptMgr.h" -#include "InstanceScript.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "InstanceScript.h" +#include "MotionMaster.h" #include "steam_vault.h" -enum Yells +enum SteamriggerTexts { SAY_MECHANICS = 0, SAY_AGGRO = 1, @@ -35,244 +32,237 @@ enum Yells SAY_DEATH = 3 }; -enum Spells +enum SteamriggerSpells { SPELL_SUPER_SHRINK_RAY = 31485, SPELL_SAW_BLADE = 31486, SPELL_ELECTRIFIED_NET = 35107, + SPELL_SUMMON_GNOME_1 = 31528, + SPELL_SUMMON_GNOME_2 = 31529, + SPELL_SUMMON_GNOME_3 = 31530, + SPELL_SUMMON_GNOMES = 31531, + SPELL_DISPEL_MAGIC = 17201, - SPELL_REPAIR = 31532, - H_SPELL_REPAIR = 37936 + SPELL_REPAIR = 31532 +}; + +enum SteamriggerEvents +{ + EVENT_SHRINK = 1, + EVENT_SAW_BLADE, + EVENT_ELECTRIFIED_NET, + EVENT_SUMMON, + EVENT_SUMMON_H }; -enum Creatures +enum SteamriggerMisc { - NPC_STREAMRIGGER_MECHANIC = 17951 + POINT_REPAIR = 1 }; -class boss_mekgineer_steamrigger : public CreatureScript +enum SteamriggerPhases : uint8 { -public: - boss_mekgineer_steamrigger() : CreatureScript("boss_mekgineer_steamrigger") { } + PHASE_NONE = 0, + PHASE_HEALTH_75, + PHASE_HEALTH_50, + PHASE_HEALTH_25 +}; - CreatureAI* GetAI(Creature* creature) const override +// 17796 - Mekgineer Steamrigger +struct boss_mekgineer_steamrigger : public BossAI +{ + boss_mekgineer_steamrigger(Creature* creature) : BossAI(creature, DATA_MEKGINEER_STEAMRIGGER), _phase(PHASE_NONE) { } + + void Reset() override { - return GetSteamVaultAI(creature); + _Reset(); + _phase = PHASE_NONE; } - struct boss_mekgineer_steamriggerAI : public ScriptedAI + void JustEngagedWith(Unit* who) override { - boss_mekgineer_steamriggerAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - Shrink_Timer = 20000; - Saw_Blade_Timer = 15000; - Electrified_Net_Timer = 10000; - - Summon75 = false; - Summon50 = false; - Summon25 = false; - } - - InstanceScript* instance; + Talk(SAY_AGGRO); + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_SHRINK, 20s); + events.ScheduleEvent(EVENT_SAW_BLADE, 5s, 20s); + events.ScheduleEvent(EVENT_ELECTRIFIED_NET, 20s, 30s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_H, 15s, 20s); + } - uint32 Shrink_Timer; - uint32 Saw_Blade_Timer; - uint32 Electrified_Net_Timer; - bool Summon75; - bool Summon50; - bool Summon25; + // Do not despawn mechanics + void JustSummoned(Creature* /*summon*/) override { } - void Reset() override + void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (_phase < PHASE_HEALTH_75 && !IsHeroic() && me->HealthBelowPctDamaged(75, damage)) { - Initialize(); - - instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, NOT_STARTED); + _phase++; + events.ScheduleEvent(EVENT_SUMMON, 0s); } - - void JustDied(Unit* /*killer*/) override + if (_phase < PHASE_HEALTH_50 && !IsHeroic() && me->HealthBelowPctDamaged(50, damage)) { - Talk(SAY_DEATH); - - instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, DONE); + _phase++; + events.ScheduleEvent(EVENT_SUMMON, 0s); } - - void KilledUnit(Unit* /*victim*/) override + if (_phase < PHASE_HEALTH_25 && !IsHeroic() && me->HealthBelowPctDamaged(25, damage)) { - Talk(SAY_SLAY); + _phase++; + events.ScheduleEvent(EVENT_SUMMON, 0s); } + } - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_SLAY); + } - instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, IN_PROGRESS); - } + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + } - //no known summon spells exist - void SummonMechanichs() - { - Talk(SAY_MECHANICS); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - DoSpawnCreature(NPC_STREAMRIGGER_MECHANIC, 5, 5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 240s); - DoSpawnCreature(NPC_STREAMRIGGER_MECHANIC, -5, 5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 240s); - DoSpawnCreature(NPC_STREAMRIGGER_MECHANIC, -5, -5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 240s); + events.Update(diff); - if (rand32() % 2) - DoSpawnCreature(NPC_STREAMRIGGER_MECHANIC, 5, -7, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 240s); - if (rand32() % 2) - DoSpawnCreature(NPC_STREAMRIGGER_MECHANIC, 7, -5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 240s); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) { - if (!UpdateVictim()) - return; - - if (Shrink_Timer <= diff) - { - DoCastVictim(SPELL_SUPER_SHRINK_RAY); - Shrink_Timer = 20000; - } else Shrink_Timer -= diff; - - if (Saw_Blade_Timer <= diff) + switch (eventId) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_SAW_BLADE); - else - DoCastVictim(SPELL_SAW_BLADE); - - Saw_Blade_Timer = 15000; - } else Saw_Blade_Timer -= diff; - - if (Electrified_Net_Timer <= diff) - { - DoCastVictim(SPELL_ELECTRIFIED_NET); - Electrified_Net_Timer = 10000; + case EVENT_SHRINK: + DoCastSelf(SPELL_SUPER_SHRINK_RAY); + events.Repeat(15s, 25s); + break; + case EVENT_SAW_BLADE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, SPELL_SAW_BLADE); + events.Repeat(10s, 20s); + break; + case EVENT_ELECTRIFIED_NET: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_ELECTRIFIED_NET); + events.Repeat(15s, 25s); + break; + case EVENT_SUMMON: + Talk(SAY_MECHANICS); + DoCastSelf(SPELL_SUMMON_GNOMES); + break; + case EVENT_SUMMON_H: + DoCastSelf(RAND(SPELL_SUMMON_GNOME_1, SPELL_SUMMON_GNOME_2, SPELL_SUMMON_GNOME_3)); + events.Repeat(20s); + break; + default: + break; } - else Electrified_Net_Timer -= diff; - if (!Summon75) - { - if (HealthBelowPct(75)) - { - SummonMechanichs(); - Summon75 = true; - } - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - if (!Summon50) - { - if (HealthBelowPct(50)) - { - SummonMechanichs(); - Summon50 = true; - } - } + DoMeleeAttackIfReady(); + } - if (!Summon25) - { - if (HealthBelowPct(25)) - { - SummonMechanichs(); - Summon25 = true; - } - } +private: + uint8 _phase; +}; - DoMeleeAttackIfReady(); - } - }; +// 17951 - Steamrigger Mechanic +struct npc_steamrigger_mechanic : public ScriptedAI +{ + npc_steamrigger_mechanic(Creature* creature) : ScriptedAI(creature) { } -}; + void Reset() override + { + _scheduler.CancelAll(); + } + + void IsSummonedBy(WorldObject* ownerWO) override + { + me->SetReactState(REACT_DEFENSIVE); -#define MAX_REPAIR_RANGE (13.0f) //we should be at least at this range for repair -#define MIN_REPAIR_RANGE (7.0f) //we can stop movement at this range to repair but not required + Creature* owner = ownerWO->ToCreature(); + if (!owner) + return; -class npc_steamrigger_mechanic : public CreatureScript -{ -public: - npc_steamrigger_mechanic() : CreatureScript("npc_steamrigger_mechanic") { } + float x, y, z; + owner->GetContactPoint(me, x, y, z); + me->GetMotionMaster()->MovePoint(POINT_REPAIR, x, y, z); + } - CreatureAI* GetAI(Creature* creature) const override + void MovementInform(uint32 type, uint32 pointId) override { - return GetSteamVaultAI(creature); + if (type != POINT_MOTION_TYPE) + return; + + if (pointId == POINT_REPAIR) + DoCastSelf(SPELL_REPAIR); } - struct npc_steamrigger_mechanicAI : public ScriptedAI + void JustEngagedWith(Unit* /*who*/) override { - npc_steamrigger_mechanicAI(Creature* creature) : ScriptedAI(creature) + _scheduler.Schedule(5s, 10s, [this](TaskContext task) { - Initialize(); - instance = creature->GetInstanceScript(); - } + DoCastSelf(SPELL_DISPEL_MAGIC); + task.Repeat(5s, 10s); + }); - void Initialize() + _scheduler.Schedule(5s, [this](TaskContext task) { - Repair_Timer = 2000; - } + DoCastSelf(SPELL_REPAIR); + task.Repeat(5s); + }); + } - InstanceScript* instance; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - uint32 Repair_Timer; + _scheduler.Update(diff); - void Reset() override - { - Initialize(); - } + DoMeleeAttackIfReady(); + } - void MoveInLineOfSight(Unit* /*who*/) override - { - //react only if attacked - } +private: + TaskScheduler _scheduler; +}; - void JustEngagedWith(Unit* /*who*/) override { } +// 31531 - Summon Gnomes +class spell_mekgineer_steamrigger_summon_gnomes : public AuraScript +{ + PrepareAuraScript(spell_mekgineer_steamrigger_summon_gnomes); - void UpdateAI(uint32 diff) override - { - if (Repair_Timer <= diff) - { - if (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == IN_PROGRESS) - { - if (Creature* mekgineer = instance->GetCreature(DATA_MEKGINEER_STEAMRIGGER)) - { - if (me->IsWithinDistInMap(mekgineer, MAX_REPAIR_RANGE)) - { - //are we already channeling? Doesn't work very well, find better check? - if (!me->GetChannelSpellId()) - { - //me->GetMotionMaster()->MovementExpired(); - //me->GetMotionMaster()->MoveIdle(); - - DoCast(me, SPELL_REPAIR, true); - } - Repair_Timer = 5000; - } - else - { - //me->GetMotionMaster()->MovementExpired(); - //me->GetMotionMaster()->MoveFollow(pMekgineer, 0, 0); - } - } - } else Repair_Timer = 5000; - } else Repair_Timer -= diff; - - if (!UpdateVictim()) - return; + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_SUMMON_GNOME_1, SPELL_SUMMON_GNOME_2, SPELL_SUMMON_GNOME_3 }); + } - DoMeleeAttackIfReady(); - } - }; + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_SUMMON_GNOME_1, true); + target->CastSpell(target, SPELL_SUMMON_GNOME_2, true); + target->CastSpell(target, SPELL_SUMMON_GNOME_3, true); + } + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_mekgineer_steamrigger_summon_gnomes::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } }; void AddSC_boss_mekgineer_steamrigger() { - new boss_mekgineer_steamrigger(); - new npc_steamrigger_mechanic(); + RegisterSteamVaultCreatureAI(boss_mekgineer_steamrigger); + RegisterSteamVaultCreatureAI(npc_steamrigger_mechanic); + RegisterSpellScript(spell_mekgineer_steamrigger_summon_gnomes); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h index 739a397a1bb..4de2ada719c 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h @@ -67,6 +67,6 @@ inline AI* GetSteamVaultAI(T* obj) return GetInstanceAI(obj, SteamVaultScriptName); } -#define RegisterSteamVaultAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetSteamVaultAI) +#define RegisterSteamVaultCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetSteamVaultAI) #endif diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp index 3cd67e7970d..894a582e138 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp @@ -34,7 +34,7 @@ #include "TemporarySummon.h" #include "the_slave_pens.h" -enum Spells +enum AhuneSpells { // Ahune SPELL_SYNCH_HEALTH = 46430, @@ -94,21 +94,21 @@ enum Spells SPELL_GHOST_DISGUISE = 46786 }; -enum Emotes +enum AhuneEmotes { EMOTE_EARTHEN_ASSAULT = 0, EMOTE_RETREAT = 0, EMOTE_RESURFACE = 1 }; -enum Says +enum AhuneTexts { SAY_PLAYER_TEXT_1 = 0, SAY_PLAYER_TEXT_2 = 1, SAY_PLAYER_TEXT_3 = 2 }; -enum Events +enum AhuneEvents { EVENT_EMERGE = 1, EVENT_INITIAL_EMERGE, @@ -127,7 +127,7 @@ enum Events EVENT_STOP_LOOKING_FOR_OPENING }; -enum Actions +enum AhuneActions { ACTION_START_EVENT = -2574500, ACTION_STOP_EVENT = -2574501, @@ -136,20 +136,20 @@ enum Actions ACTION_EMOTE_RESURFACE = -2575400 }; -enum Phases +enum AhunePhases { PHASE_ONE = 0, PHASE_TWO = 1 }; -enum Points +enum AhunePoints { POINT_FLAMECALLER_000, POINT_FLAMECALLER_001, POINT_FLAMECALLER_002 }; -enum Misc +enum AhuneMisc { MAX_FLAMECALLERS = 3 }; @@ -170,6 +170,7 @@ Position const FlameCallerSpots[] = { -129.0413f, -132.1494f, -2.09285f, 5.460842f } }; +// 25740 - Ahune struct boss_ahune : public BossAI { boss_ahune(Creature* creature) : BossAI(creature, DATA_AHUNE) @@ -272,6 +273,7 @@ struct boss_ahune : public BossAI } }; +// 25865 - Frozen Core struct npc_frozen_core : public ScriptedAI { npc_frozen_core(Creature* creature) : ScriptedAI(creature) @@ -342,6 +344,7 @@ struct npc_frozen_core : public ScriptedAI EventMap _events; }; +// 25745 - [PH] Ahune Summon Loc Bunny struct npc_ahune_bunny : public ScriptedAI { npc_ahune_bunny(Creature* creature) : ScriptedAI(creature), _summons(me) @@ -477,6 +480,7 @@ struct npc_ahune_bunny : public ScriptedAI bool _submerged; }; +// 25754 - Earthen Ring Flamecaller struct npc_earthen_ring_flamecaller : public ScriptedAI { npc_earthen_ring_flamecaller(Creature* creature) : ScriptedAI(creature) @@ -594,6 +598,7 @@ struct npc_earthen_ring_flamecaller : public ScriptedAI uint8 _mySpot; }; +// 25985 - Ahune Ice Spear Bunny struct npc_ahune_ice_spear_bunny : public ScriptedAI { npc_ahune_ice_spear_bunny(Creature* creature) : ScriptedAI(creature) { } @@ -680,9 +685,9 @@ class spell_ahune_synch_health : public SpellScript }; // 45926 - Summoning Rhyme Aura -class spell_summoning_rhyme_aura : public AuraScript +class spell_ahune_summoning_rhyme_aura : public AuraScript { - PrepareAuraScript(spell_summoning_rhyme_aura); + PrepareAuraScript(spell_ahune_summoning_rhyme_aura); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -719,14 +724,14 @@ class spell_summoning_rhyme_aura : public AuraScript void Register() override { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_summoning_rhyme_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ahune_summoning_rhyme_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; // 46878 - Summon Ice Spear Delayer -class spell_summon_ice_spear_delayer : public AuraScript +class spell_ahune_summon_ice_spear_delayer : public AuraScript { - PrepareAuraScript(spell_summon_ice_spear_delayer); + PrepareAuraScript(spell_ahune_summon_ice_spear_delayer); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -742,14 +747,14 @@ class spell_summon_ice_spear_delayer : public AuraScript void Register() override { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_summon_ice_spear_delayer::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ahune_summon_ice_spear_delayer::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; // 46371 - Ice Spear Control Aura -class spell_ice_spear_control_aura : public AuraScript +class spell_ahune_ice_spear_control_aura : public AuraScript { - PrepareAuraScript(spell_ice_spear_control_aura); + PrepareAuraScript(spell_ahune_ice_spear_control_aura); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -764,14 +769,14 @@ class spell_ice_spear_control_aura : public AuraScript void Register() override { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_ice_spear_control_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ahune_ice_spear_control_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; // 46372 - Ice Spear Target Picker -class spell_ice_spear_target_picker : public SpellScript +class spell_ahune_ice_spear_target_picker : public SpellScript { - PrepareSpellScript(spell_ice_spear_target_picker); + PrepareSpellScript(spell_ahune_ice_spear_target_picker); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -795,15 +800,15 @@ class spell_ice_spear_target_picker : public SpellScript void Register() override { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ice_spear_target_picker::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_ice_spear_target_picker::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ahune_ice_spear_target_picker::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_ahune_ice_spear_target_picker::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 46320 - Spell Slippery Floor Periodic -class spell_slippery_floor_periodic : public SpellScript +class spell_ahune_slippery_floor_periodic : public SpellScript { - PrepareSpellScript(spell_slippery_floor_periodic); + PrepareSpellScript(spell_ahune_slippery_floor_periodic); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -822,7 +827,7 @@ class spell_slippery_floor_periodic : public SpellScript void Register() override { - OnEffectHitTarget += SpellEffectFn(spell_slippery_floor_periodic::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_ahune_slippery_floor_periodic::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -839,7 +844,7 @@ class spell_ahune_spanky_hands : public AuraScript void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_COLD_SLAP, true); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_COLD_SLAP, true); } void Register() override @@ -866,9 +871,9 @@ class spell_ahune_minion_despawner : public SpellScript }; // 46398 - Spell Ice Bombardment Dest Picker -class spell_ice_bombardment_dest_picker : public SpellScript +class spell_ahune_ice_bombardment_dest_picker : public SpellScript { - PrepareSpellScript(spell_ice_bombardment_dest_picker); + PrepareSpellScript(spell_ahune_ice_bombardment_dest_picker); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -882,7 +887,7 @@ class spell_ice_bombardment_dest_picker : public SpellScript void Register() override { - OnEffectHit += SpellEffectFn(spell_ice_bombardment_dest_picker::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHit += SpellEffectFn(spell_ahune_ice_bombardment_dest_picker::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -896,12 +901,12 @@ void AddSC_boss_ahune() RegisterSlavePensGameObjectAI(go_ahune_ice_spear); RegisterSlavePensGameObjectAI(go_ahune_ice_stone); RegisterSpellScript(spell_ahune_synch_health); - RegisterSpellScript(spell_summoning_rhyme_aura); - RegisterSpellScript(spell_summon_ice_spear_delayer); - RegisterSpellScript(spell_ice_spear_control_aura); - RegisterSpellScript(spell_ice_spear_target_picker); - RegisterSpellScript(spell_slippery_floor_periodic); + RegisterSpellScript(spell_ahune_summoning_rhyme_aura); + RegisterSpellScript(spell_ahune_summon_ice_spear_delayer); + RegisterSpellScript(spell_ahune_ice_spear_control_aura); + RegisterSpellScript(spell_ahune_ice_spear_target_picker); + RegisterSpellScript(spell_ahune_slippery_floor_periodic); RegisterSpellScript(spell_ahune_spanky_hands); RegisterSpellScript(spell_ahune_minion_despawner); - RegisterSpellScript(spell_ice_bombardment_dest_picker); + RegisterSpellScript(spell_ahune_ice_bombardment_dest_picker); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp index 715472ca760..06fc07c48cf 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp @@ -15,65 +15,48 @@ * with this program. If not, see . */ -/* ScriptData -SDName: boss_mennu_the_betrayer -SD%Complete: 95% -SDComment: -SDCategory: Coilfang Reservoir, The Slave Pens -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "the_slave_pens.h" -enum Say +enum MennuTexts { SAY_AGGRO = 0, SAY_SLAY = 1, SAY_DEATH = 2 }; -enum Spells +enum MennuSpells { - SPELL_TAINTED_STONESKIN_TOTEM = 31985, // every 30 sec if health below 100% - SPELL_TAINTED_EARTHGRAB_TOTEM = 31981, // ? - SPELL_CORRUPTED_NOVA_TOTEM = 31991, // ? - SPELL_MENNUS_HEALING_WARD = 34980, // every 14 - 25 sec - SPELL_LIGHTNING_BOLT = 35010 // every 14 - 19 sec + SPELL_TAINTED_STONESKIN_TOTEM = 31985, + SPELL_TAINTED_EARTHGRAB_TOTEM = 31981, + SPELL_CORRUPTED_NOVA_TOTEM = 31991, + SPELL_MENNUS_HEALING_WARD = 34980, + SPELL_LIGHTNING_BOLT = 35010 }; -enum Events +enum MennuEvents { EVENT_TAINTED_STONESKIN_TOTEM = 1, - EVENT_TAINTED_EARTHGRAB_TOTEM = 2, - EVENT_CORRUPTED_NOVA_TOTEM = 3, - EVENT_MENNUS_HEALING_WARD = 4, - EVENT_LIGHTNING_BOLT = 5 + EVENT_TAINTED_EARTHGRAB_TOTEM, + EVENT_CORRUPTED_NOVA_TOTEM, + EVENT_MENNUS_HEALING_WARD, + EVENT_LIGHTNING_BOLT }; +// 17941 - Mennu the Betrayer struct boss_mennu_the_betrayer : public BossAI { boss_mennu_the_betrayer(Creature* creature) : BossAI(creature, DATA_MENNU_THE_BETRAYER) { } - void Reset() override - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } - void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_TAINTED_STONESKIN_TOTEM, 30s); - events.ScheduleEvent(EVENT_TAINTED_EARTHGRAB_TOTEM, 20s); - events.ScheduleEvent(EVENT_CORRUPTED_NOVA_TOTEM, 1min); - events.ScheduleEvent(EVENT_MENNUS_HEALING_WARD, 14s, 25s); - events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 14s, 19s); + events.ScheduleEvent(EVENT_TAINTED_STONESKIN_TOTEM, 30s, 40s); + events.ScheduleEvent(EVENT_TAINTED_EARTHGRAB_TOTEM, 20s, 30s); + events.ScheduleEvent(EVENT_CORRUPTED_NOVA_TOTEM, 20s, 30s); + events.ScheduleEvent(EVENT_MENNUS_HEALING_WARD, 15s, 25s); + events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 10s, 20s); Talk(SAY_AGGRO); } @@ -82,6 +65,12 @@ struct boss_mennu_the_betrayer : public BossAI Talk(SAY_SLAY); } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -97,23 +86,24 @@ struct boss_mennu_the_betrayer : public BossAI switch (eventId) { case EVENT_TAINTED_STONESKIN_TOTEM: - if (HealthBelowPct(100)) - DoCast(me, SPELL_TAINTED_STONESKIN_TOTEM); - events.ScheduleEvent(EVENT_TAINTED_STONESKIN_TOTEM, 30s); + DoCastSelf(SPELL_TAINTED_STONESKIN_TOTEM); + events.Repeat(35s, 40s); break; case EVENT_TAINTED_EARTHGRAB_TOTEM: - DoCast(me, SPELL_TAINTED_EARTHGRAB_TOTEM); + DoCastSelf(SPELL_TAINTED_EARTHGRAB_TOTEM); + events.Repeat(35s, 40s); break; case EVENT_CORRUPTED_NOVA_TOTEM: - DoCast(me, SPELL_CORRUPTED_NOVA_TOTEM); + DoCastSelf(SPELL_CORRUPTED_NOVA_TOTEM); + events.Repeat(35s, 40s); break; case EVENT_MENNUS_HEALING_WARD: - DoCast(me, SPELL_MENNUS_HEALING_WARD); - events.ScheduleEvent(EVENT_MENNUS_HEALING_WARD, 14s, 25s); + DoCastSelf(SPELL_MENNUS_HEALING_WARD); + events.Repeat(35s, 40s); break; case EVENT_LIGHTNING_BOLT: - DoCastVictim(SPELL_LIGHTNING_BOLT, true); - events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 14s, 25s); + DoCastVictim(SPELL_LIGHTNING_BOLT); + events.Repeat(15s, 25s); break; default: break; diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp index 197d2a73332..17747074c15 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp @@ -15,47 +15,31 @@ * with this program. If not, see . */ -/* ScriptData -SDName: boss_quagmirran -SD%Complete: 100% -SDComment: -SDCategory: Coilfang Reservoir, The Slave Pens -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "the_slave_pens.h" -enum Spells +enum QuagmirranSpells { SPELL_ACID_SPRAY = 38153, SPELL_CLEAVE = 40504, SPELL_UPPERCUT = 32055, - SPELL_POISON_BOLT_VOLLEY = 34780 // 39340 + SPELL_POISON_BOLT_VOLLEY = 34780 }; -enum Events +enum QuagmirranEvents { EVENT_ACID_SPRAY = 1, - EVENT_CLEAVE = 2, - EVENT_UPPERCUT = 3, - EVENT_POISON_BOLT_VOLLEY = 4 + EVENT_CLEAVE, + EVENT_UPPERCUT, + EVENT_POISON_BOLT_VOLLEY }; +// 17942 - Quagmirran struct boss_quagmirran : public BossAI { boss_quagmirran(Creature* creature) : BossAI(creature, DATA_QUAGMIRRAN) { } - void Reset() override - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - } - void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); @@ -65,8 +49,6 @@ struct boss_quagmirran : public BossAI events.ScheduleEvent(EVENT_POISON_BOLT_VOLLEY, 31s); } - void KilledUnit(Unit* /*victim*/) override { } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -83,20 +65,20 @@ struct boss_quagmirran : public BossAI { case EVENT_ACID_SPRAY: DoCastAOE(SPELL_ACID_SPRAY); - events.ScheduleEvent(EVENT_ACID_SPRAY, 20s, 25s); + events.Repeat(20s, 25s); break; case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE, true); - events.ScheduleEvent(EVENT_CLEAVE, 18s, 34s); + DoCastVictim(SPELL_CLEAVE); + events.Repeat(18s, 34s); break; case EVENT_UPPERCUT: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 10.0f, true)) DoCast(target, SPELL_UPPERCUT); - events.ScheduleEvent(EVENT_UPPERCUT, 22s); + events.Repeat(22s); break; case EVENT_POISON_BOLT_VOLLEY: - DoCast(me, SPELL_POISON_BOLT_VOLLEY); - events.ScheduleEvent(EVENT_POISON_BOLT_VOLLEY, 24s); + DoCastSelf(SPELL_POISON_BOLT_VOLLEY); + events.Repeat(24s); break; default: break; diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp index 45768c64463..7dd51ebb2e6 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp @@ -15,18 +15,11 @@ * with this program. If not, see . */ -/* ScriptData -SDName: boss_rokmar_the_crackler -SD%Complete: 100% -SDComment: -SDCategory: Coilfang Reservoir, The Slave Pens -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "the_slave_pens.h" -enum Spells +enum RokmarSpells { SPELL_GRIEVOUS_WOUND = 31956, SPELL_ENSNARING_MOSS = 31948, @@ -34,34 +27,23 @@ enum Spells SPELL_FRENZY = 34970 }; -enum Events +enum RokmarEvents { EVENT_GRIEVOUS_WOUND = 1, - EVENT_ENSNARING_MOSS = 2, - EVENT_WATER_SPIT = 3 + EVENT_ENSNARING_MOSS, + EVENT_WATER_SPIT, + EVENT_FRENZY }; +// 17991 - Rokmar the Crackler struct boss_rokmar_the_crackler : public BossAI { - boss_rokmar_the_crackler(Creature* creature) : BossAI(creature, DATA_ROKMAR_THE_CRACKLER) - { - Initialize(); - } - - void Initialize() - { - rokmarFrenzy = false; - } + boss_rokmar_the_crackler(Creature* creature) : BossAI(creature, DATA_ROKMAR_THE_CRACKLER), _frenzied(false) { } void Reset() override { _Reset(); - Initialize(); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); + _frenzied = false; } void JustEngagedWith(Unit* who) override @@ -72,7 +54,14 @@ struct boss_rokmar_the_crackler : public BossAI events.ScheduleEvent(EVENT_WATER_SPIT, 14s); } - void KilledUnit(Unit* /*victim*/) override { } + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (!_frenzied && me->HealthBelowPctDamaged(10, damage)) + { + _frenzied = true; + events.ScheduleEvent(EVENT_FRENZY, 0s); + } + } void UpdateAI(uint32 diff) override { @@ -89,16 +78,19 @@ struct boss_rokmar_the_crackler : public BossAI switch (eventId) { case EVENT_GRIEVOUS_WOUND: - DoCastVictim(SPELL_GRIEVOUS_WOUND, true); - events.ScheduleEvent(EVENT_GRIEVOUS_WOUND, 20s, 30s); + DoCastVictim(SPELL_GRIEVOUS_WOUND); + events.Repeat(20s, 30s); break; case EVENT_ENSNARING_MOSS: DoCastAOE(SPELL_ENSNARING_MOSS); - events.ScheduleEvent(EVENT_ENSNARING_MOSS, 20s, 30s); + events.Repeat(20s, 30s); break; case EVENT_WATER_SPIT: DoCastAOE(SPELL_WATER_SPIT); - events.ScheduleEvent(EVENT_WATER_SPIT, 14s, 18s); + events.Repeat(14s, 18s); + break; + case EVENT_FRENZY: + DoCastSelf(SPELL_FRENZY); break; default: break; @@ -108,17 +100,11 @@ struct boss_rokmar_the_crackler : public BossAI return; } - if (HealthBelowPct(10) && !rokmarFrenzy) - { - DoCast(me, SPELL_FRENZY); - rokmarFrenzy = true; - } - DoMeleeAttackIfReady(); } private: - bool rokmarFrenzy; + bool _frenzied; }; void AddSC_boss_rokmar_the_crackler() diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp index 916783f03e3..be90b9a2bec 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp @@ -15,9 +15,11 @@ * with this program. If not, see . */ +#include "Containers.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellAuras.h" +#include "SpellScript.h" #include "the_underbog.h" enum HungarfenTexts @@ -53,17 +55,15 @@ struct boss_hungarfen : public BossAI void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - _scheduler.Schedule(IsHeroic() ? 2500ms : 5s, [this](TaskContext task) + scheduler.Schedule(IsHeroic() ? 2500ms : 5s, [this](TaskContext task) { - /// @todo cast here SPELL_PUTRID_MUSHROOM_PRIMER and do it in spell script - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - target->CastSpell(target, SPELL_SUMMON_UNDERBOG_MUSHROOM, true); + DoCastSelf(SPELL_PUTRID_MUSHROOM_PRIMER); task.Repeat(IsHeroic() ? 2500ms : 10s); }); if (IsHeroic()) { - _scheduler.Schedule(3s, 5s, [this](TaskContext task) + scheduler.Schedule(3s, 5s, [this](TaskContext task) { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) DoCast(target, SPELL_ACID_GEYSER); @@ -89,7 +89,7 @@ struct boss_hungarfen : public BossAI if (!UpdateVictim()) return; - _scheduler.Update(diff, [this] + scheduler.Update(diff, [this] { DoMeleeAttackIfReady(); }); @@ -100,7 +100,7 @@ struct boss_hungarfen : public BossAI _roared = true; me->SetReactState(REACT_PASSIVE); - _scheduler.Schedule(2s, [this](TaskContext /*task*/) + scheduler.Schedule(2s, [this](TaskContext /*task*/) { DoCastSelf(SPELL_FOUL_SPORES); me->SetReactState(REACT_AGGRESSIVE); @@ -109,7 +109,6 @@ struct boss_hungarfen : public BossAI } private: - TaskScheduler _scheduler; bool _roared; }; @@ -159,8 +158,42 @@ struct npc_underbog_mushroom : public ScriptedAI uint32 _counter; }; +// 31693 - Putrid Mushroom Primer +class spell_hungarfen_putrid_mushroom_primer : public SpellScript +{ + PrepareSpellScript(spell_hungarfen_putrid_mushroom_primer); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SUMMON_UNDERBOG_MUSHROOM }); + } + + /// @todo: Check if something else should be done here + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUMMON_UNDERBOG_MUSHROOM, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hungarfen_putrid_mushroom_primer::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_hungarfen_putrid_mushroom_primer::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_boss_hungarfen() { RegisterTheUnderbogCreatureAI(boss_hungarfen); RegisterTheUnderbogCreatureAI(npc_underbog_mushroom); + RegisterSpellScript(spell_hungarfen_putrid_mushroom_primer); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp index 6a04a457345..4640f9e00ff 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp @@ -63,17 +63,17 @@ enum Events struct boss_the_black_stalker : public BossAI { - boss_the_black_stalker(Creature* creature) : BossAI(creature, DATA_THE_BLACK_STALKER), _summons(creature) { } + boss_the_black_stalker(Creature* creature) : BossAI(creature, DATA_THE_BLACK_STALKER) { } void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - _events.ScheduleEvent(EVENT_LEASH_CHECK, 5s); - _events.ScheduleEvent(EVENT_LEVITATE, 8s, 18s); - _events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 0s, 3s); - _events.ScheduleEvent(EVENT_STATIC_CHARGE, 10s); + events.ScheduleEvent(EVENT_LEASH_CHECK, 5s); + events.ScheduleEvent(EVENT_LEVITATE, 8s, 18s); + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 0s, 3s); + events.ScheduleEvent(EVENT_STATIC_CHARGE, 10s); if (IsHeroic()) - _events.ScheduleEvent(EVENT_SUMMON_SPORE_STRIDER, 20s, 30s); + events.ScheduleEvent(EVENT_SUMMON_SPORE_STRIDER, 20s, 30s); } void UpdateAI(uint32 diff) override @@ -81,12 +81,12 @@ struct boss_the_black_stalker : public BossAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { @@ -99,25 +99,25 @@ struct boss_the_black_stalker : public BossAI EnterEvadeMode(); return; } - _events.Repeat(1s); + events.Repeat(1s); break; } case EVENT_LEVITATE: DoCastSelf(SPELL_LEVITATE); - _events.Repeat(18s, 24s); + events.Repeat(18s, 24s); break; case EVENT_CHAIN_LIGHTNING: DoCastVictim(SPELL_CHAIN_LIGHTNING); - _events.Repeat(6s, 12s); + events.Repeat(6s, 12s); break; case EVENT_STATIC_CHARGE: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30, true)) DoCast(target, SPELL_STATIC_CHARGE); - _events.Repeat(10s); + events.Repeat(10s); break; case EVENT_SUMMON_SPORE_STRIDER: DoCastSelf(SPELL_SUMMON_SPORE_STRIDER_SCRIPT); - _events.Repeat(15s, 25s); + events.Repeat(15s, 25s); break; default: break; @@ -129,10 +129,6 @@ struct boss_the_black_stalker : public BossAI DoMeleeAttackIfReady(); } - -private: - EventMap _events; - SummonList _summons; }; // 31704 - Levitate diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp index 1697cf13df2..e1c2bb69ab5 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp @@ -15,51 +15,38 @@ * with this program. If not, see . */ -/* ScriptData -SDName: boss_gatewatcher_gyrokill -SD%Complete: 99% -SDComment: -SDCategory: Tempest Keep, The Mechanar -EndScriptData */ - #include "ScriptMgr.h" +#include "SpellInfo.h" #include "mechanar.h" #include "ScriptedCreature.h" -enum Say +enum GyroKillTexts { SAY_AGGRO = 0, SAY_SLAY = 1, - SAY_SAW_BLADEs = 2, + SAY_SAW_BLADES = 2, SAY_DEATH = 3 }; -enum Spells +enum GyroKillSpells { SPELL_STREAM_OF_MACHINE_FLUID = 35311, SPELL_SAW_BLADE = 35318, - H_SPELL_SAW_BLADE = 39192, - SPELL_SHADOW_POWER = 35322, - H_SPELL_SHADOW_POWER = 39193 + SPELL_SHADOW_POWER = 35322 }; -enum Events +enum GyroKillEvents { EVENT_STREAM_OF_MACHINE_FLUID = 1, - EVENT_SAW_BLADE = 2, - EVENT_SHADOW_POWER = 3 + EVENT_SAW_BLADE, + EVENT_SHADOW_POWER }; +// 19218 - Gatewatcher Gyro-Kill struct boss_gatewatcher_gyrokill : public BossAI { boss_gatewatcher_gyrokill(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_GYROKILL) { } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } - void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); @@ -69,11 +56,23 @@ struct boss_gatewatcher_gyrokill : public BossAI Talk(SAY_AGGRO); } + void OnSpellCast(SpellInfo const* spell) override + { + if (spell->Id == SPELL_SAW_BLADE) + Talk(SAY_SAW_BLADES); + } + void KilledUnit(Unit* /*victim*/) override { Talk(SAY_SLAY); } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -89,17 +88,16 @@ struct boss_gatewatcher_gyrokill : public BossAI switch (eventId) { case EVENT_STREAM_OF_MACHINE_FLUID: - DoCastVictim(SPELL_STREAM_OF_MACHINE_FLUID, true); - events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 13s, 17s); + DoCastVictim(SPELL_STREAM_OF_MACHINE_FLUID); + events.Repeat(13s, 17s); break; case EVENT_SAW_BLADE: - DoCast(me, SPELL_SAW_BLADE); - Talk(SAY_SAW_BLADEs); - events.ScheduleEvent(EVENT_SAW_BLADE, 20s, 30s); + DoCastVictim(SPELL_SAW_BLADE); + events.Repeat(20s, 30s); break; case EVENT_SHADOW_POWER: - DoCast(me, SPELL_SHADOW_POWER); - events.ScheduleEvent(EVENT_SAW_BLADE, 25s, 35s); + DoCastSelf(SPELL_SHADOW_POWER); + events.Repeat(25s, 35s); break; default: break; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp index 8d09645b02a..64f9013d63f 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp @@ -15,18 +15,11 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Gatewatcher_Ironhand -SD%Complete: 75 -SDComment: -SDCategory: Tempest Keep, The Mechanar -EndScriptData */ - #include "ScriptMgr.h" #include "mechanar.h" #include "ScriptedCreature.h" -enum Says +enum IronHandTexts { SAY_AGGRO = 0, SAY_HAMMER = 1, @@ -35,23 +28,22 @@ enum Says EMOTE_HAMMER = 4 }; -enum Spells +enum IronHandSpells { SPELL_SHADOW_POWER = 35322, - H_SPELL_SHADOW_POWER = 39193, SPELL_HAMMER_PUNCH = 35326, SPELL_JACKHAMMER = 35327, - H_SPELL_JACKHAMMER = 39194, SPELL_STREAM_OF_MACHINE_FLUID = 35311 }; -enum Events +enum IronHandEvents { EVENT_STREAM_OF_MACHINE_FLUID = 1, - EVENT_JACKHAMMER = 2, - EVENT_SHADOW_POWER = 3 + EVENT_JACKHAMMER, + EVENT_SHADOW_POWER }; +// 19710 - Gatewatcher Iron-Hand struct boss_gatewatcher_iron_hand : public BossAI { boss_gatewatcher_iron_hand(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_IRON_HAND) { } @@ -92,20 +84,20 @@ struct boss_gatewatcher_iron_hand : public BossAI switch (eventId) { case EVENT_STREAM_OF_MACHINE_FLUID: - DoCastVictim(SPELL_STREAM_OF_MACHINE_FLUID, true); - events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 35s, 50s); + DoCastVictim(SPELL_STREAM_OF_MACHINE_FLUID); + events.Repeat(35s, 50s); break; case EVENT_JACKHAMMER: Talk(EMOTE_HAMMER); /// @todo expect cast this about 5 times in a row (?), announce it by emote only once - DoCastVictim(SPELL_JACKHAMMER, true); + DoCastVictim(SPELL_JACKHAMMER); if (roll_chance_i(50)) Talk(SAY_HAMMER); - events.ScheduleEvent(EVENT_JACKHAMMER, 30s); + events.Repeat(30s); break; case EVENT_SHADOW_POWER: - DoCast(me, SPELL_SHADOW_POWER); - events.ScheduleEvent(EVENT_SHADOW_POWER, 20s, 28s); + DoCastSelf(SPELL_SHADOW_POWER); + events.Repeat(20s, 28s); break; default: break; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp index a8cf171c383..fda9de6ae85 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp @@ -22,15 +22,22 @@ #include "SpellInfo.h" #include "SpellScript.h" -enum Spells +enum CapacitusTexts +{ + SAY_AGGRO = 0, + SAY_REFLECTIVE_MAGIC_SHIELD = 1, + SAY_REFLECTIVE_DAMAGE_SHIELD = 2, + SAY_SLAY = 3, + SAY_DEATH = 4 +}; + +enum CapacitusSpells { SPELL_HEADCRACK = 35161, SPELL_REFLECTIVE_MAGIC_SHIELD = 35158, SPELL_REFLECTIVE_DAMAGE_SHIELD = 35159, SPELL_POLARITY_SHIFT = 39096, SPELL_BERSERK = 26662, - SPELL_NETHER_CHARGE_TIMER = 37670, - SPELL_NETHER_CHARGE_PASSIVE = 35150, SPELL_SUMMON_NETHER_CHARGE_NE = 35153, SPELL_SUMMON_NETHER_CHARGE_NW = 35904, @@ -46,32 +53,17 @@ enum Spells SPELL_NEGATIVE_CHARGE = 39093 }; -enum Yells -{ - YELL_AGGRO = 0, - YELL_REFLECTIVE_MAGIC_SHIELD = 1, - YELL_REFLECTIVE_DAMAGE_SHIELD = 2, - YELL_KILL = 3, - YELL_DEATH = 4 -}; - -enum Creatures +enum CapacitusEvents { - NPC_NETHER_CHARGE = 20405 -}; - -enum Events -{ - EVENT_NONE = 0, - EVENT_HEADCRACK = 1, - EVENT_REFLECTIVE_DAMAGE_SHIELD = 2, - EVENT_REFLECTIVE_MAGIE_SHIELD = 3, - EVENT_POSITIVE_SHIFT = 4, - EVENT_SUMMON_NETHER_CHARGE = 5, - EVENT_BERSERK = 6 + EVENT_REFLECTIVE_DAMAGE_SHIELD, + EVENT_REFLECTIVE_MAGIE_SHIELD, + EVENT_POSITIVE_SHIFT, + EVENT_SUMMON_NETHER_CHARGE, + EVENT_BERSERK }; +// 19219 - Mechano-Lord Capacitus struct boss_mechano_lord_capacitus : public BossAI { boss_mechano_lord_capacitus(Creature* creature) : BossAI(creature, DATA_MECHANOLORD_CAPACITUS) { } @@ -79,7 +71,7 @@ struct boss_mechano_lord_capacitus : public BossAI void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - Talk(YELL_AGGRO); + Talk(SAY_AGGRO); events.ScheduleEvent(EVENT_HEADCRACK, 10s); events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 15s); events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10s); @@ -91,13 +83,13 @@ struct boss_mechano_lord_capacitus : public BossAI void KilledUnit(Unit* /*victim*/) override { - Talk(YELL_KILL); + Talk(SAY_SLAY); } void JustDied(Unit* /*killer*/) override { _JustDied(); - Talk(YELL_DEATH); + Talk(SAY_DEATH); } void UpdateAI(uint32 diff) override @@ -116,21 +108,21 @@ struct boss_mechano_lord_capacitus : public BossAI { case EVENT_HEADCRACK: DoCastVictim(SPELL_HEADCRACK); - events.ScheduleEvent(EVENT_HEADCRACK, 10s); + events.Repeat(10s); break; case EVENT_REFLECTIVE_DAMAGE_SHIELD: - Talk(YELL_REFLECTIVE_DAMAGE_SHIELD); - DoCast(me, SPELL_REFLECTIVE_DAMAGE_SHIELD); - events.ScheduleEvent(EVENT_REFLECTIVE_MAGIE_SHIELD, 30s); + Talk(SAY_REFLECTIVE_DAMAGE_SHIELD); + DoCastSelf(SPELL_REFLECTIVE_DAMAGE_SHIELD); + events.Repeat(30s); break; case EVENT_REFLECTIVE_MAGIE_SHIELD: - Talk(YELL_REFLECTIVE_MAGIC_SHIELD); - DoCast(me, SPELL_REFLECTIVE_MAGIC_SHIELD); - events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 30s); + Talk(SAY_REFLECTIVE_MAGIC_SHIELD); + DoCastSelf(SPELL_REFLECTIVE_MAGIC_SHIELD); + events.Repeat(30s); break; case EVENT_POSITIVE_SHIFT: DoCastAOE(SPELL_POLARITY_SHIFT); - events.ScheduleEvent(EVENT_POSITIVE_SHIFT, 45s, 60s); + events.Repeat(45s, 60s); break; case EVENT_SUMMON_NETHER_CHARGE: { @@ -140,11 +132,11 @@ struct boss_mechano_lord_capacitus : public BossAI SPELL_SUMMON_NETHER_CHARGE_SW); Milliseconds netherChargeTimer = DUNGEON_MODE(randtime(9s, 11s), randtime(2s, 5s)); DoCastSelf(spellId); - events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, netherChargeTimer); + events.Repeat(netherChargeTimer); break; } case EVENT_BERSERK: - DoCast(me, SPELL_BERSERK); + DoCastSelf(SPELL_BERSERK); break; default: break; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp index 11dbd778ab8..a9878890e2b 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp @@ -15,57 +15,54 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss Pathaleon the Calculator -SD%Complete: 50 -SDComment: Event missing. Script for himself 99% blizzlike. -SDCategory: Tempest Keep, The Mechanar -EndScriptData */ - #include "ScriptMgr.h" #include "mechanar.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellInfo.h" #include "TemporarySummon.h" -enum Says -{ - SAY_AGGRO = 0, - SAY_DOMINATION = 1, - SAY_SUMMON = 2, - SAY_ENRAGE = 3, - SAY_SLAY = 4, - SAY_DEATH = 5 -}; - -enum Spells +enum PathaleonTexts { - SPELL_MANA_TAP = 36021, - SPELL_ARCANE_TORRENT = 36022, - SPELL_DOMINATION = 35280, - H_SPELL_ARCANE_EXPLOSION = 15453, - SPELL_FRENZY = 36992, - SPELL_SUMMON_NETHER_WRAITH_1 = 35285, // Not scripted - SPELL_SUMMON_NETHER_WRAITH_2 = 35286, // Not scripted - SPELL_SUMMON_NETHER_WRAITH_3 = 35287, // Not scripted - SPELL_SUMMON_NETHER_WRAITH_4 = 35288, // Not scripted - SPELL_DETONATION = 35058, // Used by Nether Wraith - SPELL_ARCANE_MISSILES = 35034 // Used by Nether Wraith + SAY_AGGRO = 0, + SAY_DOMINATION = 1, + SAY_SUMMON = 2, + SAY_ENRAGE = 3, + SAY_SLAY = 4, + SAY_DEATH = 5 }; -enum Events +enum PathaleonSpells { - EVENT_SUMMON = 1, - EVENT_MANA_TAP = 2, - EVENT_ARCANE_TORRENT = 3, - EVENT_DOMINATION = 4, - EVENT_ARCANE_EXPLOSION = 5 + SPELL_MANA_TAP = 36021, + SPELL_ARCANE_TORRENT = 36022, + SPELL_DOMINATION = 35280, + SPELL_ARCANE_EXPLOSION_H = 15453, + SPELL_FRENZY = 36992, + SPELL_SUICIDE = 35301, // NYI + + SPELL_SUMMON_NETHER_WRAITHS = 35284, + SPELL_SUMMON_NETHER_WRAITH_LEFT = 35285, + SPELL_SUMMON_NETHER_WRAITH_RIGHT = 35286, // Unused + SPELL_SUMMON_NETHER_WRAITH_FRONT = 35287, + SPELL_SUMMON_NETHER_WRAITH_BACK = 35288, + + // Nether Wraith + SPELL_ARCANE_BOLT = 20720, + SPELL_NETHER_EXPLOSION = 35058 }; -enum Creatures +enum PathaleonEvents { - NPC_NETHER_WRAITH = 21062 + EVENT_SUMMON = 1, + EVENT_MANA_TAP, + EVENT_ARCANE_TORRENT, + EVENT_DOMINATION, + EVENT_ARCANE_EXPLOSION, + EVENT_FRENZY }; +// 19220 - Pathaleon the Calculator struct boss_pathaleon_the_calculator : public BossAI { boss_pathaleon_the_calculator(Creature* creature) : BossAI(creature, DATA_PATHALEON_THE_CALCULATOR) { } @@ -77,7 +74,8 @@ struct boss_pathaleon_the_calculator : public BossAI events.ScheduleEvent(EVENT_MANA_TAP, 12s, 20s); events.ScheduleEvent(EVENT_ARCANE_TORRENT, 16s, 25s); events.ScheduleEvent(EVENT_DOMINATION, 25s, 40s); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 8s, 13s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 8s, 13s); Talk(SAY_AGGRO); } @@ -92,15 +90,30 @@ struct boss_pathaleon_the_calculator : public BossAI Talk(SAY_DEATH); } - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + void OnSpellCast(SpellInfo const* spell) override { - if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY)) + switch (spell->Id) { - DoCast(me, SPELL_FRENZY); - Talk(SAY_ENRAGE); + case SPELL_SUMMON_NETHER_WRAITHS: + Talk(SAY_SUMMON); + break; + case SPELL_DOMINATION: + Talk(SAY_DOMINATION); + break; + case SPELL_FRENZY: + Talk(SAY_ENRAGE); + break; + default: + break; } } + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY)) + events.ScheduleEvent(EVENT_FRENZY, 0s); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -116,33 +129,27 @@ struct boss_pathaleon_the_calculator : public BossAI switch (eventId) { case EVENT_SUMMON: - for (uint8 i = 0; i < 3; ++i) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - { - if (Creature* Wraith = me->SummonCreature(NPC_NETHER_WRAITH, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25s)) - Wraith->AI()->AttackStart(target); - } - } - Talk(SAY_SUMMON); - events.ScheduleEvent(EVENT_SUMMON, 30s, 45s); + DoCastSelf(SPELL_SUMMON_NETHER_WRAITHS); + events.Repeat(30s, 45s); break; case EVENT_MANA_TAP: - DoCastVictim(SPELL_MANA_TAP, true); - events.ScheduleEvent(EVENT_MANA_TAP, 14s, 22s); + DoCastVictim(SPELL_MANA_TAP); + events.Repeat(14s, 22s); break; case EVENT_ARCANE_TORRENT: - DoCastVictim(SPELL_ARCANE_TORRENT, true); - events.ScheduleEvent(EVENT_ARCANE_TORRENT, 12s, 18s); + DoCastVictim(SPELL_ARCANE_TORRENT); + events.Repeat(12s, 18s); break; case EVENT_DOMINATION: - Talk(SAY_DOMINATION); - DoCastVictim(SPELL_DOMINATION, true); - events.ScheduleEvent(EVENT_DOMINATION, 25s, 30s); + DoCastVictim(SPELL_DOMINATION); + events.Repeat(25s, 30s); + break; + case EVENT_ARCANE_EXPLOSION: + DoCastSelf(SPELL_ARCANE_EXPLOSION_H); + events.Repeat(10s, 14s); break; - case EVENT_ARCANE_EXPLOSION: // Heroic only - DoCastVictim(H_SPELL_ARCANE_EXPLOSION, true); - events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 10s, 14s); + case EVENT_FRENZY: + DoCastSelf(SPELL_FRENZY); break; default: break; @@ -158,69 +165,70 @@ struct boss_pathaleon_the_calculator : public BossAI struct npc_nether_wraith : public ScriptedAI { - npc_nether_wraith(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + npc_nether_wraith(Creature* creature) : ScriptedAI(creature) { } - void Initialize() + void Reset() override { - ArcaneMissiles_Timer = urand(1000, 4000); - Detonation_Timer = 20000; - Die_Timer = 2200; - Detonation = false; + me->SetCorpseDelay(15, true); + _scheduler.CancelAll(); } - uint32 ArcaneMissiles_Timer; - uint32 Detonation_Timer; - uint32 Die_Timer; - bool Detonation; - - void Reset() override + void JustEngagedWith(Unit* /*who*/) override { - Initialize(); - } + _scheduler.Schedule(0s, 10s, [this](TaskContext task) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_ARCANE_BOLT); + task.Repeat(5s, 10s); + }); - void JustEngagedWith(Unit* /*who*/) override { } + _scheduler.Schedule(5s, 10s, [this](TaskContext task) + { + DoCastSelf(SPELL_NETHER_EXPLOSION); + task.Repeat(10s, 15s); + }); + } void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; - if (ArcaneMissiles_Timer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_ARCANE_MISSILES); - else - DoCastVictim(SPELL_ARCANE_MISSILES); - ArcaneMissiles_Timer = urand(5000, 10000); - } - else - ArcaneMissiles_Timer -=diff; + _scheduler.Update(diff); - if (!Detonation) - { - if (Detonation_Timer <= diff) - { - DoCast(me, SPELL_DETONATION); - Detonation = true; - } - else - Detonation_Timer -= diff; - } + DoMeleeAttackIfReady(); + } - if (Detonation) +private: + TaskScheduler _scheduler; +}; + +// 35284 - Summon Nether Wraiths +class spell_pathaleon_summon_nether_wraiths : public SpellScript +{ + PrepareSpellScript(spell_pathaleon_summon_nether_wraiths); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - if (Die_Timer <= diff) - { - me->DespawnOrUnsummon(); - return; - } - else - Die_Timer -= diff; - } - DoMeleeAttackIfReady(); + SPELL_SUMMON_NETHER_WRAITH_LEFT, + SPELL_SUMMON_NETHER_WRAITH_FRONT, + SPELL_SUMMON_NETHER_WRAITH_BACK + }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_SUMMON_NETHER_WRAITH_LEFT); + caster->CastSpell(caster, SPELL_SUMMON_NETHER_WRAITH_FRONT); + caster->CastSpell(caster, SPELL_SUMMON_NETHER_WRAITH_BACK); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_pathaleon_summon_nether_wraiths::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -228,4 +236,5 @@ void AddSC_boss_pathaleon_the_calculator() { RegisterMechanarCreatureAI(boss_pathaleon_the_calculator); RegisterMechanarCreatureAI(npc_nether_wraith); + RegisterSpellScript(spell_pathaleon_summon_nether_wraiths); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp index df75ec83c98..2dcad062e32 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -15,147 +15,155 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Boss_Harbinger_Skyriss -SD%Complete: 45 -SDComment: CombatAI not fully implemented. Timers will need adjustments. Need more docs on how event fully work. Reset all event and force start over if fail at one point? -SDCategory: Tempest Keep, The Arcatraz -EndScriptData */ - -/* ContentData -boss_harbinger_skyriss -boss_harbinger_skyriss_illusion -EndContentData */ +/* Need more docs on how event fully work. Reset all event and force start over if fail at one point? */ #include "ScriptMgr.h" +#include "SpellInfo.h" +#include "SpellScript.h" #include "arcatraz.h" #include "InstanceScript.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" -enum Says +enum SkyrissTexts { - SAY_INTRO = 0, - SAY_AGGRO = 1, - SAY_KILL = 2, - SAY_MIND = 3, - SAY_FEAR = 4, - SAY_IMAGE = 5, - SAY_DEATH = 6 + SAY_INTRO = 0, + SAY_AGGRO = 1, + SAY_KILL = 2, + SAY_MIND = 3, + SAY_FEAR = 4, + SAY_IMAGE = 5, + SAY_DEATH = 6 }; -enum Spells +enum SkyrissSpells { - SPELL_FEAR = 39415, - SPELL_MIND_REND = 36924, - H_SPELL_MIND_REND = 39017, - SPELL_DOMINATION = 37162, - H_SPELL_DOMINATION = 39019, - H_SPELL_MANA_BURN = 39020, - SPELL_66_ILLUSION = 36931, //entry 21466 - SPELL_33_ILLUSION = 36932, //entry 21467 - - SPELL_MIND_REND_IMAGE = 36929, - H_SPELL_MIND_REND_IMAGE = 39021 + // Intro + SPELL_SIMPLE_TELEPORT = 12980, + SPELL_MIND_REND_COSMETIC = 36859, + // Combat + SPELL_FEAR = 39415, + SPELL_MIND_REND = 36924, + SPELL_DOMINATION = 37162, + SPELL_DOMINATION_H = 39019, + SPELL_MANA_BURN = 39020, + + SPELL_SUMMON_66_ILLUSION = 36931, + SPELL_SUMMON_33_ILLUSION = 36932, + + SPELL_BIRTH = 26262, + SPELL_BLINK_VISUAL = 36937, + SPELL_66_HEALTH = 36928, + SPELL_33_HEALTH = 36930, + SPELL_MIND_REND_IMAGE = 36929, + SPELL_MIND_REND_IMAGE_H = 39021 }; +enum SkyrissEvents +{ + EVENT_MIND_REND = 1, + EVENT_FEAR, + EVENT_DOMINATION, + EVENT_MANA_BURN, + EVENT_SUMMON_66, + EVENT_SUMMON_33 +}; + +enum SkyrissMisc +{ + NPC_ILLUSION_66 = 21466, + NPC_ILLUSION_33 = 21467 +}; + +enum SkyrissPhases : uint8 +{ + PHASE_NONE = 0, + PHASE_HEALTH_66, + PHASE_HEALTH_33 +}; + +// 20912 - Harbinger Skyriss struct boss_harbinger_skyriss : public BossAI { - boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS) - { - Initialize(); - Intro = false; - } + boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS), _intro(false), _phase(PHASE_NONE) { } void Initialize() { - IsImage33 = false; - IsImage66 = false; - Intro_Phase = 1; Intro_Timer = 5000; - MindRend_Timer = 3000; - Fear_Timer = 15000; - Domination_Timer = 30000; - ManaBurn_Timer = 25000; } - bool Intro; - bool IsImage33; - bool IsImage66; - uint32 Intro_Phase; uint32 Intro_Timer; - uint32 MindRend_Timer; - uint32 Fear_Timer; - uint32 Domination_Timer; - uint32 ManaBurn_Timer; void Reset() override { + DoCastSelf(SPELL_SIMPLE_TELEPORT); _Reset(); - - me->SetImmuneToAll(!Intro); + _intro = false; + _phase = PHASE_NONE; + me->SetImmuneToAll(!_intro); Initialize(); } - void MoveInLineOfSight(Unit* who) override - { - if (!Intro) - return; - - ScriptedAI::MoveInLineOfSight(who); - } - - void JustEngagedWith(Unit* /*who*/) override { } - - void JustDied(Unit* /*killer*/) override + void JustEngagedWith(Unit* who) override { - Talk(SAY_DEATH); - _JustDied(); + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_MIND_REND, 2s, 10s); + events.ScheduleEvent(EVENT_FEAR, 10s, 20s); + events.ScheduleEvent(EVENT_DOMINATION, 30s, 40s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_MANA_BURN, 25s); } - void JustSummoned(Creature* summon) override + void OnSpellCast(SpellInfo const* spell) override { - if (!summon) - return; - if (IsImage66) - summon->SetHealth(summon->CountPctFromMaxHealth(33)); - else - summon->SetHealth(summon->CountPctFromMaxHealth(66)); - if (me->GetVictim()) - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - summon->AI()->AttackStart(target); - - summons.Summon(summon); - summon->SetImmuneToAll(false); + switch (spell->Id) + { + case SPELL_FEAR: + Talk(SAY_FEAR); + break; + case SPELL_DOMINATION: + case SPELL_DOMINATION_H: + Talk(SAY_MIND); + break; + default: + break; + } } void KilledUnit(Unit* victim) override { - //won't yell killing pet/other unit + // Won't yell killing pet/other unit if (victim->GetEntry() == NPC_ALPHA_POD_TARGET) return; Talk(SAY_KILL); } - void DoSplit(uint32 val) + void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override { - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(false); - - Talk(SAY_IMAGE); + if (_phase < PHASE_HEALTH_66 && me->HealthBelowPctDamaged(66, damage)) + { + _phase++; + events.ScheduleEvent(EVENT_SUMMON_66, 0s); + } + if (_phase < PHASE_HEALTH_33 && me->HealthBelowPctDamaged(33, damage)) + { + _phase++; + events.ScheduleEvent(EVENT_SUMMON_33, 0s); + } + } - if (val == 66) - DoCast(me, SPELL_66_ILLUSION); - else - DoCast(me, SPELL_33_ILLUSION); + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); } void UpdateAI(uint32 diff) override { - if (!Intro) + if (!_intro) { if (Intro_Timer <= diff) { @@ -181,107 +189,145 @@ struct boss_harbinger_skyriss : public BossAI break; case 3: me->SetImmuneToAll(false); - Intro = true; + _intro = true; break; } } else Intro_Timer -=diff; } + if (!UpdateVictim()) return; - if (!IsImage66 && !HealthAbovePct(66)) - { - DoSplit(66); - IsImage66 = true; - } - if (!IsImage33 && !HealthAbovePct(33)) - { - DoSplit(33); - IsImage33 = true; - } - - if (MindRend_Timer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_MIND_REND); - else - DoCastVictim(SPELL_MIND_REND); + events.Update(diff); - MindRend_Timer = 8000; - } - else - MindRend_Timer -=diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (Fear_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - if (me->IsNonMeleeSpellCast(false)) - return; + switch (eventId) + { + case EVENT_MIND_REND: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_MIND_REND); + events.Repeat(8s, 12s); + break; + case EVENT_FEAR: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_FEAR); + events.Repeat(25s, 35s); + break; + case EVENT_DOMINATION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_DOMINATION); + events.Repeat(30s, 40s); + break; + case EVENT_MANA_BURN: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_MANA_BURN); + events.Repeat(15s, 30s); + break; + case EVENT_SUMMON_66: + Talk(SAY_IMAGE); + DoCastSelf(SPELL_SUMMON_66_ILLUSION); + DoCastSelf(SPELL_BLINK_VISUAL); + break; + case EVENT_SUMMON_33: + Talk(SAY_IMAGE); + DoCastSelf(SPELL_SUMMON_33_ILLUSION); + DoCastSelf(SPELL_BLINK_VISUAL); + break; + default: + break; + } - Talk(SAY_FEAR); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_FEAR); - else - DoCastVictim(SPELL_FEAR); + DoMeleeAttackIfReady(); + } - Fear_Timer = 25000; - } - else - Fear_Timer -=diff; +private: + bool _intro; + uint8 _phase; +}; - if (Domination_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - return; +// 21466, 21467 - Harbinger Skyriss +struct boss_harbinger_skyriss_illusion : public ScriptedAI +{ + boss_harbinger_skyriss_illusion(Creature* creature) : ScriptedAI(creature) { } - Talk(SAY_MIND); + void Reset() override + { + _scheduler.CancelAll(); + me->SetCorpseDelay(0, true); + } - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_DOMINATION); - else - DoCastVictim(SPELL_DOMINATION); + void JustAppeared() override + { + DoZoneInCombat(); + // Should be in this sniffed order but makes it ignore other spell casts, so disabled + // DoCastSelf(SPELL_BIRTH); + DoCastSelf(SPELL_BLINK_VISUAL); - Domination_Timer = 16000 + rand32() % 16000; + switch (me->GetEntry()) + { + case NPC_ILLUSION_66: + DoCastSelf(SPELL_66_HEALTH); + break; + case NPC_ILLUSION_33: + DoCastSelf(SPELL_33_HEALTH); + break; + default: + break; } - else - Domination_Timer -=diff; - if (IsHeroic()) + _scheduler.Schedule(2s, 10s, [this](TaskContext task) { - if (ManaBurn_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - return; + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, IsHeroic() ? SPELL_MIND_REND_IMAGE_H : SPELL_MIND_REND_IMAGE); + task.Repeat(8s, 12s); + }); + } - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, H_SPELL_MANA_BURN); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - ManaBurn_Timer = 16000 + rand32() % 16000; - } - else - ManaBurn_Timer -=diff; - } - DoMeleeAttackIfReady(); + _scheduler.Update(diff, [this] + { + DoMeleeAttackIfReady(); + }); } + +private: + TaskScheduler _scheduler; }; -struct boss_harbinger_skyriss_illusion : public ScriptedAI +// 36928 - 66% Health +// 36930 - 33% Health +class spell_harbinger_skyriss_health : public SpellScript { - boss_harbinger_skyriss_illusion(Creature* creature) : ScriptedAI(creature) { } + PrepareSpellScript(spell_harbinger_skyriss_health); - void Reset() override + void HandleScript(SpellEffIndex /*effIndex*/) { - me->SetImmuneToPC(false); - me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE | UNIT_FLAG_NON_ATTACKABLE); + GetCaster()->SetHealth(GetCaster()->CountPctFromMaxHealth(uint32(GetEffectValue()))); } - void JustEngagedWith(Unit* /*who*/) override { } + void Register() override + { + OnEffectHit += SpellEffectFn(spell_harbinger_skyriss_health::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; void AddSC_boss_harbinger_skyriss() { RegisterArcatrazCreatureAI(boss_harbinger_skyriss); RegisterArcatrazCreatureAI(boss_harbinger_skyriss_illusion); + RegisterSpellScript(spell_harbinger_skyriss_health); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp index 5693d7a32c5..bc6793779f2 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp @@ -19,7 +19,7 @@ #include "ScriptedCreature.h" #include "arcatraz.h" -enum Say +enum ZerekethTexts { SAY_AGGRO = 0, SAY_SLAY = 1, @@ -27,35 +27,25 @@ enum Say SAY_DEATH = 3 }; -enum Spells +enum ZerekethSpells { SPELL_VOID_ZONE = 36119, SPELL_SHADOW_NOVA = 36127, SPELL_SEED_OF_CORRUPTION = 36123 }; -enum Events +enum ZerekethEvents { EVENT_VOID_ZONE = 1, - EVENT_SHADOW_NOVA = 2, - EVENT_SEED_OF_CORRUPTION = 3 + EVENT_SHADOW_NOVA, + EVENT_SEED_OF_CORRUPTION }; +// 20870 - Zereketh the Unbound struct boss_zereketh_the_unbound : public BossAI { boss_zereketh_the_unbound(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } - void Reset() override - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } - void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); @@ -70,6 +60,12 @@ struct boss_zereketh_the_unbound : public BossAI Talk(SAY_SLAY); } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -87,17 +83,17 @@ struct boss_zereketh_the_unbound : public BossAI case EVENT_VOID_ZONE: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) DoCast(target, SPELL_VOID_ZONE); - events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); + events.Repeat(6s, 10s); break; case EVENT_SHADOW_NOVA: - DoCastVictim(SPELL_SHADOW_NOVA, true); + DoCastVictim(SPELL_SHADOW_NOVA); Talk(SAY_SHADOW_NOVA); - events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); + events.Repeat(6s, 10s); break; case EVENT_SEED_OF_CORRUPTION: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) DoCast(target, SPELL_SEED_OF_CORRUPTION); - events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); + events.Repeat(12s, 20s); break; default: break; diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp index 1af1d6c10cd..9e37d0de9f7 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp @@ -17,152 +17,167 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellInfo.h" #include "the_botanica.h" -enum Says +enum ThorngrinTexts { SAY_AGGRO = 0, SAY_20_PERCENT_HP = 1, - SAY_KILL = 2, + SAY_SLAY = 2, SAY_CAST_SACRIFICE = 3, SAY_50_PERCENT_HP = 4, SAY_CAST_HELLFIRE = 5, SAY_DEATH = 6, - EMOTE_ENRAGE = 7 + EMOTE_ENRAGE = 7, + SAY_INTRO = 8 }; -enum Spells +enum ThorngrinSpells { SPELL_SACRIFICE = 34661, SPELL_HELLFIRE = 34659, + SPELL_HELLFIRE_H = 39131, SPELL_ENRAGE = 34670 }; -enum Events +enum ThorngrinEvents { EVENT_SACRIFICE = 1, - EVENT_HELLFIRE = 2, - EVENT_ENRAGE = 3 + EVENT_HELLFIRE, + EVENT_ENRAGE }; -class boss_thorngrin_the_tender : public CreatureScript +enum ThorngrinPhases : uint8 { - public: boss_thorngrin_the_tender() : CreatureScript("thorngrin_the_tender") { } + PHASE_NONE = 0, + PHASE_HEALTH_50, + PHASE_HEALTH_20 +}; - struct boss_thorngrin_the_tenderAI : public BossAI +// 17978 - Thorngrin the Tender +struct boss_thorngrin_the_tender : public BossAI +{ + boss_thorngrin_the_tender(Creature* creature) : BossAI(creature, DATA_THORNGRIN_THE_TENDER), _phase(PHASE_NONE), _introDone(false) { } + + void Reset() override + { + _Reset(); + _phase = PHASE_NONE; + _introDone = false; + } + + void MoveInLineOfSight(Unit* who) override + { + if (!_introDone && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 75.0f)) { - boss_thorngrin_the_tenderAI(Creature* creature) : BossAI(creature, DATA_THORNGRIN_THE_TENDER) - { - Initialize(); - } + _introDone = true; + Talk(SAY_INTRO); + } - void Initialize() - { - _phase1 = true; - _phase2 = true; - } + BossAI::MoveInLineOfSight(who); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_SACRIFICE, 30s, 40s); + events.ScheduleEvent(EVENT_HELLFIRE, 5s, 15s); + events.ScheduleEvent(EVENT_ENRAGE, 30s, 40s); + } + + void OnSpellStart(SpellInfo const* spell) override + { + if (spell->Id == SPELL_SACRIFICE) + Talk(SAY_CAST_SACRIFICE); + } + + void OnSpellCast(SpellInfo const* spell) override + { + switch (spell->Id) + { + case SPELL_HELLFIRE: + case SPELL_HELLFIRE_H: + Talk(SAY_CAST_HELLFIRE); + break; + case SPELL_ENRAGE: + Talk(EMOTE_ENRAGE); + break; + default: + break; + } + } - void Reset() override - { - _Reset(); - Initialize(); - } + void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (_phase < PHASE_HEALTH_50 && me->HealthBelowPctDamaged(50, damage)) + { + _phase++; + Talk(SAY_50_PERCENT_HP); + } + if (_phase < PHASE_HEALTH_20 && me->HealthBelowPctDamaged(20, damage)) + { + _phase++; + Talk(SAY_20_PERCENT_HP); + } + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SACRIFICE, 5700ms); - if (IsHeroic()) - events.ScheduleEvent(EVENT_HELLFIRE, 17400ms, 19300ms); - else - events.ScheduleEvent(EVENT_HELLFIRE, 18s); - events.ScheduleEvent(EVENT_ENRAGE, 12s); - } + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_SLAY); + } - void KilledUnit(Unit* /*victim*/) override - { - Talk(SAY_KILL); - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override - { - if (me->HealthBelowPctDamaged(50, damage) && _phase1) - { - _phase1 = false; - Talk(SAY_50_PERCENT_HP); - } - if (me->HealthBelowPctDamaged(20, damage) && _phase2) - { - _phase2 = false; - Talk(SAY_20_PERCENT_HP); - } - } + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SACRIFICE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) - { - Talk(SAY_CAST_SACRIFICE); - DoCast(target, SPELL_SACRIFICE, true); - } - events.ScheduleEvent(EVENT_SACRIFICE, 29400ms); - break; - case EVENT_HELLFIRE: - Talk(SAY_CAST_HELLFIRE); - DoCastVictim(SPELL_HELLFIRE, true); - if (IsHeroic()) - events.ScheduleEvent(EVENT_HELLFIRE, 17400ms, 19300ms); - else - events.ScheduleEvent(EVENT_HELLFIRE, 18s); - break; - case EVENT_ENRAGE: - Talk(EMOTE_ENRAGE); - DoCast(me, SPELL_ENRAGE); - events.ScheduleEvent(EVENT_ENRAGE, 33s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + case EVENT_SACRIFICE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) + DoCast(target, SPELL_SACRIFICE); + events.Repeat(25s, 30s); + break; + case EVENT_HELLFIRE: + DoCastSelf(SPELL_HELLFIRE); + events.Repeat(15s, 25s); + break; + case EVENT_ENRAGE: + DoCastSelf(SPELL_ENRAGE); + events.Repeat(30s, 40s); + break; + default: + break; } - private: - bool _phase1; - bool _phase2; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBotanicaAI(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } + +private: + uint8 _phase; + bool _introDone; }; void AddSC_boss_thorngrin_the_tender() { - new boss_thorngrin_the_tender(); + RegisterBotanicaCreatureAI(boss_thorngrin_the_tender); } diff --git a/src/server/scripts/Outland/outland_script_loader.cpp b/src/server/scripts/Outland/outland_script_loader.cpp index 68a1ed7591a..c5eec083978 100644 --- a/src/server/scripts/Outland/outland_script_loader.cpp +++ b/src/server/scripts/Outland/outland_script_loader.cpp @@ -25,6 +25,7 @@ void AddSC_instance_auchenai_crypts(); void AddSC_boss_pandemonius(); void AddSC_boss_nexusprince_shaffar(); void AddSC_instance_mana_tombs(); +void AddSC_mana_tombs(); // Auchindoun - Sekketh Halls void AddSC_boss_darkweaver_syth(); @@ -148,6 +149,7 @@ void AddOutlandScripts() AddSC_boss_pandemonius(); AddSC_boss_nexusprince_shaffar(); AddSC_instance_mana_tombs(); + AddSC_mana_tombs(); // Auchindoun - Sekketh Halls AddSC_boss_darkweaver_syth(); diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index f6a31d4ba6c..d91c3d320bb 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -1013,6 +1013,36 @@ class spell_oscillating_field : public SpellScriptLoader } }; +/*###### +## Quest 10556: Scratches +######*/ + +enum Scratches +{ + SPELL_LASHHAN_CHANNELING = 36904 +}; + +// 37028 - Dispelling Analysis +class spell_bem_dispelling_analysis : public SpellScript +{ + PrepareSpellScript(spell_bem_dispelling_analysis); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_LASHHAN_CHANNELING }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(SPELL_LASHHAN_CHANNELING); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_bem_dispelling_analysis::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_blades_edge_mountains() { new npc_nether_drake(); @@ -1022,4 +1052,5 @@ void AddSC_blades_edge_mountains() new go_apexis_relic(); new npc_oscillating_frequency_scanner_master_bunny(); new spell_oscillating_field(); + RegisterSpellScript(spell_bem_dispelling_analysis); } diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp index b77262e6f4e..5e080361e20 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -850,6 +850,39 @@ class spell_hellfire_peninsula_send_vengeance_to_player : public SpellScript } }; +enum Translocation +{ + SPELL_TRANSLOCATION_FALCON_WATCH_TOWER_DOWN = 30140, + SPELL_TRANSLOCATION_FALCON_WATCH_TOWER_UP = 30141 +}; + +// 25650 - Translocate +// 25652 - Translocate +class spell_hellfire_peninsula_translocation_falcon_watch : public SpellScript +{ + PrepareSpellScript(spell_hellfire_peninsula_translocation_falcon_watch); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ _triggeredSpellId }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), _triggeredSpellId); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_hellfire_peninsula_translocation_falcon_watch::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + + uint32 _triggeredSpellId; + +public: + explicit spell_hellfire_peninsula_translocation_falcon_watch(Translocation triggeredSpellId) : _triggeredSpellId(triggeredSpellId) { } +}; + void AddSC_hellfire_peninsula() { new npc_colonel_jules(); @@ -860,4 +893,6 @@ void AddSC_hellfire_peninsula() RegisterCreatureAI(npc_fear_controller); RegisterSpellScript(spell_hellfire_peninsula_send_vengeance); RegisterSpellScript(spell_hellfire_peninsula_send_vengeance_to_player); + RegisterSpellScriptWithArgs(spell_hellfire_peninsula_translocation_falcon_watch, "spell_hellfire_peninsula_translocation_falcon_watch_tower_down", SPELL_TRANSLOCATION_FALCON_WATCH_TOWER_DOWN); + RegisterSpellScriptWithArgs(spell_hellfire_peninsula_translocation_falcon_watch, "spell_hellfire_peninsula_translocation_falcon_watch_tower_up", SPELL_TRANSLOCATION_FALCON_WATCH_TOWER_UP); } diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index f2ff3e921af..0267fa947bf 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -1662,6 +1662,75 @@ class spell_shadowmoon_quest_credit_crazed_colossus : public SpellScript } }; +/*###### +## Quest 10637, 10688: A Necessary Distraction +######*/ + +enum ANecessaryDistraction +{ + SPELL_BANISH_AZALOTH = 37833 +}; + +// 37834 - Unbanish Azaloth +class spell_shadowmoon_unbanish_azaloth : public SpellScript +{ + PrepareSpellScript(spell_shadowmoon_unbanish_azaloth); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BANISH_AZALOTH }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(SPELL_BANISH_AZALOTH); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_shadowmoon_unbanish_azaloth::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +/*###### +## Quest 10672: Frankly, It Makes No Sense... +######*/ + +enum FranklyItMakesNoSense +{ + SPELL_ARCANO_SCORP_CONTROL_01 = 37868, + SPELL_ARCANO_SCORP_CONTROL_02 = 37893, + SPELL_ARCANO_SCORP_CONTROL_03 = 37895 +}; + +// 37867 - Arcano-Scorp Control +// 37892 - Arcano-Scorp Control +// 37894 - Arcano-Scorp Control +class spell_shadowmoon_arcano_scorp_control : public SpellScript +{ + PrepareSpellScript(spell_shadowmoon_arcano_scorp_control); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ _triggeredSpellId }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), _triggeredSpellId); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_shadowmoon_arcano_scorp_control::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + + uint32 _triggeredSpellId; + +public: + explicit spell_shadowmoon_arcano_scorp_control(uint32 triggeredSpellId) : _triggeredSpellId(triggeredSpellId) { } +}; + void AddSC_shadowmoon_valley() { new npc_invis_infernal_caster(); @@ -1678,4 +1747,8 @@ void AddSC_shadowmoon_valley() new npc_shadowmoon_tuber_node(); RegisterSpellScript(spell_shadowmoon_illidari_agent_illusion); RegisterSpellScript(spell_shadowmoon_quest_credit_crazed_colossus); + RegisterSpellScript(spell_shadowmoon_unbanish_azaloth); + RegisterSpellScriptWithArgs(spell_shadowmoon_arcano_scorp_control, "spell_shadowmoon_arcano_scorp_control_01", SPELL_ARCANO_SCORP_CONTROL_01); + RegisterSpellScriptWithArgs(spell_shadowmoon_arcano_scorp_control, "spell_shadowmoon_arcano_scorp_control_02", SPELL_ARCANO_SCORP_CONTROL_02); + RegisterSpellScriptWithArgs(spell_shadowmoon_arcano_scorp_control, "spell_shadowmoon_arcano_scorp_control_03", SPELL_ARCANO_SCORP_CONTROL_03); } diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index a7c1e94fb72..31df4f40c06 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -317,6 +317,43 @@ class spell_terokkar_cancel_shadowy_disguise : public SpellScript } }; +enum Translocation +{ + SPELL_TRANSLOCATION_FIREWING_POINT_BUILDING_DOWN = 32572, + SPELL_TRANSLOCATION_FIREWING_POINT_BUILDING_UP = 32568, + SPELL_TRANSLOCATION_FIREWING_POINT_TOWER_DOWN = 32569, + SPELL_TRANSLOCATION_FIREWING_POINT_TOWER_UP = 32571 +}; + +// 25143 - Translocate +// 29128 - Translocate +// 29129 - Translocate +// 25140 - Translocate +class spell_terokkar_translocation_firewing_point : public SpellScript +{ + PrepareSpellScript(spell_terokkar_translocation_firewing_point); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ _triggeredSpellId }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), _triggeredSpellId); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_terokkar_translocation_firewing_point::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + + uint32 _triggeredSpellId; + +public: + explicit spell_terokkar_translocation_firewing_point(Translocation triggeredSpellId) : _triggeredSpellId(triggeredSpellId) { } +}; + void AddSC_terokkar_forest() { new npc_unkor_the_ruthless(); @@ -326,4 +363,8 @@ void AddSC_terokkar_forest() RegisterSpellScript(spell_terokkar_shadowy_disguise_cast_from_questgiver); RegisterSpellScript(spell_terokkar_shadowy_disguise); RegisterSpellScript(spell_terokkar_cancel_shadowy_disguise); + RegisterSpellScriptWithArgs(spell_terokkar_translocation_firewing_point, "spell_terokkar_translocation_firewing_point_building_down", SPELL_TRANSLOCATION_FIREWING_POINT_BUILDING_DOWN); + RegisterSpellScriptWithArgs(spell_terokkar_translocation_firewing_point, "spell_terokkar_translocation_firewing_point_building_up", SPELL_TRANSLOCATION_FIREWING_POINT_BUILDING_UP); + RegisterSpellScriptWithArgs(spell_terokkar_translocation_firewing_point, "spell_terokkar_translocation_firewing_point_tower_down", SPELL_TRANSLOCATION_FIREWING_POINT_TOWER_DOWN); + RegisterSpellScriptWithArgs(spell_terokkar_translocation_firewing_point, "spell_terokkar_translocation_firewing_point_tower_up", SPELL_TRANSLOCATION_FIREWING_POINT_TOWER_UP); } diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index b8bb69fe226..e0d66e3629f 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -202,7 +202,7 @@ class spell_pet_gen_lich_pet_aura : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return (eventInfo.GetProcTarget()->GetTypeId() == TYPEID_PLAYER); + return eventInfo.GetActionTarget()->IsPlayer(); } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 9894e948252..51a9a14f3b0 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -205,7 +205,7 @@ class spell_pet_guard_dog : public AuraScript Unit* caster = eventInfo.GetActor(); caster->CastSpell(nullptr, SPELL_PET_GUARD_DOG_HAPPINESS, aurEff); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); if (!target->CanHaveThreatList()) return; float addThreat = CalculatePct(ASSERT_NOTNULL(eventInfo.GetSpellInfo())->GetEffect(EFFECT_0).CalcValue(caster), aurEff->GetAmount()); diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 71eb6b58fe1..a3f06959d5b 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -981,7 +981,7 @@ class spell_dk_glyph_of_scourge_strike : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DK_GLYPH_OF_SCOURGE_STRIKE_SCRIPT, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_DK_GLYPH_OF_SCOURGE_STRIKE_SCRIPT, aurEff); } void Register() override @@ -1344,7 +1344,7 @@ class spell_dk_mark_of_blood : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DK_MARK_OF_BLOOD_HEAL, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_DK_MARK_OF_BLOOD_HEAL, aurEff); } void Register() override @@ -1363,21 +1363,24 @@ class spell_dk_necrosis : public AuraScript return ValidateSpellInfo({ SPELL_DK_NECROSIS_DAMAGE }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + return damageInfo && damageInfo->GetDamage(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DK_NECROSIS_DAMAGE, args); + args.AddSpellBP0(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount())); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_DK_NECROSIS_DAMAGE, args); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_dk_necrosis::CheckProc); OnEffectProc += AuraEffectProcFn(spell_dk_necrosis::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -1889,7 +1892,7 @@ class spell_dk_sudden_doom : public AuraScript if (!spellId) return; - caster->CastSpell(eventInfo.GetProcTarget(), spellId, aurEff); + caster->CastSpell(eventInfo.GetActionTarget(), spellId, aurEff); } void Register() override @@ -1956,7 +1959,7 @@ class spell_dk_threat_of_thassarian : public AuraScript return; spellId = sSpellMgr->GetSpellWithRank(spellId, spellInfo->GetRank()); - caster->CastSpell(eventInfo.GetProcTarget(), spellId, aurEff); + caster->CastSpell(eventInfo.GetActionTarget(), spellId, aurEff); } void Register() override @@ -1979,19 +1982,21 @@ class spell_dk_unholy_blight : public AuraScript }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + return damageInfo && damageInfo->GetDamage(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; - Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DK_UNHOLY_BLIGHT_DAMAGE); - int32 amount = CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()); + int32 amount = CalculatePct(static_cast(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_UNHOLY_BLIGHT, EFFECT_0, caster->GetGUID())) AddPct(amount, glyph->GetAmount()); @@ -2005,6 +2010,7 @@ class spell_dk_unholy_blight : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_dk_unholy_blight::CheckProc); OnEffectProc += AuraEffectProcFn(spell_dk_unholy_blight::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -2060,19 +2066,22 @@ class spell_dk_wandering_plague : public AuraScript return ValidateSpellInfo({ SPELL_DK_WANDERING_PLAGUE_DAMAGE }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + if (!roll_chance_f(eventInfo.GetActor()->GetUnitCriticalChanceAgainst(BASE_ATTACK, eventInfo.GetActionTarget()))) + return false; + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + return damageInfo && damageInfo->GetDamage(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); - if (!roll_chance_f(caster->GetUnitCriticalChanceAgainst(BASE_ATTACK, target))) - return; - - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; + Unit* target = eventInfo.GetActionTarget(); - int32 amount = CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()); + int32 amount = CalculatePct(static_cast(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(amount); caster->CastSpell(target, SPELL_DK_WANDERING_PLAGUE_DAMAGE, args); @@ -2080,6 +2089,7 @@ class spell_dk_wandering_plague : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_dk_wandering_plague::CheckProc); OnEffectProc += AuraEffectProcFn(spell_dk_wandering_plague::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 9efa58725a9..f10de91b481 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -536,13 +536,13 @@ class spell_dru_glyph_of_rake : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetProcTarget()->GetTypeId() == TYPEID_UNIT; + return eventInfo.GetActionTarget()->IsCreature(); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED, aurEff); } void Register() override @@ -564,19 +564,20 @@ class spell_dru_glyph_of_rejuvenation : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetProcTarget()->HealthBelowPct(50); + if (!eventInfo.GetActionTarget()->HealthBelowPct(50)) + return false; + + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetHeal(); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount())); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL, args); + args.AddSpellBP0(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount())); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL, args); } void Register() override @@ -606,7 +607,7 @@ class spell_dru_glyph_of_shred : public AuraScript Unit* caster = eventInfo.GetActor(); // try to find spell Rip on the target - if (AuraEffect const* rip = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, caster->GetGUID())) + if (AuraEffect const* rip = eventInfo.GetActionTarget()->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, caster->GetGUID())) { // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip uint32 countMin = rip->GetBase()->GetMaxDuration(); @@ -689,7 +690,7 @@ class spell_dru_glyph_of_starfire_dummy : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT, aurEff); } void Register() override @@ -886,21 +887,24 @@ class spell_dru_living_seed : public AuraScript return ValidateSpellInfo({ SPELL_DRUID_LIVING_SEED_PROC }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetHeal(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount())); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_LIVING_SEED_PROC, args); + args.AddSpellBP0(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount())); + GetTarget()->CastSpell(eventInfo.GetActionTarget(), SPELL_DRUID_LIVING_SEED_PROC, args); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_dru_living_seed::CheckProc); OnEffectProc += AuraEffectProcFn(spell_dru_living_seed::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -1157,7 +1161,7 @@ class spell_dru_revitalize : public AuraScript if (!roll_chance_i(aurEff->GetAmount())) return; - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); uint32 spellId; switch (target->GetPowerType()) @@ -1483,7 +1487,7 @@ class spell_dru_t3_2p_bonus : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); uint32 spellId; switch (target->GetPowerType()) @@ -1524,7 +1528,7 @@ class spell_dru_t3_6p_bonus : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_BLESSING_OF_THE_CLAW, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_DRUID_BLESSING_OF_THE_CLAW, aurEff); } void Register() override @@ -1721,7 +1725,7 @@ class spell_dru_t10_balance_4p_bonus : public AuraScript return; Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DRUID_LANGUISH); int32 amount = CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()); @@ -1807,7 +1811,7 @@ class spell_dru_t10_restoration_4p_bonus_dummy : public AuraScript if (!caster) return false; - return caster->GetGroup() || caster != eventInfo.GetProcTarget(); + return caster->GetGroup() || caster != eventInfo.GetActionTarget(); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 81264592509..b1ab38a8020 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -214,7 +214,7 @@ class spell_spawn_blood_pool : public SpellScript Unit* caster = GetCaster(); Position summonPos = caster->GetPosition(); LiquidData liquidStatus; - if (caster->GetMap()->GetLiquidStatus(caster->GetPhaseMask(), caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus, caster->GetCollisionHeight())) + if (caster->GetMap()->GetLiquidStatus(caster->GetPhaseMask(), caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), {}, &liquidStatus, caster->GetCollisionHeight())) summonPos.m_positionZ = liquidStatus.level; dest.Relocate(summonPos); } @@ -703,6 +703,26 @@ class spell_gen_burning_depths_necrolyte_image : public AuraScript } }; +class spell_gen_cancel_aura : public SpellScript +{ + PrepareSpellScript(spell_gen_cancel_aura); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->RemoveAurasDueToSpell(uint32(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gen_cancel_aura::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + enum CannibalizeSpells { SPELL_CANNIBALIZE_TRIGGERED = 20578 @@ -1509,7 +1529,7 @@ class spell_ethereal_pet_aura : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - uint32 levelDiff = std::abs(GetTarget()->GetLevel() - eventInfo.GetProcTarget()->GetLevel()); + uint32 levelDiff = std::abs(eventInfo.GetActor()->GetLevel() - eventInfo.GetActionTarget()->GetLevel()); return levelDiff <= 9; } @@ -1524,7 +1544,7 @@ class spell_ethereal_pet_aura : public AuraScript if (minion->IsAIEnabled()) { minion->AI()->Talk(SAY_STEAL_ESSENCE); - minion->CastSpell(eventInfo.GetProcTarget(), SPELL_STEAL_ESSENCE_VISUAL); + minion->CastSpell(eventInfo.GetActionTarget(), SPELL_STEAL_ESSENCE_VISUAL); } } } @@ -4585,6 +4605,7 @@ void AddSC_generic_spell_scripts() RegisterSpellScriptWithArgs(spell_gen_break_shield, "spell_gen_break_shield"); RegisterSpellScriptWithArgs(spell_gen_break_shield, "spell_gen_tournament_counterattack"); RegisterSpellScript(spell_gen_burning_depths_necrolyte_image); + RegisterSpellScript(spell_gen_cancel_aura); RegisterSpellScript(spell_gen_cannibalize); RegisterSpellScript(spell_gen_chains_of_ice); RegisterSpellScript(spell_gen_chaos_blast); diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 09b314d7ffd..623822f112c 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -357,7 +357,7 @@ class spell_hun_glyph_of_arcane_shot : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - if (Unit* procTarget = eventInfo.GetProcTarget()) + if (Unit* procTarget = eventInfo.GetActionTarget()) { Unit::AuraApplicationMap const& auras = procTarget->GetAppliedAuras(); for (Unit::AuraApplicationMap::const_iterator i = auras.begin(); i != auras.end(); ++i) @@ -381,13 +381,13 @@ class spell_hun_glyph_of_arcane_shot : public AuraScript if (!procSpell) return; - int32 mana = procSpell->CalcPowerCost(GetTarget(), procSpell->GetSchoolMask()); + int32 mana = procSpell->CalcPowerCost(eventInfo.GetActor(), procSpell->GetSchoolMask()); ApplyPct(mana, aurEff->GetAmount()); // castspell refactor note: this is not triggered - is this intended? CastSpellExtraArgs args; args.AddSpellBP0(mana); - GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT, args); + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT, args); } void Register() override @@ -410,7 +410,7 @@ class spell_hun_glyph_of_mend_pet : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetProcTarget()->CastSpell(nullptr, SPELL_HUNTER_GLYPH_OF_MEND_PET_HAPPINESS, aurEff); + eventInfo.GetActionTarget()->CastSpell(nullptr, SPELL_HUNTER_GLYPH_OF_MEND_PET_HAPPINESS, aurEff); } void Register() override @@ -1240,7 +1240,7 @@ class spell_hun_thrill_of_the_hunt : public AuraScript // Explosive Shot if (spellInfo->SpellFamilyFlags[2] & 0x200) { - if (AuraEffect const* explosiveShot = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x00000000, 0x80000000, 0x00000000, caster->GetGUID())) + if (AuraEffect const* explosiveShot = eventInfo.GetActionTarget()->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x00000000, 0x80000000, 0x00000000, caster->GetGUID())) { // due to Lock and Load SpellInfo::CalcPowerCost might return 0, so just calculate it manually amount = CalculatePct(static_cast(CalculatePct(caster->GetCreateMana(), explosiveShot->GetSpellInfo()->ManaCostPercentage)), aurEff->GetAmount()); diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 2cf9d7bc5c7..b57a3f4b262 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -249,7 +249,7 @@ class spell_item_anger_capacitor : public SpellScriptLoader { PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); caster->CastSpell(nullptr, SPELL_MOTE_OF_ANGER, true); Aura const* motes = caster->GetAura(SPELL_MOTE_OF_ANGER); @@ -450,19 +450,16 @@ class spell_item_blessing_of_ancient_kings : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetProcTarget() != nullptr; + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetHeal(); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; - - int32 absorb = int32(CalculatePct(healInfo->GetHeal(), 15.0f)); - if (AuraEffect* protEff = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0, eventInfo.GetActor()->GetGUID())) + int32 absorb = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15.0f)); + if (AuraEffect* protEff = eventInfo.GetActionTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0, eventInfo.GetActor()->GetGUID())) { // The shield can grow to a maximum size of 20,000 damage absorbtion protEff->SetAmount(std::min(protEff->GetAmount() + absorb, 20000)); @@ -474,7 +471,7 @@ class spell_item_blessing_of_ancient_kings : public AuraScript { CastSpellExtraArgs args(aurEff); args.AddSpellBP0(absorb); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_PROTECTION_OF_ANCIENT_KINGS, args); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_PROTECTION_OF_ANCIENT_KINGS, args); } } @@ -1596,19 +1593,20 @@ class spell_item_necrotic_touch : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive(); + if (!eventInfo.GetActionTarget()->IsAlive()) + return false; + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + return damageInfo && damageInfo->GetDamage(); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); - GetTarget()->CastSpell(nullptr, SPELL_ITEM_NECROTIC_TOUCH_PROC, args); + args.AddSpellBP0(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount())); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_ITEM_NECROTIC_TOUCH_PROC, args); } void Register() override @@ -1751,7 +1749,7 @@ class spell_item_persistent_shield : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); int32 bp0 = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15); // Scarab Brooch does not replace stronger shields @@ -2235,22 +2233,21 @@ class spell_item_shadowmourne : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - if (GetTarget()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) // cant collect shards while under effect of Chaos Bane buff - return false; - return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive(); + // cant collect shards while under effect of Chaos Bane buff + return !eventInfo.GetActor()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF) && eventInfo.GetActionTarget()->IsAlive(); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, aurEff); // this can't be handled in AuraScript of SoulFragments because we need to know victim if (Aura* soulFragments = GetTarget()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT)) { if (soulFragments->GetStackAmount() >= 10) { - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, aurEff); soulFragments->Remove(); } } @@ -3439,7 +3436,7 @@ class spell_item_shard_of_the_scale : public SpellScriptLoader { PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) caster->CastSpell(target, HealProc, aurEff); @@ -3563,16 +3560,14 @@ class spell_item_sunwell_neck : public SpellScriptLoader bool CheckProc(ProcEventInfo& eventInfo) { - if (eventInfo.GetActor()->GetTypeId() != TYPEID_PLAYER) - return false; - return true; + return eventInfo.GetActor()->GetTypeId() == TYPEID_PLAYER; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); Player* player = eventInfo.GetActor()->ToPlayer(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); // Aggression checks are in the spell system... just cast and forget if (player->GetReputationRank(FACTION_ALDOR) == REP_EXALTED) @@ -4286,6 +4281,64 @@ class spell_item_eggnog : public SpellScript } }; +// Titanium Seal of Dalaran +enum TitaniumSealOfDalaranTexts +{ + TEXT_TSOD_COIN_TOSS = 32638, + TEXT_TSOD_FLIPPED_HEADS = 32663, + TEXT_TSOD_FLIPPED_TAILS = 32664 +}; + +// 60458 - Toss Your Luck! +class spell_item_titanium_seal_of_dalaran_toss : public SpellScript +{ + PrepareSpellScript(spell_item_titanium_seal_of_dalaran_toss); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return sObjectMgr->GetBroadcastText(TEXT_TSOD_COIN_TOSS); + } + + void RelocateHeight(SpellDestination& dest) + { + dest.RelocateOffset({ 0.0f, 0.0f, 20.0f }); + } + + void TriggerEmote(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->TextEmote(TEXT_TSOD_COIN_TOSS, caster); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_item_titanium_seal_of_dalaran_toss::RelocateHeight, EFFECT_0, TARGET_DEST_CASTER); + OnEffectLaunch += SpellEffectFn(spell_item_titanium_seal_of_dalaran_toss::TriggerEmote, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); + } +}; + +// 60476 - Toss Your Luck! +class spell_item_titanium_seal_of_dalaran_catch : public SpellScript +{ + PrepareSpellScript(spell_item_titanium_seal_of_dalaran_catch); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return sObjectMgr->GetBroadcastText(TEXT_TSOD_FLIPPED_HEADS) && sObjectMgr->GetBroadcastText(TEXT_TSOD_FLIPPED_TAILS); + } + + void TriggerEmote(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->TextEmote(RAND(TEXT_TSOD_FLIPPED_HEADS, TEXT_TSOD_FLIPPED_TAILS), caster); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_item_titanium_seal_of_dalaran_catch::TriggerEmote, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_item_spell_scripts() { // 23074 Arcanite Dragonling @@ -4421,4 +4474,6 @@ void AddSC_item_spell_scripts() RegisterSpellScript(spell_item_mad_alchemists_potion); RegisterSpellScript(spell_item_crazy_alchemists_potion); RegisterSpellScript(spell_item_eggnog); + RegisterSpellScript(spell_item_titanium_seal_of_dalaran_toss); + RegisterSpellScript(spell_item_titanium_seal_of_dalaran_catch); } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 545dc8d08d1..3e75600ac92 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -393,7 +393,7 @@ class spell_mage_imp_blizzard : public AuraScript { PreventDefaultAction(); uint32 triggerSpellId = sSpellMgr->GetSpellWithRank(SPELL_MAGE_CHILLED, GetSpellInfo()->GetRank()); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), triggerSpellId, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), triggerSpellId, aurEff); } void Register() override @@ -627,7 +627,7 @@ class spell_mage_gen_extra_effects : public AuraScript { Unit* caster = eventInfo.GetActor(); // Prevent double proc for Arcane missiles - if (caster == eventInfo.GetProcTarget()) + if (caster == eventInfo.GetActionTarget()) return false; // Proc chance is unknown, we'll just use dummy aura amount @@ -661,7 +661,7 @@ class spell_mage_glyph_of_polymorph : public AuraScript void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed. target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); @@ -841,7 +841,8 @@ class spell_mage_ignite : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetDamageInfo() && eventInfo.GetProcTarget(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + return damageInfo && damageInfo->GetDamage(); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) @@ -856,7 +857,7 @@ class spell_mage_ignite : public AuraScript CastSpellExtraArgs args(aurEff); args.AddSpellBP0(amount); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_IGNITE, args); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_MAGE_IGNITE, args); } void Register() override @@ -1061,7 +1062,7 @@ class spell_mage_missile_barrage_proc : public AuraScript { Unit* caster = eventInfo.GetActor(); // Prevent double proc for Arcane missiles - if (caster == eventInfo.GetProcTarget()) + if (caster == eventInfo.GetActionTarget()) return false; // Proc chance is unknown, we'll just use dummy aura amount diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 5f7f1303ca2..c91810158f0 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -431,17 +431,20 @@ class spell_pal_divine_purpose : public AuraScript { PrepareAuraScript(spell_pal_divine_purpose); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) { - PreventDefaultAction(); - if (!roll_chance_i(aurEff->GetAmount())) - return; + return roll_chance_i(aurEff->GetAmount()); + } - eventInfo.GetProcTarget()->RemoveAurasWithMechanic(1 << MECHANIC_STUN, AURA_REMOVE_BY_ENEMY_SPELL); + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActionTarget()->RemoveAurasWithMechanic(1 << MECHANIC_STUN, AURA_REMOVE_BY_ENEMY_SPELL); } void Register() override { + DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_divine_purpose::CheckProc, EFFECT_2, SPELL_AURA_DUMMY); OnEffectProc += AuraEffectProcFn(spell_pal_divine_purpose::HandleProc, EFFECT_2, SPELL_AURA_DUMMY); } }; @@ -599,22 +602,26 @@ class spell_pal_eye_for_an_eye : public AuraScript return ValidateSpellInfo({ SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + return damageInfo && damageInfo->GetDamage(); + } + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; // return damage % to attacker but < 50% own total health - int32 damage = std::min(CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()), static_cast(GetTarget()->GetMaxHealth()) / 2); + int32 damage = std::min(CalculatePct(static_cast(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()), static_cast(eventInfo.GetActionTarget()->GetMaxHealth()) / 2); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(damage); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, args); + eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, args); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pal_eye_for_an_eye::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye::OnProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -637,7 +644,7 @@ class spell_pal_glyph_of_divinity : public AuraScript return; Unit* caster = eventInfo.GetActor(); - if (caster == eventInfo.GetProcTarget()) + if (caster == eventInfo.GetActionTarget()) return; CastSpellExtraArgs args(aurEff); @@ -684,12 +691,17 @@ class spell_pal_glyph_of_holy_light_dummy : public AuraScript return ValidateSpellInfo({ SPELL_PALADIN_GLYPH_OF_HOLY_LIGHT_HEAL }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetHeal(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); + HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; uint32 basePoints = healInfo->GetSpellInfo()->GetEffect(EFFECT_0).BasePoints + healInfo->GetSpellInfo()->GetEffect(EFFECT_0).DieSides; uint32 healAmount; @@ -700,11 +712,12 @@ class spell_pal_glyph_of_holy_light_dummy : public AuraScript CastSpellExtraArgs args(aurEff); args.AddSpellBP0(CalculatePct(healAmount, aurEff->GetAmount())); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_PALADIN_GLYPH_OF_HOLY_LIGHT_HEAL, args); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_PALADIN_GLYPH_OF_HOLY_LIGHT_HEAL, args); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pal_glyph_of_holy_light_dummy::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pal_glyph_of_holy_light_dummy::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -803,7 +816,7 @@ class spell_pal_heart_of_the_crusader : public AuraScript PreventDefaultAction(); uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HEART_OF_THE_CRUSADER_EFF_R1, GetSpellInfo()->GetRank()); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), spellId, aurEff); } void Register() override @@ -1140,39 +1153,47 @@ class spell_pal_item_t6_trinket : public AuraScript }); } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckProc(ProcEventInfo& eventInfo) { - PreventDefaultAction(); SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); if (!spellInfo) - return; - - uint32 spellId; - int32 chance; + return false; // Holy Light & Flash of Light if (spellInfo->SpellFamilyFlags[0] & 0xC0000000) { - spellId = SPELL_PALADIN_ENDURING_LIGHT; - chance = 15; + if (!roll_chance_i(15)) + return false; + + _triggeredSpellId = SPELL_PALADIN_ENDURING_LIGHT; + return true; } // Judgements else if (spellInfo->SpellFamilyFlags[0] & 0x00800000) { - spellId = SPELL_PALADIN_ENDURING_JUDGEMENT; - chance = 50; + if (!roll_chance_i(50)) + return false; + + _triggeredSpellId = SPELL_PALADIN_ENDURING_JUDGEMENT; + return true; } - else - return; - if (roll_chance_i(chance)) - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, aurEff); + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), _triggeredSpellId, aurEff); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pal_item_t6_trinket::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pal_item_t6_trinket::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } + + uint32 _triggeredSpellId = 0; }; // 53407 - Judgement of Justice @@ -1256,7 +1277,7 @@ class spell_pal_judgement_of_light_heal : public AuraScript { PreventDefaultAction(); - Unit* caster = eventInfo.GetProcTarget(); + Unit* caster = eventInfo.GetActor(); CastSpellExtraArgs args(aurEff); args.OriginalCaster = GetCasterGUID(); @@ -1282,7 +1303,7 @@ class spell_pal_judgement_of_wisdom_mana : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetProcTarget()->GetPowerType() == POWER_MANA; + return eventInfo.GetActor()->GetPowerType() == POWER_MANA; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) @@ -1291,7 +1312,7 @@ class spell_pal_judgement_of_wisdom_mana : public AuraScript SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_JUDGEMENT_OF_WISDOM_MANA); - Unit* caster = eventInfo.GetProcTarget(); + Unit* caster = eventInfo.GetActor(); int32 const amount = CalculatePct(static_cast(caster->GetCreateMana()), spellInfo->GetEffect(EFFECT_0).CalcValue()); CastSpellExtraArgs args(aurEff); args.OriginalCaster = GetCasterGUID(); @@ -1517,19 +1538,21 @@ class spell_pal_righteous_vengeance : public AuraScript return ValidateSpellInfo({ SPELL_PALADIN_RIGHTEOUS_VENGEANCE_DAMAGE }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + return damageInfo && damageInfo->GetDamage(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; - Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_RIGHTEOUS_VENGEANCE_DAMAGE); - int32 amount = CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()); + int32 amount = CalculatePct(static_cast(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); ASSERT(spellInfo->GetMaxTicks() > 0); amount /= spellInfo->GetMaxTicks(); @@ -1541,6 +1564,7 @@ class spell_pal_righteous_vengeance : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pal_righteous_vengeance::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pal_righteous_vengeance::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -1637,16 +1661,11 @@ class spell_pal_seal_of_righteousness : public AuraScript return ValidateSpellInfo({ SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS }); } - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget() != nullptr; - } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - Unit* victim = eventInfo.GetProcTarget(); + Unit* victim = eventInfo.GetActionTarget(); float ap = GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK); ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS); @@ -1660,12 +1679,11 @@ class spell_pal_seal_of_righteousness : public AuraScript int32 bp = std::lroundf(mws * (0.022f * ap + 0.044f * sph)); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(bp); - GetTarget()->CastSpell(victim, SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, args); + eventInfo.GetActor()->CastSpell(victim, SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, args); } void Register() override { - DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_righteousness::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_righteousness::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -1722,7 +1740,7 @@ class spell_pal_seal_of_vengeance : public SpellScriptLoader } // don't cast triggered, spell already has SPELL_ATTR4_CAN_CAST_WHILE_CASTING attr - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), DoTSpell, CastSpellExtraArgs(TRIGGERED_DONT_RESET_PERIODIC_TIMER).SetTriggeringAura(aurEff)); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), DoTSpell, CastSpellExtraArgs(TRIGGERED_DONT_RESET_PERIODIC_TIMER).SetTriggeringAura(aurEff)); } void HandleSeal(AuraEffect const* aurEff, ProcEventInfo& eventInfo) @@ -1730,7 +1748,7 @@ class spell_pal_seal_of_vengeance : public SpellScriptLoader PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); // get current aura on target, if any AuraEffect const* sealDot = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PALADIN, 0x00000000, 0x00000800, 0x00000000, caster->GetGUID()); @@ -1767,6 +1785,7 @@ class spell_pal_seal_of_vengeance : public SpellScriptLoader }; // 20375 - Seal of Command +// 20154 - Seal of Righteousness // 21084 - Seal of Righteousness // 31801 - Seal of Vengeance // 31892 - Seal of Blood @@ -1787,6 +1806,9 @@ class spell_pal_seals : public AuraScript void Register() override { + if (m_scriptSpellId == 20154) + return; // another console log prevention hack - first "rank" of Seal of Righteousness doesn't have the judgement effect + DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_seals::CheckDummyProc, EFFECT_2, SPELL_AURA_DUMMY); } }; @@ -1804,7 +1826,7 @@ class spell_pal_spiritual_attunement : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { // "when healed by other friendly targets' spells" - if (eventInfo.GetProcTarget() == eventInfo.GetActionTarget()) + if (eventInfo.GetActor() == eventInfo.GetActionTarget()) return false; return eventInfo.GetHealInfo() && eventInfo.GetHealInfo()->GetEffectiveHeal(); @@ -1838,19 +1860,21 @@ class spell_pal_sheath_of_light : public AuraScript return ValidateSpellInfo({ SPELL_PALADIN_SHEATH_OF_LIGHT_HEAL }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetEffectiveHeal(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetEffectiveHeal()) - return; - Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_SHEATH_OF_LIGHT_HEAL); - int32 amount = CalculatePct(static_cast(healInfo->GetEffectiveHeal()), aurEff->GetAmount()); + int32 amount = CalculatePct(static_cast(eventInfo.GetHealInfo()->GetEffectiveHeal()), aurEff->GetAmount()); ASSERT(spellInfo->GetMaxTicks() > 0); amount /= spellInfo->GetMaxTicks(); @@ -1862,6 +1886,7 @@ class spell_pal_sheath_of_light : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pal_sheath_of_light::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pal_sheath_of_light::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); } }; @@ -1888,7 +1913,7 @@ class spell_pal_t3_6p_bonus : public AuraScript uint32 spellId; Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); switch (target->GetClass()) { @@ -1932,19 +1957,21 @@ class spell_pal_t8_2p_bonus : public AuraScript return ValidateSpellInfo({ SPELL_PALADIN_HOLY_MENDING }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetHeal(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; - Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_HOLY_MENDING); - int32 amount = CalculatePct(static_cast(healInfo->GetHeal()), aurEff->GetAmount()); + int32 amount = CalculatePct(static_cast(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()); ASSERT(spellInfo->GetMaxTicks() > 0); amount /= spellInfo->GetMaxTicks(); @@ -1956,6 +1983,7 @@ class spell_pal_t8_2p_bonus : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pal_t8_2p_bonus::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pal_t8_2p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index ba55c1cbc7a..781bbe1cda7 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -154,24 +154,27 @@ class spell_pri_aq_3p_bonus : public AuraScript return ValidateSpellInfo({ SPELL_PRIEST_ORACULAR_HEAL }); } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckProc(ProcEventInfo& eventInfo) { - PreventDefaultAction(); - Unit* caster = eventInfo.GetActor(); - if (caster == eventInfo.GetProcTarget()) - return; + if (eventInfo.GetActor() == eventInfo.GetActionTarget()) + return false; HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; + return healInfo && healInfo->GetHeal(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), 10)); - caster->CastSpell(caster, SPELL_PRIEST_ORACULAR_HEAL, args); + args.AddSpellBP0(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 10)); + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_PRIEST_ORACULAR_HEAL, args); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pri_aq_3p_bonus::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pri_aq_3p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -227,37 +230,35 @@ class spell_pri_body_and_soul : public AuraScript }); } - void HandleProcTriggerSpell(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + bool CheckProcTriggerSpell(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { // Proc only on Power Word: Shield SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo || !(spellInfo->SpellFamilyFlags[0] & 0x00000001)) - { - PreventDefaultAction(); - return; - } + return spellInfo && (spellInfo->SpellFamilyFlags[0] & 0x00000001) != 0; } - void HandleProcDummy(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckProcDummy(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { - PreventDefaultAction(); - // Proc only on self casted abolish disease + if (eventInfo.GetActor() != eventInfo.GetActionTarget()) + return false; + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo) - return; + return spellInfo && spellInfo->Id == SPELL_PRIEST_ABOLISH_DISEASE; + } - Unit* caster = eventInfo.GetActor(); - if (spellInfo->Id != SPELL_PRIEST_ABOLISH_DISEASE || caster != eventInfo.GetProcTarget()) - return; + void HandleProcDummy(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); if (roll_chance_i(aurEff->GetAmount())) - caster->CastSpell(caster, SPELL_PRIEST_BODY_AND_SOUL_POISON_TRIGGER, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_PRIEST_BODY_AND_SOUL_POISON_TRIGGER, aurEff); } void Register() override { - OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul::HandleProcTriggerSpell, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_body_and_soul::CheckProcTriggerSpell, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_body_and_soul::CheckProcDummy, EFFECT_1, SPELL_AURA_DUMMY); OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul::HandleProcDummy, EFFECT_1, SPELL_AURA_DUMMY); } }; @@ -303,28 +304,25 @@ class spell_pri_divine_aegis : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetProcTarget() != nullptr; + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetHeal(); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; - - int32 absorb = CalculatePct(healInfo->GetHeal(), aurEff->GetAmount()); + int32 absorb = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount()); // Multiple effects stack, so let's try to find this aura. - if (AuraEffect const* aegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0)) + if (AuraEffect const* aegis = eventInfo.GetActionTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0)) absorb += aegis->GetAmount(); - absorb = std::min(absorb, eventInfo.GetProcTarget()->GetLevel() * 125); + absorb = std::min(absorb, eventInfo.GetActionTarget()->GetLevel() * 125); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(absorb); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_DIVINE_AEGIS, args); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_PRIEST_DIVINE_AEGIS, args); } void Register() override @@ -368,15 +366,18 @@ class spell_pri_glyph_of_dispel_magic : public AuraScript return ValidateSpellInfo({ SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL }); } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckProc(ProcEventInfo& eventInfo) { - PreventDefaultAction(); // Dispel Magic shares spellfamilyflag with abolish disease SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo || spellInfo->SpellIconID != 74) - return; + return spellInfo && spellInfo->SpellIconID == 74; + } - Unit* target = eventInfo.GetProcTarget(); + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* target = eventInfo.GetActionTarget(); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(target->CountPctFromMaxHealth(aurEff->GetAmount())); @@ -385,6 +386,7 @@ class spell_pri_glyph_of_dispel_magic : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pri_glyph_of_dispel_magic::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_dispel_magic::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -399,24 +401,27 @@ class spell_pri_glyph_of_prayer_of_healing : public AuraScript return ValidateSpellInfo({ SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetHeal(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; - SpellInfo const* triggeredSpellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL); ASSERT(triggeredSpellInfo->GetMaxTicks() > 0); CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks()); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, args); + args.AddSpellBP0(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks()); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, args); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pri_glyph_of_prayer_of_healing::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_prayer_of_healing::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -1193,7 +1198,7 @@ class spell_pri_t3_4p_bonus : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_ARMOR_OF_FAITH, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_PRIEST_ARMOR_OF_FAITH, aurEff); } void Register() override @@ -1246,22 +1251,24 @@ class spell_pri_t10_heal_2p_bonus : public AuraScript return ValidateSpellInfo({ SPELL_PRIEST_BLESSED_HEALING }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + HealInfo* healInfo = eventInfo.GetHealInfo(); + return healInfo && healInfo->GetHeal(); + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; - SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_BLESSED_HEALING); - int32 amount = CalculatePct(static_cast(healInfo->GetHeal()), aurEff->GetAmount()); + int32 amount = CalculatePct(static_cast(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()); ASSERT(spellInfo->GetMaxTicks() > 0); amount /= spellInfo->GetMaxTicks(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(amount); @@ -1270,6 +1277,7 @@ class spell_pri_t10_heal_2p_bonus : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_pri_t10_heal_2p_bonus::CheckProc); OnEffectProc += AuraEffectProcFn(spell_pri_t10_heal_2p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 9a60d1816f1..b0b6f4681f5 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -71,7 +71,7 @@ class spell_rog_blade_flurry : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget()); + _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetActionTarget()); return _procTarget != nullptr; } @@ -186,7 +186,7 @@ class spell_rog_deadly_brew : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_ROGUE_CRIPPLING_POISON, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_ROGUE_CRIPPLING_POISON, aurEff); } void Register() override @@ -637,7 +637,7 @@ class spell_rog_glyph_of_backstab : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_ROGUE_GLYPH_OF_BACKSTAB_TRIGGER, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_ROGUE_GLYPH_OF_BACKSTAB_TRIGGER, aurEff); } void Register() override diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 74bed44d1d0..e7ec0cd9c51 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -483,7 +483,7 @@ class spell_sha_earthliving_weapon : public AuraScript int32 chance = 20; Unit* caster = eventInfo.GetActor(); if (AuraEffect const* aurEff = caster->GetAuraEffectOfRankedSpell(SPELL_SHAMAN_BLESSING_OF_THE_ETERNALS_R1, EFFECT_1, caster->GetGUID())) - if (eventInfo.GetProcTarget()->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT)) + if (eventInfo.GetActionTarget()->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT)) chance += aurEff->GetAmount(); return roll_chance_i(chance); @@ -614,7 +614,7 @@ class spell_sha_flametongue_weapon : public AuraScript PreventDefaultAction(); Player* player = eventInfo.GetActor()->ToPlayer(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); WeaponAttackType attType = BASE_ATTACK; if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK) attType = OFF_ATTACK; @@ -678,7 +678,7 @@ class spell_sha_frozen_power : public AuraScript SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_FREEZE); float minDistance(spellInfo->GetEffect(EFFECT_0).CalcValue(caster)); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); if (caster->GetDistance(target) < minDistance) return; @@ -704,7 +704,7 @@ class spell_sha_glyph_of_earth_shield : public AuraScript if (!earthShield) return; - AuraEffect* earthShieldEffect = eventInfo.GetProcTarget()->GetAuraEffect(earthShield->Id, EFFECT_0, eventInfo.GetActor()->GetGUID()); + AuraEffect* earthShieldEffect = eventInfo.GetActionTarget()->GetAuraEffect(earthShield->Id, EFFECT_0, eventInfo.GetActor()->GetGUID()); if (!earthShieldEffect) return; @@ -729,24 +729,27 @@ class spell_sha_glyph_of_healing_wave : public AuraScript return ValidateSpellInfo({ SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE_HEAL }); } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckProc(ProcEventInfo& eventInfo) { - PreventDefaultAction(); - Unit* caster = eventInfo.GetActor(); - if (caster == eventInfo.GetProcTarget()) - return; + if (eventInfo.GetActor() == eventInfo.GetActionTarget()) + return false; HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; + return healInfo && healInfo->GetHeal(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount())); - caster->CastSpell(nullptr, SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE_HEAL, args); + args.AddSpellBP0(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount())); + eventInfo.GetActor()->CastSpell(nullptr, SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE_HEAL, args); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_sha_glyph_of_healing_wave::CheckProc); OnEffectProc += AuraEffectProcFn(spell_sha_glyph_of_healing_wave::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -963,7 +966,7 @@ class spell_sha_lightning_overload : public AuraScript spellId = sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_R1, spellInfo->GetRank()); } - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), spellId, aurEff); } void Register() override @@ -985,7 +988,7 @@ class spell_sha_item_lightning_shield : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD, aurEff); } void Register() override @@ -1004,10 +1007,10 @@ class spell_sha_item_lightning_shield_trigger : public AuraScript return ValidateSpellInfo({ SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE }); } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE, aurEff); + eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE, aurEff); } void Register() override @@ -1516,7 +1519,7 @@ class spell_sha_static_shock : public AuraScript return; uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LIGHTNING_SHIELD_DAMAGE_R1, lightningShield->GetSpellInfo()->GetRank()); - eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), spellId, aurEff); lightningShield->GetBase()->DropCharge(); } @@ -1615,7 +1618,7 @@ class spell_sha_t3_6p_bonus : public AuraScript uint32 spellId; Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); switch (target->GetClass()) { @@ -1694,7 +1697,7 @@ class spell_sha_t8_elemental_4p_bonus : public AuraScript amount /= spellInfo->GetMaxTicks(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(amount); @@ -1732,7 +1735,7 @@ class spell_sha_t9_elemental_4p_bonus : public AuraScript amount /= spellInfo->GetMaxTicks(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(amount); @@ -1755,7 +1758,7 @@ class spell_sha_t10_elemental_4p_bonus : public AuraScript PreventDefaultAction(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); // try to find spell Flame Shock on the target AuraEffect* flameShock = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x00000000, 0x00000000, caster->GetGUID()); @@ -1804,7 +1807,7 @@ class spell_sha_t10_restoration_4p_bonus : public AuraScript amount /= spellInfo->GetMaxTicks(); Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetProcTarget(); + Unit* target = eventInfo.GetActionTarget(); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(amount); @@ -1895,7 +1898,7 @@ class spell_sha_windfury_weapon : public AuraScript args.AddSpellBP0(amount); // Attack twice for (uint8 i = 0; i < 2; ++i) - player->CastSpell(eventInfo.GetProcTarget(), spellId, args); + player->CastSpell(eventInfo.GetActionTarget(), spellId, args); } void Register() override diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index e1de6fd68d5..bac0337f9c0 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -449,13 +449,9 @@ class spell_warl_drain_soul : public AuraScript // Drain Soul's proc tries to happen each time the warlock lands a killing blow on a unit while channeling. // Make sure that dying unit is afflicted by the caster's Drain Soul debuff in order to avoid a false positive. - Unit* caster = GetCaster(); - Unit* victim = eventInfo.GetProcTarget(); - - if (caster && victim) - return victim->GetAuraApplicationOfRankedSpell(SPELL_WARLOCK_DRAIN_SOUL_R1, caster->GetGUID()) != 0; - - return false; + Unit* caster = eventInfo.GetActor(); + Unit* victim = eventInfo.GetActionTarget(); + return victim->GetAuraApplicationOfRankedSpell(SPELL_WARLOCK_DRAIN_SOUL_R1, caster->GetGUID()) != 0; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) @@ -621,7 +617,7 @@ class spell_warl_glyph_of_shadowflame : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME, aurEff); + eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME, aurEff); } void Register() override diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 1ea3ca5206d..d9b4014a7ae 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -196,10 +196,10 @@ class spell_warr_damage_shield : public AuraScript PreventDefaultAction(); // % of amount blocked - int32 damage = CalculatePct(int32(GetTarget()->GetShieldBlockValue()), aurEff->GetAmount()); + int32 damage = CalculatePct(int32(eventInfo.GetActionTarget()->GetShieldBlockValue()), aurEff->GetAmount()); CastSpellExtraArgs args(aurEff); args.AddSpellBP0(damage); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, args); + eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, args); } void Register() override @@ -282,7 +282,7 @@ class spell_warr_deep_wounds_aura : public AuraScript CastSpellExtraArgs args(aurEff); args.AddSpellBP0(damage); - actor->CastSpell(eventInfo.GetProcTarget(), GetEffectInfo(EFFECT_0).TriggerSpell, args); + actor->CastSpell(eventInfo.GetActionTarget(), GetEffectInfo(EFFECT_0).TriggerSpell, args); } void Register() override @@ -622,13 +622,13 @@ class spell_warr_retaliation : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { // check attack comes not from behind and warrior is not stunned - return GetTarget()->isInFront(eventInfo.GetActor(), float(M_PI)) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED); + return eventInfo.GetActionTarget()->isInFront(eventInfo.GetActor(), float(M_PI)) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED); } void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARRIOR_RETALIATION_DAMAGE, aurEff); + eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_WARRIOR_RETALIATION_DAMAGE, aurEff); } void Register() override @@ -735,7 +735,7 @@ class spell_warr_sweeping_strikes : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget()); + _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetActionTarget()); return _procTarget != nullptr; } diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index 89417cb3362..5a82e210f5a 100644 --- a/src/server/scripts/World/item_scripts.cpp +++ b/src/server/scripts/World/item_scripts.cpp @@ -77,7 +77,7 @@ class item_only_for_flight : public ItemScript return false; // error - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, nullptr); return true; } }; @@ -178,7 +178,7 @@ class item_captured_frog : public ItemScript player->SendEquipError(EQUIP_ERR_OUT_OF_RANGE, item, nullptr); } else - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, item, nullptr); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, nullptr); return true; } }; diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 31c4702224e..77b6f3a6f45 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -409,7 +409,7 @@ void ProcessUnlearnAction(Player* player, Creature* creature, uint32 spellId, ui player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, 0, 0); } else - player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, nullptr, nullptr); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, nullptr, nullptr); CloseGossipMenuFor(player); } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index e9f6fa7f605..df0e4b1e3e8 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -897,9 +897,6 @@ void npc_doctor::npc_doctorAI::UpdateAI(uint32 diff) if (Creature* Patient = me->SummonCreature(patientEntry, **point, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5s)) { - //303, this flag appear to be required for client side item->spell to work (TARGET_SINGLE_FRIEND) - Patient->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); - Patients.push_back(Patient->GetGUID()); ENSURE_AI(npc_injured_patient::npc_injured_patientAI, Patient->AI())->DoctorGUID = me->GetGUID(); ENSURE_AI(npc_injured_patient::npc_injured_patientAI, Patient->AI())->Coord = *point; @@ -915,175 +912,6 @@ void npc_doctor::npc_doctorAI::UpdateAI(uint32 diff) } } -/*###### -## npc_garments_of_quests -######*/ - -/// @todo get text for each NPC - -enum Garments -{ - SPELL_LESSER_HEAL_R2 = 2052, - SPELL_FORTITUDE_R1 = 1243, - - QUEST_MOON = 5621, - QUEST_LIGHT_1 = 5624, - QUEST_LIGHT_2 = 5625, - QUEST_SPIRIT = 5648, - QUEST_DARKNESS = 5650, - - ENTRY_SHAYA = 12429, - ENTRY_ROBERTS = 12423, - ENTRY_DOLF = 12427, - ENTRY_KORJA = 12430, - ENTRY_DG_KEL = 12428, - - // used by 12429, 12423, 12427, 12430, 12428, but signed for 12429 - SAY_THANKS = 0, - SAY_GOODBYE = 1, - SAY_HEALED = 2, -}; - -class npc_garments_of_quests : public CreatureScript -{ -public: - npc_garments_of_quests() : CreatureScript("npc_garments_of_quests") { } - - struct npc_garments_of_questsAI : public EscortAI - { - npc_garments_of_questsAI(Creature* creature) : EscortAI(creature) - { - switch (me->GetEntry()) - { - case ENTRY_SHAYA: - quest = QUEST_MOON; - break; - case ENTRY_ROBERTS: - quest = QUEST_LIGHT_1; - break; - case ENTRY_DOLF: - quest = QUEST_LIGHT_2; - break; - case ENTRY_KORJA: - quest = QUEST_SPIRIT; - break; - case ENTRY_DG_KEL: - quest = QUEST_DARKNESS; - break; - default: - quest = 0; - break; - } - - Initialize(); - } - - void Initialize() - { - IsHealed = false; - CanRun = false; - - RunAwayTimer = 5000; - } - - ObjectGuid CasterGUID; - - bool IsHealed; - bool CanRun; - - uint32 RunAwayTimer; - uint32 quest; - - void Reset() override - { - CasterGUID.Clear(); - - Initialize(); - - me->SetStandState(UNIT_STAND_STATE_KNEEL); - // expect database to have RegenHealth=0 - me->SetHealth(me->CountPctFromMaxHealth(70)); - } - - void JustEngagedWith(Unit* /*who*/) override { } - - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == SPELL_LESSER_HEAL_R2 || spellInfo->Id == SPELL_FORTITUDE_R1) - { - //not while in combat - if (me->IsInCombat()) - return; - - //nothing to be done now - if (IsHealed && CanRun) - return; - - if (Player* player = caster->ToPlayer()) - { - if (quest && player->GetQuestStatus(quest) == QUEST_STATUS_INCOMPLETE) - { - if (IsHealed && !CanRun && spellInfo->Id == SPELL_FORTITUDE_R1) - { - Talk(SAY_THANKS, player); - CanRun = true; - } - else if (!IsHealed && spellInfo->Id == SPELL_LESSER_HEAL_R2) - { - CasterGUID = player->GetGUID(); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_HEALED, player); - IsHealed = true; - } - } - - // give quest credit, not expect any special quest objectives - if (CanRun) - player->TalkedToCreature(me->GetEntry(), me->GetGUID()); - } - } - } - - void UpdateAI(uint32 diff) override - { - if (CanRun && !me->IsInCombat()) - { - if (RunAwayTimer <= diff) - { - if (Unit* unit = ObjectAccessor::GetUnit(*me, CasterGUID)) - { - switch (me->GetEntry()) - { - case ENTRY_SHAYA: - case ENTRY_ROBERTS: - case ENTRY_DOLF: - case ENTRY_KORJA: - case ENTRY_DG_KEL: - Talk(SAY_GOODBYE, unit); - break; - } - - Start(false, true); - } - else - EnterEvadeMode(); //something went wrong - - RunAwayTimer = 30000; - } - else - RunAwayTimer -= diff; - } - - EscortAI::UpdateAI(diff); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_garments_of_questsAI(creature); - } -}; - /*###### ## npc_guardian ######*/ @@ -2459,7 +2287,6 @@ void AddSC_npcs_special() new npc_midsummer_bunny_pole(); new npc_doctor(); new npc_injured_patient(); - new npc_garments_of_quests(); new npc_guardian(); new npc_steam_tonk(); new npc_tournament_mount(); diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt index 5fd13cee9d4..56c6ef3789c 100644 --- a/src/server/shared/CMakeLists.txt +++ b/src/server/shared/CMakeLists.txt @@ -20,8 +20,6 @@ endif() GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) -add_definitions(-DTRINITY_API_EXPORT_SHARED) - add_library(shared ${PRIVATE_PCH_SOURCE} ${PRIVATE_SOURCES} @@ -39,6 +37,10 @@ target_include_directories(shared PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +set_target_properties(shared + PROPERTIES + DEFINE_SYMBOL TRINITY_API_EXPORT_SHARED) + target_link_libraries(shared PRIVATE trinity-core-interface diff --git a/src/server/shared/Networking/NetworkThread.h b/src/server/shared/Networking/NetworkThread.h index 5f9071af656..e149867c962 100644 --- a/src/server/shared/Networking/NetworkThread.h +++ b/src/server/shared/Networking/NetworkThread.h @@ -122,7 +122,7 @@ class NetworkThread { TC_LOG_DEBUG("misc", "Network Thread Starting"); - _updateTimer.expires_from_now(boost::posix_time::milliseconds(1)); + _updateTimer.expires_after(1ms); _updateTimer.async_wait([this](boost::system::error_code const&) { Update(); }); _ioContext.run(); @@ -136,7 +136,7 @@ class NetworkThread if (_stopped) return; - _updateTimer.expires_from_now(boost::posix_time::milliseconds(1)); + _updateTimer.expires_after(1ms); _updateTimer.async_wait([this](boost::system::error_code const&) { Update(); }); AddNewSockets(); diff --git a/src/server/shared/Realm/RealmList.cpp b/src/server/shared/Realm/RealmList.cpp index f68623c5a5d..b525707cf4d 100644 --- a/src/server/shared/Realm/RealmList.cpp +++ b/src/server/shared/Realm/RealmList.cpp @@ -167,7 +167,7 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) if (_updateInterval) { - _updateTimer->expires_from_now(boost::posix_time::seconds(_updateInterval)); + _updateTimer->expires_after(std::chrono::seconds(_updateInterval)); _updateTimer->async_wait(std::bind(&RealmList::UpdateRealms, this, std::placeholders::_1)); } } diff --git a/src/server/shared/Secrets/SecretMgr.cpp b/src/server/shared/Secrets/SecretMgr.cpp index 2672511b375..9031d8f209e 100644 --- a/src/server/shared/Secrets/SecretMgr.cpp +++ b/src/server/shared/Secrets/SecretMgr.cpp @@ -17,7 +17,7 @@ #include "SecretMgr.h" #include "AES.h" -#include "Argon2.h" +#include "Argon2Hash.h" #include "Config.h" #include "CryptoGenerics.h" #include "DatabaseEnv.h" diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 2ae3043b79c..e263346932f 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -480,7 +480,7 @@ enum SpellAttr2 : uint32 SPELL_ATTR2_CAN_TARGET_DEAD = 0x00000001, // TITLE Can target dead players or corpses SPELL_ATTR2_UNK1 = 0x00000002, // TITLE Unknown attribute 1@Attr2 SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS = 0x00000004, // TITLE Ignore Line of Sight - SPELL_ATTR2_UNK3 = 0x00000008, // TITLE Ignore aura scaling + SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF = 0x00000008, // TITLE Allow Low Level Buff SPELL_ATTR2_DISPLAY_IN_STANCE_BAR = 0x00000010, // TITLE Show in stance bar (client only) SPELL_ATTR2_AUTOREPEAT_FLAG = 0x00000020, // TITLE Ranged auto-attack spell SPELL_ATTR2_CANT_TARGET_TAPPED = 0x00000040, // TITLE Cannot target others' tapped units DESCRIPTION Can only target untapped units, or those tapped by caster @@ -507,7 +507,7 @@ enum SpellAttr2 : uint32 SPELL_ATTR2_UNK27 = 0x08000000, // TITLE Unknown attribute 27@Attr2 SPELL_ATTR2_UNK28 = 0x10000000, // TITLE Unknown attribute 28@Attr2 SPELL_ATTR2_CANT_CRIT = 0x20000000, // TITLE Cannot critically strike - SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC = 0x40000000, // TITLE Allow triggered spell to trigger (type 1) DESCRIPTION Without this attribute, any triggered spell will be unable to trigger other auras' procs + SPELL_ATTR2_ACTIVE_THREAT = 0x40000000, // TITLE Active Threat SPELL_ATTR2_FOOD_BUFF = 0x80000000 // TITLE Food buff (client only) }; @@ -523,7 +523,7 @@ enum SpellAttr3 : uint32 SPELL_ATTR3_UNK6 = 0x00000040, // TITLE Unknown attribute 6@Attr3 SPELL_ATTR3_STACK_FOR_DIFF_CASTERS = 0x00000080, // TITLE Stack separately for each caster SPELL_ATTR3_ONLY_TARGET_PLAYERS = 0x00000100, // TITLE Can only target players - SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2 = 0x00000200, // TITLE Allow triggered spell to trigger (type 2) DESCRIPTION Without this attribute, any triggered spell will be unable to trigger other auras' procs + SPELL_ATTR3_NOT_A_PROC = 0x00000200, // TITLE Not a Proc DESCRIPTION Without this attribute, any triggered spell will be unable to trigger other auras' procs SPELL_ATTR3_MAIN_HAND = 0x00000400, // TITLE Require main hand weapon SPELL_ATTR3_BATTLEGROUND = 0x00000800, // TITLE Can only be cast in battleground SPELL_ATTR3_ONLY_TARGET_GHOSTS = 0x00001000, // TITLE Can only target ghost players @@ -540,7 +540,7 @@ enum SpellAttr3 : uint32 SPELL_ATTR3_UNK23 = 0x00800000, // TITLE Unknown attribute 23@Attr3 SPELL_ATTR3_REQ_OFFHAND = 0x01000000, // TITLE Requires offhand weapon SPELL_ATTR3_TREAT_AS_PERIODIC = 0x02000000, // TITLE Treat as periodic effect - SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED = 0x04000000, // TITLE Can trigger from triggered spells + SPELL_ATTR3_CAN_PROC_FROM_PROCS = 0x04000000, // TITLE Can Proc From Procs SPELL_ATTR3_DRAIN_SOUL = 0x08000000, // TITLE Drain Soul SPELL_ATTR3_UNK28 = 0x10000000, // TITLE Unknown attribute 28@Attr3 SPELL_ATTR3_NO_DONE_BONUS = 0x20000000, // TITLE Damage dealt is unaffected by modifiers @@ -2766,6 +2766,13 @@ enum CreatureEliteType CREATURE_ELITE_TRIVIAL = 5 // found in 2.2.3 for 2 mobs }; +enum class StringIdType : int32 +{ + Template = 0, + Spawn = 1, + Script = 2 +}; + // values based at Holidays.dbc enum HolidayIds { @@ -3663,23 +3670,32 @@ enum DuelCompleteType : uint8 DUEL_FLED = 2 }; -// handle the queue types and bg types separately to enable joining queue for different sized arenas at the same time -enum BattlegroundQueueTypeId +struct BattlegroundQueueTypeId { - BATTLEGROUND_QUEUE_NONE = 0, - BATTLEGROUND_QUEUE_AV = 1, - BATTLEGROUND_QUEUE_WS = 2, - BATTLEGROUND_QUEUE_AB = 3, - BATTLEGROUND_QUEUE_EY = 4, - BATTLEGROUND_QUEUE_SA = 5, - BATTLEGROUND_QUEUE_IC = 6, - BATTLEGROUND_QUEUE_RB = 7, - BATTLEGROUND_QUEUE_2v2 = 8, - BATTLEGROUND_QUEUE_3v3 = 9, - BATTLEGROUND_QUEUE_5v5 = 10, - MAX_BATTLEGROUND_QUEUE_TYPES + uint16 BattlemasterListId; + uint8 BracketId; + uint8 TeamSize; + + static constexpr BattlegroundQueueTypeId FromPacked(uint64 packedQueueId) + { + return { .BattlemasterListId = uint16((packedQueueId >> 16) & 0xFFFF), .BracketId = uint8((packedQueueId >> 8) & 0x7F), .TeamSize = uint8(packedQueueId & 0x7F) }; + } + + constexpr uint64 GetPacked() const + { + return (uint64(BattlemasterListId) << 16) + | (uint64(BracketId & 0xFF) << 8) + | (uint64(TeamSize & 0x3F)) + | UI64LIT(0x1F90000000000000); + } + + constexpr bool operator==(BattlegroundQueueTypeId const& right) const = default; + + constexpr std::strong_ordering operator<=>(BattlegroundQueueTypeId const& right) const = default; }; +constexpr BattlegroundQueueTypeId BATTLEGROUND_QUEUE_NONE = { 0, 0, 0 }; + enum GroupJoinBattlegroundResult { // positive values are indexes in BattlemasterList.dbc diff --git a/src/server/shared/enuminfo_SharedDefines.cpp b/src/server/shared/enuminfo_SharedDefines.cpp index c29d65018a6..776c1f99389 100644 --- a/src/server/shared/enuminfo_SharedDefines.cpp +++ b/src/server/shared/enuminfo_SharedDefines.cpp @@ -529,7 +529,7 @@ TC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr2 value) case SPELL_ATTR2_CAN_TARGET_DEAD: return { "SPELL_ATTR2_CAN_TARGET_DEAD", "Can target dead players or corpses", "" }; case SPELL_ATTR2_UNK1: return { "SPELL_ATTR2_UNK1", "Unknown attribute 1@Attr2", "" }; case SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS: return { "SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS", "Ignore Line of Sight", "" }; - case SPELL_ATTR2_UNK3: return { "SPELL_ATTR2_UNK3", "Ignore aura scaling", "" }; + case SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF: return { "SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF", "Allow Low Level Buff", "" }; case SPELL_ATTR2_DISPLAY_IN_STANCE_BAR: return { "SPELL_ATTR2_DISPLAY_IN_STANCE_BAR", "Show in stance bar (client only)", "" }; case SPELL_ATTR2_AUTOREPEAT_FLAG: return { "SPELL_ATTR2_AUTOREPEAT_FLAG", "Ranged auto-attack spell", "" }; case SPELL_ATTR2_CANT_TARGET_TAPPED: return { "SPELL_ATTR2_CANT_TARGET_TAPPED", "Cannot target others' tapped units", "Can only target untapped units, or those tapped by caster" }; @@ -556,7 +556,7 @@ TC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr2 value) case SPELL_ATTR2_UNK27: return { "SPELL_ATTR2_UNK27", "Unknown attribute 27@Attr2", "" }; case SPELL_ATTR2_UNK28: return { "SPELL_ATTR2_UNK28", "Unknown attribute 28@Attr2", "" }; case SPELL_ATTR2_CANT_CRIT: return { "SPELL_ATTR2_CANT_CRIT", "Cannot critically strike", "" }; - case SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC: return { "SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC", "Allow triggered spell to trigger (type 1)", "Without this attribute, any triggered spell will be unable to trigger other auras' procs" }; + case SPELL_ATTR2_ACTIVE_THREAT: return { "SPELL_ATTR2_ACTIVE_THREAT", "Active Threat", "" }; case SPELL_ATTR2_FOOD_BUFF: return { "SPELL_ATTR2_FOOD_BUFF", "Food buff (client only)", "" }; default: throw std::out_of_range("value"); } @@ -573,7 +573,7 @@ TC_API_EXPORT SpellAttr2 EnumUtils::FromIndex(size_t index) case 0: return SPELL_ATTR2_CAN_TARGET_DEAD; case 1: return SPELL_ATTR2_UNK1; case 2: return SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; - case 3: return SPELL_ATTR2_UNK3; + case 3: return SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF; case 4: return SPELL_ATTR2_DISPLAY_IN_STANCE_BAR; case 5: return SPELL_ATTR2_AUTOREPEAT_FLAG; case 6: return SPELL_ATTR2_CANT_TARGET_TAPPED; @@ -600,7 +600,7 @@ TC_API_EXPORT SpellAttr2 EnumUtils::FromIndex(size_t index) case 27: return SPELL_ATTR2_UNK27; case 28: return SPELL_ATTR2_UNK28; case 29: return SPELL_ATTR2_CANT_CRIT; - case 30: return SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC; + case 30: return SPELL_ATTR2_ACTIVE_THREAT; case 31: return SPELL_ATTR2_FOOD_BUFF; default: throw std::out_of_range("index"); } @@ -614,7 +614,7 @@ TC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr2 value) case SPELL_ATTR2_CAN_TARGET_DEAD: return 0; case SPELL_ATTR2_UNK1: return 1; case SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS: return 2; - case SPELL_ATTR2_UNK3: return 3; + case SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF: return 3; case SPELL_ATTR2_DISPLAY_IN_STANCE_BAR: return 4; case SPELL_ATTR2_AUTOREPEAT_FLAG: return 5; case SPELL_ATTR2_CANT_TARGET_TAPPED: return 6; @@ -641,7 +641,7 @@ TC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr2 value) case SPELL_ATTR2_UNK27: return 27; case SPELL_ATTR2_UNK28: return 28; case SPELL_ATTR2_CANT_CRIT: return 29; - case SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC: return 30; + case SPELL_ATTR2_ACTIVE_THREAT: return 30; case SPELL_ATTR2_FOOD_BUFF: return 31; default: throw std::out_of_range("value"); } @@ -664,7 +664,7 @@ TC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr3 value) case SPELL_ATTR3_UNK6: return { "SPELL_ATTR3_UNK6", "Unknown attribute 6@Attr3", "" }; case SPELL_ATTR3_STACK_FOR_DIFF_CASTERS: return { "SPELL_ATTR3_STACK_FOR_DIFF_CASTERS", "Stack separately for each caster", "" }; case SPELL_ATTR3_ONLY_TARGET_PLAYERS: return { "SPELL_ATTR3_ONLY_TARGET_PLAYERS", "Can only target players", "" }; - case SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2: return { "SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2", "Allow triggered spell to trigger (type 2)", "Without this attribute, any triggered spell will be unable to trigger other auras' procs" }; + case SPELL_ATTR3_NOT_A_PROC: return { "SPELL_ATTR3_NOT_A_PROC", "Not a Proc", "Without this attribute, any triggered spell will be unable to trigger other auras' procs" }; case SPELL_ATTR3_MAIN_HAND: return { "SPELL_ATTR3_MAIN_HAND", "Require main hand weapon", "" }; case SPELL_ATTR3_BATTLEGROUND: return { "SPELL_ATTR3_BATTLEGROUND", "Can only be cast in battleground", "" }; case SPELL_ATTR3_ONLY_TARGET_GHOSTS: return { "SPELL_ATTR3_ONLY_TARGET_GHOSTS", "Can only target ghost players", "" }; @@ -681,7 +681,7 @@ TC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr3 value) case SPELL_ATTR3_UNK23: return { "SPELL_ATTR3_UNK23", "Unknown attribute 23@Attr3", "" }; case SPELL_ATTR3_REQ_OFFHAND: return { "SPELL_ATTR3_REQ_OFFHAND", "Requires offhand weapon", "" }; case SPELL_ATTR3_TREAT_AS_PERIODIC: return { "SPELL_ATTR3_TREAT_AS_PERIODIC", "Treat as periodic effect", "" }; - case SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED: return { "SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED", "Can trigger from triggered spells", "" }; + case SPELL_ATTR3_CAN_PROC_FROM_PROCS: return { "SPELL_ATTR3_CAN_PROC_FROM_PROCS", "Can Proc From Procs", "" }; case SPELL_ATTR3_DRAIN_SOUL: return { "SPELL_ATTR3_DRAIN_SOUL", "Drain Soul", "" }; case SPELL_ATTR3_UNK28: return { "SPELL_ATTR3_UNK28", "Unknown attribute 28@Attr3", "" }; case SPELL_ATTR3_NO_DONE_BONUS: return { "SPELL_ATTR3_NO_DONE_BONUS", "Damage dealt is unaffected by modifiers", "" }; @@ -708,7 +708,7 @@ TC_API_EXPORT SpellAttr3 EnumUtils::FromIndex(size_t index) case 6: return SPELL_ATTR3_UNK6; case 7: return SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; case 8: return SPELL_ATTR3_ONLY_TARGET_PLAYERS; - case 9: return SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2; + case 9: return SPELL_ATTR3_NOT_A_PROC; case 10: return SPELL_ATTR3_MAIN_HAND; case 11: return SPELL_ATTR3_BATTLEGROUND; case 12: return SPELL_ATTR3_ONLY_TARGET_GHOSTS; @@ -725,7 +725,7 @@ TC_API_EXPORT SpellAttr3 EnumUtils::FromIndex(size_t index) case 23: return SPELL_ATTR3_UNK23; case 24: return SPELL_ATTR3_REQ_OFFHAND; case 25: return SPELL_ATTR3_TREAT_AS_PERIODIC; - case 26: return SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED; + case 26: return SPELL_ATTR3_CAN_PROC_FROM_PROCS; case 27: return SPELL_ATTR3_DRAIN_SOUL; case 28: return SPELL_ATTR3_UNK28; case 29: return SPELL_ATTR3_NO_DONE_BONUS; @@ -749,7 +749,7 @@ TC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr3 value) case SPELL_ATTR3_UNK6: return 6; case SPELL_ATTR3_STACK_FOR_DIFF_CASTERS: return 7; case SPELL_ATTR3_ONLY_TARGET_PLAYERS: return 8; - case SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2: return 9; + case SPELL_ATTR3_NOT_A_PROC: return 9; case SPELL_ATTR3_MAIN_HAND: return 10; case SPELL_ATTR3_BATTLEGROUND: return 11; case SPELL_ATTR3_ONLY_TARGET_GHOSTS: return 12; @@ -766,7 +766,7 @@ TC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr3 value) case SPELL_ATTR3_UNK23: return 23; case SPELL_ATTR3_REQ_OFFHAND: return 24; case SPELL_ATTR3_TREAT_AS_PERIODIC: return 25; - case SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED: return 26; + case SPELL_ATTR3_CAN_PROC_FROM_PROCS: return 26; case SPELL_ATTR3_DRAIN_SOUL: return 27; case SPELL_ATTR3_UNK28: return 28; case SPELL_ATTR3_NO_DONE_BONUS: return 29; diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index f723e777b4b..69534d8c69d 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -39,12 +39,6 @@ if(NOT WIN32) ) endif() -if(UNIX AND NOT NOJEM AND NOT APPLE) - set(worldserver_LINK_FLAGS "-pthread -lncurses ${worldserver_LINK_FLAGS}") -endif() - -set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAGS}") - target_link_libraries(worldserver PRIVATE trinity-core-interface @@ -76,28 +70,22 @@ if(WORLDSERVER_DYNAMIC_SCRIPT_MODULES_DEPENDENCIES) add_dependencies(worldserver ${WORLDSERVER_DYNAMIC_SCRIPT_MODULES_DEPENDENCIES}) endif() -if(COPY_CONF AND WIN32) - if("${CMAKE_MAKE_PROGRAM}" MATCHES "MSBuild") - add_custom_command(TARGET worldserver - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/ - ) - elseif(MINGW) - add_custom_command(TARGET worldserver - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_BINARY_DIR}/bin/ - ) - endif() -endif() - if(UNIX) install(TARGETS worldserver DESTINATION bin) if(COPY_CONF) + add_custom_command(TARGET worldserver + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/../etc/worldserver.conf.dist + ) install(FILES worldserver.conf.dist DESTINATION ${CONF_DIR}) endif() elseif(WIN32) install(TARGETS worldserver DESTINATION "${CMAKE_INSTALL_PREFIX}") if(COPY_CONF) + add_custom_command(TARGET worldserver + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ + ) install(FILES worldserver.conf.dist DESTINATION "${CMAKE_INSTALL_PREFIX}") endif() endif() diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 70426698405..63145380745 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -93,26 +93,26 @@ int m_ServiceStatus = -1; class FreezeDetector { - public: +public: FreezeDetector(Trinity::Asio::IoContext& ioContext, uint32 maxCoreStuckTime) : _timer(ioContext), _worldLoopCounter(0), _lastChangeMsTime(getMSTime()), _maxCoreStuckTimeInMs(maxCoreStuckTime) { } - static void Start(std::shared_ptr const& freezeDetector) + static void Start(std::shared_ptr const& freezeDetector) + { + freezeDetector->_timer.expires_after(5s); + freezeDetector->_timer.async_wait([freezeDetectorRef = std::weak_ptr(freezeDetector)](boost::system::error_code const& error) mutable { - freezeDetector->_timer.expires_from_now(boost::posix_time::seconds(5)); - freezeDetector->_timer.async_wait([freezeDetectorRef = std::weak_ptr(freezeDetector)](boost::system::error_code const& error) - { - return Handler(freezeDetectorRef, error); - }); - } + Handler(std::move(freezeDetectorRef), error); + }); + } - static void Handler(std::weak_ptr freezeDetectorRef, boost::system::error_code const& error); + static void Handler(std::weak_ptr freezeDetectorRef, boost::system::error_code const& error); - private: - Trinity::Asio::DeadlineTimer _timer; - uint32 _worldLoopCounter; - uint32 _lastChangeMsTime; - uint32 _maxCoreStuckTimeInMs; +private: + Trinity::Asio::DeadlineTimer _timer; + uint32 _worldLoopCounter; + uint32 _lastChangeMsTime; + uint32 _maxCoreStuckTimeInMs; }; void SignalHandler(boost::system::error_code const& error, int signalNumber); @@ -574,10 +574,10 @@ void FreezeDetector::Handler(std::weak_ptr freezeDetectorRef, bo } } - freezeDetector->_timer.expires_from_now(boost::posix_time::seconds(1)); - freezeDetector->_timer.async_wait([freezeDetectorRef](boost::system::error_code const& timerError) + freezeDetector->_timer.expires_after(1s); + freezeDetector->_timer.async_wait([freezeDetectorRef = std::move(freezeDetectorRef)](boost::system::error_code const& error) mutable { - return Handler(freezeDetectorRef, timerError); + Handler(std::move(freezeDetectorRef), error); }); } } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 90ad17d3181..344f36e3660 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -728,7 +728,7 @@ CharacterCreating.Disabled = 0 # # CharacterCreating.Disabled.RaceMask # Description: Mask of races which cannot be created by players. -# Example: 1536 - (1024 + 512, Blood Elf and Draenei races are disabled) +# Example: 1536 - (512 + 1024, Blood Elf and Draenei races are disabled) # Default: 0 - (Enabled, All races are allowed) # 1 - (Disabled, Human) # 2 - (Disabled, Orc) @@ -845,6 +845,14 @@ StartDeathKnightPlayerLevel = 55 StartPlayerMoney = 0 +# +# StartDeathKnightPlayerMoney +# Description: Amount of money (in Copper) that a death knight character has after creation. +# Default: 2000 +# 100 - (1 Silver) + +StartDeathKnightPlayerMoney = 2000 + # # MaxHonorPoints # Description: Maximum honor points a character can have. @@ -2170,8 +2178,12 @@ GM.AllowInvite = 0 # # GM.LowerSecurity -# Description: Allow lower security levels to use commands on higher security level -# characters. +# Description: Disallow lower security levels to use commands on higher security level +# characters. Regardless of this value, lower security check is always +# enabled for accounts without RBAC_PERM_CAN_IGNORE_LOWER_SECURITY_CHECK. +# This option also does not affect "strong" checks, such as in +# certain .account and .rbac commands, which are always enabled. +# # Default: 0 - (Disabled) # 1 - (Enabled) diff --git a/tests/common/Config.cpp b/tests/common/Config.cpp index 639622c41e6..b2b1ad4e115 100644 --- a/tests/common/Config.cpp +++ b/tests/common/Config.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include