diff --git a/README.md b/README.md index 2feeee5804..6b078c2134 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ website at [TrinityCore.org](http://www.trinitycore.org). + MySQL ≥ 5.1.0 (included for Windows) + CMake ≥ 2.8.0 + OpenSSL ≥ 1.0.0 -+ GCC ≥ 4.3 (Linux only) -+ MS Visual Studio ≥ 9 (2008) (Windows only) ++ GCC ≥ 4.7.2 (Linux only) ++ MS Visual Studio ≥ 12 (2013) (Windows only) ## Install diff --git a/cmake/compiler/gcc/settings.cmake b/cmake/compiler/gcc/settings.cmake index 25ee96c856..641efa166d 100644 --- a/cmake/compiler/gcc/settings.cmake +++ b/cmake/compiler/gcc/settings.cmake @@ -22,3 +22,5 @@ if( WITH_COREDEBUG ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") message(STATUS "GCC: Debug-flags set (-g3)") endif() + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") diff --git a/cmake/platform/unix/settings.cmake b/cmake/platform/unix/settings.cmake index b0c0d26062..42bfefa699 100644 --- a/cmake/platform/unix/settings.cmake +++ b/cmake/platform/unix/settings.cmake @@ -33,7 +33,7 @@ add_custom_target(uninstall message(STATUS "UNIX: Created uninstall target") message(STATUS "UNIX: Detected compiler: ${CMAKE_C_COMPILER}") -if(CMAKE_C_COMPILER MATCHES "gcc") +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) diff --git a/dep/mysqllite/libmysql/libmysql.c b/dep/mysqllite/libmysql/libmysql.c index f802387cf9..3af9165de8 100644 --- a/dep/mysqllite/libmysql/libmysql.c +++ b/dep/mysqllite/libmysql/libmysql.c @@ -2303,7 +2303,7 @@ stmt_read_row_no_result_set(MYSQL_STMT *stmt __attribute__((unused)), mysql_stmt_attr_set() attr_type statement attribute - value casted to const void * pointer to value. + value cast to const void * pointer to value. RETURN VALUE 0 success diff --git a/dep/recastnavigation/Detour/DetourCommon.cpp b/dep/recastnavigation/Detour/DetourCommon.cpp index b5700f5930..a98d8c8e56 100644 --- a/dep/recastnavigation/Detour/DetourCommon.cpp +++ b/dep/recastnavigation/Detour/DetourCommon.cpp @@ -16,14 +16,14 @@ // 3. This notice may not be removed or altered from any source distribution. // -#include #include "DetourCommon.h" +#include "DetourMath.h" ////////////////////////////////////////////////////////////////////////////////////////// float dtSqrt(float x) { - return sqrtf(x); + return dtMathSqrtf(x); } void dtClosestPtPointTriangle(float* closest, const float* p, diff --git a/dep/recastnavigation/Detour/DetourCommon.h b/dep/recastnavigation/Detour/DetourCommon.h index ed7c5149db..0888614ea9 100644 --- a/dep/recastnavigation/Detour/DetourCommon.h +++ b/dep/recastnavigation/Detour/DetourCommon.h @@ -32,6 +32,11 @@ feature to find minor members. /// @name General helper functions /// @{ +/// Used to ignore a function parameter. VS complains about unused parameters +/// and this silences the warning. +/// @param [in] _ Unused parameter +template void dtIgnoreUnused(const T&) { } + /// Swaps the values of the two parameters. /// @param[in,out] a Value A /// @param[in,out] b Value B diff --git a/dep/recastnavigation/Detour/DetourMath.h b/dep/recastnavigation/Detour/DetourMath.h new file mode 100644 index 0000000000..744c562e5f --- /dev/null +++ b/dep/recastnavigation/Detour/DetourMath.h @@ -0,0 +1,21 @@ +#ifndef DETOURMATH_H +#define DETOURMATH_H + +/** +@defgroup detour Detour + +Members in this module are wrappers around the standard math library + +*/ + +#include + +#define dtMathFabs(x) fabs(x) +#define dtMathSqrtf(x) sqrtf(x) +#define dtMathFloorf(x) floorf(x) +#define dtMathCeilf(x) ceilf(x) +#define dtMathCosf(x) cosf(x) +#define dtMathSinf(x) sinf(x) +#define dtMathAtan2f(y, x) atan2f(y, x) + +#endif diff --git a/dep/recastnavigation/Detour/DetourNavMesh.cpp b/dep/recastnavigation/Detour/DetourNavMesh.cpp index 6b8e2d9d64..3bc2b73505 100644 --- a/dep/recastnavigation/Detour/DetourNavMesh.cpp +++ b/dep/recastnavigation/Detour/DetourNavMesh.cpp @@ -16,13 +16,13 @@ // 3. This notice may not be removed or altered from any source distribution. // -#include #include #include #include #include "DetourNavMesh.h" #include "DetourNode.h" #include "DetourCommon.h" +#include "DetourMath.h" #include "DetourAlloc.h" #include "DetourAssert.h" #include @@ -193,11 +193,13 @@ dtNavMesh::dtNavMesh() : m_tileLutMask(0), m_posLookup(0), m_nextFree(0), - m_tiles(0), - m_saltBits(0), - m_tileBits(0), - m_polyBits(0) + m_tiles(0) { +#ifndef DT_POLYREF64 + m_saltBits = 0; + m_tileBits = 0; + m_polyBits = 0; +#endif memset(&m_params, 0, sizeof(dtNavMeshParams)); m_orig[0] = 0; m_orig[1] = 0; @@ -248,11 +250,17 @@ dtStatus dtNavMesh::init(const dtNavMeshParams* params) m_nextFree = &m_tiles[i]; } - // Edited by TC - m_tileBits = STATIC_TILE_BITS; - m_polyBits = STATIC_POLY_BITS; - m_saltBits = STATIC_SALT_BITS; + // Init ID generator values. +#ifndef DT_POLYREF64 + m_tileBits = dtIlog2(dtNextPow2((unsigned int)params->maxTiles)); + m_polyBits = dtIlog2(dtNextPow2((unsigned int)params->maxPolys)); + // Only allow 31 salt bits, since the salt mask is calculated using 32bit uint and it will overflow. + m_saltBits = dtMin((unsigned int)31, 32 - m_tileBits - m_polyBits); + if (m_saltBits < 10) + return DT_FAILURE | DT_INVALID_PARAM; +#endif + return DT_SUCCESS; } @@ -1206,7 +1214,11 @@ dtStatus dtNavMesh::removeTile(dtTileRef ref, unsigned char** data, int* dataSiz tile->offMeshCons = 0; // Update salt, salt should never be zero. +#ifdef DT_POLYREF64 + tile->salt = (tile->salt+1) & ((1<salt = (tile->salt+1) & ((1<salt == 0) tile->salt++; diff --git a/dep/recastnavigation/Detour/DetourNavMesh.h b/dep/recastnavigation/Detour/DetourNavMesh.h index c094e4134d..d87fee8d5d 100644 --- a/dep/recastnavigation/Detour/DetourNavMesh.h +++ b/dep/recastnavigation/Detour/DetourNavMesh.h @@ -22,37 +22,39 @@ #include "DetourAlloc.h" #include "DetourStatus.h" +// Undefine (or define in a build cofnig) the following line to use 64bit polyref. +// Generally not needed, useful for very large worlds. +// Note: tiles build using 32bit refs are not compatible with 64bit refs! +//#define DT_POLYREF64 1 -// Edited by TC -#if defined(WIN32) && !defined(__MINGW32__) -typedef unsigned __int64 uint64; -#else +#ifdef DT_POLYREF64 +// TODO: figure out a multiplatform version of uint64_t +// - maybe: https://code.google.com/p/msinttypes/ +// - or: http://www.azillionmonkeys.com/qed/pstdint.h #include -#ifndef uint64_t -#ifdef __linux__ -#include #endif -#endif -typedef uint64_t uint64; -#endif // Note: If you want to use 64-bit refs, change the types of both dtPolyRef & dtTileRef. // It is also recommended that you change dtHashRef() to a proper 64-bit hash. -// Edited by TC -// We cannot have over 31 bits for either tile nor poly -// without changing polyCount to use 64bits too. -static const int STATIC_SALT_BITS = 12; -static const int STATIC_TILE_BITS = 21; -static const int STATIC_POLY_BITS = 31; - /// A handle to a polygon within a navigation mesh tile. /// @ingroup detour -typedef uint64 dtPolyRef; // Edited by TC +#ifdef DT_POLYREF64 +static const unsigned int DT_SALT_BITS = 16; +static const unsigned int DT_TILE_BITS = 28; +static const unsigned int DT_POLY_BITS = 20; +typedef uint64_t dtPolyRef; +#else +typedef unsigned int dtPolyRef; +#endif /// A handle to a tile within a navigation mesh. /// @ingroup detour -typedef uint64 dtTileRef; // Edited by TC +#ifdef DT_POLYREF64 +typedef uint64_t dtTileRef; +#else +typedef unsigned int dtTileRef; +#endif /// The maximum number of vertices per navigation polygon. /// @ingroup detour @@ -490,7 +492,11 @@ public: /// @param[in] ip The index of the polygon within the tile. inline dtPolyRef encodePolyId(unsigned int salt, unsigned int it, unsigned int ip) const { +#ifdef DT_POLYREF64 + return ((dtPolyRef)salt << (DT_POLY_BITS+DT_TILE_BITS)) | ((dtPolyRef)it << DT_POLY_BITS) | (dtPolyRef)ip; +#else return ((dtPolyRef)salt << (m_polyBits+m_tileBits)) | ((dtPolyRef)it << m_polyBits) | (dtPolyRef)ip; +#endif } /// Decodes a standard polygon reference. @@ -502,12 +508,21 @@ public: /// @see #encodePolyId inline void decodePolyId(dtPolyRef ref, unsigned int& salt, unsigned int& it, unsigned int& ip) const { +#ifdef DT_POLYREF64 + const dtPolyRef saltMask = ((dtPolyRef)1<> (DT_POLY_BITS+DT_TILE_BITS)) & saltMask); + it = (unsigned int)((ref >> DT_POLY_BITS) & tileMask); + ip = (unsigned int)(ref & polyMask); +#else const dtPolyRef saltMask = ((dtPolyRef)1<> (m_polyBits+m_tileBits)) & saltMask); it = (unsigned int)((ref >> m_polyBits) & tileMask); ip = (unsigned int)(ref & polyMask); +#endif } /// Extracts a tile's salt value from the specified polygon reference. @@ -516,8 +531,13 @@ public: /// @see #encodePolyId inline unsigned int decodePolyIdSalt(dtPolyRef ref) const { +#ifdef DT_POLYREF64 + const dtPolyRef saltMask = ((dtPolyRef)1<> (DT_POLY_BITS+DT_TILE_BITS)) & saltMask); +#else const dtPolyRef saltMask = ((dtPolyRef)1<> (m_polyBits+m_tileBits)) & saltMask); +#endif } /// Extracts the tile's index from the specified polygon reference. @@ -526,8 +546,13 @@ public: /// @see #encodePolyId inline unsigned int decodePolyIdTile(dtPolyRef ref) const { +#ifdef DT_POLYREF64 + const dtPolyRef tileMask = ((dtPolyRef)1<> DT_POLY_BITS) & tileMask); +#else const dtPolyRef tileMask = ((dtPolyRef)1<> m_polyBits) & tileMask); +#endif } /// Extracts the polygon's index (within its tile) from the specified polygon reference. @@ -536,8 +561,13 @@ public: /// @see #encodePolyId inline unsigned int decodePolyIdPoly(dtPolyRef ref) const { +#ifdef DT_POLYREF64 + const dtPolyRef polyMask = ((dtPolyRef)1< #include #include #include #include #include "DetourNavMesh.h" #include "DetourCommon.h" +#include "DetourMath.h" #include "DetourNavMeshBuilder.h" #include "DetourAlloc.h" #include "DetourAssert.h" @@ -202,8 +202,8 @@ static int createBVTree(const unsigned short* verts, const int /*nverts*/, if (z > it.bmax[2]) it.bmax[2] = z; } // Remap y - it.bmin[1] = (unsigned short)floorf((float)it.bmin[1]*ch/cs); - it.bmax[1] = (unsigned short)ceilf((float)it.bmax[1]*ch/cs); + it.bmin[1] = (unsigned short)dtMathFloorf((float)it.bmin[1]*ch/cs); + it.bmax[1] = (unsigned short)dtMathCeilf((float)it.bmax[1]*ch/cs); } int curNode = 0; diff --git a/dep/recastnavigation/Detour/DetourNavMeshQuery.cpp b/dep/recastnavigation/Detour/DetourNavMeshQuery.cpp index e6557cf707..bdbee00483 100644 --- a/dep/recastnavigation/Detour/DetourNavMeshQuery.cpp +++ b/dep/recastnavigation/Detour/DetourNavMeshQuery.cpp @@ -16,13 +16,13 @@ // 3. This notice may not be removed or altered from any source distribution. // -#include #include #include #include "DetourNavMeshQuery.h" #include "DetourNavMesh.h" #include "DetourNode.h" #include "DetourCommon.h" +#include "DetourMath.h" #include "DetourAlloc.h" #include "DetourAssert.h" #include @@ -99,9 +99,8 @@ inline float dtQueryFilter::getCost(const float* pa, const float* pb, return dtVdist(pa, pb) * m_areaCost[curPoly->getArea()]; } #endif - -// Edited by TC -static const float H_SCALE = 2.0f; // Search heuristic scale. + +static const float H_SCALE = 0.999f; // Search heuristic scale. dtNavMeshQuery* dtAllocNavMeshQuery() @@ -511,11 +510,7 @@ dtStatus dtNavMeshQuery::closestPointOnPoly(dtPolyRef ref, const float* pos, flo return DT_FAILURE | DT_INVALID_PARAM; if (!tile) return DT_FAILURE | DT_INVALID_PARAM; - - // Edited by TC - if (poly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) - return DT_FAILURE; - + closestPointOnPolyInTile(tile, poly, pos, closest); return DT_SUCCESS; @@ -3347,7 +3342,7 @@ dtStatus dtNavMeshQuery::findDistanceToWall(dtPolyRef startRef, const float* cen dtVsub(hitNormal, centerPos, hitPos); dtVnormalize(hitNormal); - *hitDist = dtSqrt(radiusSqr); + *hitDist = dtMathSqrtf(radiusSqr); return status; } diff --git a/dep/recastnavigation/Detour/DetourNavMeshQuery.h b/dep/recastnavigation/Detour/DetourNavMeshQuery.h index d431bf177b..6edf5bf611 100644 --- a/dep/recastnavigation/Detour/DetourNavMeshQuery.h +++ b/dep/recastnavigation/Detour/DetourNavMeshQuery.h @@ -200,8 +200,8 @@ public: /// Finalizes and returns the results of an incomplete sliced path query, returning the path to the furthest /// polygon on the existing path that was visited during the search. - /// @param[out] existing An array of polygon references for the existing path. - /// @param[out] existingSize The number of polygon in the @p existing array. + /// @param[in] existing An array of polygon references for the existing path. + /// @param[in] existingSize The number of polygon in the @p existing array. /// @param[out] path An ordered list of polygon references representing the path. (Start to end.) /// [(polyRef) * @p pathCount] /// @param[out] pathCount The number of polygons returned in the @p path array. diff --git a/dep/recastnavigation/Detour/DetourNode.cpp b/dep/recastnavigation/Detour/DetourNode.cpp index 4c8215e20d..57cb206669 100644 --- a/dep/recastnavigation/Detour/DetourNode.cpp +++ b/dep/recastnavigation/Detour/DetourNode.cpp @@ -22,17 +22,30 @@ #include "DetourCommon.h" #include +#ifdef DT_POLYREF64 +// From Thomas Wang, https://gist.github.com/badboy/6267743 inline unsigned int dtHashRef(dtPolyRef a) { - // Edited by TC - a = (~a) + (a << 18); - a = a ^ (a >> 31); - a = a * 21; - a = a ^ (a >> 11); - a = a + (a << 6); - a = a ^ (a >> 22); - return (unsigned int)a; + a = (~a) + (a << 18); // a = (a << 18) - a - 1; + a = a ^ (a >> 31); + a = a * 21; // a = (a + (a << 2)) + (a << 4); + a = a ^ (a >> 11); + a = a + (a << 6); + a = a ^ (a >> 22); + return (unsigned int)a; } +#else +inline unsigned int dtHashRef(dtPolyRef a) +{ + a += ~(a<<15); + a ^= (a>>10); + a += (a<<3); + a ^= (a>>6); + a += ~(a<<11); + a ^= (a>>16); + return (unsigned int)a; +} +#endif ////////////////////////////////////////////////////////////////////////////////////////// dtNodePool::dtNodePool(int maxNodes, int hashSize) : diff --git a/dep/recastnavigation/Recast/Recast.cpp b/dep/recastnavigation/Recast/Recast.cpp index 803daac3bc..b9d86036c3 100644 --- a/dep/recastnavigation/Recast/Recast.cpp +++ b/dep/recastnavigation/Recast/Recast.cpp @@ -208,12 +208,11 @@ void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* /// See the #rcConfig documentation for more information on the configuration parameters. /// /// @see rcAllocHeightfield, rcHeightfield -bool rcCreateHeightfield(rcContext* /*ctx*/, rcHeightfield& hf, int width, int height, +bool rcCreateHeightfield(rcContext* ctx, rcHeightfield& hf, int width, int height, const float* bmin, const float* bmax, float cs, float ch) { - // TODO: VC complains about unref formal variable, figure out a way to handle this better. -// rcAssert(ctx); + rcIgnoreUnused(ctx); hf.width = width; hf.height = height; @@ -245,13 +244,12 @@ static void calcTriNormal(const float* v0, const float* v1, const float* v2, flo /// See the #rcConfig documentation for more information on the configuration parameters. /// /// @see rcHeightfield, rcClearUnwalkableTriangles, rcRasterizeTriangles -void rcMarkWalkableTriangles(rcContext* /*ctx*/, const float walkableSlopeAngle, +void rcMarkWalkableTriangles(rcContext* ctx, const float walkableSlopeAngle, const float* verts, int /*nv*/, const int* tris, int nt, unsigned char* areas) { - // TODO: VC complains about unref formal variable, figure out a way to handle this better. -// rcAssert(ctx); + rcIgnoreUnused(ctx); const float walkableThr = cosf(walkableSlopeAngle/180.0f*RC_PI); @@ -275,13 +273,12 @@ void rcMarkWalkableTriangles(rcContext* /*ctx*/, const float walkableSlopeAngle, /// See the #rcConfig documentation for more information on the configuration parameters. /// /// @see rcHeightfield, rcClearUnwalkableTriangles, rcRasterizeTriangles -void rcClearUnwalkableTriangles(rcContext* /*ctx*/, const float walkableSlopeAngle, +void rcClearUnwalkableTriangles(rcContext* ctx, const float walkableSlopeAngle, const float* verts, int /*nv*/, const int* tris, int nt, unsigned char* areas) { - // TODO: VC complains about unref formal variable, figure out a way to handle this better. -// rcAssert(ctx); + rcIgnoreUnused(ctx); const float walkableThr = cosf(walkableSlopeAngle/180.0f*RC_PI); @@ -297,10 +294,9 @@ void rcClearUnwalkableTriangles(rcContext* /*ctx*/, const float walkableSlopeAng } } -int rcGetHeightFieldSpanCount(rcContext* /*ctx*/, rcHeightfield& hf) +int rcGetHeightFieldSpanCount(rcContext* ctx, rcHeightfield& hf) { - // TODO: VC complains about unref formal variable, figure out a way to handle this better. -// rcAssert(ctx); + rcIgnoreUnused(ctx); const int w = hf.width; const int h = hf.height; diff --git a/dep/recastnavigation/Recast/Recast.h b/dep/recastnavigation/Recast/Recast.h index fb36aa4c5c..336837ec27 100644 --- a/dep/recastnavigation/Recast/Recast.h +++ b/dep/recastnavigation/Recast/Recast.h @@ -219,7 +219,7 @@ struct rcConfig int maxEdgeLen; /// The maximum distance a simplfied contour's border edges should deviate - /// the original raw contour. [Limit: >=0] [Units: wu] + /// the original raw contour. [Limit: >=0] [Units: vx] float maxSimplificationError; /// The minimum number of cells allowed to form isolated island areas. [Limit: >=0] [Units: vx] @@ -243,7 +243,7 @@ struct rcConfig }; /// Defines the number of bits allocated to rcSpan::smin and rcSpan::smax. -static const int RC_SPAN_HEIGHT_BITS = 16; // EDITED BY TC +static const int RC_SPAN_HEIGHT_BITS = 13; /// Defines the maximum value for rcSpan::smin and rcSpan::smax. static const int RC_SPAN_MAX_HEIGHT = (1< void rcIgnoreUnused(const T&) { } + /// Swaps the values of the two parameters. /// @param[in,out] a Value A /// @param[in,out] b Value B diff --git a/dep/recastnavigation/Recast/RecastLayers.cpp b/dep/recastnavigation/Recast/RecastLayers.cpp index 5ea6cb79d1..204f72e8cb 100644 --- a/dep/recastnavigation/Recast/RecastLayers.cpp +++ b/dep/recastnavigation/Recast/RecastLayers.cpp @@ -325,7 +325,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, continue; // Skip if the height range would become too large. const int ymin = rcMin(root.ymin, regn.ymin); - const int ymax = rcMax(root.ymax, regn.ymax); // Edited by TC + const int ymax = rcMax(root.ymax, regn.ymax); if ((ymax - ymin) >= 255) continue; @@ -373,7 +373,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, continue; // Skip if the height range would become too large. const int ymin = rcMin(ri.ymin, rj.ymin); - const int ymax = rcMax(ri.ymax, rj.ymax); // Edited by TC + const int ymax = rcMax(ri.ymax, rj.ymax); if ((ymax - ymin) >= 255) continue; diff --git a/dep/recastnavigation/Recast/RecastMesh.cpp b/dep/recastnavigation/Recast/RecastMesh.cpp index 13aad2af01..23a466053b 100644 --- a/dep/recastnavigation/Recast/RecastMesh.cpp +++ b/dep/recastnavigation/Recast/RecastMesh.cpp @@ -1105,7 +1105,9 @@ bool rcBuildPolyMesh(rcContext* ctx, rcContourSet& cset, const int nvp, rcPolyMe unsigned short* pa = &polys[bestPa*nvp]; unsigned short* pb = &polys[bestPb*nvp]; mergePolys(pa, pb, bestEa, bestEb, tmpPoly, nvp); - memcpy(pb, &polys[(npolys-1)*nvp], sizeof(unsigned short)*nvp); + unsigned short* lastPoly = &polys[(npolys-1)*nvp]; + if (pb != lastPoly) + memcpy(pb, lastPoly, sizeof(unsigned short)*nvp); npolys--; } else diff --git a/dep/recastnavigation/Recast/RecastMeshDetail.cpp b/dep/recastnavigation/Recast/RecastMeshDetail.cpp index f49d67400c..77438fd8f5 100644 --- a/dep/recastnavigation/Recast/RecastMeshDetail.cpp +++ b/dep/recastnavigation/Recast/RecastMeshDetail.cpp @@ -200,8 +200,8 @@ static unsigned short getHeight(const float fx, const float fy, const float fz, { int ix = (int)floorf(fx*ics + 0.01f); int iz = (int)floorf(fz*ics + 0.01f); - ix = rcClamp(ix-hp.xmin, 0, hp.width); - iz = rcClamp(iz-hp.ymin, 0, hp.height); + ix = rcClamp(ix-hp.xmin, 0, hp.width - 1); + iz = rcClamp(iz-hp.ymin, 0, hp.height - 1); unsigned short h = hp.data[ix+iz*hp.width]; if (h == RC_UNSET_HEIGHT) { @@ -554,7 +554,7 @@ static bool buildPolyDetail(rcContext* ctx, const float* in, const int nin, float dx = vi[0] - vj[0]; float dy = vi[1] - vj[1]; float dz = vi[2] - vj[2]; - float d = rcSqrt(dx*dx + dz*dz); + float d = sqrtf(dx*dx + dz*dz); int nn = 1 + (int)floorf(d/sampleDist); if (nn >= MAX_VERTS_PER_EDGE) nn = MAX_VERTS_PER_EDGE-1; if (nverts+nn >= MAX_VERTS) diff --git a/sql/updates/world/2013_12_19_01_world_sai.sql b/sql/updates/world/2013_12_19_01_world_sai.sql index e282faa7a2..a8e5396f9f 100644 --- a/sql/updates/world/2013_12_19_01_world_sai.sql +++ b/sql/updates/world/2013_12_19_01_world_sai.sql @@ -53,7 +53,7 @@ DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES (@ENTRY,0,0,0,6,0,100,0,0,0,0,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodmaul Warlock - On Death - Say text 1 CONDITIONED"), (@ENTRY,0,1,0,1,0,100,0,1000,1000,1800000,1800000,11,13787,1,1,0,0,0,1,0,0,0,0,0,0,0,"Bloodmaul Warlock - Out Of Combat - Cast Demon Armor"), -(@ENTRY,0,2,0,1,0,100,0,3000,3000,0,0,11,11939,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodmaul Warlock - Out Of Combat - Cast Summon Imp"), +(@ENTRY,0,2,0,1,0,100,1,3000,3000,0,0,11,11939,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodmaul Warlock - Out Of Combat - Cast Summon Imp"), (@ENTRY,0,3,0,4,0,35,0,0,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodmaul Warlock - On Aggro - Say text 0"), (@ENTRY,0,4,0,0,0,100,0,0,0,2400,3800,11,20825,64,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodmaul Warlock - In Combat - Cast Shadow Bolt"), (@ENTRY,0,5,0,2,0,100,1,0,20,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodmaul Warlock - Between 0-20% Health - Flee for assist"); @@ -430,7 +430,7 @@ DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES (@ENTRY,0,0,0,6,0,100,0,0,0,0,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodmaul Soothsayer - On Death - Say text 1 CONDITIONED"), (@ENTRY,0,1,0,1,0,100,0,1000,1000,1800000,1800000,11,13787,1,1,0,0,0,1,0,0,0,0,0,0,0,"Bloodmaul Soothsayer - Out Of Combat - Cast Demon Armor"), -(@ENTRY,0,2,0,1,0,100,0,3000,3000,0,0,11,11939,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodmaul Soothsayer - Out Of Combat - Cast Summon Imp"), +(@ENTRY,0,2,0,1,0,100,1,3000,3000,0,0,11,11939,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodmaul Soothsayer - Out Of Combat - Cast Summon Imp"), (@ENTRY,0,3,0,4,0,35,0,0,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodmaul Soothsayer - On Aggro - Say text 0"), (@ENTRY,0,4,0,0,0,100,0,0,0,2400,3800,11,20825,64,0,0,0,0,2,0,0,0,0,0,0,0,"Bloodmaul Soothsayer - In Combat - Cast Shadow Bolt"), (@ENTRY,0,5,0,2,0,100,1,0,20,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bloodmaul Soothsayer - Between 0-20% Health - Flee for assist"); diff --git a/sql/updates/world/2013_12_23_01_world_misc.sql b/sql/updates/world/2013_12_23_01_world_misc.sql new file mode 100644 index 0000000000..e586667fb8 --- /dev/null +++ b/sql/updates/world/2013_12_23_01_world_misc.sql @@ -0,0 +1,28 @@ +-- Overseer Nuaar SAI +SET @ENTRY := 21981; +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`= '' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,62,0,100,0,8429,0,0,0,26,10682,0,0,0,0,0,7,0,0,0,0,0,0,0,"Overseer Nuaar - On Gossip Option - Complete quest 10682"); + +-- Add Conditions for Overseer Nuaar gossip +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=8429; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,8429,0,0,0,9,0,10682,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 10682 is taken'); + +-- Add Conditions for Sai'kkal the Elder gossip +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=8616; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,8616,0,0,0,9,0,10980,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 10980 is taken'); + +UPDATE `creature_template` SET `gossip_menu_id`=8616 WHERE `entry`=22932; +DELETE FROM `gossip_menu` WHERE (`entry`=8616 AND `text_id`=10794); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8616,10794); +DELETE FROM `gossip_menu` WHERE (`entry`=8617 AND `text_id`=10795); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8617,10795); +DELETE FROM `gossip_menu` WHERE (`entry`=8618 AND `text_id`=10796); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8618,10796); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (8616,8617); +INSERT INTO `gossip_menu_option` (menu_id, id, option_icon, option_text, option_id, npc_option_npcflag, action_menu_id, action_poi_id, box_coded, box_money, box_text) VALUES +(8616,0,0, 'Yes... yes, it''s me.',1,1,8617,0,0,0, ''), +(8617,0,0, 'Yes elder. Tell me more of the book.',1,1,8618,0,0,0, ''); diff --git a/sql/updates/world/2013_12_23_02_world_gossip.sql b/sql/updates/world/2013_12_23_02_world_gossip.sql new file mode 100644 index 0000000000..6399565588 --- /dev/null +++ b/sql/updates/world/2013_12_23_02_world_gossip.sql @@ -0,0 +1,12 @@ +-- Add Missing gossip for Engineer "Spark" Overgrind +UPDATE `creature_template` SET `gossip_menu_id`=7426 WHERE `entry`=17243; +DELETE FROM `gossip_menu` WHERE (`entry`=7426 AND `text_id`=8978); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7426,8978); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7426); +INSERT INTO `gossip_menu_option` (menu_id, id, option_icon, option_text, option_id, npc_option_npcflag, action_menu_id, action_poi_id, box_coded, box_money, box_text) VALUES +(7426,0,0, 'It''s over, Spark. The admiral knows it was you who betrayed the Alliance. Now you''re either going to cooperate with me and tell me everything that you know or we''re going to engage in some fisticuff.',1,1,0,0,0,0, ''); + +-- Add Conditions for Engineer "Spark" Overgrind gossip +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7426; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,7426,0,0,0,9,0,9537,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 9537 is taken'); diff --git a/sql/updates/world/2013_12_23_03_world_misc.sql b/sql/updates/world/2013_12_23_03_world_misc.sql new file mode 100644 index 0000000000..6b5fe812c3 --- /dev/null +++ b/sql/updates/world/2013_12_23_03_world_misc.sql @@ -0,0 +1,9 @@ +-- Add Conditions for Deathly Usher gossip +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=1541; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,1541,0,0,0,9,0,3628,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 9537 is taken'), +(15,1541,0,0,1,2,0,10757,1,0,0,0,0, '', 'Gossip Option - Show Option if player has item 10757'); + +DELETE FROM `spell_script_names` WHERE `spell_id`=27686; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(27686, 'spell_razelikh_teleport_group'); diff --git a/sql/updates/world/2013_12_23_04_world_misc.sql b/sql/updates/world/2013_12_23_04_world_misc.sql new file mode 100644 index 0000000000..725fe0239f --- /dev/null +++ b/sql/updates/world/2013_12_23_04_world_misc.sql @@ -0,0 +1,26 @@ +-- Captured Sunhawk Agent SAI +SET @ENTRY := 17824; +UPDATE `creature_template` SET `gossip_menu_id`=7531, `AIName`='SmartAI', `ScriptName`= '' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,62,0,100,0,7533,0,0,0,33,17974,0,0,0,0,0,7,0,0,0,0,0,0,0,"Captured Sunhawk Agent - On Gossip Option - Kill Credit"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Captured Sunhawk Agent - On Gossip Option - Close Gossip"); + +-- Add missing gossip for Captured Sunhawk Agent +DELETE FROM `gossip_menu` WHERE `entry` IN (7531,7533,7534,7535,7536,7537); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(7531,9134),(7531,9136),(7533,9141),(7534,9140),(7535,9139),(7536,9138),(7537,9137); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7531,7537,7536,7535,7534,7533); +INSERT INTO `gossip_menu_option` (menu_id, id, option_icon, option_text, option_id, npc_option_npcflag, action_menu_id, action_poi_id, box_coded, box_money, box_text) VALUES +(7531,0,0, 'I''m a prisoner, what does it look like? The draenei filth captured me as I exited the sun gate. They killed our portal controllers and destroyed the gate. The Sun King will be most displeased with this turn of events.',1,1,7537,0,0,0, ''), +(7537,0,0, 'Ah yes, Sironas. I had nearly forgotten that Sironas was here. I served under Sironas back on Outland. I hadn''t heard of this abomination, though; those damnable draenei captured me before I even fully materialized on this world.',1,1,7536,0,0,0, ''), +(7536,0,0, 'Incredible. How did Sironas accomplish such a thing?',1,1,7535,0,0,0, ''), +(7535,0,0, 'Sironas is an eredar... I mean, yes, obviously.',1,1,7534,0,0,0, ''), +(7534,0,0, 'The Vector Coil is massive. I hope we have more than one abomination guarding the numerous weak points.',1,1,7533,0,0,0, ''), +(7533,0,0, 'I did and you believed me. Thank you for the information, blood elf. You have helped us more than you could know.',1,1,0,0,0,0, ''); + +-- Add Conditions for Captured Sunhawk Agent gossip option +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7531; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,7531,0,0,0,9,0,9756,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 9756 is taken'), +(15,7531,0,0,1,1,0,31609,0,0,0,0,0, '', 'Gossip Option - Show Option if player has aura 31609'); diff --git a/sql/updates/world/2013_12_23_05_world_condition.sql b/sql/updates/world/2013_12_23_05_world_condition.sql new file mode 100644 index 0000000000..d810cb662b --- /dev/null +++ b/sql/updates/world/2013_12_23_05_world_condition.sql @@ -0,0 +1,4 @@ +-- Add Conditions for Captured Sunhawk Agent gossip text +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7531; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14,7531,9136,0,0,9,0,9756,0,0,0,0,0, '', 'Gossip Option - Show text if Quest 9756 is taken'); diff --git a/sql/updates/world/2013_12_23_06_world_sai.sql b/sql/updates/world/2013_12_23_06_world_sai.sql new file mode 100644 index 0000000000..784fe743e0 --- /dev/null +++ b/sql/updates/world/2013_12_23_06_world_sai.sql @@ -0,0 +1 @@ +UPDATE `smart_scripts` SET `event_flags`=1 WHERE `entryorguid` IN (19994,22384) AND `source_type`=0 AND `id`=2; diff --git a/sql/updates/world/2013_12_23_07_world_creature_template.sql b/sql/updates/world/2013_12_23_07_world_creature_template.sql new file mode 100644 index 0000000000..2532dcc870 --- /dev/null +++ b/sql/updates/world/2013_12_23_07_world_creature_template.sql @@ -0,0 +1 @@ +UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=28487; diff --git a/sql/updates/world/2013_12_23_08_world_creature_text.sql b/sql/updates/world/2013_12_23_08_world_creature_text.sql new file mode 100644 index 0000000000..3ea746f24e --- /dev/null +++ b/sql/updates/world/2013_12_23_08_world_creature_text.sql @@ -0,0 +1 @@ +UPDATE `creature_text` SET `type`=41 WHERE `entry`=28860 AND `groupid`=9; diff --git a/sql/updates/world/2013_12_24_00_world_misc.sql b/sql/updates/world/2013_12_24_00_world_misc.sql new file mode 100644 index 0000000000..8415acffa7 --- /dev/null +++ b/sql/updates/world/2013_12_24_00_world_misc.sql @@ -0,0 +1,26 @@ +-- Budd Nedreck SAI +SET @ENTRY := 23559; +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`= '' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,62,0,100,0,8775,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Keristrasza - On Gossip Option - Close Gossip"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,11,42540,0,0,0,0,0,7,0,0,0,0,0,0,0,"Keristrasza - On Gossip Option - Cast Zul'aman Disguise Creation"); +-- Gossip Option for Budd Nedreck +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (8775); +INSERT INTO `gossip_menu_option` (menu_id, id, option_icon, option_text, option_id, npc_option_npcflag, action_menu_id, action_poi_id, box_coded, box_money, box_text) VALUES +(8775,0,0, 'You gave the crew disguises?',1,1,0,0,0,0, ''); +-- Add Conditions for Budd Nedreck gossip +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=8775; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,8775,0,0,0,9,0,11166,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 11166 is taken'); + +-- Remove script for Rathis Tomber +UPDATE `creature_template` SET `AIName`='', `ScriptName`= '' WHERE `entry`=16224; +-- Gossip Option for Rathis Tomber +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7162); +INSERT INTO `gossip_menu_option` (menu_id, id, option_icon, option_text, option_id, npc_option_npcflag, action_menu_id, action_poi_id, box_coded, box_money, box_text) VALUES +(7162,0,0, 'I want to browse your goods.',3,128,0,0,0,0, ''); +-- Add Conditions for Rathis Tomber gossip +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7162; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,7162,0,0,0,8,0,9152,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 9152 is rewarded'); diff --git a/sql/updates/world/2013_12_24_01_world_misc.sql b/sql/updates/world/2013_12_24_01_world_misc.sql new file mode 100644 index 0000000000..65abb308f9 --- /dev/null +++ b/sql/updates/world/2013_12_24_01_world_misc.sql @@ -0,0 +1,54 @@ +-- Remove script for Naladu gossip already exist +UPDATE `creature_template` SET `AIName`='', `ScriptName`= '' WHERE `entry`=19361; + +-- Gossip text & Options for Tracy Proudwell +UPDATE `creature_template` SET `gossip_menu_id`=7892 WHERE `entry`=18266; +DELETE FROM `gossip_menu` WHERE `entry` IN (8544); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8544,10689); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7892,8544); +INSERT INTO `gossip_menu_option` (menu_id, id, option_icon, option_text, option_id, npc_option_npcflag, action_menu_id, action_poi_id, box_coded, box_money, box_text) VALUES +(7892,0,1, 'I have marks to redeem!',3,128,0,0,0,0, ''), +(7892,1,0, 'I heard that your dog Fei Fei took Klatu''s prayer beads...',1,1,8544,0,0,0, ''), +(8544,0,0, '',1,1,7892,0,0,0, ''); +-- Add Conditions for Budd Nedreck gossip option +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7892; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,7892,1,0,0,9,0,10916,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 10916 is taken'); + +-- Commander Danath Trollbane SAI +SET @ENTRY := 16819; +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`= '' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,50,0,100,0,10254,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Commander Danath Trollbane - On Quest Rewarded - Say 0"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,11,6245,0,0,0,0,0,7,0,0,0,0,0,0,0,"Commander Danath Trollbane - On Quest Rewarded - Cast Force Target - Salute"); + +-- Creature text for Commander Danath Trollbane +DELETE FROM `creature_text` WHERE `entry`=16819; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(16819,0,0, 'Welcome to Honor Hold, $N. It''s good to have you.',12,0,100,66,0,0, 'Commander Danath Trollbane'); + +-- Gossip text & Options for Force Commander Danath Trollbane +DELETE FROM `gossip_menu` WHERE `entry` IN (8043,8044,8049,8051); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8043,9933),(8044,9932),(8049,9941),(8051,8772); +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7352,8044); +INSERT INTO `gossip_menu_option` (menu_id, id, option_icon, option_text, option_id, npc_option_npcflag, action_menu_id, action_poi_id, box_coded, box_money, box_text) VALUES +(7352,0,0, 'Tell me of the Sons of Lothar.',1,1,8044,0,0,0, ''), +(7352,1,0, 'Tell me of the Hellfire orcs.',1,1,8049,0,0,0, ''), +(7352,2,0, 'Tell me of your homeland.',1,1,8051,0,0,0, ''), +(8044,0,0, '',1,1,8043,0,0,0, ''); + +-- Add Conditions for Force Commander Danath Trollbane gossip text +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7352; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14,7352,9938,0,0,8,0,10254,0,0,0,1,0, '', 'Gossip Text - Show Text if Quest 10254 is not rewarded'), +(14,7352,9939,0,0,8,0,10254,0,0,0,0,0, '', 'Gossip Text - Show Text if Quest 10254 is rewarded'), +(14,7352,9939,0,1,8,0,10937,0,0,0,1,0, '', 'Gossip Text - Show Text if Quest 10937 is not rewarded'), +(14,7352,9944,0,0,8,0,10937,0,0,0,0,0, '', 'Gossip Text - Show Text if Quest 10937 is rewarded'); + +-- Add Conditions for Force Commander Danath Trollbane gossip options +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=7352; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15,7352,0,0,0,8,0,10254,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 10254 is rewarded'), +(15,7352,1,0,0,8,0,10254,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 10254 is rewarded'), +(15,7352,2,0,0,8,0,10141,0,0,0,0,0, '', 'Gossip Option - Show Option if Quest 10141 is rewarded'); diff --git a/sql/updates/world/2013_12_24_02_world_gameobject_template.sql b/sql/updates/world/2013_12_24_02_world_gameobject_template.sql new file mode 100644 index 0000000000..4fe5d4d3c5 --- /dev/null +++ b/sql/updates/world/2013_12_24_02_world_gameobject_template.sql @@ -0,0 +1,13 @@ +DELETE FROM `gameobject_template` WHERE `entry` IN (147075, 147076, 147077, 178188, 180609, 180610, 180611, 184633, 187191, 188216, 190217); +INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `data0`, `data1`, `data2`, `data3`, `data4`, `data5`, `data6`, `data7`, `data8`, `data9`, `data10`, `data11`, `data12`, `data13`, `data14`, `data15`, `data16`, `data17`, `data18`, `data19`, `data20`, `data21`, `data22`, `data23`, `size`, `WDBVerified`) VALUES +(147075, 7, 39, 'Doodad_GeneralChairLoEnd02', '', '', '', 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538), -- -Unknown- +(147076, 7, 39, 'Doodad_GeneralChairLoEnd04', '', '', '', 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538), -- -Unknown- +(147077, 7, 39, 'Doodad_GeneralChairLoEnd05', '', '', '', 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538), -- -Unknown- +(178188, 6, 410, 'Molten Core Circle BARON', '', '', '', 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17658), -- -Unknown- +(180609, 7, 39, 'Doodad_GeneralChairLoEnd02', '', '', '', 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538), -- -Unknown- +(180610, 7, 39, 'Doodad_GeneralChairLoEnd04', '', '', '', 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538), -- -Unknown- +(180611, 7, 39, 'Doodad_GeneralChairLoEnd05', '', '', '', 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538), -- -Unknown- +(184633, 8, 233, 'Forge', '', '', '', 3, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538), -- -Unknown- +(187191, 5, 5251, 'Standing, Exterior, Medium - Xmas', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17658), -- -Unknown- +(188216, 5, 7736, 'Armor Stand', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538), -- -Unknown- +(190217, 5, 7873, 'Forsaken Tent 04', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17538); -- -Unknown- diff --git a/sql/updates/world/2013_12_24_03_world_creature_template.sql b/sql/updates/world/2013_12_24_03_world_creature_template.sql new file mode 100644 index 0000000000..e12a8f66be --- /dev/null +++ b/sql/updates/world/2013_12_24_03_world_creature_template.sql @@ -0,0 +1 @@ +UPDATE `creature_template` SET `ScriptName`= 'npc_oox09hl' WHERE `ScriptName`= 'npc_00x09hl'; diff --git a/sql/updates/world/2013_12_25_00_world_misc.sql b/sql/updates/world/2013_12_25_00_world_misc.sql new file mode 100644 index 0000000000..ce8b3d5764 --- /dev/null +++ b/sql/updates/world/2013_12_25_00_world_misc.sql @@ -0,0 +1,15 @@ +-- Commander Danath Trollbane SAI +SET @ENTRY := 16819; +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`= '' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,20,0,100,0,10254,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Commander Danath Trollbane - On Quest Rewarded - Say 0"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,11,6245,0,0,0,0,0,7,0,0,0,0,0,0,0,"Commander Danath Trollbane - On Quest Rewarded - Cast Force Target - Salute"); + +-- Add Conditions for Force Commander Danath Trollbane gossip text +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=7352; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14,7352,9938,0,0,8,0,10254,0,0,1,0,0, '', 'Gossip Text - Show Text if Quest 10254 is not rewarded'), +(14,7352,9939,0,0,8,0,10254,0,0,0,0,0, '', 'Gossip Text - Show Text if Quest 10254 is rewarded'), +(14,7352,9939,0,1,8,0,10937,0,0,1,0,0, '', 'Gossip Text - Show Text if Quest 10937 is not rewarded'), +(14,7352,9944,0,0,8,0,10937,0,0,0,0,0, '', 'Gossip Text - Show Text if Quest 10937 is rewarded'); diff --git a/sql/updates/world/2013_12_25_01_world_misc.sql b/sql/updates/world/2013_12_25_01_world_misc.sql new file mode 100644 index 0000000000..d95283ebf5 --- /dev/null +++ b/sql/updates/world/2013_12_25_01_world_misc.sql @@ -0,0 +1,37 @@ +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=30179) AND `path_id`=0; +DELETE FROM `creature_template_addon` WHERE `entry`=30179; +INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (30179,0,1,0, ''); + +-- Spectral Warden SAI +SET @ENTRY := 36666; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,25,0,100,6,0,0,0,0,11,69144,32,0,0,0,0,1,0,0,0,0,0,0,0,"Spectral Warden - On Reset - Cast 'Shadowform'"), +(@ENTRY,0,1,0,0,0,100,6,5000,6000,9000,10000,11,69633,0,0,0,0,0,2,0,0,0,0,0,0,0,"Spectral Warden - In Combat - Cast 'Veil of Shadow'"), +(@ENTRY,0,2,0,0,0,100,2,9000,11000,5000,6000,11,69633,0,0,0,0,0,5,0,0,0,0,0,0,0,"Spectral Warden - In Combat - Cast 'Veil of Shadow'"), +(@ENTRY,0,3,0,0,0,100,4,9000,11000,5000,6000,11,69148,0,0,0,0,0,5,0,0,0,0,0,0,0,"Spectral Warden - In Combat - Cast 'Wail of Souls'"); + +DELETE FROM `creature_template_addon` WHERE `entry`=36666; +INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (36666,0,1,0, ''); +UPDATE `creature_addon` SET `bytes1`=1, `auras`= '' WHERE `guid` IN (201796,201737,201687); + +-- Scarlet Crusader SAI +SET @ENTRY := 28529; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Scarlet Crusader - In Combat CMC - Cast 'Shoot'"); + +UPDATE `creature_addon` SET `auras`= '' WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=28529); + +-- Mam'toth Disciple SAI +SET @ENTRY := 28861; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,6,0,100,0,0,0,0,0,33,28876,0,0,0,0,0,7,0,0,0,0,0,0,0,"Mam'toth Disciple - On Just Died - Quest Credit 'Wooly Justice'"), +(@ENTRY,0,1,2,25,0,100,0,0,0,0,0,28,52607,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mam'toth Disciple - On Reset - Remove Aura 'Enraged Mammoth: Trample Aura for On Death Kill Credit'"), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,11,52574,32,0,0,0,0,1,0,0,0,0,0,0,0,"Mam'toth Disciple - On Reset - Cast 'Blue Radiation'"); +UPDATE `creature_addon` SET `auras`= '' WHERE `guid` IN (113829,83026); +UPDATE `creature_template_addon` SET `auras`= '' WHERE `entry` IN (28861); diff --git a/sql/updates/world/2013_12_25_02_world_misc.sql b/sql/updates/world/2013_12_25_02_world_misc.sql new file mode 100644 index 0000000000..691a2d6610 --- /dev/null +++ b/sql/updates/world/2013_12_25_02_world_misc.sql @@ -0,0 +1,42 @@ +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=26735); +DELETE FROM `creature_template_addon` WHERE `entry`=26735; +INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (26735,0,1,0, ''); + +-- Ashmane Boar SAI +SET @ENTRY := 5992; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,25,0,100,0,0,0,0,0,11,11351,33,0,0,0,0,1,0,0,0,0,0,0,0,"Ashmane Boar - Out of Combat - Cast 'Fire Shield'"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,11,12898,33,0,0,0,0,1,0,0,0,0,0,0,0,"Ashmane Boar - Out of Combat - Cast 'Smoke Aura Visual"), +(@ENTRY,0,2,0,9,0,50,1,5,20,0,0,11,6268,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ashmane Boar - Within 5-20 Range - Cast 'Rushing Charge'"); + +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=5992); +DELETE FROM `creature_template_addon` WHERE `entry`=5992; +INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (5992,0,4097,0, ''); + +-- Spiteful Apparition SAI +SET @ENTRY := 36551; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,25,0,100,6,0,0,0,0,11,69105,32,0,0,0,0,1,0,0,0,0,0,0,0,"Spiteful Apparition - On Reset - Cast 'Soul Horror Visual' (Dungeon)"), +(@ENTRY,0,1,2,61,0,100,6,0,0,0,0,11,69136,32,0,0,0,0,1,0,0,0,0,0,0,0,"Spiteful Apparition - On Reset - Cast 'Spiteful Apparition Visual' (Dungeon)"), +(@ENTRY,0,2,0,61,0,100,6,0,0,0,0,11,41253,32,0,0,0,0,1,0,0,0,0,0,0,0,"Spiteful Apparition - On Reset - Cast 'Greater Invisibility' (Dungeon)"), +(@ENTRY,0,3,0,10,0,100,6,0,10,3000,4000,28,41253,0,0,0,0,0,1,0,0,0,0,0,0,0,"Spiteful Apparition - Within 0-10 Range Out of Combat LoS - Remove Aura 'Greater Invisibility' (Dungeon)"), +(@ENTRY,0,4,0,0,0,100,2,7000,9000,7000,9000,11,68895,0,0,0,0,0,2,0,0,0,0,0,0,0,"Spiteful Apparition - In Combat - Cast 'Spite' (Normal)"), +(@ENTRY,0,5,0,0,0,100,4,7000,9000,7000,9000,11,70212,0,0,0,0,0,2,0,0,0,0,0,0,0,"Spiteful Apparition - In Combat - Cast 'Spite' (Heroic)"); +UPDATE `creature_template_addon` SET `auras`= '' WHERE `entry` IN (36551); + +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=26734); +DELETE FROM `creature_template_addon` WHERE `entry`=26734; +INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (26734,0,1,0, ''); + +-- Smoldering Construct SAI +SET @ENTRY := 27362; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,25,0,100,0,0,0,0,0,11,48460,32,0,0,0,0,1,0,0,0,0,0,0,0,"Smoldering Construct - On Reset - Cast 'Smoldering Flames'"), +(@ENTRY,0,1,0,0,0,100,0,4000,9000,12000,16000,11,51439,0,0,0,0,0,1,0,0,0,0,0,0,0,"Smoldering Construct - In Combat - Cast 'Backlash'"); +UPDATE `creature_template_addon` SET `auras`= '' WHERE `entry` IN (27362); diff --git a/sql/updates/world/2013_12_25_03_world_misc.sql b/sql/updates/world/2013_12_25_03_world_misc.sql new file mode 100644 index 0000000000..8976384619 --- /dev/null +++ b/sql/updates/world/2013_12_25_03_world_misc.sql @@ -0,0 +1,38 @@ +-- Tunnel Rat Scout SAI +SET @ENTRY := 1173; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,4,0,10,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Tunnel Rat Scout - On Aggro - Say Line 0"), +(@ENTRY,0,1,0,0,0,100,0,0,0,2300,2700,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Tunnel Rat Scout - In Combat CMC - Cast 'Shoot'"), +(@ENTRY,0,2,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Tunnel Rat Scout - Between 0-15% Health - Flee For Assist (No Repeat)"); + +-- Deatholme Necromancer SAI +SET @ENTRY := 16317; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,0,1000,1000,300000,300000,11,29066,1,0,0,0,0,1,0,0,0,0,0,0,0,"Deatholme Necromancer - Out of Combat - Cast 'Summon Dreadbone Skeleton'"), +(@ENTRY,0,1,0,0,0,100,0,0,0,3400,4800,11,9613,64,0,0,0,0,2,0,0,0,0,0,0,0,"Deatholme Necromancer - In Combat CMC - Cast 'Shadow Bolt'"), +(@ENTRY,0,2,0,2,0,100,0,0,20,8000,12000,11,29067,1,0,0,0,0,1,0,0,0,0,0,0,0,"Deatholme Necromancer - Between 0-20% Health - Cast 'Slave Drain'"), +(@ENTRY,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deatholme Necromancer - Between 0-15% Health - Flee For Assist (No Repeat)"); +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=16317) AND `emote`=0; + +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=18453); + +-- Shattered Hand Warlock SAI +SET @ENTRY := 19411; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,0,1000,1000,1800000,1800000,11,13787,1,0,0,0,0,1,0,0,0,0,0,0,0,"Shattered Hand Warlock - Out of Combat - Cast 'Demon Armor'"), +(@ENTRY,0,1,0,0,0,100,0,0,0,2400,3800,11,9613,64,0,0,0,0,2,0,0,0,0,0,0,0,"Shattered Hand Warlock - In Combat CMC - Cast 'Shadow Bolt'"), +(@ENTRY,0,2,0,0,0,85,0,5800,11800,16000,22000,11,11962,0,0,0,0,0,2,0,0,0,0,0,0,0,"Shattered Hand Warlock - In Combat - Cast 'Immolate'"), +(@ENTRY,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shattered Hand Warlock - Between 0-15% Health - Flee For Assist (No Repeat)"), +(@ENTRY,0,4,0,6,0,10,0,0,0,0,0,11,38879,7,0,0,0,0,2,0,0,0,0,0,0,0,"Shattered Hand Warlock - On Just Died - Cast 'Soul Burden'"); +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=19411) AND `bytes1`=0; +UPDATE `creature_addon` SET `auras`= '' WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=19411); + +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id`=10504); +DELETE FROM `creature_template_addon` WHERE `entry`=10504; +INSERT INTO `creature_template_addon` (`entry`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (10504,0,4097,0, ''); diff --git a/sql/updates/world/2013_12_27_00_world_sai.sql b/sql/updates/world/2013_12_27_00_world_sai.sql new file mode 100644 index 0000000000..76f90dad32 --- /dev/null +++ b/sql/updates/world/2013_12_27_00_world_sai.sql @@ -0,0 +1,6 @@ +-- Lord Kragaru SAI +SET @ENTRY := 12369; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,9,0,100,0,0,5,3000,4000,11,15496,0,0,0,0,0,2,0,0,0,0,0,0,0,"Lord Kragaru - Within 0-5 Range - Cast 'Cleave'"), +(@ENTRY,0,1,0,13,0,100,0,10000,15000,0,0,11,12555,0,0,0,0,0,2,0,0,0,0,0,0,0,"Lord Kragaru - Target Casting - Cast 'Pummel'"); diff --git a/sql/updates/world/2013_12_27_01_world_creature_formations.sql b/sql/updates/world/2013_12_27_01_world_creature_formations.sql new file mode 100644 index 0000000000..08b22a544b --- /dev/null +++ b/sql/updates/world/2013_12_27_01_world_creature_formations.sql @@ -0,0 +1,25 @@ +DELETE FROM `creature_formations` WHERE `leaderGUID` = 126396; +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(126396, 126396, 0, 0, 1, 0, 0), +(126396, 126399, 0, 0, 1, 0, 0), +(126396, 126403, 0, 0, 1, 0, 0), +(126396, 126411, 0, 0, 1, 0, 0), +(126396, 126404, 0, 0, 1, 0, 0), +(126396, 126410, 0, 0, 1, 0, 0), +(126396, 126398, 0, 0, 1, 0, 0), +(126396, 126409, 0, 0, 1, 0, 0), +(126396, 126402, 0, 0, 1, 0, 0), +(126396, 126418, 0, 0, 1, 0, 0), +(126396, 126419, 0, 0, 1, 0, 0), +(126396, 126397, 0, 0, 1, 0, 0), +(126396, 126401, 0, 0, 1, 0, 0), +(126396, 126407, 0, 0, 1, 0, 0), +(126396, 126408, 0, 0, 1, 0, 0), +(126396, 126420, 0, 0, 1, 0, 0), +(126396, 126421, 0, 0, 1, 0, 0), +(126396, 126412, 0, 0, 1, 0, 0), +(126396, 126406, 0, 0, 1, 0, 0), +(126396, 126400, 0, 0, 1, 0, 0), +(126396, 126405, 0, 0, 1, 0, 0), +(126396, 126416, 0, 0, 1, 0, 0), +(126396, 126417, 0, 0, 1, 0, 0); diff --git a/sql/updates/world/2013_12_28_00_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_28_00_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..0ca50efa68 --- /dev/null +++ b/sql/updates/world/2013_12_28_00_world_creature_classlevelstats.sql @@ -0,0 +1,6 @@ +ALTER TABLE creature_classlevelstats ADD attackpower SMALLINT(6) DEFAULT 0 NOT NULL; +ALTER TABLE creature_classlevelstats ADD rangedattackpower SMALLINT(6) DEFAULT 0 NOT NULL; +ALTER TABLE creature_classlevelstats ADD damage_base FLOAT DEFAULT 0 NOT NULL; +ALTER TABLE creature_classlevelstats ADD damage_exp1 FLOAT DEFAULT 0 NOT NULL; +ALTER TABLE creature_classlevelstats ADD damage_exp2 FLOAT DEFAULT 0 NOT NULL; +ALTER TABLE creature_classlevelstats ADD `comment` BLOB; diff --git a/sql/updates/world/2013_12_28_01_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_28_01_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..9a1b051155 --- /dev/null +++ b/sql/updates/world/2013_12_28_01_world_creature_classlevelstats.sql @@ -0,0 +1,254 @@ +-- Warrior Class +UPDATE `creature_classlevelstats` SET `attackpower`=24, `rangedattackpower`=1 WHERE `class`=1 AND `level`=1; +UPDATE `creature_classlevelstats` SET `attackpower`=26, `rangedattackpower`=1 WHERE `class`=1 AND `level`=2; +UPDATE `creature_classlevelstats` SET `attackpower`=28, `rangedattackpower`=1 WHERE `class`=1 AND `level`=3; +UPDATE `creature_classlevelstats` SET `attackpower`=30, `rangedattackpower`=1 WHERE `class`=1 AND `level`=4; +UPDATE `creature_classlevelstats` SET `attackpower`=32, `rangedattackpower`=1 WHERE `class`=1 AND `level`=5; +UPDATE `creature_classlevelstats` SET `attackpower`=34, `rangedattackpower`=1 WHERE `class`=1 AND `level`=6; +UPDATE `creature_classlevelstats` SET `attackpower`=36, `rangedattackpower`=1 WHERE `class`=1 AND `level`=7; +UPDATE `creature_classlevelstats` SET `attackpower`=38, `rangedattackpower`=1 WHERE `class`=1 AND `level`=8; +UPDATE `creature_classlevelstats` SET `attackpower`=40, `rangedattackpower`=1 WHERE `class`=1 AND `level`=9; +UPDATE `creature_classlevelstats` SET `attackpower`=42, `rangedattackpower`=1 WHERE `class`=1 AND `level`=10; +UPDATE `creature_classlevelstats` SET `attackpower`=44, `rangedattackpower`=1 WHERE `class`=1 AND `level`=11; +UPDATE `creature_classlevelstats` SET `attackpower`=46, `rangedattackpower`=1 WHERE `class`=1 AND `level`=12; +UPDATE `creature_classlevelstats` SET `attackpower`=48, `rangedattackpower`=1 WHERE `class`=1 AND `level`=13; +UPDATE `creature_classlevelstats` SET `attackpower`=50, `rangedattackpower`=1 WHERE `class`=1 AND `level`=14; +UPDATE `creature_classlevelstats` SET `attackpower`=54, `rangedattackpower`=2 WHERE `class`=1 AND `level`=15; +UPDATE `creature_classlevelstats` SET `attackpower`=56, `rangedattackpower`=2 WHERE `class`=1 AND `level`=16; +UPDATE `creature_classlevelstats` SET `attackpower`=60, `rangedattackpower`=2 WHERE `class`=1 AND `level`=17; +UPDATE `creature_classlevelstats` SET `attackpower`=64, `rangedattackpower`=3 WHERE `class`=1 AND `level`=18; +UPDATE `creature_classlevelstats` SET `attackpower`=68, `rangedattackpower`=3 WHERE `class`=1 AND `level`=19; +UPDATE `creature_classlevelstats` SET `attackpower`=70, `rangedattackpower`=4 WHERE `class`=1 AND `level`=20; +UPDATE `creature_classlevelstats` SET `attackpower`=74, `rangedattackpower`=4 WHERE `class`=1 AND `level`=21; +UPDATE `creature_classlevelstats` SET `attackpower`=78, `rangedattackpower`=4 WHERE `class`=1 AND `level`=22; +UPDATE `creature_classlevelstats` SET `attackpower`=80, `rangedattackpower`=5 WHERE `class`=1 AND `level`=23; +UPDATE `creature_classlevelstats` SET `attackpower`=84, `rangedattackpower`=6 WHERE `class`=1 AND `level`=24; +UPDATE `creature_classlevelstats` SET `attackpower`=86, `rangedattackpower`=6 WHERE `class`=1 AND `level`=25; +UPDATE `creature_classlevelstats` SET `attackpower`=90, `rangedattackpower`=7 WHERE `class`=1 AND `level`=26; +UPDATE `creature_classlevelstats` SET `attackpower`=92, `rangedattackpower`=7 WHERE `class`=1 AND `level`=27; +UPDATE `creature_classlevelstats` SET `attackpower`=96, `rangedattackpower`=8 WHERE `class`=1 AND `level`=28; +UPDATE `creature_classlevelstats` SET `attackpower`=100, `rangedattackpower`=8 WHERE `class`=1 AND `level`=29; +UPDATE `creature_classlevelstats` SET `attackpower`=102, `rangedattackpower`=9 WHERE `class`=1 AND `level`=30; +UPDATE `creature_classlevelstats` SET `attackpower`=106, `rangedattackpower`=9 WHERE `class`=1 AND `level`=31; +UPDATE `creature_classlevelstats` SET `attackpower`=108, `rangedattackpower`=10 WHERE `class`=1 AND `level`=32; +UPDATE `creature_classlevelstats` SET `attackpower`=112, `rangedattackpower`=10 WHERE `class`=1 AND `level`=33; +UPDATE `creature_classlevelstats` SET `attackpower`=114, `rangedattackpower`=11 WHERE `class`=1 AND `level`=34; +UPDATE `creature_classlevelstats` SET `attackpower`=118, `rangedattackpower`=11 WHERE `class`=1 AND `level`=35; +UPDATE `creature_classlevelstats` SET `attackpower`=120, `rangedattackpower`=12 WHERE `class`=1 AND `level`=36; +UPDATE `creature_classlevelstats` SET `attackpower`=124, `rangedattackpower`=12 WHERE `class`=1 AND `level`=37; +UPDATE `creature_classlevelstats` SET `attackpower`=128, `rangedattackpower`=13 WHERE `class`=1 AND `level`=38; +UPDATE `creature_classlevelstats` SET `attackpower`=132, `rangedattackpower`=13 WHERE `class`=1 AND `level`=39; +UPDATE `creature_classlevelstats` SET `attackpower`=136, `rangedattackpower`=14 WHERE `class`=1 AND `level`=40; +UPDATE `creature_classlevelstats` SET `attackpower`=142, `rangedattackpower`=15 WHERE `class`=1 AND `level`=41; +UPDATE `creature_classlevelstats` SET `attackpower`=152, `rangedattackpower`=15 WHERE `class`=1 AND `level`=42; +UPDATE `creature_classlevelstats` SET `attackpower`=162, `rangedattackpower`=16 WHERE `class`=1 AND `level`=43; +UPDATE `creature_classlevelstats` SET `attackpower`=174, `rangedattackpower`=16 WHERE `class`=1 AND `level`=44; +UPDATE `creature_classlevelstats` SET `attackpower`=184, `rangedattackpower`=17 WHERE `class`=1 AND `level`=45; +UPDATE `creature_classlevelstats` SET `attackpower`=188, `rangedattackpower`=17 WHERE `class`=1 AND `level`=46; +UPDATE `creature_classlevelstats` SET `attackpower`=192, `rangedattackpower`=18 WHERE `class`=1 AND `level`=47; +UPDATE `creature_classlevelstats` SET `attackpower`=196, `rangedattackpower`=19 WHERE `class`=1 AND `level`=48; +UPDATE `creature_classlevelstats` SET `attackpower`=200, `rangedattackpower`=19 WHERE `class`=1 AND `level`=49; +UPDATE `creature_classlevelstats` SET `attackpower`=206, `rangedattackpower`=20 WHERE `class`=1 AND `level`=50; +UPDATE `creature_classlevelstats` SET `attackpower`=210, `rangedattackpower`=20 WHERE `class`=1 AND `level`=51; +UPDATE `creature_classlevelstats` SET `attackpower`=214, `rangedattackpower`=21 WHERE `class`=1 AND `level`=52; +UPDATE `creature_classlevelstats` SET `attackpower`=218, `rangedattackpower`=22 WHERE `class`=1 AND `level`=53; +UPDATE `creature_classlevelstats` SET `attackpower`=224, `rangedattackpower`=22 WHERE `class`=1 AND `level`=54; +UPDATE `creature_classlevelstats` SET `attackpower`=228, `rangedattackpower`=23 WHERE `class`=1 AND `level`=55; +UPDATE `creature_classlevelstats` SET `attackpower`=234, `rangedattackpower`=23 WHERE `class`=1 AND `level`=56; +UPDATE `creature_classlevelstats` SET `attackpower`=238, `rangedattackpower`=24 WHERE `class`=1 AND `level`=57; +UPDATE `creature_classlevelstats` SET `attackpower`=242, `rangedattackpower`=25 WHERE `class`=1 AND `level`=58; +UPDATE `creature_classlevelstats` SET `attackpower`=248, `rangedattackpower`=25 WHERE `class`=1 AND `level`=59; +UPDATE `creature_classlevelstats` SET `attackpower`=252, `rangedattackpower`=26 WHERE `class`=1 AND `level`=60; +UPDATE `creature_classlevelstats` SET `attackpower`=258, `rangedattackpower`=28 WHERE `class`=1 AND `level`=61; +UPDATE `creature_classlevelstats` SET `attackpower`=262, `rangedattackpower`=30 WHERE `class`=1 AND `level`=62; +UPDATE `creature_classlevelstats` SET `attackpower`=268, `rangedattackpower`=32 WHERE `class`=1 AND `level`=63; +UPDATE `creature_classlevelstats` SET `attackpower`=272, `rangedattackpower`=33 WHERE `class`=1 AND `level`=64; +UPDATE `creature_classlevelstats` SET `attackpower`=278, `rangedattackpower`=35 WHERE `class`=1 AND `level`=65; +UPDATE `creature_classlevelstats` SET `attackpower`=282, `rangedattackpower`=37 WHERE `class`=1 AND `level`=66; +UPDATE `creature_classlevelstats` SET `attackpower`=288, `rangedattackpower`=39 WHERE `class`=1 AND `level`=67; +UPDATE `creature_classlevelstats` SET `attackpower`=292, `rangedattackpower`=41 WHERE `class`=1 AND `level`=68; +UPDATE `creature_classlevelstats` SET `attackpower`=298, `rangedattackpower`=43 WHERE `class`=1 AND `level`=69; +UPDATE `creature_classlevelstats` SET `attackpower`=304, `rangedattackpower`=44 WHERE `class`=1 AND `level`=70; +UPDATE `creature_classlevelstats` SET `attackpower`=308, `rangedattackpower`=48 WHERE `class`=1 AND `level`=71; +UPDATE `creature_classlevelstats` SET `attackpower`=314, `rangedattackpower`=53 WHERE `class`=1 AND `level`=72; +UPDATE `creature_classlevelstats` SET `attackpower`=320, `rangedattackpower`=58 WHERE `class`=1 AND `level`=73; +UPDATE `creature_classlevelstats` SET `attackpower`=354, `rangedattackpower`=63 WHERE `class`=1 AND `level`=74; +UPDATE `creature_classlevelstats` SET `attackpower`=392, `rangedattackpower`=68 WHERE `class`=1 AND `level`=75; +UPDATE `creature_classlevelstats` SET `attackpower`=432, `rangedattackpower`=74 WHERE `class`=1 AND `level`=76; +UPDATE `creature_classlevelstats` SET `attackpower`=478, `rangedattackpower`=81 WHERE `class`=1 AND `level`=77; +UPDATE `creature_classlevelstats` SET `attackpower`=528, `rangedattackpower`=88 WHERE `class`=1 AND `level`=78; +UPDATE `creature_classlevelstats` SET `attackpower`=582, `rangedattackpower`=95 WHERE `class`=1 AND `level`=79; +UPDATE `creature_classlevelstats` SET `attackpower`=642, `rangedattackpower`=103 WHERE `class`=1 AND `level`=80; +UPDATE `creature_classlevelstats` SET `attackpower`=708, `rangedattackpower`=112 WHERE `class`=1 AND `level`=81; +UPDATE `creature_classlevelstats` SET `attackpower`=782, `rangedattackpower`=121 WHERE `class`=1 AND `level`=82; +UPDATE `creature_classlevelstats` SET `attackpower`=805, `rangedattackpower`=135 WHERE `class`=1 AND `level`=83; +-- Rogue Class +UPDATE `creature_classlevelstats` SET `attackpower`=472, `rangedattackpower`=58 WHERE `class`=4 AND `level`=78; +-- Paladin Class +UPDATE `creature_classlevelstats` SET `attackpower`=24, `rangedattackpower`=1 WHERE `class`=2 AND `level`=1; +UPDATE `creature_classlevelstats` SET `attackpower`=25, `rangedattackpower`=1 WHERE `class`=2 AND `level`=2; +UPDATE `creature_classlevelstats` SET `attackpower`=26, `rangedattackpower`=1 WHERE `class`=2 AND `level`=3; +UPDATE `creature_classlevelstats` SET `attackpower`=27, `rangedattackpower`=1 WHERE `class`=2 AND `level`=4; +UPDATE `creature_classlevelstats` SET `attackpower`=28, `rangedattackpower`=1 WHERE `class`=2 AND `level`=5; +UPDATE `creature_classlevelstats` SET `attackpower`=29, `rangedattackpower`=1 WHERE `class`=2 AND `level`=6; +UPDATE `creature_classlevelstats` SET `attackpower`=30, `rangedattackpower`=1 WHERE `class`=2 AND `level`=7; +UPDATE `creature_classlevelstats` SET `attackpower`=32, `rangedattackpower`=1 WHERE `class`=2 AND `level`=8; +UPDATE `creature_classlevelstats` SET `attackpower`=34, `rangedattackpower`=1 WHERE `class`=2 AND `level`=9; +UPDATE `creature_classlevelstats` SET `attackpower`=38, `rangedattackpower`=1 WHERE `class`=2 AND `level`=10; +UPDATE `creature_classlevelstats` SET `attackpower`=40, `rangedattackpower`=1 WHERE `class`=2 AND `level`=11; +UPDATE `creature_classlevelstats` SET `attackpower`=42, `rangedattackpower`=1 WHERE `class`=2 AND `level`=12; +UPDATE `creature_classlevelstats` SET `attackpower`=44, `rangedattackpower`=1 WHERE `class`=2 AND `level`=13; +UPDATE `creature_classlevelstats` SET `attackpower`=46, `rangedattackpower`=1 WHERE `class`=2 AND `level`=14; +UPDATE `creature_classlevelstats` SET `attackpower`=48, `rangedattackpower`=2 WHERE `class`=2 AND `level`=15; +UPDATE `creature_classlevelstats` SET `attackpower`=52, `rangedattackpower`=2 WHERE `class`=2 AND `level`=16; +UPDATE `creature_classlevelstats` SET `attackpower`=56, `rangedattackpower`=2 WHERE `class`=2 AND `level`=17; +UPDATE `creature_classlevelstats` SET `attackpower`=58, `rangedattackpower`=3 WHERE `class`=2 AND `level`=18; +UPDATE `creature_classlevelstats` SET `attackpower`=60, `rangedattackpower`=3 WHERE `class`=2 AND `level`=19; +UPDATE `creature_classlevelstats` SET `attackpower`=64, `rangedattackpower`=4 WHERE `class`=2 AND `level`=20; +UPDATE `creature_classlevelstats` SET `attackpower`=68, `rangedattackpower`=4 WHERE `class`=2 AND `level`=21; +UPDATE `creature_classlevelstats` SET `attackpower`=71, `rangedattackpower`=5 WHERE `class`=2 AND `level`=22; +UPDATE `creature_classlevelstats` SET `attackpower`=74, `rangedattackpower`=5 WHERE `class`=2 AND `level`=23; +UPDATE `creature_classlevelstats` SET `attackpower`=78, `rangedattackpower`=6 WHERE `class`=2 AND `level`=24; +UPDATE `creature_classlevelstats` SET `attackpower`=80, `rangedattackpower`=6 WHERE `class`=2 AND `level`=25; +UPDATE `creature_classlevelstats` SET `attackpower`=84, `rangedattackpower`=6 WHERE `class`=2 AND `level`=26; +UPDATE `creature_classlevelstats` SET `attackpower`=86, `rangedattackpower`=7 WHERE `class`=2 AND `level`=27; +UPDATE `creature_classlevelstats` SET `attackpower`=90, `rangedattackpower`=7 WHERE `class`=2 AND `level`=28; +UPDATE `creature_classlevelstats` SET `attackpower`=94, `rangedattackpower`=8 WHERE `class`=2 AND `level`=29; +UPDATE `creature_classlevelstats` SET `attackpower`=96, `rangedattackpower`=8 WHERE `class`=2 AND `level`=30; +UPDATE `creature_classlevelstats` SET `attackpower`=98, `rangedattackpower`=9 WHERE `class`=2 AND `level`=31; +UPDATE `creature_classlevelstats` SET `attackpower`=100, `rangedattackpower`=9 WHERE `class`=2 AND `level`=32; +UPDATE `creature_classlevelstats` SET `attackpower`=104, `rangedattackpower`=10 WHERE `class`=2 AND `level`=33; +UPDATE `creature_classlevelstats` SET `attackpower`=106, `rangedattackpower`=10 WHERE `class`=2 AND `level`=34; +UPDATE `creature_classlevelstats` SET `attackpower`=110, `rangedattackpower`=11 WHERE `class`=2 AND `level`=35; +UPDATE `creature_classlevelstats` SET `attackpower`=112, `rangedattackpower`=11 WHERE `class`=2 AND `level`=36; +UPDATE `creature_classlevelstats` SET `attackpower`=116, `rangedattackpower`=11 WHERE `class`=2 AND `level`=37; +UPDATE `creature_classlevelstats` SET `attackpower`=120, `rangedattackpower`=12 WHERE `class`=2 AND `level`=38; +UPDATE `creature_classlevelstats` SET `attackpower`=124, `rangedattackpower`=12 WHERE `class`=2 AND `level`=39; +UPDATE `creature_classlevelstats` SET `attackpower`=128, `rangedattackpower`=13 WHERE `class`=2 AND `level`=40; +UPDATE `creature_classlevelstats` SET `attackpower`=132, `rangedattackpower`=13 WHERE `class`=2 AND `level`=41; +UPDATE `creature_classlevelstats` SET `attackpower`=142, `rangedattackpower`=15 WHERE `class`=2 AND `level`=42; +UPDATE `creature_classlevelstats` SET `attackpower`=152, `rangedattackpower`=14 WHERE `class`=2 AND `level`=43; +UPDATE `creature_classlevelstats` SET `attackpower`=166, `rangedattackpower`=15 WHERE `class`=2 AND `level`=44; +UPDATE `creature_classlevelstats` SET `attackpower`=172, `rangedattackpower`=15 WHERE `class`=2 AND `level`=45; +UPDATE `creature_classlevelstats` SET `attackpower`=176, `rangedattackpower`=16 WHERE `class`=2 AND `level`=46; +UPDATE `creature_classlevelstats` SET `attackpower`=180, `rangedattackpower`=16 WHERE `class`=2 AND `level`=47; +UPDATE `creature_classlevelstats` SET `attackpower`=184, `rangedattackpower`=17 WHERE `class`=2 AND `level`=48; +UPDATE `creature_classlevelstats` SET `attackpower`=188, `rangedattackpower`=17 WHERE `class`=2 AND `level`=49; +UPDATE `creature_classlevelstats` SET `attackpower`=194, `rangedattackpower`=18 WHERE `class`=2 AND `level`=50; +UPDATE `creature_classlevelstats` SET `attackpower`=198, `rangedattackpower`=19 WHERE `class`=2 AND `level`=51; +UPDATE `creature_classlevelstats` SET `attackpower`=202, `rangedattackpower`=19 WHERE `class`=2 AND `level`=52; +UPDATE `creature_classlevelstats` SET `attackpower`=206, `rangedattackpower`=20 WHERE `class`=2 AND `level`=53; +UPDATE `creature_classlevelstats` SET `attackpower`=210, `rangedattackpower`=20 WHERE `class`=2 AND `level`=54; +UPDATE `creature_classlevelstats` SET `attackpower`=214, `rangedattackpower`=21 WHERE `class`=2 AND `level`=55; +UPDATE `creature_classlevelstats` SET `attackpower`=220, `rangedattackpower`=21 WHERE `class`=2 AND `level`=56; +UPDATE `creature_classlevelstats` SET `attackpower`=224, `rangedattackpower`=22 WHERE `class`=2 AND `level`=57; +UPDATE `creature_classlevelstats` SET `attackpower`=228, `rangedattackpower`=23 WHERE `class`=2 AND `level`=58; +UPDATE `creature_classlevelstats` SET `attackpower`=234, `rangedattackpower`=23 WHERE `class`=2 AND `level`=59; +UPDATE `creature_classlevelstats` SET `attackpower`=238, `rangedattackpower`=24 WHERE `class`=2 AND `level`=60; +UPDATE `creature_classlevelstats` SET `attackpower`=244, `rangedattackpower`=25 WHERE `class`=2 AND `level`=61; +UPDATE `creature_classlevelstats` SET `attackpower`=246, `rangedattackpower`=26 WHERE `class`=2 AND `level`=62; +UPDATE `creature_classlevelstats` SET `attackpower`=249, `rangedattackpower`=26 WHERE `class`=2 AND `level`=63; +UPDATE `creature_classlevelstats` SET `attackpower`=252, `rangedattackpower`=27 WHERE `class`=2 AND `level`=64; +UPDATE `creature_classlevelstats` SET `attackpower`=262, `rangedattackpower`=29 WHERE `class`=2 AND `level`=65; +UPDATE `creature_classlevelstats` SET `attackpower`=266, `rangedattackpower`=29 WHERE `class`=2 AND `level`=66; +UPDATE `creature_classlevelstats` SET `attackpower`=272, `rangedattackpower`=31 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `attackpower`=276, `rangedattackpower`=31 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `attackpower`=282, `rangedattackpower`=32 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `attackpower`=286, `rangedattackpower`=33 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `attackpower`=290, `rangedattackpower`=37 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `attackpower`=296, `rangedattackpower`=40 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `attackpower`=302, `rangedattackpower`=44 WHERE `class`=2 AND `level`=73; +UPDATE `creature_classlevelstats` SET `attackpower`=334, `rangedattackpower`=48 WHERE `class`=2 AND `level`=74; +UPDATE `creature_classlevelstats` SET `attackpower`=370, `rangedattackpower`=53 WHERE `class`=2 AND `level`=75; +UPDATE `creature_classlevelstats` SET `attackpower`=408, `rangedattackpower`=57 WHERE `class`=2 AND `level`=76; +UPDATE `creature_classlevelstats` SET `attackpower`=452, `rangedattackpower`=62 WHERE `class`=2 AND `level`=77; +UPDATE `creature_classlevelstats` SET `attackpower`=500, `rangedattackpower`=68 WHERE `class`=2 AND `level`=78; +UPDATE `creature_classlevelstats` SET `attackpower`=550, `rangedattackpower`=74 WHERE `class`=2 AND `level`=79; +UPDATE `creature_classlevelstats` SET `attackpower`=608, `rangedattackpower`=80 WHERE `class`=2 AND `level`=80; +UPDATE `creature_classlevelstats` SET `attackpower`=670, `rangedattackpower`=86 WHERE `class`=2 AND `level`=81; +UPDATE `creature_classlevelstats` SET `attackpower`=726, `rangedattackpower`=91 WHERE `class`=2 AND `level`=82; +UPDATE `creature_classlevelstats` SET `attackpower`=783, `rangedattackpower`=98 WHERE `class`=2 AND `level`=83; +-- Mage Class +UPDATE `creature_classlevelstats` SET `attackpower`=10, `rangedattackpower`=10 WHERE `class`=8 AND `level`=1; +UPDATE `creature_classlevelstats` SET `attackpower`=11, `rangedattackpower`=10 WHERE `class`=8 AND `level`=2; +UPDATE `creature_classlevelstats` SET `attackpower`=12, `rangedattackpower`=10 WHERE `class`=8 AND `level`=3; +UPDATE `creature_classlevelstats` SET `attackpower`=13, `rangedattackpower`=11 WHERE `class`=8 AND `level`=4; +UPDATE `creature_classlevelstats` SET `attackpower`=14, `rangedattackpower`=11 WHERE `class`=8 AND `level`=5; +UPDATE `creature_classlevelstats` SET `attackpower`=15, `rangedattackpower`=11 WHERE `class`=8 AND `level`=6; +UPDATE `creature_classlevelstats` SET `attackpower`=16, `rangedattackpower`=11 WHERE `class`=8 AND `level`=7; +UPDATE `creature_classlevelstats` SET `attackpower`=16, `rangedattackpower`=11 WHERE `class`=8 AND `level`=8; +UPDATE `creature_classlevelstats` SET `attackpower`=16, `rangedattackpower`=11 WHERE `class`=8 AND `level`=9; +UPDATE `creature_classlevelstats` SET `attackpower`=17, `rangedattackpower`=12 WHERE `class`=8 AND `level`=10; +UPDATE `creature_classlevelstats` SET `attackpower`=18, `rangedattackpower`=12 WHERE `class`=8 AND `level`=11; +UPDATE `creature_classlevelstats` SET `attackpower`=19, `rangedattackpower`=12 WHERE `class`=8 AND `level`=12; +UPDATE `creature_classlevelstats` SET `attackpower`=20, `rangedattackpower`=12 WHERE `class`=8 AND `level`=13; +UPDATE `creature_classlevelstats` SET `attackpower`=21, `rangedattackpower`=12 WHERE `class`=8 AND `level`=14; +UPDATE `creature_classlevelstats` SET `attackpower`=22, `rangedattackpower`=13 WHERE `class`=8 AND `level`=15; +UPDATE `creature_classlevelstats` SET `attackpower`=24, `rangedattackpower`=13 WHERE `class`=8 AND `level`=16; +UPDATE `creature_classlevelstats` SET `attackpower`=26, `rangedattackpower`=13 WHERE `class`=8 AND `level`=17; +UPDATE `creature_classlevelstats` SET `attackpower`=27, `rangedattackpower`=13 WHERE `class`=8 AND `level`=18; +UPDATE `creature_classlevelstats` SET `attackpower`=28, `rangedattackpower`=13 WHERE `class`=8 AND `level`=19; +UPDATE `creature_classlevelstats` SET `attackpower`=30, `rangedattackpower`=14 WHERE `class`=8 AND `level`=20; +UPDATE `creature_classlevelstats` SET `attackpower`=32, `rangedattackpower`=14 WHERE `class`=8 AND `level`=21; +UPDATE `creature_classlevelstats` SET `attackpower`=34, `rangedattackpower`=14 WHERE `class`=8 AND `level`=22; +UPDATE `creature_classlevelstats` SET `attackpower`=35, `rangedattackpower`=14 WHERE `class`=8 AND `level`=23; +UPDATE `creature_classlevelstats` SET `attackpower`=36, `rangedattackpower`=15 WHERE `class`=8 AND `level`=24; +UPDATE `creature_classlevelstats` SET `attackpower`=37, `rangedattackpower`=15 WHERE `class`=8 AND `level`=25; +UPDATE `creature_classlevelstats` SET `attackpower`=39, `rangedattackpower`=15 WHERE `class`=8 AND `level`=26; +UPDATE `creature_classlevelstats` SET `attackpower`=40, `rangedattackpower`=15 WHERE `class`=8 AND `level`=27; +UPDATE `creature_classlevelstats` SET `attackpower`=42, `rangedattackpower`=15 WHERE `class`=8 AND `level`=28; +UPDATE `creature_classlevelstats` SET `attackpower`=43, `rangedattackpower`=16 WHERE `class`=8 AND `level`=29; +UPDATE `creature_classlevelstats` SET `attackpower`=44, `rangedattackpower`=16 WHERE `class`=8 AND `level`=30; +UPDATE `creature_classlevelstats` SET `attackpower`=46, `rangedattackpower`=16 WHERE `class`=8 AND `level`=31; +UPDATE `creature_classlevelstats` SET `attackpower`=47, `rangedattackpower`=16 WHERE `class`=8 AND `level`=32; +UPDATE `creature_classlevelstats` SET `attackpower`=49, `rangedattackpower`=17 WHERE `class`=8 AND `level`=33; +UPDATE `creature_classlevelstats` SET `attackpower`=50, `rangedattackpower`=17 WHERE `class`=8 AND `level`=34; +UPDATE `creature_classlevelstats` SET `attackpower`=52, `rangedattackpower`=17 WHERE `class`=8 AND `level`=35; +UPDATE `creature_classlevelstats` SET `attackpower`=53, `rangedattackpower`=18 WHERE `class`=8 AND `level`=36; +UPDATE `creature_classlevelstats` SET `attackpower`=54, `rangedattackpower`=18 WHERE `class`=8 AND `level`=37; +UPDATE `creature_classlevelstats` SET `attackpower`=56, `rangedattackpower`=18 WHERE `class`=8 AND `level`=38; +UPDATE `creature_classlevelstats` SET `attackpower`=58, `rangedattackpower`=18 WHERE `class`=8 AND `level`=39; +UPDATE `creature_classlevelstats` SET `attackpower`=60, `rangedattackpower`=19 WHERE `class`=8 AND `level`=40; +UPDATE `creature_classlevelstats` SET `attackpower`=62, `rangedattackpower`=19 WHERE `class`=8 AND `level`=41; +UPDATE `creature_classlevelstats` SET `attackpower`=67, `rangedattackpower`=19 WHERE `class`=8 AND `level`=42; +UPDATE `creature_classlevelstats` SET `attackpower`=71, `rangedattackpower`=19 WHERE `class`=8 AND `level`=43; +UPDATE `creature_classlevelstats` SET `attackpower`=78, `rangedattackpower`=20 WHERE `class`=8 AND `level`=44; +UPDATE `creature_classlevelstats` SET `attackpower`=81, `rangedattackpower`=20 WHERE `class`=8 AND `level`=45; +UPDATE `creature_classlevelstats` SET `attackpower`=83, `rangedattackpower`=20 WHERE `class`=8 AND `level`=46; +UPDATE `creature_classlevelstats` SET `attackpower`=85, `rangedattackpower`=21 WHERE `class`=8 AND `level`=47; +UPDATE `creature_classlevelstats` SET `attackpower`=87, `rangedattackpower`=21 WHERE `class`=8 AND `level`=48; +UPDATE `creature_classlevelstats` SET `attackpower`=89, `rangedattackpower`=21 WHERE `class`=8 AND `level`=49; +UPDATE `creature_classlevelstats` SET `attackpower`=91, `rangedattackpower`=22 WHERE `class`=8 AND `level`=50; +UPDATE `creature_classlevelstats` SET `attackpower`=93, `rangedattackpower`=22 WHERE `class`=8 AND `level`=51; +UPDATE `creature_classlevelstats` SET `attackpower`=95, `rangedattackpower`=22 WHERE `class`=8 AND `level`=52; +UPDATE `creature_classlevelstats` SET `attackpower`=97, `rangedattackpower`=23 WHERE `class`=8 AND `level`=53; +UPDATE `creature_classlevelstats` SET `attackpower`=99, `rangedattackpower`=23 WHERE `class`=8 AND `level`=54; +UPDATE `creature_classlevelstats` SET `attackpower`=101, `rangedattackpower`=23 WHERE `class`=8 AND `level`=55; +UPDATE `creature_classlevelstats` SET `attackpower`=104, `rangedattackpower`=24 WHERE `class`=8 AND `level`=56; +UPDATE `creature_classlevelstats` SET `attackpower`=106, `rangedattackpower`=24 WHERE `class`=8 AND `level`=57; +UPDATE `creature_classlevelstats` SET `attackpower`=107, `rangedattackpower`=24 WHERE `class`=8 AND `level`=58; +UPDATE `creature_classlevelstats` SET `attackpower`=110, `rangedattackpower`=25 WHERE `class`=8 AND `level`=59; +UPDATE `creature_classlevelstats` SET `attackpower`=112, `rangedattackpower`=25 WHERE `class`=8 AND `level`=60; +UPDATE `creature_classlevelstats` SET `attackpower`=115, `rangedattackpower`=25 WHERE `class`=8 AND `level`=61; +UPDATE `creature_classlevelstats` SET `attackpower`=116, `rangedattackpower`=25 WHERE `class`=8 AND `level`=62; +UPDATE `creature_classlevelstats` SET `attackpower`=119, `rangedattackpower`=26 WHERE `class`=8 AND `level`=63; +UPDATE `creature_classlevelstats` SET `attackpower`=121, `rangedattackpower`=26 WHERE `class`=8 AND `level`=64; +UPDATE `creature_classlevelstats` SET `attackpower`=124, `rangedattackpower`=26 WHERE `class`=8 AND `level`=65; +UPDATE `creature_classlevelstats` SET `attackpower`=125, `rangedattackpower`=27 WHERE `class`=8 AND `level`=66; +UPDATE `creature_classlevelstats` SET `attackpower`=128, `rangedattackpower`=27 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `attackpower`=130, `rangedattackpower`=27 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `attackpower`=133, `rangedattackpower`=28 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `attackpower`=135, `rangedattackpower`=28 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `attackpower`=137, `rangedattackpower`=31 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `attackpower`=140, `rangedattackpower`=34 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `attackpower`=143, `rangedattackpower`=37 WHERE `class`=8 AND `level`=73; +UPDATE `creature_classlevelstats` SET `attackpower`=158, `rangedattackpower`=41 WHERE `class`=8 AND `level`=74; +UPDATE `creature_classlevelstats` SET `attackpower`=175, `rangedattackpower`=45 WHERE `class`=8 AND `level`=75; +UPDATE `creature_classlevelstats` SET `attackpower`=193, `rangedattackpower`=49 WHERE `class`=8 AND `level`=76; +UPDATE `creature_classlevelstats` SET `attackpower`=214, `rangedattackpower`=54 WHERE `class`=8 AND `level`=77; +UPDATE `creature_classlevelstats` SET `attackpower`=236, `rangedattackpower`=58 WHERE `class`=8 AND `level`=78; +UPDATE `creature_classlevelstats` SET `attackpower`=260, `rangedattackpower`=64 WHERE `class`=8 AND `level`=79; +UPDATE `creature_classlevelstats` SET `attackpower`=287, `rangedattackpower`=69 WHERE `class`=8 AND `level`=80; +UPDATE `creature_classlevelstats` SET `attackpower`=304, `rangedattackpower`=74 WHERE `class`=8 AND `level`=81; +UPDATE `creature_classlevelstats` SET `attackpower`=326, `rangedattackpower`=79 WHERE `class`=8 AND `level`=82; +UPDATE `creature_classlevelstats` SET `attackpower`=343, `rangedattackpower`=84 WHERE `class`=8 AND `level`=83; diff --git a/sql/updates/world/2013_12_28_02_world_sai.sql b/sql/updates/world/2013_12_28_02_world_sai.sql new file mode 100644 index 0000000000..66e1e00f33 --- /dev/null +++ b/sql/updates/world/2013_12_28_02_world_sai.sql @@ -0,0 +1,5 @@ +SET @ENTRY := 27530; +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,8,0,100,1,49349,0,0,0,11,49364,2,0,0,0,0,7,0,0,0,0,0,0,0, 'Ruby Keeper - On Spellhit - Quest Credit'); diff --git a/sql/updates/world/2013_12_28_03_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_28_03_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..69d4365b9a --- /dev/null +++ b/sql/updates/world/2013_12_28_03_world_creature_classlevelstats.sql @@ -0,0 +1,168 @@ +-- Rogue Class +UPDATE `creature_classlevelstats` SET `attackpower`=24, `rangedattackpower`=1 WHERE `class`=4 AND `level`=1; +UPDATE `creature_classlevelstats` SET `attackpower`=26, `rangedattackpower`=1 WHERE `class`=4 AND `level`=2; +UPDATE `creature_classlevelstats` SET `attackpower`=28, `rangedattackpower`=1 WHERE `class`=4 AND `level`=3; +UPDATE `creature_classlevelstats` SET `attackpower`=30, `rangedattackpower`=1 WHERE `class`=4 AND `level`=4; +UPDATE `creature_classlevelstats` SET `attackpower`=32, `rangedattackpower`=1 WHERE `class`=4 AND `level`=5; +UPDATE `creature_classlevelstats` SET `attackpower`=34, `rangedattackpower`=1 WHERE `class`=4 AND `level`=6; +UPDATE `creature_classlevelstats` SET `attackpower`=36, `rangedattackpower`=1 WHERE `class`=4 AND `level`=7; +UPDATE `creature_classlevelstats` SET `attackpower`=38, `rangedattackpower`=1 WHERE `class`=4 AND `level`=8; +UPDATE `creature_classlevelstats` SET `attackpower`=40, `rangedattackpower`=1 WHERE `class`=4 AND `level`=9; +UPDATE `creature_classlevelstats` SET `attackpower`=42, `rangedattackpower`=1 WHERE `class`=4 AND `level`=10; +UPDATE `creature_classlevelstats` SET `attackpower`=44, `rangedattackpower`=1 WHERE `class`=4 AND `level`=11; +UPDATE `creature_classlevelstats` SET `attackpower`=46, `rangedattackpower`=1 WHERE `class`=4 AND `level`=12; +UPDATE `creature_classlevelstats` SET `attackpower`=48, `rangedattackpower`=1 WHERE `class`=4 AND `level`=13; +UPDATE `creature_classlevelstats` SET `attackpower`=50, `rangedattackpower`=1 WHERE `class`=4 AND `level`=14; +UPDATE `creature_classlevelstats` SET `attackpower`=54, `rangedattackpower`=2 WHERE `class`=4 AND `level`=15; +UPDATE `creature_classlevelstats` SET `attackpower`=56, `rangedattackpower`=2 WHERE `class`=4 AND `level`=16; +UPDATE `creature_classlevelstats` SET `attackpower`=60, `rangedattackpower`=2 WHERE `class`=4 AND `level`=17; +UPDATE `creature_classlevelstats` SET `attackpower`=64, `rangedattackpower`=3 WHERE `class`=4 AND `level`=18; +UPDATE `creature_classlevelstats` SET `attackpower`=68, `rangedattackpower`=3 WHERE `class`=4 AND `level`=19; +UPDATE `creature_classlevelstats` SET `attackpower`=70, `rangedattackpower`=4 WHERE `class`=4 AND `level`=20; +UPDATE `creature_classlevelstats` SET `attackpower`=74, `rangedattackpower`=4 WHERE `class`=4 AND `level`=21; +UPDATE `creature_classlevelstats` SET `attackpower`=78, `rangedattackpower`=4 WHERE `class`=4 AND `level`=22; +UPDATE `creature_classlevelstats` SET `attackpower`=80, `rangedattackpower`=5 WHERE `class`=4 AND `level`=23; +UPDATE `creature_classlevelstats` SET `attackpower`=84, `rangedattackpower`=6 WHERE `class`=4 AND `level`=24; +UPDATE `creature_classlevelstats` SET `attackpower`=86, `rangedattackpower`=6 WHERE `class`=4 AND `level`=25; +UPDATE `creature_classlevelstats` SET `attackpower`=90, `rangedattackpower`=7 WHERE `class`=4 AND `level`=26; +UPDATE `creature_classlevelstats` SET `attackpower`=92, `rangedattackpower`=7 WHERE `class`=4 AND `level`=27; +UPDATE `creature_classlevelstats` SET `attackpower`=96, `rangedattackpower`=8 WHERE `class`=4 AND `level`=28; +UPDATE `creature_classlevelstats` SET `attackpower`=100, `rangedattackpower`=8 WHERE `class`=4 AND `level`=29; +UPDATE `creature_classlevelstats` SET `attackpower`=102, `rangedattackpower`=9 WHERE `class`=4 AND `level`=30; +UPDATE `creature_classlevelstats` SET `attackpower`=106, `rangedattackpower`=9 WHERE `class`=4 AND `level`=31; +UPDATE `creature_classlevelstats` SET `attackpower`=108, `rangedattackpower`=10 WHERE `class`=4 AND `level`=32; +UPDATE `creature_classlevelstats` SET `attackpower`=112, `rangedattackpower`=10 WHERE `class`=4 AND `level`=33; +UPDATE `creature_classlevelstats` SET `attackpower`=114, `rangedattackpower`=11 WHERE `class`=4 AND `level`=34; +UPDATE `creature_classlevelstats` SET `attackpower`=118, `rangedattackpower`=11 WHERE `class`=4 AND `level`=35; +UPDATE `creature_classlevelstats` SET `attackpower`=120, `rangedattackpower`=12 WHERE `class`=4 AND `level`=36; +UPDATE `creature_classlevelstats` SET `attackpower`=124, `rangedattackpower`=12 WHERE `class`=4 AND `level`=37; +UPDATE `creature_classlevelstats` SET `attackpower`=128, `rangedattackpower`=13 WHERE `class`=4 AND `level`=38; +UPDATE `creature_classlevelstats` SET `attackpower`=132, `rangedattackpower`=13 WHERE `class`=4 AND `level`=39; +UPDATE `creature_classlevelstats` SET `attackpower`=136, `rangedattackpower`=14 WHERE `class`=4 AND `level`=40; +UPDATE `creature_classlevelstats` SET `attackpower`=142, `rangedattackpower`=15 WHERE `class`=4 AND `level`=41; +UPDATE `creature_classlevelstats` SET `attackpower`=152, `rangedattackpower`=15 WHERE `class`=4 AND `level`=42; +UPDATE `creature_classlevelstats` SET `attackpower`=162, `rangedattackpower`=16 WHERE `class`=4 AND `level`=43; +UPDATE `creature_classlevelstats` SET `attackpower`=174, `rangedattackpower`=16 WHERE `class`=4 AND `level`=44; +UPDATE `creature_classlevelstats` SET `attackpower`=184, `rangedattackpower`=17 WHERE `class`=4 AND `level`=45; +UPDATE `creature_classlevelstats` SET `attackpower`=188, `rangedattackpower`=17 WHERE `class`=4 AND `level`=46; +UPDATE `creature_classlevelstats` SET `attackpower`=192, `rangedattackpower`=18 WHERE `class`=4 AND `level`=47; +UPDATE `creature_classlevelstats` SET `attackpower`=196, `rangedattackpower`=19 WHERE `class`=4 AND `level`=48; +UPDATE `creature_classlevelstats` SET `attackpower`=200, `rangedattackpower`=19 WHERE `class`=4 AND `level`=49; +UPDATE `creature_classlevelstats` SET `attackpower`=206, `rangedattackpower`=20 WHERE `class`=4 AND `level`=50; +UPDATE `creature_classlevelstats` SET `attackpower`=210, `rangedattackpower`=20 WHERE `class`=4 AND `level`=51; +UPDATE `creature_classlevelstats` SET `attackpower`=214, `rangedattackpower`=21 WHERE `class`=4 AND `level`=52; +UPDATE `creature_classlevelstats` SET `attackpower`=218, `rangedattackpower`=22 WHERE `class`=4 AND `level`=53; +UPDATE `creature_classlevelstats` SET `attackpower`=224, `rangedattackpower`=22 WHERE `class`=4 AND `level`=54; +UPDATE `creature_classlevelstats` SET `attackpower`=228, `rangedattackpower`=23 WHERE `class`=4 AND `level`=55; +UPDATE `creature_classlevelstats` SET `attackpower`=234, `rangedattackpower`=23 WHERE `class`=4 AND `level`=56; +UPDATE `creature_classlevelstats` SET `attackpower`=238, `rangedattackpower`=24 WHERE `class`=4 AND `level`=57; +UPDATE `creature_classlevelstats` SET `attackpower`=242, `rangedattackpower`=25 WHERE `class`=4 AND `level`=58; +UPDATE `creature_classlevelstats` SET `attackpower`=248, `rangedattackpower`=25 WHERE `class`=4 AND `level`=59; +UPDATE `creature_classlevelstats` SET `attackpower`=252, `rangedattackpower`=26 WHERE `class`=4 AND `level`=60; +UPDATE `creature_classlevelstats` SET `attackpower`=258, `rangedattackpower`=28 WHERE `class`=4 AND `level`=61; +UPDATE `creature_classlevelstats` SET `attackpower`=262, `rangedattackpower`=30 WHERE `class`=4 AND `level`=62; +UPDATE `creature_classlevelstats` SET `attackpower`=268, `rangedattackpower`=32 WHERE `class`=4 AND `level`=63; +UPDATE `creature_classlevelstats` SET `attackpower`=272, `rangedattackpower`=33 WHERE `class`=4 AND `level`=64; +UPDATE `creature_classlevelstats` SET `attackpower`=278, `rangedattackpower`=35 WHERE `class`=4 AND `level`=65; +UPDATE `creature_classlevelstats` SET `attackpower`=282, `rangedattackpower`=37 WHERE `class`=4 AND `level`=66; +UPDATE `creature_classlevelstats` SET `attackpower`=288, `rangedattackpower`=39 WHERE `class`=4 AND `level`=67; +UPDATE `creature_classlevelstats` SET `attackpower`=292, `rangedattackpower`=41 WHERE `class`=4 AND `level`=68; +UPDATE `creature_classlevelstats` SET `attackpower`=298, `rangedattackpower`=43 WHERE `class`=4 AND `level`=69; +UPDATE `creature_classlevelstats` SET `attackpower`=304, `rangedattackpower`=44 WHERE `class`=4 AND `level`=70; +UPDATE `creature_classlevelstats` SET `attackpower`=308, `rangedattackpower`=48 WHERE `class`=4 AND `level`=71; +UPDATE `creature_classlevelstats` SET `attackpower`=314, `rangedattackpower`=53 WHERE `class`=4 AND `level`=72; +UPDATE `creature_classlevelstats` SET `attackpower`=320, `rangedattackpower`=58 WHERE `class`=4 AND `level`=73; +UPDATE `creature_classlevelstats` SET `attackpower`=354, `rangedattackpower`=63 WHERE `class`=4 AND `level`=74; +UPDATE `creature_classlevelstats` SET `attackpower`=392, `rangedattackpower`=68 WHERE `class`=4 AND `level`=75; +UPDATE `creature_classlevelstats` SET `attackpower`=432, `rangedattackpower`=74 WHERE `class`=4 AND `level`=76; +UPDATE `creature_classlevelstats` SET `attackpower`=478, `rangedattackpower`=81 WHERE `class`=4 AND `level`=77; +UPDATE `creature_classlevelstats` SET `attackpower`=528, `rangedattackpower`=88 WHERE `class`=4 AND `level`=78; +UPDATE `creature_classlevelstats` SET `attackpower`=582, `rangedattackpower`=95 WHERE `class`=4 AND `level`=79; +UPDATE `creature_classlevelstats` SET `attackpower`=642, `rangedattackpower`=103 WHERE `class`=4 AND `level`=80; +UPDATE `creature_classlevelstats` SET `attackpower`=708, `rangedattackpower`=112 WHERE `class`=4 AND `level`=81; +UPDATE `creature_classlevelstats` SET `attackpower`=782, `rangedattackpower`=121 WHERE `class`=4 AND `level`=82; +UPDATE `creature_classlevelstats` SET `attackpower`=805, `rangedattackpower`=135 WHERE `class`=4 AND `level`=83; +-- Mage Class +UPDATE `creature_classlevelstats` SET `attackpower`=20, `rangedattackpower`=10 WHERE `class`=8 AND `level`=1; +UPDATE `creature_classlevelstats` SET `attackpower`=22, `rangedattackpower`=10 WHERE `class`=8 AND `level`=2; +UPDATE `creature_classlevelstats` SET `attackpower`=24, `rangedattackpower`=10 WHERE `class`=8 AND `level`=3; +UPDATE `creature_classlevelstats` SET `attackpower`=26, `rangedattackpower`=11 WHERE `class`=8 AND `level`=4; +UPDATE `creature_classlevelstats` SET `attackpower`=28, `rangedattackpower`=11 WHERE `class`=8 AND `level`=5; +UPDATE `creature_classlevelstats` SET `attackpower`=30, `rangedattackpower`=11 WHERE `class`=8 AND `level`=6; +UPDATE `creature_classlevelstats` SET `attackpower`=32, `rangedattackpower`=11 WHERE `class`=8 AND `level`=7; +UPDATE `creature_classlevelstats` SET `attackpower`=32, `rangedattackpower`=11 WHERE `class`=8 AND `level`=8; +UPDATE `creature_classlevelstats` SET `attackpower`=32, `rangedattackpower`=11 WHERE `class`=8 AND `level`=9; +UPDATE `creature_classlevelstats` SET `attackpower`=34, `rangedattackpower`=12 WHERE `class`=8 AND `level`=10; +UPDATE `creature_classlevelstats` SET `attackpower`=36, `rangedattackpower`=12 WHERE `class`=8 AND `level`=11; +UPDATE `creature_classlevelstats` SET `attackpower`=38, `rangedattackpower`=12 WHERE `class`=8 AND `level`=12; +UPDATE `creature_classlevelstats` SET `attackpower`=40, `rangedattackpower`=12 WHERE `class`=8 AND `level`=13; +UPDATE `creature_classlevelstats` SET `attackpower`=42, `rangedattackpower`=12 WHERE `class`=8 AND `level`=14; +UPDATE `creature_classlevelstats` SET `attackpower`=44, `rangedattackpower`=13 WHERE `class`=8 AND `level`=15; +UPDATE `creature_classlevelstats` SET `attackpower`=48, `rangedattackpower`=13 WHERE `class`=8 AND `level`=16; +UPDATE `creature_classlevelstats` SET `attackpower`=52, `rangedattackpower`=13 WHERE `class`=8 AND `level`=17; +UPDATE `creature_classlevelstats` SET `attackpower`=54, `rangedattackpower`=13 WHERE `class`=8 AND `level`=18; +UPDATE `creature_classlevelstats` SET `attackpower`=56, `rangedattackpower`=13 WHERE `class`=8 AND `level`=19; +UPDATE `creature_classlevelstats` SET `attackpower`=60, `rangedattackpower`=14 WHERE `class`=8 AND `level`=20; +UPDATE `creature_classlevelstats` SET `attackpower`=64, `rangedattackpower`=14 WHERE `class`=8 AND `level`=21; +UPDATE `creature_classlevelstats` SET `attackpower`=68, `rangedattackpower`=14 WHERE `class`=8 AND `level`=22; +UPDATE `creature_classlevelstats` SET `attackpower`=70, `rangedattackpower`=14 WHERE `class`=8 AND `level`=23; +UPDATE `creature_classlevelstats` SET `attackpower`=72, `rangedattackpower`=15 WHERE `class`=8 AND `level`=24; +UPDATE `creature_classlevelstats` SET `attackpower`=74, `rangedattackpower`=15 WHERE `class`=8 AND `level`=25; +UPDATE `creature_classlevelstats` SET `attackpower`=78, `rangedattackpower`=15 WHERE `class`=8 AND `level`=26; +UPDATE `creature_classlevelstats` SET `attackpower`=80, `rangedattackpower`=15 WHERE `class`=8 AND `level`=27; +UPDATE `creature_classlevelstats` SET `attackpower`=84, `rangedattackpower`=15 WHERE `class`=8 AND `level`=28; +UPDATE `creature_classlevelstats` SET `attackpower`=86, `rangedattackpower`=16 WHERE `class`=8 AND `level`=29; +UPDATE `creature_classlevelstats` SET `attackpower`=88, `rangedattackpower`=16 WHERE `class`=8 AND `level`=30; +UPDATE `creature_classlevelstats` SET `attackpower`=92, `rangedattackpower`=16 WHERE `class`=8 AND `level`=31; +UPDATE `creature_classlevelstats` SET `attackpower`=94, `rangedattackpower`=16 WHERE `class`=8 AND `level`=32; +UPDATE `creature_classlevelstats` SET `attackpower`=98, `rangedattackpower`=17 WHERE `class`=8 AND `level`=33; +UPDATE `creature_classlevelstats` SET `attackpower`=100, `rangedattackpower`=17 WHERE `class`=8 AND `level`=34; +UPDATE `creature_classlevelstats` SET `attackpower`=104, `rangedattackpower`=17 WHERE `class`=8 AND `level`=35; +UPDATE `creature_classlevelstats` SET `attackpower`=106, `rangedattackpower`=18 WHERE `class`=8 AND `level`=36; +UPDATE `creature_classlevelstats` SET `attackpower`=108, `rangedattackpower`=18 WHERE `class`=8 AND `level`=37; +UPDATE `creature_classlevelstats` SET `attackpower`=112, `rangedattackpower`=18 WHERE `class`=8 AND `level`=38; +UPDATE `creature_classlevelstats` SET `attackpower`=116, `rangedattackpower`=18 WHERE `class`=8 AND `level`=39; +UPDATE `creature_classlevelstats` SET `attackpower`=120, `rangedattackpower`=19 WHERE `class`=8 AND `level`=40; +UPDATE `creature_classlevelstats` SET `attackpower`=124, `rangedattackpower`=19 WHERE `class`=8 AND `level`=41; +UPDATE `creature_classlevelstats` SET `attackpower`=134, `rangedattackpower`=19 WHERE `class`=8 AND `level`=42; +UPDATE `creature_classlevelstats` SET `attackpower`=142, `rangedattackpower`=19 WHERE `class`=8 AND `level`=43; +UPDATE `creature_classlevelstats` SET `attackpower`=156, `rangedattackpower`=20 WHERE `class`=8 AND `level`=44; +UPDATE `creature_classlevelstats` SET `attackpower`=162, `rangedattackpower`=20 WHERE `class`=8 AND `level`=45; +UPDATE `creature_classlevelstats` SET `attackpower`=166, `rangedattackpower`=20 WHERE `class`=8 AND `level`=46; +UPDATE `creature_classlevelstats` SET `attackpower`=170, `rangedattackpower`=21 WHERE `class`=8 AND `level`=47; +UPDATE `creature_classlevelstats` SET `attackpower`=174, `rangedattackpower`=21 WHERE `class`=8 AND `level`=48; +UPDATE `creature_classlevelstats` SET `attackpower`=178, `rangedattackpower`=21 WHERE `class`=8 AND `level`=49; +UPDATE `creature_classlevelstats` SET `attackpower`=182, `rangedattackpower`=22 WHERE `class`=8 AND `level`=50; +UPDATE `creature_classlevelstats` SET `attackpower`=186, `rangedattackpower`=22 WHERE `class`=8 AND `level`=51; +UPDATE `creature_classlevelstats` SET `attackpower`=190, `rangedattackpower`=22 WHERE `class`=8 AND `level`=52; +UPDATE `creature_classlevelstats` SET `attackpower`=194, `rangedattackpower`=23 WHERE `class`=8 AND `level`=53; +UPDATE `creature_classlevelstats` SET `attackpower`=198, `rangedattackpower`=23 WHERE `class`=8 AND `level`=54; +UPDATE `creature_classlevelstats` SET `attackpower`=202, `rangedattackpower`=23 WHERE `class`=8 AND `level`=55; +UPDATE `creature_classlevelstats` SET `attackpower`=208, `rangedattackpower`=24 WHERE `class`=8 AND `level`=56; +UPDATE `creature_classlevelstats` SET `attackpower`=212, `rangedattackpower`=24 WHERE `class`=8 AND `level`=57; +UPDATE `creature_classlevelstats` SET `attackpower`=214, `rangedattackpower`=24 WHERE `class`=8 AND `level`=58; +UPDATE `creature_classlevelstats` SET `attackpower`=220, `rangedattackpower`=25 WHERE `class`=8 AND `level`=59; +UPDATE `creature_classlevelstats` SET `attackpower`=224, `rangedattackpower`=25 WHERE `class`=8 AND `level`=60; +UPDATE `creature_classlevelstats` SET `attackpower`=230, `rangedattackpower`=25 WHERE `class`=8 AND `level`=61; +UPDATE `creature_classlevelstats` SET `attackpower`=232, `rangedattackpower`=25 WHERE `class`=8 AND `level`=62; +UPDATE `creature_classlevelstats` SET `attackpower`=238, `rangedattackpower`=26 WHERE `class`=8 AND `level`=63; +UPDATE `creature_classlevelstats` SET `attackpower`=242, `rangedattackpower`=26 WHERE `class`=8 AND `level`=64; +UPDATE `creature_classlevelstats` SET `attackpower`=248, `rangedattackpower`=26 WHERE `class`=8 AND `level`=65; +UPDATE `creature_classlevelstats` SET `attackpower`=250, `rangedattackpower`=27 WHERE `class`=8 AND `level`=66; +UPDATE `creature_classlevelstats` SET `attackpower`=256, `rangedattackpower`=27 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `attackpower`=260, `rangedattackpower`=27 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `attackpower`=266, `rangedattackpower`=28 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `attackpower`=270, `rangedattackpower`=28 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `attackpower`=274, `rangedattackpower`=31 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `attackpower`=280, `rangedattackpower`=34 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `attackpower`=286, `rangedattackpower`=37 WHERE `class`=8 AND `level`=73; +UPDATE `creature_classlevelstats` SET `attackpower`=316, `rangedattackpower`=41 WHERE `class`=8 AND `level`=74; +UPDATE `creature_classlevelstats` SET `attackpower`=350, `rangedattackpower`=45 WHERE `class`=8 AND `level`=75; +UPDATE `creature_classlevelstats` SET `attackpower`=386, `rangedattackpower`=49 WHERE `class`=8 AND `level`=76; +UPDATE `creature_classlevelstats` SET `attackpower`=428, `rangedattackpower`=54 WHERE `class`=8 AND `level`=77; +UPDATE `creature_classlevelstats` SET `attackpower`=472, `rangedattackpower`=58 WHERE `class`=8 AND `level`=78; +UPDATE `creature_classlevelstats` SET `attackpower`=520, `rangedattackpower`=64 WHERE `class`=8 AND `level`=79; +UPDATE `creature_classlevelstats` SET `attackpower`=574, `rangedattackpower`=69 WHERE `class`=8 AND `level`=80; +UPDATE `creature_classlevelstats` SET `attackpower`=608, `rangedattackpower`=74 WHERE `class`=8 AND `level`=81; +UPDATE `creature_classlevelstats` SET `attackpower`=652, `rangedattackpower`=79 WHERE `class`=8 AND `level`=82; +UPDATE `creature_classlevelstats` SET `attackpower`=686, `rangedattackpower`=84 WHERE `class`=8 AND `level`=83; diff --git a/sql/updates/world/2013_12_29_00_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_29_00_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..778e76a4e0 --- /dev/null +++ b/sql/updates/world/2013_12_29_00_world_creature_classlevelstats.sql @@ -0,0 +1,71 @@ +UPDATE `creature_classlevelstats` SET `damage_exp2`=111.1744 WHERE `class`=1 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=115.2244 WHERE `class`=1 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=119.2744 WHERE `class`=1 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=123.3244 WHERE `class`=1 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=127.3744 WHERE `class`=1 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=131.4244 WHERE `class`=1 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=135.4744 WHERE `class`=1 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=139.5244 WHERE `class`=1 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=143.5744 WHERE `class`=1 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=147.6244 WHERE `class`=1 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=151.6744 WHERE `class`=1 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=155.7244 WHERE `class`=1 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=160.2582 WHERE `class`=1 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=164.9240 WHERE `class`=1 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=168.9740 WHERE `class`=1 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=173.0240 WHERE `class`=1 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=177.0740 WHERE `class`=1 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=111.4876 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=115.4614 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=119.4352 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=123.4090 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=127.3828 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=131.2566 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=135.1304 WHERE `class`=2 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=139.0042 WHERE `class`=2 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=142.8780 WHERE `class`=2 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=146.8518 WHERE `class`=2 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=150.8256 WHERE `class`=2 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=154.7994 WHERE `class`=2 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=158.7732 WHERE `class`=2 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=162.7470 WHERE `class`=2 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=166.7208 WHERE `class`=2 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=170.6946 WHERE `class`=2 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=174.6684 WHERE `class`=2 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=111.1744 WHERE `class`=4 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=115.2244 WHERE `class`=4 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=119.2744 WHERE `class`=4 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=123.3244 WHERE `class`=4 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=127.3744 WHERE `class`=4 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=131.4244 WHERE `class`=4 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=135.4744 WHERE `class`=4 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=139.5244 WHERE `class`=4 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=143.5744 WHERE `class`=4 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=147.6244 WHERE `class`=4 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=151.6744 WHERE `class`=4 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=155.7244 WHERE `class`=4 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=160.2582 WHERE `class`=4 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=164.9240 WHERE `class`=4 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=168.9740 WHERE `class`=4 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=173.0240 WHERE `class`=4 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=177.0740 WHERE `class`=4 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=101.4332 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=105.3070 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=109.1808 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=113.0546 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=116.9284 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=120.8022 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=124.6760 WHERE `class`=8 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=128.5498 WHERE `class`=8 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=132.4236 WHERE `class`=8 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=136.2974 WHERE `class`=8 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=140.1712 WHERE `class`=8 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=144.0450 WHERE `class`=8 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=147.9188 WHERE `class`=8 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=152.5548 WHERE `class`=8 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=156.4286 WHERE `class`=8 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=160.3024 WHERE `class`=8 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=164.1762 WHERE `class`=8 AND `level`=83; diff --git a/sql/updates/world/2013_12_29_01_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_29_01_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..7d989f8007 --- /dev/null +++ b/sql/updates/world/2013_12_29_01_world_creature_classlevelstats.sql @@ -0,0 +1,71 @@ +UPDATE `creature_classlevelstats` SET `damage_exp1`=42.1353 WHERE `class`=1 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=46.9207 WHERE `class`=1 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=51.7061 WHERE `class`=1 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=56.4915 WHERE `class`=1 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=61.2769 WHERE `class`=1 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=66.0623 WHERE `class`=1 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=70.8477 WHERE `class`=1 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=75.6331 WHERE `class`=1 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=80.4185 WHERE `class`=1 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=85.2039 WHERE `class`=1 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=89.9893 WHERE `class`=1 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=94.7747 WHERE `class`=1 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=99.5601 WHERE `class`=1 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=104.3456 WHERE `class`=1 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=109.1310 WHERE `class`=1 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=113.9164 WHERE `class`=1 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=118.7018 WHERE `class`=1 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp1`=40.1830 WHERE `class`=2 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=44.7542 WHERE `class`=2 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=49.3254 WHERE `class`=2 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=53.8966 WHERE `class`=2 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=58.4678 WHERE `class`=2 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=63.4390 WHERE `class`=2 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=68.4102 WHERE `class`=2 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=73.3814 WHERE `class`=2 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=78.3526 WHERE `class`=2 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=83.3238 WHERE `class`=2 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=88.2950 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=93.2662 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=98.2376 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=103.0388 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=107.8400 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=112.6412 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=117.4424 WHERE `class`=2 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp1`=42.1353 WHERE `class`=4 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=46.9207 WHERE `class`=4 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=51.7061 WHERE `class`=4 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=56.4915 WHERE `class`=4 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=61.2769 WHERE `class`=4 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=66.0623 WHERE `class`=4 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=70.8477 WHERE `class`=4 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=75.6331 WHERE `class`=4 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=80.4185 WHERE `class`=4 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=85.2039 WHERE `class`=4 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=89.9893 WHERE `class`=4 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=94.7747 WHERE `class`=4 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=99.5601 WHERE `class`=4 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=104.3456 WHERE `class`=4 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=109.1310 WHERE `class`=4 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=113.9164 WHERE `class`=4 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=118.7018 WHERE `class`=4 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp1`=36.3127 WHERE `class`=8 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=40.8157 WHERE `class`=8 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=45.3187 WHERE `class`=8 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=49.8217 WHERE `class`=8 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=54.3247 WHERE `class`=8 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=58.8277 WHERE `class`=8 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=63.3307 WHERE `class`=8 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=67.8337 WHERE `class`=8 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=72.3367 WHERE `class`=8 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=76.8397 WHERE `class`=8 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=81.3427 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=85.8457 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=90.3487 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=94.8517 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=99.3547 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=103.8577 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=108.7978 WHERE `class`=8 AND `level`=73; diff --git a/sql/updates/world/2013_12_30_00_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_30_00_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..8974bcc025 --- /dev/null +++ b/sql/updates/world/2013_12_30_00_world_creature_classlevelstats.sql @@ -0,0 +1,479 @@ +UPDATE `creature_classlevelstats` SET `damage_base`=0.2500 WHERE `class`=1 AND `level`=1; +UPDATE `creature_classlevelstats` SET `damage_base`=0.5400 WHERE `class`=1 AND `level`=2; +UPDATE `creature_classlevelstats` SET `damage_base`=0.7400 WHERE `class`=1 AND `level`=3; +UPDATE `creature_classlevelstats` SET `damage_base`=0.9435 WHERE `class`=1 AND `level`=4; +UPDATE `creature_classlevelstats` SET `damage_base`=1.5000 WHERE `class`=1 AND `level`=5; +UPDATE `creature_classlevelstats` SET `damage_base`=2.2000 WHERE `class`=1 AND `level`=6; +UPDATE `creature_classlevelstats` SET `damage_base`=3.0000 WHERE `class`=1 AND `level`=7; +UPDATE `creature_classlevelstats` SET `damage_base`=4.3597 WHERE `class`=1 AND `level`=8; +UPDATE `creature_classlevelstats` SET `damage_base`=4.6993 WHERE `class`=1 AND `level`=9; +UPDATE `creature_classlevelstats` SET `damage_base`=4.8281 WHERE `class`=1 AND `level`=10; +UPDATE `creature_classlevelstats` SET `damage_base`=5.1609 WHERE `class`=1 AND `level`=11; +UPDATE `creature_classlevelstats` SET `damage_base`=5.6558 WHERE `class`=1 AND `level`=12; +UPDATE `creature_classlevelstats` SET `damage_base`=6.0221 WHERE `class`=1 AND `level`=13; +UPDATE `creature_classlevelstats` SET `damage_base`=6.6101 WHERE `class`=1 AND `level`=14; +UPDATE `creature_classlevelstats` SET `damage_base`=7.1981 WHERE `class`=1 AND `level`=15; +UPDATE `creature_classlevelstats` SET `damage_base`=7.7861 WHERE `class`=1 AND `level`=16; +UPDATE `creature_classlevelstats` SET `damage_base`=8.3741 WHERE `class`=1 AND `level`=17; +UPDATE `creature_classlevelstats` SET `damage_base`=8.9621 WHERE `class`=1 AND `level`=18; +UPDATE `creature_classlevelstats` SET `damage_base`=9.5501 WHERE `class`=1 AND `level`=19; +UPDATE `creature_classlevelstats` SET `damage_base`=10.1381 WHERE `class`=1 AND `level`=20; +UPDATE `creature_classlevelstats` SET `damage_base`=10.7261 WHERE `class`=1 AND `level`=21; +UPDATE `creature_classlevelstats` SET `damage_base`=11.3141 WHERE `class`=1 AND `level`=22; +UPDATE `creature_classlevelstats` SET `damage_base`=11.9021 WHERE `class`=1 AND `level`=23; +UPDATE `creature_classlevelstats` SET `damage_base`=12.4901 WHERE `class`=1 AND `level`=24; +UPDATE `creature_classlevelstats` SET `damage_base`=13.0781 WHERE `class`=1 AND `level`=25; +UPDATE `creature_classlevelstats` SET `damage_base`=13.6661 WHERE `class`=1 AND `level`=26; +UPDATE `creature_classlevelstats` SET `damage_base`=14.2541 WHERE `class`=1 AND `level`=27; +UPDATE `creature_classlevelstats` SET `damage_base`=14.8421 WHERE `class`=1 AND `level`=28; +UPDATE `creature_classlevelstats` SET `damage_base`=15.4301 WHERE `class`=1 AND `level`=29; +UPDATE `creature_classlevelstats` SET `damage_base`=16.0181 WHERE `class`=1 AND `level`=30; +UPDATE `creature_classlevelstats` SET `damage_base`=16.6061 WHERE `class`=1 AND `level`=31; +UPDATE `creature_classlevelstats` SET `damage_base`=17.1941 WHERE `class`=1 AND `level`=32; +UPDATE `creature_classlevelstats` SET `damage_base`=17.7821 WHERE `class`=1 AND `level`=33; +UPDATE `creature_classlevelstats` SET `damage_base`=18.3701 WHERE `class`=1 AND `level`=34; +UPDATE `creature_classlevelstats` SET `damage_base`=18.9581 WHERE `class`=1 AND `level`=35; +UPDATE `creature_classlevelstats` SET `damage_base`=19.5461 WHERE `class`=1 AND `level`=36; +UPDATE `creature_classlevelstats` SET `damage_base`=20.1341 WHERE `class`=1 AND `level`=37; +UPDATE `creature_classlevelstats` SET `damage_base`=20.7221 WHERE `class`=1 AND `level`=38; +UPDATE `creature_classlevelstats` SET `damage_base`=21.3101 WHERE `class`=1 AND `level`=39; +UPDATE `creature_classlevelstats` SET `damage_base`=21.8981 WHERE `class`=1 AND `level`=40; +UPDATE `creature_classlevelstats` SET `damage_base`=22.4861 WHERE `class`=1 AND `level`=41; +UPDATE `creature_classlevelstats` SET `damage_base`=23.0741 WHERE `class`=1 AND `level`=42; +UPDATE `creature_classlevelstats` SET `damage_base`=23.6621 WHERE `class`=1 AND `level`=43; +UPDATE `creature_classlevelstats` SET `damage_base`=24.2501 WHERE `class`=1 AND `level`=44; +UPDATE `creature_classlevelstats` SET `damage_base`=24.8381 WHERE `class`=1 AND `level`=45; +UPDATE `creature_classlevelstats` SET `damage_base`=25.4261 WHERE `class`=1 AND `level`=46; +UPDATE `creature_classlevelstats` SET `damage_base`=26.0141 WHERE `class`=1 AND `level`=47; +UPDATE `creature_classlevelstats` SET `damage_base`=26.6021 WHERE `class`=1 AND `level`=48; +UPDATE `creature_classlevelstats` SET `damage_base`=27.1901 WHERE `class`=1 AND `level`=49; +UPDATE `creature_classlevelstats` SET `damage_base`=27.7781 WHERE `class`=1 AND `level`=50; +UPDATE `creature_classlevelstats` SET `damage_base`=28.3661 WHERE `class`=1 AND `level`=51; +UPDATE `creature_classlevelstats` SET `damage_base`=28.9541 WHERE `class`=1 AND `level`=52; +UPDATE `creature_classlevelstats` SET `damage_base`=29.5421 WHERE `class`=1 AND `level`=53; +UPDATE `creature_classlevelstats` SET `damage_base`=30.1301 WHERE `class`=1 AND `level`=54; +UPDATE `creature_classlevelstats` SET `damage_base`=30.7177 WHERE `class`=1 AND `level`=55; +UPDATE `creature_classlevelstats` SET `damage_base`=31.3057 WHERE `class`=1 AND `level`=56; +UPDATE `creature_classlevelstats` SET `damage_base`=31.8937 WHERE `class`=1 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_base`=32.4817 WHERE `class`=1 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_base`=33.0697 WHERE `class`=1 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_base`=33.6577 WHERE `class`=1 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_base`=34.2457 WHERE `class`=1 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_base`=34.8337 WHERE `class`=1 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_base`=35.4217 WHERE `class`=1 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_base`=36.0097 WHERE `class`=1 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_base`=36.5977 WHERE `class`=1 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_base`=37.1857 WHERE `class`=1 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_base`=37.7737 WHERE `class`=1 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_base`=38.3617 WHERE `class`=1 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_base`=38.9497 WHERE `class`=1 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_base`=39.5377 WHERE `class`=1 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_base`=40.1257 WHERE `class`=1 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_base`=40.7137 WHERE `class`=1 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_base`=41.3017 WHERE `class`=1 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_base`=41.8897 WHERE `class`=1 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_base`=42.4777 WHERE `class`=1 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_base`=43.0657 WHERE `class`=1 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_base`=43.6537 WHERE `class`=1 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_base`=44.2417 WHERE `class`=1 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_base`=44.8297 WHERE `class`=1 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_base`=45.4177 WHERE `class`=1 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_base`=46.0057 WHERE `class`=1 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_base`=46.5937 WHERE `class`=1 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_base`=47.1817 WHERE `class`=1 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_base`=0.2500 WHERE `class`=2 AND `level`=1; +UPDATE `creature_classlevelstats` SET `damage_base`=0.5400 WHERE `class`=2 AND `level`=2; +UPDATE `creature_classlevelstats` SET `damage_base`=0.7400 WHERE `class`=2 AND `level`=3; +UPDATE `creature_classlevelstats` SET `damage_base`=0.9435 WHERE `class`=2 AND `level`=4; +UPDATE `creature_classlevelstats` SET `damage_base`=1.5000 WHERE `class`=2 AND `level`=5; +UPDATE `creature_classlevelstats` SET `damage_base`=2.2000 WHERE `class`=2 AND `level`=6; +UPDATE `creature_classlevelstats` SET `damage_base`=3.0000 WHERE `class`=2 AND `level`=7; +UPDATE `creature_classlevelstats` SET `damage_base`=4.3597 WHERE `class`=2 AND `level`=8; +UPDATE `creature_classlevelstats` SET `damage_base`=4.6993 WHERE `class`=2 AND `level`=9; +UPDATE `creature_classlevelstats` SET `damage_base`=4.8281 WHERE `class`=2 AND `level`=10; +UPDATE `creature_classlevelstats` SET `damage_base`=5.1609 WHERE `class`=2 AND `level`=11; +UPDATE `creature_classlevelstats` SET `damage_base`=5.6558 WHERE `class`=2 AND `level`=12; +UPDATE `creature_classlevelstats` SET `damage_base`=5.4575 WHERE `class`=2 AND `level`=13; +UPDATE `creature_classlevelstats` SET `damage_base`=5.9573 WHERE `class`=2 AND `level`=14; +UPDATE `creature_classlevelstats` SET `damage_base`=6.4571 WHERE `class`=2 AND `level`=15; +UPDATE `creature_classlevelstats` SET `damage_base`=6.9569 WHERE `class`=2 AND `level`=16; +UPDATE `creature_classlevelstats` SET `damage_base`=7.4567 WHERE `class`=2 AND `level`=17; +UPDATE `creature_classlevelstats` SET `damage_base`=7.9565 WHERE `class`=2 AND `level`=18; +UPDATE `creature_classlevelstats` SET `damage_base`=8.4563 WHERE `class`=2 AND `level`=19; +UPDATE `creature_classlevelstats` SET `damage_base`=8.9561 WHERE `class`=2 AND `level`=20; +UPDATE `creature_classlevelstats` SET `damage_base`=9.3521 WHERE `class`=2 AND `level`=21; +UPDATE `creature_classlevelstats` SET `damage_base`=9.7481 WHERE `class`=2 AND `level`=22; +UPDATE `creature_classlevelstats` SET `damage_base`=10.1441 WHERE `class`=2 AND `level`=23; +UPDATE `creature_classlevelstats` SET `damage_base`=10.5401 WHERE `class`=2 AND `level`=24; +UPDATE `creature_classlevelstats` SET `damage_base`=10.9361 WHERE `class`=2 AND `level`=25; +UPDATE `creature_classlevelstats` SET `damage_base`=11.3321 WHERE `class`=2 AND `level`=26; +UPDATE `creature_classlevelstats` SET `damage_base`=11.7281 WHERE `class`=2 AND `level`=27; +UPDATE `creature_classlevelstats` SET `damage_base`=12.1241 WHERE `class`=2 AND `level`=28; +UPDATE `creature_classlevelstats` SET `damage_base`=12.5201 WHERE `class`=2 AND `level`=29; +UPDATE `creature_classlevelstats` SET `damage_base`=12.9161 WHERE `class`=2 AND `level`=30; +UPDATE `creature_classlevelstats` SET `damage_base`=13.3121 WHERE `class`=2 AND `level`=31; +UPDATE `creature_classlevelstats` SET `damage_base`=13.7081 WHERE `class`=2 AND `level`=32; +UPDATE `creature_classlevelstats` SET `damage_base`=14.1041 WHERE `class`=2 AND `level`=33; +UPDATE `creature_classlevelstats` SET `damage_base`=14.5001 WHERE `class`=2 AND `level`=34; +UPDATE `creature_classlevelstats` SET `damage_base`=14.8961 WHERE `class`=2 AND `level`=35; +UPDATE `creature_classlevelstats` SET `damage_base`=15.2921 WHERE `class`=2 AND `level`=36; +UPDATE `creature_classlevelstats` SET `damage_base`=15.6881 WHERE `class`=2 AND `level`=37; +UPDATE `creature_classlevelstats` SET `damage_base`=16.0841 WHERE `class`=2 AND `level`=38; +UPDATE `creature_classlevelstats` SET `damage_base`=16.4801 WHERE `class`=2 AND `level`=39; +UPDATE `creature_classlevelstats` SET `damage_base`=16.8754 WHERE `class`=2 AND `level`=40; +UPDATE `creature_classlevelstats` SET `damage_base`=17.6408 WHERE `class`=2 AND `level`=41; +UPDATE `creature_classlevelstats` SET `damage_base`=18.4062 WHERE `class`=2 AND `level`=42; +UPDATE `creature_classlevelstats` SET `damage_base`=19.1716 WHERE `class`=2 AND `level`=43; +UPDATE `creature_classlevelstats` SET `damage_base`=19.9370 WHERE `class`=2 AND `level`=44; +UPDATE `creature_classlevelstats` SET `damage_base`=20.7024 WHERE `class`=2 AND `level`=45; +UPDATE `creature_classlevelstats` SET `damage_base`=21.4678 WHERE `class`=2 AND `level`=46; +UPDATE `creature_classlevelstats` SET `damage_base`=22.2332 WHERE `class`=2 AND `level`=47; +UPDATE `creature_classlevelstats` SET `damage_base`=22.9986 WHERE `class`=2 AND `level`=48; +UPDATE `creature_classlevelstats` SET `damage_base`=23.7640 WHERE `class`=2 AND `level`=49; +UPDATE `creature_classlevelstats` SET `damage_base`=24.5294 WHERE `class`=2 AND `level`=50; +UPDATE `creature_classlevelstats` SET `damage_base`=25.2948 WHERE `class`=2 AND `level`=51; +UPDATE `creature_classlevelstats` SET `damage_base`=26.0602 WHERE `class`=2 AND `level`=52; +UPDATE `creature_classlevelstats` SET `damage_base`=26.8256 WHERE `class`=2 AND `level`=53; +UPDATE `creature_classlevelstats` SET `damage_base`=27.5910 WHERE `class`=2 AND `level`=54; +UPDATE `creature_classlevelstats` SET `damage_base`=28.3567 WHERE `class`=2 AND `level`=55; +UPDATE `creature_classlevelstats` SET `damage_base`=28.9221 WHERE `class`=2 AND `level`=56; +UPDATE `creature_classlevelstats` SET `damage_base`=29.4875 WHERE `class`=2 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_base`=30.0529 WHERE `class`=2 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_base`=30.6183 WHERE `class`=2 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_base`=31.1837 WHERE `class`=2 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_base`=31.7491 WHERE `class`=2 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_base`=32.3145 WHERE `class`=2 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_base`=32.8799 WHERE `class`=2 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_base`=33.4453 WHERE `class`=2 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_base`=34.0107 WHERE `class`=2 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_base`=34.5761 WHERE `class`=2 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_base`=35.1415 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_base`=35.7069 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_base`=36.2723 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_base`=36.8377 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_base`=37.4031 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_base`=37.9685 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_base`=38.5339 WHERE `class`=2 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_base`=39.0993 WHERE `class`=2 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_base`=39.6647 WHERE `class`=2 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_base`=40.2301 WHERE `class`=2 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_base`=40.7955 WHERE `class`=2 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_base`=41.3609 WHERE `class`=2 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_base`=41.9263 WHERE `class`=2 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_base`=42.4917 WHERE `class`=2 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_base`=43.0571 WHERE `class`=2 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_base`=43.6225 WHERE `class`=2 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_base`=44.1879 WHERE `class`=2 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_base`=0.2500 WHERE `class`=4 AND `level`=1; +UPDATE `creature_classlevelstats` SET `damage_base`=0.5400 WHERE `class`=4 AND `level`=2; +UPDATE `creature_classlevelstats` SET `damage_base`=0.7400 WHERE `class`=4 AND `level`=3; +UPDATE `creature_classlevelstats` SET `damage_base`=0.9435 WHERE `class`=4 AND `level`=4; +UPDATE `creature_classlevelstats` SET `damage_base`=1.5000 WHERE `class`=4 AND `level`=5; +UPDATE `creature_classlevelstats` SET `damage_base`=2.2000 WHERE `class`=4 AND `level`=6; +UPDATE `creature_classlevelstats` SET `damage_base`=3.0000 WHERE `class`=4 AND `level`=7; +UPDATE `creature_classlevelstats` SET `damage_base`=4.3597 WHERE `class`=4 AND `level`=8; +UPDATE `creature_classlevelstats` SET `damage_base`=4.6993 WHERE `class`=4 AND `level`=9; +UPDATE `creature_classlevelstats` SET `damage_base`=4.8281 WHERE `class`=4 AND `level`=10; +UPDATE `creature_classlevelstats` SET `damage_base`=5.1609 WHERE `class`=4 AND `level`=11; +UPDATE `creature_classlevelstats` SET `damage_base`=5.6558 WHERE `class`=4 AND `level`=12; +UPDATE `creature_classlevelstats` SET `damage_base`=6.0221 WHERE `class`=4 AND `level`=13; +UPDATE `creature_classlevelstats` SET `damage_base`=6.6101 WHERE `class`=4 AND `level`=14; +UPDATE `creature_classlevelstats` SET `damage_base`=7.1981 WHERE `class`=4 AND `level`=15; +UPDATE `creature_classlevelstats` SET `damage_base`=7.7861 WHERE `class`=4 AND `level`=16; +UPDATE `creature_classlevelstats` SET `damage_base`=8.3741 WHERE `class`=4 AND `level`=17; +UPDATE `creature_classlevelstats` SET `damage_base`=8.9621 WHERE `class`=4 AND `level`=18; +UPDATE `creature_classlevelstats` SET `damage_base`=9.5501 WHERE `class`=4 AND `level`=19; +UPDATE `creature_classlevelstats` SET `damage_base`=10.1381 WHERE `class`=4 AND `level`=20; +UPDATE `creature_classlevelstats` SET `damage_base`=10.7261 WHERE `class`=4 AND `level`=21; +UPDATE `creature_classlevelstats` SET `damage_base`=11.3141 WHERE `class`=4 AND `level`=22; +UPDATE `creature_classlevelstats` SET `damage_base`=11.9021 WHERE `class`=4 AND `level`=23; +UPDATE `creature_classlevelstats` SET `damage_base`=12.4901 WHERE `class`=4 AND `level`=24; +UPDATE `creature_classlevelstats` SET `damage_base`=13.0781 WHERE `class`=4 AND `level`=25; +UPDATE `creature_classlevelstats` SET `damage_base`=13.6661 WHERE `class`=4 AND `level`=26; +UPDATE `creature_classlevelstats` SET `damage_base`=14.2541 WHERE `class`=4 AND `level`=27; +UPDATE `creature_classlevelstats` SET `damage_base`=14.8421 WHERE `class`=4 AND `level`=28; +UPDATE `creature_classlevelstats` SET `damage_base`=15.4301 WHERE `class`=4 AND `level`=29; +UPDATE `creature_classlevelstats` SET `damage_base`=16.0181 WHERE `class`=4 AND `level`=30; +UPDATE `creature_classlevelstats` SET `damage_base`=16.6061 WHERE `class`=4 AND `level`=31; +UPDATE `creature_classlevelstats` SET `damage_base`=17.1941 WHERE `class`=4 AND `level`=32; +UPDATE `creature_classlevelstats` SET `damage_base`=17.7821 WHERE `class`=4 AND `level`=33; +UPDATE `creature_classlevelstats` SET `damage_base`=18.3701 WHERE `class`=4 AND `level`=34; +UPDATE `creature_classlevelstats` SET `damage_base`=18.9581 WHERE `class`=4 AND `level`=35; +UPDATE `creature_classlevelstats` SET `damage_base`=19.5461 WHERE `class`=4 AND `level`=36; +UPDATE `creature_classlevelstats` SET `damage_base`=20.1341 WHERE `class`=4 AND `level`=37; +UPDATE `creature_classlevelstats` SET `damage_base`=20.7221 WHERE `class`=4 AND `level`=38; +UPDATE `creature_classlevelstats` SET `damage_base`=21.3101 WHERE `class`=4 AND `level`=39; +UPDATE `creature_classlevelstats` SET `damage_base`=21.8981 WHERE `class`=4 AND `level`=40; +UPDATE `creature_classlevelstats` SET `damage_base`=22.4861 WHERE `class`=4 AND `level`=41; +UPDATE `creature_classlevelstats` SET `damage_base`=23.0741 WHERE `class`=4 AND `level`=42; +UPDATE `creature_classlevelstats` SET `damage_base`=23.6621 WHERE `class`=4 AND `level`=43; +UPDATE `creature_classlevelstats` SET `damage_base`=24.2501 WHERE `class`=4 AND `level`=44; +UPDATE `creature_classlevelstats` SET `damage_base`=24.8381 WHERE `class`=4 AND `level`=45; +UPDATE `creature_classlevelstats` SET `damage_base`=25.4261 WHERE `class`=4 AND `level`=46; +UPDATE `creature_classlevelstats` SET `damage_base`=26.0141 WHERE `class`=4 AND `level`=47; +UPDATE `creature_classlevelstats` SET `damage_base`=26.6021 WHERE `class`=4 AND `level`=48; +UPDATE `creature_classlevelstats` SET `damage_base`=27.1901 WHERE `class`=4 AND `level`=49; +UPDATE `creature_classlevelstats` SET `damage_base`=27.7781 WHERE `class`=4 AND `level`=50; +UPDATE `creature_classlevelstats` SET `damage_base`=28.3661 WHERE `class`=4 AND `level`=51; +UPDATE `creature_classlevelstats` SET `damage_base`=28.9541 WHERE `class`=4 AND `level`=52; +UPDATE `creature_classlevelstats` SET `damage_base`=29.5421 WHERE `class`=4 AND `level`=53; +UPDATE `creature_classlevelstats` SET `damage_base`=30.1301 WHERE `class`=4 AND `level`=54; +UPDATE `creature_classlevelstats` SET `damage_base`=30.7177 WHERE `class`=4 AND `level`=55; +UPDATE `creature_classlevelstats` SET `damage_base`=31.3057 WHERE `class`=4 AND `level`=56; +UPDATE `creature_classlevelstats` SET `damage_base`=31.8937 WHERE `class`=4 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_base`=32.4817 WHERE `class`=4 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_base`=33.0697 WHERE `class`=4 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_base`=33.6577 WHERE `class`=4 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_base`=34.2457 WHERE `class`=4 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_base`=34.8337 WHERE `class`=4 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_base`=35.4217 WHERE `class`=4 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_base`=36.0097 WHERE `class`=4 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_base`=36.5977 WHERE `class`=4 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_base`=37.1857 WHERE `class`=4 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_base`=37.7737 WHERE `class`=4 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_base`=38.3617 WHERE `class`=4 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_base`=38.9497 WHERE `class`=4 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_base`=39.5377 WHERE `class`=4 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_base`=40.1257 WHERE `class`=4 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_base`=40.7137 WHERE `class`=4 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_base`=41.3017 WHERE `class`=4 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_base`=41.8897 WHERE `class`=4 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_base`=42.4777 WHERE `class`=4 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_base`=43.0657 WHERE `class`=4 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_base`=43.6537 WHERE `class`=4 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_base`=44.2417 WHERE `class`=4 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_base`=44.8297 WHERE `class`=4 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_base`=45.4177 WHERE `class`=4 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_base`=46.0057 WHERE `class`=4 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_base`=46.5937 WHERE `class`=4 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_base`=47.1817 WHERE `class`=4 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_base`=0.2500 WHERE `class`=8 AND `level`=1; +UPDATE `creature_classlevelstats` SET `damage_base`=0.5400 WHERE `class`=8 AND `level`=2; +UPDATE `creature_classlevelstats` SET `damage_base`=0.7400 WHERE `class`=8 AND `level`=3; +UPDATE `creature_classlevelstats` SET `damage_base`=0.9435 WHERE `class`=8 AND `level`=4; +UPDATE `creature_classlevelstats` SET `damage_base`=1.5000 WHERE `class`=8 AND `level`=5; +UPDATE `creature_classlevelstats` SET `damage_base`=2.2000 WHERE `class`=8 AND `level`=6; +UPDATE `creature_classlevelstats` SET `damage_base`=3.0000 WHERE `class`=8 AND `level`=7; +UPDATE `creature_classlevelstats` SET `damage_base`=4.3597 WHERE `class`=8 AND `level`=8; +UPDATE `creature_classlevelstats` SET `damage_base`=4.6993 WHERE `class`=8 AND `level`=9; +UPDATE `creature_classlevelstats` SET `damage_base`=4.8281 WHERE `class`=8 AND `level`=10; +UPDATE `creature_classlevelstats` SET `damage_base`=5.1609 WHERE `class`=8 AND `level`=11; +UPDATE `creature_classlevelstats` SET `damage_base`=5.6558 WHERE `class`=8 AND `level`=12; +UPDATE `creature_classlevelstats` SET `damage_base`=5.8075 WHERE `class`=8 AND `level`=13; +UPDATE `creature_classlevelstats` SET `damage_base`=6.0953 WHERE `class`=8 AND `level`=14; +UPDATE `creature_classlevelstats` SET `damage_base`=6.6583 WHERE `class`=8 AND `level`=15; +UPDATE `creature_classlevelstats` SET `damage_base`=7.0945 WHERE `class`=8 AND `level`=16; +UPDATE `creature_classlevelstats` SET `damage_base`=7.6058 WHERE `class`=8 AND `level`=17; +UPDATE `creature_classlevelstats` SET `damage_base`=7.9043 WHERE `class`=8 AND `level`=18; +UPDATE `creature_classlevelstats` SET `damage_base`=8.3806 WHERE `class`=8 AND `level`=19; +UPDATE `creature_classlevelstats` SET `damage_base`=8.9561 WHERE `class`=8 AND `level`=20; +UPDATE `creature_classlevelstats` SET `damage_base`=9.2202 WHERE `class`=8 AND `level`=21; +UPDATE `creature_classlevelstats` SET `damage_base`=9.5228 WHERE `class`=8 AND `level`=22; +UPDATE `creature_classlevelstats` SET `damage_base`=9.8254 WHERE `class`=8 AND `level`=23; +UPDATE `creature_classlevelstats` SET `damage_base`=10.1280 WHERE `class`=8 AND `level`=24; +UPDATE `creature_classlevelstats` SET `damage_base`=10.4306 WHERE `class`=8 AND `level`=25; +UPDATE `creature_classlevelstats` SET `damage_base`=10.7332 WHERE `class`=8 AND `level`=26; +UPDATE `creature_classlevelstats` SET `damage_base`=11.0358 WHERE `class`=8 AND `level`=27; +UPDATE `creature_classlevelstats` SET `damage_base`=11.3384 WHERE `class`=8 AND `level`=28; +UPDATE `creature_classlevelstats` SET `damage_base`=11.6410 WHERE `class`=8 AND `level`=29; +UPDATE `creature_classlevelstats` SET `damage_base`=11.9436 WHERE `class`=8 AND `level`=30; +UPDATE `creature_classlevelstats` SET `damage_base`=12.2462 WHERE `class`=8 AND `level`=31; +UPDATE `creature_classlevelstats` SET `damage_base`=12.5488 WHERE `class`=8 AND `level`=32; +UPDATE `creature_classlevelstats` SET `damage_base`=12.8514 WHERE `class`=8 AND `level`=33; +UPDATE `creature_classlevelstats` SET `damage_base`=13.1540 WHERE `class`=8 AND `level`=34; +UPDATE `creature_classlevelstats` SET `damage_base`=13.4567 WHERE `class`=8 AND `level`=35; +UPDATE `creature_classlevelstats` SET `damage_base`=14.0678 WHERE `class`=8 AND `level`=36; +UPDATE `creature_classlevelstats` SET `damage_base`=14.6789 WHERE `class`=8 AND `level`=37; +UPDATE `creature_classlevelstats` SET `damage_base`=15.2900 WHERE `class`=8 AND `level`=38; +UPDATE `creature_classlevelstats` SET `damage_base`=15.9011 WHERE `class`=8 AND `level`=39; +UPDATE `creature_classlevelstats` SET `damage_base`=16.5122 WHERE `class`=8 AND `level`=40; +UPDATE `creature_classlevelstats` SET `damage_base`=17.1233 WHERE `class`=8 AND `level`=41; +UPDATE `creature_classlevelstats` SET `damage_base`=17.7344 WHERE `class`=8 AND `level`=42; +UPDATE `creature_classlevelstats` SET `damage_base`=18.3455 WHERE `class`=8 AND `level`=43; +UPDATE `creature_classlevelstats` SET `damage_base`=18.9566 WHERE `class`=8 AND `level`=44; +UPDATE `creature_classlevelstats` SET `damage_base`=19.5677 WHERE `class`=8 AND `level`=45; +UPDATE `creature_classlevelstats` SET `damage_base`=20.1788 WHERE `class`=8 AND `level`=46; +UPDATE `creature_classlevelstats` SET `damage_base`=20.7899 WHERE `class`=8 AND `level`=47; +UPDATE `creature_classlevelstats` SET `damage_base`=21.4010 WHERE `class`=8 AND `level`=48; +UPDATE `creature_classlevelstats` SET `damage_base`=22.0121 WHERE `class`=8 AND `level`=49; +UPDATE `creature_classlevelstats` SET `damage_base`=22.6232 WHERE `class`=8 AND `level`=50; +UPDATE `creature_classlevelstats` SET `damage_base`=23.2343 WHERE `class`=8 AND `level`=51; +UPDATE `creature_classlevelstats` SET `damage_base`=23.8454 WHERE `class`=8 AND `level`=52; +UPDATE `creature_classlevelstats` SET `damage_base`=24.4565 WHERE `class`=8 AND `level`=53; +UPDATE `creature_classlevelstats` SET `damage_base`=25.0676 WHERE `class`=8 AND `level`=54; +UPDATE `creature_classlevelstats` SET `damage_base`=25.6787 WHERE `class`=8 AND `level`=55; +UPDATE `creature_classlevelstats` SET `damage_base`=26.2898 WHERE `class`=8 AND `level`=56; +UPDATE `creature_classlevelstats` SET `damage_base`=26.9009 WHERE `class`=8 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_base`=27.5120 WHERE `class`=8 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_base`=28.1234 WHERE `class`=8 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_base`=28.7345 WHERE `class`=8 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_base`=29.3456 WHERE `class`=8 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_base`=29.9567 WHERE `class`=8 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_base`=30.5678 WHERE `class`=8 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_base`=31.1789 WHERE `class`=8 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_base`=31.7900 WHERE `class`=8 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_base`=32.4011 WHERE `class`=8 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_base`=33.0122 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_base`=33.6233 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_base`=34.2344 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_base`=34.8455 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_base`=35.4566 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_base`=36.0677 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_base`=36.6788 WHERE `class`=8 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_base`=37.2899 WHERE `class`=8 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_base`=37.9010 WHERE `class`=8 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_base`=38.5121 WHERE `class`=8 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_base`=39.1232 WHERE `class`=8 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_base`=39.7343 WHERE `class`=8 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_base`=40.3454 WHERE `class`=8 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_base`=40.9565 WHERE `class`=8 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_base`=41.5676 WHERE `class`=8 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_base`=42.1787 WHERE `class`=8 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_base`=42.7898 WHERE `class`=8 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_exp1`=42.1353 WHERE `class`=1 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=46.9207 WHERE `class`=1 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=51.7061 WHERE `class`=1 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=56.4915 WHERE `class`=1 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=61.2769 WHERE `class`=1 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=66.0623 WHERE `class`=1 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=70.8477 WHERE `class`=1 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=75.6331 WHERE `class`=1 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=80.4185 WHERE `class`=1 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=85.2039 WHERE `class`=1 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=89.9893 WHERE `class`=1 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=94.7747 WHERE `class`=1 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=99.5601 WHERE `class`=1 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=104.3456 WHERE `class`=1 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=109.1310 WHERE `class`=1 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=113.9164 WHERE `class`=1 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=118.7018 WHERE `class`=1 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp1`=40.1830 WHERE `class`=2 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=44.7542 WHERE `class`=2 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=49.3254 WHERE `class`=2 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=53.8966 WHERE `class`=2 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=58.4678 WHERE `class`=2 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=63.4390 WHERE `class`=2 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=68.4102 WHERE `class`=2 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=73.3814 WHERE `class`=2 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=78.3526 WHERE `class`=2 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=83.3238 WHERE `class`=2 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=88.2950 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=93.2662 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=98.2376 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=103.0388 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=107.8400 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=112.6412 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=117.4424 WHERE `class`=2 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp1`=42.1353 WHERE `class`=4 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=46.9207 WHERE `class`=4 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=51.7061 WHERE `class`=4 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=56.4915 WHERE `class`=4 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=61.2769 WHERE `class`=4 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=66.0623 WHERE `class`=4 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=70.8477 WHERE `class`=4 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=75.6331 WHERE `class`=4 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=80.4185 WHERE `class`=4 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=85.2039 WHERE `class`=4 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=89.9893 WHERE `class`=4 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=94.7747 WHERE `class`=4 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=99.5601 WHERE `class`=4 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=104.3456 WHERE `class`=4 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=109.1310 WHERE `class`=4 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=113.9164 WHERE `class`=4 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=118.7018 WHERE `class`=4 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp1`=37.8665 WHERE `class`=8 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=38.7223 WHERE `class`=8 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=39.5781 WHERE `class`=8 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=40.4339 WHERE `class`=8 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=41.2897 WHERE `class`=8 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=42.1455 WHERE `class`=8 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=43.0013 WHERE `class`=8 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=43.8571 WHERE `class`=8 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=44.7129 WHERE `class`=8 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=45.5687 WHERE `class`=8 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=46.4245 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=47.2803 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=48.1361 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=48.9919 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=49.8477 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=50.7035 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=51.5593 WHERE `class`=8 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=111.1744 WHERE `class`=1 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=115.2244 WHERE `class`=1 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=119.2744 WHERE `class`=1 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=123.3244 WHERE `class`=1 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=127.3744 WHERE `class`=1 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=131.4244 WHERE `class`=1 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=135.4744 WHERE `class`=1 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=139.5244 WHERE `class`=1 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=143.5744 WHERE `class`=1 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=147.6244 WHERE `class`=1 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=151.6744 WHERE `class`=1 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=155.7244 WHERE `class`=1 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=160.2582 WHERE `class`=1 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=164.9240 WHERE `class`=1 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=168.9740 WHERE `class`=1 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=173.0240 WHERE `class`=1 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=177.0740 WHERE `class`=1 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=111.4876 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=115.4614 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=119.4352 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=123.4090 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=127.3828 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=131.2566 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=135.1304 WHERE `class`=2 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=139.0042 WHERE `class`=2 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=142.8780 WHERE `class`=2 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=146.8518 WHERE `class`=2 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=150.8256 WHERE `class`=2 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=154.7994 WHERE `class`=2 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=158.7732 WHERE `class`=2 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=162.7470 WHERE `class`=2 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=166.7208 WHERE `class`=2 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=170.6946 WHERE `class`=2 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=174.6684 WHERE `class`=2 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=111.1744 WHERE `class`=4 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=115.2244 WHERE `class`=4 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=119.2744 WHERE `class`=4 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=123.3244 WHERE `class`=4 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=127.3744 WHERE `class`=4 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=131.4244 WHERE `class`=4 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=135.4744 WHERE `class`=4 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=139.5244 WHERE `class`=4 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=143.5744 WHERE `class`=4 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=147.6244 WHERE `class`=4 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=151.6744 WHERE `class`=4 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=155.7244 WHERE `class`=4 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=160.2582 WHERE `class`=4 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=164.9240 WHERE `class`=4 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=168.9740 WHERE `class`=4 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=173.0240 WHERE `class`=4 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=177.0740 WHERE `class`=4 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=111.4876 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=115.4614 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=119.4352 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=123.4090 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=127.3828 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=131.2566 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=135.1304 WHERE `class`=8 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=139.0042 WHERE `class`=8 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=142.8780 WHERE `class`=8 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=146.8518 WHERE `class`=8 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=150.8256 WHERE `class`=8 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=154.7994 WHERE `class`=8 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=158.7732 WHERE `class`=8 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=162.7470 WHERE `class`=8 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=166.7208 WHERE `class`=8 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=170.6946 WHERE `class`=8 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=174.6684 WHERE `class`=8 AND `level`=83; diff --git a/sql/updates/world/2013_12_30_01_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_30_01_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..330545abf1 --- /dev/null +++ b/sql/updates/world/2013_12_30_01_world_creature_classlevelstats.sql @@ -0,0 +1,83 @@ +UPDATE `creature_classlevelstats` SET `damage_base`=0.7460, `attackpower`=1 WHERE `class`=2 AND `level`=1; +UPDATE `creature_classlevelstats` SET `damage_base`=0.7365, `attackpower`=3 WHERE `class`=2 AND `level`=2; +UPDATE `creature_classlevelstats` SET `damage_base`=0.6984, `attackpower`=7 WHERE `class`=2 AND `level`=3; +UPDATE `creature_classlevelstats` SET `damage_base`=1.2138, `attackpower`=18 WHERE `class`=2 AND `level`=4; +UPDATE `creature_classlevelstats` SET `damage_base`=1.8471, `attackpower`=19 WHERE `class`=2 AND `level`=5; +UPDATE `creature_classlevelstats` SET `damage_base`=2.6006, `attackpower`=24 WHERE `class`=2 AND `level`=6; +UPDATE `creature_classlevelstats` SET `damage_base`=3.5412, `attackpower`=28 WHERE `class`=2 AND `level`=7; +UPDATE `creature_classlevelstats` SET `damage_base`=4.1435, `attackpower`=32 WHERE `class`=2 AND `level`=8; +UPDATE `creature_classlevelstats` SET `damage_base`=4.7933, `attackpower`=36 WHERE `class`=2 AND `level`=9; +UPDATE `creature_classlevelstats` SET `damage_base`=5.0660, `attackpower`=38 WHERE `class`=2 AND `level`=10; +UPDATE `creature_classlevelstats` SET `damage_base`=5.3387, `attackpower`=40 WHERE `class`=2 AND `level`=11; +UPDATE `creature_classlevelstats` SET `damage_base`=5.6114, `attackpower`=42 WHERE `class`=2 AND `level`=12; +UPDATE `creature_classlevelstats` SET `damage_base`=5.8841, `attackpower`=44 WHERE `class`=2 AND `level`=13; +UPDATE `creature_classlevelstats` SET `damage_base`=6.1568, `attackpower`=46 WHERE `class`=2 AND `level`=14; +UPDATE `creature_classlevelstats` SET `damage_base`=6.8211, `attackpower`=48 WHERE `class`=2 AND `level`=15; +UPDATE `creature_classlevelstats` SET `damage_base`=7.1374, `attackpower`=52 WHERE `class`=2 AND `level`=16; +UPDATE `creature_classlevelstats` SET `damage_base`=7.6355, `attackpower`=56 WHERE `class`=2 AND `level`=17; +UPDATE `creature_classlevelstats` SET `damage_base`=8.1353, `attackpower`=58 WHERE `class`=2 AND `level`=18; +UPDATE `creature_classlevelstats` SET `damage_base`=8.6351, `attackpower`=60 WHERE `class`=2 AND `level`=19; +UPDATE `creature_classlevelstats` SET `damage_base`=9.0674, `attackpower`=64 WHERE `class`=2 AND `level`=20; +UPDATE `creature_classlevelstats` SET `damage_base`=9.3169, `attackpower`=68 WHERE `class`=2 AND `level`=21; +UPDATE `creature_classlevelstats` SET `damage_base`=9.7231, `attackpower`=72 WHERE `class`=2 AND `level`=22; +UPDATE `creature_classlevelstats` SET `damage_base`=10.0761, `attackpower`=74 WHERE `class`=2 AND `level`=23; +UPDATE `creature_classlevelstats` SET `damage_base`=10.4619, `attackpower`=78 WHERE `class`=2 AND `level`=24; +UPDATE `creature_classlevelstats` SET `damage_base`=10.8234, `attackpower`=80 WHERE `class`=2 AND `level`=25; +UPDATE `creature_classlevelstats` SET `damage_base`=11.1850, `attackpower`=84 WHERE `class`=2 AND `level`=26; +UPDATE `creature_classlevelstats` SET `damage_base`=11.7126, `attackpower`=86 WHERE `class`=2 AND `level`=27; +UPDATE `creature_classlevelstats` SET `damage_base`=11.9663, `attackpower`=90 WHERE `class`=2 AND `level`=28; +UPDATE `creature_classlevelstats` SET `damage_base`=12.3520, `attackpower`=94 WHERE `class`=2 AND `level`=29; +UPDATE `creature_classlevelstats` SET `damage_base`=13.0007, `attackpower`=94 WHERE `class`=2 AND `level`=30; +UPDATE `creature_classlevelstats` SET `damage_base`=13.2348, `attackpower`=98 WHERE `class`=2 AND `level`=31; +UPDATE `creature_classlevelstats` SET `damage_base`=13.6924, `attackpower`=100 WHERE `class`=2 AND `level`=32; +UPDATE `creature_classlevelstats` SET `damage_base`=13.9511, `attackpower`=104 WHERE `class`=2 AND `level`=33; +UPDATE `creature_classlevelstats` SET `damage_base`=14.4142, `attackpower`=106 WHERE `class`=2 AND `level`=34; +UPDATE `creature_classlevelstats` SET `damage_base`=14.7365, `attackpower`=110 WHERE `class`=2 AND `level`=35; +UPDATE `creature_classlevelstats` SET `damage_base`=15.1346, `attackpower`=112 WHERE `class`=2 AND `level`=36; +UPDATE `creature_classlevelstats` SET `damage_base`=15.5816, `attackpower`=116 WHERE `class`=2 AND `level`=37; +UPDATE `creature_classlevelstats` SET `damage_base`=15.9286, `attackpower`=120 WHERE `class`=2 AND `level`=38; +UPDATE `creature_classlevelstats` SET `damage_base`=16.4168, `attackpower`=124 WHERE `class`=2 AND `level`=39; +UPDATE `creature_classlevelstats` SET `damage_base`=16.9294, `attackpower`=128 WHERE `class`=2 AND `level`=40; +UPDATE `creature_classlevelstats` SET `damage_base`=17.8592, `attackpower`=132 WHERE `class`=2 AND `level`=41; +UPDATE `creature_classlevelstats` SET `damage_base`=18.8825, `attackpower`=142 WHERE `class`=2 AND `level`=42; +UPDATE `creature_classlevelstats` SET `damage_base`=20.1126, `attackpower`=152 WHERE `class`=2 AND `level`=43; +UPDATE `creature_classlevelstats` SET `damage_base`=21.6981, `attackpower`=166 WHERE `class`=2 AND `level`=44; +UPDATE `creature_classlevelstats` SET `damage_base`=22.9018, `attackpower`=172 WHERE `class`=2 AND `level`=45; +UPDATE `creature_classlevelstats` SET `damage_base`=23.3450, `attackpower`=176 WHERE `class`=2 AND `level`=46; +UPDATE `creature_classlevelstats` SET `damage_base`=23.9542, `attackpower`=180 WHERE `class`=2 AND `level`=47; +UPDATE `creature_classlevelstats` SET `damage_base`=24.4010, `attackpower`=184 WHERE `class`=2 AND `level`=48; +UPDATE `creature_classlevelstats` SET `damage_base`=24.9975, `attackpower`=188 WHERE `class`=2 AND `level`=49; +UPDATE `creature_classlevelstats` SET `damage_base`=25.5204, `attackpower`=194 WHERE `class`=2 AND `level`=50; +UPDATE `creature_classlevelstats` SET `damage_base`=26.0047, `attackpower`=198 WHERE `class`=2 AND `level`=51; +UPDATE `creature_classlevelstats` SET `damage_base`=26.6877, `attackpower`=202 WHERE `class`=2 AND `level`=52; +UPDATE `creature_classlevelstats` SET `damage_base`=27.1912, `attackpower`=206 WHERE `class`=2 AND `level`=53; +UPDATE `creature_classlevelstats` SET `damage_base`=27.8506, `attackpower`=210 WHERE `class`=2 AND `level`=54; +UPDATE `creature_classlevelstats` SET `damage_base`=28.3834, `attackpower`=214 WHERE `class`=2 AND `level`=55; +UPDATE `creature_classlevelstats` SET `damage_base`=28.9161, `attackpower`=220 WHERE `class`=2 AND `level`=56; +UPDATE `creature_classlevelstats` SET `damage_base`=29.5702, `attackpower`=224 WHERE `class`=2 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_base`=30.1469, `attackpower`=228 WHERE `class`=2 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_base`=30.7656, `attackpower`=234 WHERE `class`=2 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_base`=31.3842, `attackpower`=238 WHERE `class`=2 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_base`=31.9807, `attackpower`=244 WHERE `class`=2 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_base`=32.5772, `attackpower`=246 WHERE `class`=2 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_base`=33.1737, `attackpower`=249 WHERE `class`=2 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_base`=33.7702, `attackpower`=252 WHERE `class`=2 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_base`=34.3667, `attackpower`=262 WHERE `class`=2 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_base`=34.9632, `attackpower`=266 WHERE `class`=2 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_base`=35.5597, `attackpower`=272 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_base`=36.1562, `attackpower`=276 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_base`=36.7527, `attackpower`=282 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_base`=37.3492, `attackpower`=286 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_base`=37.9457, `attackpower`=290 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_base`=38.5422, `attackpower`=296 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_base`=39.1387, `attackpower`=302 WHERE `class`=2 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_base`=39.7352, `attackpower`=334 WHERE `class`=2 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_base`=40.3317, `attackpower`=370 WHERE `class`=2 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_base`=40.9282, `attackpower`=408 WHERE `class`=2 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_base`=41.5247, `attackpower`=452 WHERE `class`=2 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_base`=42.1212, `attackpower`=500 WHERE `class`=2 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_base`=42.7177, `attackpower`=550 WHERE `class`=2 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_base`=43.3142, `attackpower`=608 WHERE `class`=2 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_base`=43.9107, `attackpower`=670 WHERE `class`=2 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_base`=44.5072, `attackpower`=726 WHERE `class`=2 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_base`=45.1037, `attackpower`=783 WHERE `class`=2 AND `level`=83; diff --git a/sql/updates/world/2013_12_30_02_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_30_02_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..fe86d53ad0 --- /dev/null +++ b/sql/updates/world/2013_12_30_02_world_creature_classlevelstats.sql @@ -0,0 +1,35 @@ +UPDATE `creature_classlevelstats` SET `damage_exp1`=41.2575, `attackpower`=224 WHERE `class`=2 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=45.5251, `attackpower`=228 WHERE `class`=2 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=49.7927, `attackpower`=234 WHERE `class`=2 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=54.0603, `attackpower`=238 WHERE `class`=2 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=58.3279, `attackpower`=244 WHERE `class`=2 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=62.4676, `attackpower`=246 WHERE `class`=2 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=66.1210, `attackpower`=252 WHERE `class`=2 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=70.2568, `attackpower`=256 WHERE `class`=2 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=74.3252, `attackpower`=262 WHERE `class`=2 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=78.4720, `attackpower`=266 WHERE `class`=2 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=82.7944, `attackpower`=272 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=87.2676, `attackpower`=276 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=91.8915, `attackpower`=282 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=96.7365, `attackpower`=286 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=101.0041, `attackpower`=290 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=105.2717, `attackpower`=296 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=109.5393, `attackpower`=302 WHERE `class`=2 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=110.6980, `attackpower`=272 WHERE `class`=2 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=114.8692, `attackpower`=276 WHERE `class`=2 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=119.0404, `attackpower`=282 WHERE `class`=2 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=123.2116, `attackpower`=286 WHERE `class`=2 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=127.3828, `attackpower`=290 WHERE `class`=2 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=131.0916, `attackpower`=296 WHERE `class`=2 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=134.9081, `attackpower`=302 WHERE `class`=2 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=138.8359, `attackpower`=334 WHERE `class`=2 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=142.8780, `attackpower`=370 WHERE `class`=2 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=147.0376, `attackpower`=408 WHERE `class`=2 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=151.3188, `attackpower`=452 WHERE `class`=2 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=155.7242, `attackpower`=500 WHERE `class`=2 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=160.2583, `attackpower`=550 WHERE `class`=2 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=164.9239, `attackpower`=608 WHERE `class`=2 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=169.0951, `attackpower`=670 WHERE `class`=2 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=173.2663, `attackpower`=726 WHERE `class`=2 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=177.4375, `attackpower`=783 WHERE `class`=2 AND `level`=83; diff --git a/sql/updates/world/2013_12_30_03_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_30_03_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..19e34107e3 --- /dev/null +++ b/sql/updates/world/2013_12_30_03_world_creature_classlevelstats.sql @@ -0,0 +1,119 @@ +UPDATE `creature_classlevelstats` SET `damage_base`=0.4564, `attackpower`=1 WHERE `class`=8 AND `level`=1; +UPDATE `creature_classlevelstats` SET `damage_base`=0.4564, `attackpower`=3 WHERE `class`=8 AND `level`=2; +UPDATE `creature_classlevelstats` SET `damage_base`=0.7334, `attackpower`=7 WHERE `class`=8 AND `level`=3; +UPDATE `creature_classlevelstats` SET `damage_base`=1.1235, `attackpower`=8 WHERE `class`=8 AND `level`=4; +UPDATE `creature_classlevelstats` SET `damage_base`=1.3456, `attackpower`=9 WHERE `class`=8 AND `level`=5; +UPDATE `creature_classlevelstats` SET `damage_base`=1.9557, `attackpower`=10 WHERE `class`=8 AND `level`=6; +UPDATE `creature_classlevelstats` SET `damage_base`=2.7876, `attackpower`=13 WHERE `class`=8 AND `level`=7; +UPDATE `creature_classlevelstats` SET `damage_base`=3.2334, `attackpower`=15 WHERE `class`=8 AND `level`=8; +UPDATE `creature_classlevelstats` SET `damage_base`=3.7654, `attackpower`=16 WHERE `class`=8 AND `level`=9; +UPDATE `creature_classlevelstats` SET `damage_base`=4.2456, `attackpower`=17 WHERE `class`=8 AND `level`=10; +UPDATE `creature_classlevelstats` SET `damage_base`=4.7654, `attackpower`=17 WHERE `class`=8 AND `level`=11; +UPDATE `creature_classlevelstats` SET `damage_base`=5.0345, `attackpower`=18 WHERE `class`=8 AND `level`=12; +UPDATE `creature_classlevelstats` SET `damage_base`=5.1990, `attackpower`=19 WHERE `class`=8 AND `level`=13; +UPDATE `creature_classlevelstats` SET `damage_base`=5.7241, `attackpower`=21 WHERE `class`=8 AND `level`=14; +UPDATE `creature_classlevelstats` SET `damage_base`=6.3298, `attackpower`=22 WHERE `class`=8 AND `level`=15; +UPDATE `creature_classlevelstats` SET `damage_base`=6.6051, `attackpower`=24 WHERE `class`=8 AND `level`=16; +UPDATE `creature_classlevelstats` SET `damage_base`=7.0485, `attackpower`=26 WHERE `class`=8 AND `level`=17; +UPDATE `creature_classlevelstats` SET `damage_base`=7.4083, `attackpower`=27 WHERE `class`=8 AND `level`=18; +UPDATE `creature_classlevelstats` SET `damage_base`=7.9334, `attackpower`=28 WHERE `class`=8 AND `level`=19; +UPDATE `creature_classlevelstats` SET `damage_base`=8.3382, `attackpower`=30 WHERE `class`=8 AND `level`=20; +UPDATE `creature_classlevelstats` SET `damage_base`=8.5517, `attackpower`=32 WHERE `class`=8 AND `level`=21; +UPDATE `creature_classlevelstats` SET `damage_base`=8.9102, `attackpower`=34 WHERE `class`=8 AND `level`=22; +UPDATE `creature_classlevelstats` SET `damage_base`=9.2280, `attackpower`=35 WHERE `class`=8 AND `level`=23; +UPDATE `creature_classlevelstats` SET `damage_base`=9.6818, `attackpower`=36 WHERE `class`=8 AND `level`=24; +UPDATE `creature_classlevelstats` SET `damage_base`=10.1014, `attackpower`=37 WHERE `class`=8 AND `level`=25; +UPDATE `creature_classlevelstats` SET `damage_base`=10.3246, `attackpower`=39 WHERE `class`=8 AND `level`=26; +UPDATE `creature_classlevelstats` SET `damage_base`=10.8040, `attackpower`=40 WHERE `class`=8 AND `level`=27; +UPDATE `creature_classlevelstats` SET `damage_base`=11.0214, `attackpower`=42 WHERE `class`=8 AND `level`=28; +UPDATE `creature_classlevelstats` SET `damage_base`=11.3608, `attackpower`=44 WHERE `class`=8 AND `level`=29; +UPDATE `creature_classlevelstats` SET `damage_base`=11.9607, `attackpower`=44 WHERE `class`=8 AND `level`=30; +UPDATE `creature_classlevelstats` SET `damage_base`=12.1600, `attackpower`=46 WHERE `class`=8 AND `level`=31; +UPDATE `creature_classlevelstats` SET `damage_base`=12.5746, `attackpower`=47 WHERE `class`=8 AND `level`=32; +UPDATE `creature_classlevelstats` SET `damage_base`=12.7966, `attackpower`=49 WHERE `class`=8 AND `level`=33; +UPDATE `creature_classlevelstats` SET `damage_base`=13.2162, `attackpower`=50 WHERE `class`=8 AND `level`=34; +UPDATE `creature_classlevelstats` SET `damage_base`=13.4970, `attackpower`=52 WHERE `class`=8 AND `level`=35; +UPDATE `creature_classlevelstats` SET `damage_base`=13.8566, `attackpower`=53 WHERE `class`=8 AND `level`=36; +UPDATE `creature_classlevelstats` SET `damage_base`=14.3670, `attackpower`=54 WHERE `class`=8 AND `level`=37; +UPDATE `creature_classlevelstats` SET `damage_base`=14.6707, `attackpower`=56 WHERE `class`=8 AND `level`=38; +UPDATE `creature_classlevelstats` SET `damage_base`=15.1049, `attackpower`=58 WHERE `class`=8 AND `level`=39; +UPDATE `creature_classlevelstats` SET `damage_base`=15.5617, `attackpower`=60 WHERE `class`=8 AND `level`=40; +UPDATE `creature_classlevelstats` SET `damage_base`=16.4044, `attackpower`=62 WHERE `class`=8 AND `level`=41; +UPDATE `creature_classlevelstats` SET `damage_base`=17.3076, `attackpower`=67 WHERE `class`=8 AND `level`=42; +UPDATE `creature_classlevelstats` SET `damage_base`=18.5165, `attackpower`=71 WHERE `class`=8 AND `level`=43; +UPDATE `creature_classlevelstats` SET `damage_base`=19.9224, `attackpower`=78 WHERE `class`=8 AND `level`=44; +UPDATE `creature_classlevelstats` SET `damage_base`=21.0097, `attackpower`=81 WHERE `class`=8 AND `level`=45; +UPDATE `creature_classlevelstats` SET `damage_base`=21.4023, `attackpower`=83 WHERE `class`=8 AND `level`=46; +UPDATE `creature_classlevelstats` SET `damage_base`=21.9484, `attackpower`=85 WHERE `class`=8 AND `level`=47; +UPDATE `creature_classlevelstats` SET `damage_base`=22.3444, `attackpower`=87 WHERE `class`=8 AND `level`=48; +UPDATE `creature_classlevelstats` SET `damage_base`=22.8788, `attackpower`=89 WHERE `class`=8 AND `level`=49; +UPDATE `creature_classlevelstats` SET `damage_base`=23.4508, `attackpower`=91 WHERE `class`=8 AND `level`=50; +UPDATE `creature_classlevelstats` SET `damage_base`=23.8815, `attackpower`=93 WHERE `class`=8 AND `level`=51; +UPDATE `creature_classlevelstats` SET `damage_base`=24.4958, `attackpower`=95 WHERE `class`=8 AND `level`=52; +UPDATE `creature_classlevelstats` SET `damage_base`=24.9442, `attackpower`=97 WHERE `class`=8 AND `level`=53; +UPDATE `creature_classlevelstats` SET `damage_base`=25.5368, `attackpower`=99 WHERE `class`=8 AND `level`=54; +UPDATE `creature_classlevelstats` SET `damage_base`=26.0790, `attackpower`=101 WHERE `class`=8 AND `level`=55; +UPDATE `creature_classlevelstats` SET `damage_base`=26.4791, `attackpower`=104 WHERE `class`=8 AND `level`=56; +UPDATE `creature_classlevelstats` SET `damage_base`=27.0667, `attackpower`=106 WHERE `class`=8 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_base`=27.6972, `attackpower`=107 WHERE `class`=8 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_base`=28.1686, `attackpower`=110 WHERE `class`=8 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_base`=28.7983, `attackpower`=112 WHERE `class`=8 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_base`=29.2976, `attackpower`=115 WHERE `class`=8 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_base`=29.7969, `attackpower`=116 WHERE `class`=8 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_base`=30.2962, `attackpower`=119 WHERE `class`=8 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_base`=30.7955, `attackpower`=121 WHERE `class`=8 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_base`=31.2948, `attackpower`=124 WHERE `class`=8 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_base`=31.7941, `attackpower`=125 WHERE `class`=8 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_base`=32.2934, `attackpower`=128 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_base`=32.7927, `attackpower`=130 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_base`=33.2920, `attackpower`=133 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_base`=33.7913, `attackpower`=135 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_base`=34.2906, `attackpower`=137 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_base`=34.7899, `attackpower`=140 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_base`=35.2892, `attackpower`=143 WHERE `class`=8 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_base`=35.7885, `attackpower`=158 WHERE `class`=8 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_base`=36.2878, `attackpower`=175 WHERE `class`=8 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_base`=36.7871, `attackpower`=193 WHERE `class`=8 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_base`=37.2864, `attackpower`=214 WHERE `class`=8 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_base`=37.7857, `attackpower`=236 WHERE `class`=8 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_base`=38.2850, `attackpower`=260 WHERE `class`=8 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_base`=38.7843, `attackpower`=289 WHERE `class`=8 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_base`=39.2836, `attackpower`=304 WHERE `class`=8 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_base`=39.7829, `attackpower`=326 WHERE `class`=8 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_base`=40.2822, `attackpower`=343 WHERE `class`=8 AND `level`=83; + +UPDATE `creature_classlevelstats` SET `damage_exp1`=39.5236 WHERE `class`=8 AND `level`=57; +UPDATE `creature_classlevelstats` SET `damage_exp1`=43.1021 WHERE `class`=8 AND `level`=58; +UPDATE `creature_classlevelstats` SET `damage_exp1`=46.5379 WHERE `class`=8 AND `level`=59; +UPDATE `creature_classlevelstats` SET `damage_exp1`=50.0450 WHERE `class`=8 AND `level`=60; +UPDATE `creature_classlevelstats` SET `damage_exp1`=53.4807 WHERE `class`=8 AND `level`=61; +UPDATE `creature_classlevelstats` SET `damage_exp1`=57.2713 WHERE `class`=8 AND `level`=62; +UPDATE `creature_classlevelstats` SET `damage_exp1`=60.5770 WHERE `class`=8 AND `level`=63; +UPDATE `creature_classlevelstats` SET `damage_exp1`=64.3364 WHERE `class`=8 AND `level`=64; +UPDATE `creature_classlevelstats` SET `damage_exp1`=68.0244 WHERE `class`=8 AND `level`=65; +UPDATE `creature_classlevelstats` SET `damage_exp1`=72.0499 WHERE `class`=8 AND `level`=66; +UPDATE `creature_classlevelstats` SET `damage_exp1`=75.9676 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp1`=79.9198 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp1`=83.8005 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp1`=87.7526 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp1`=91.7048 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp1`=95.5855 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp1`=99.4662 WHERE `class`=8 AND `level`=73; + +UPDATE `creature_classlevelstats` SET `damage_exp2`=87.7106 WHERE `class`=8 AND `level`=67; +UPDATE `creature_classlevelstats` SET `damage_exp2`=96.6868 WHERE `class`=8 AND `level`=68; +UPDATE `creature_classlevelstats` SET `damage_exp2`=105.5915 WHERE `class`=8 AND `level`=69; +UPDATE `creature_classlevelstats` SET `damage_exp2`=114.4956 WHERE `class`=8 AND `level`=70; +UPDATE `creature_classlevelstats` SET `damage_exp2`=117.8288 WHERE `class`=8 AND `level`=71; +UPDATE `creature_classlevelstats` SET `damage_exp2`=121.2595 WHERE `class`=8 AND `level`=72; +UPDATE `creature_classlevelstats` SET `damage_exp2`=124.7902 WHERE `class`=8 AND `level`=73; +UPDATE `creature_classlevelstats` SET `damage_exp2`=128.4233 WHERE `class`=8 AND `level`=74; +UPDATE `creature_classlevelstats` SET `damage_exp2`=132.1620 WHERE `class`=8 AND `level`=75; +UPDATE `creature_classlevelstats` SET `damage_exp2`=136.0098 WHERE `class`=8 AND `level`=76; +UPDATE `creature_classlevelstats` SET `damage_exp2`=139.9698 WHERE `class`=8 AND `level`=77; +UPDATE `creature_classlevelstats` SET `damage_exp2`=144.0449 WHERE `class`=8 AND `level`=78; +UPDATE `creature_classlevelstats` SET `damage_exp2`=148.2391 WHERE `class`=8 AND `level`=79; +UPDATE `creature_classlevelstats` SET `damage_exp2`=152.4116 WHERE `class`=8 AND `level`=80; +UPDATE `creature_classlevelstats` SET `damage_exp2`=157.5842 WHERE `class`=8 AND `level`=81; +UPDATE `creature_classlevelstats` SET `damage_exp2`=162.2568 WHERE `class`=8 AND `level`=82; +UPDATE `creature_classlevelstats` SET `damage_exp2`=167.2865 WHERE `class`=8 AND `level`=83; diff --git a/sql/updates/world/2013_12_31_00_world_creature_classlevelstats.sql b/sql/updates/world/2013_12_31_00_world_creature_classlevelstats.sql new file mode 100644 index 0000000000..8039fcd441 --- /dev/null +++ b/sql/updates/world/2013_12_31_00_world_creature_classlevelstats.sql @@ -0,0 +1,13 @@ +UPDATE `creature_classlevelstats` SET `damage_base`=0.0607, `attackpower`=10 WHERE `class`=1 AND `level`=1; +UPDATE `creature_classlevelstats` SET `damage_base`=0.3603, `attackpower`=10 WHERE `class`=1 AND `level`=2; +UPDATE `creature_classlevelstats` SET `damage_base`=0.6976, `attackpower`=11 WHERE `class`=1 AND `level`=3; +UPDATE `creature_classlevelstats` SET `damage_base`=1.0863, `attackpower`=13 WHERE `class`=1 AND `level`=4; +UPDATE `creature_classlevelstats` SET `damage_base`=1.4422, `attackpower`=17 WHERE `class`=1 AND `level`=5; +UPDATE `creature_classlevelstats` SET `damage_base`=2.1375, `attackpower`=19 WHERE `class`=1 AND `level`=6; +UPDATE `creature_classlevelstats` SET `damage_base`=2.9811, `attackpower`=21 WHERE `class`=1 AND `level`=7; +UPDATE `creature_classlevelstats` SET `damage_base`=3.4850, `attackpower`=24 WHERE `class`=1 AND `level`=8; +UPDATE `creature_classlevelstats` SET `damage_base`=3.0304, `attackpower`=28 WHERE `class`=1 AND `level`=9; +UPDATE `creature_classlevelstats` SET `damage_base`=3.2707, `attackpower`=32 WHERE `class`=1 AND `level`=10; +UPDATE `creature_classlevelstats` SET `damage_base`=4.8425, `attackpower`=36 WHERE `class`=1 AND `level`=11; +UPDATE `creature_classlevelstats` SET `damage_base`=5.6030, `attackpower`=40 WHERE `class`=1 AND `level`=12; +UPDATE `creature_classlevelstats` SET `damage_base`=6.0787, `attackpower`=44 WHERE `class`=1 AND `level`=13; diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index 80a810e4ce..c4a130e7aa 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -229,7 +229,7 @@ extern int main(int argc, char** argv) { CPU_ZERO(&mask); sched_getaffinity(0, sizeof(mask), &mask); - TC_LOG_INFO("server.authserver", "Using processors (bitmask, hex): %x", *(uint32*)(&mask)); + TC_LOG_INFO("server.authserver", "Using processors (bitmask, hex): %lx", *(__cpu_mask*)(&mask)); } } diff --git a/src/server/collision/Management/MMapFactory.cpp b/src/server/collision/Management/MMapFactory.cpp index 6aa71d77ed..28a1caf14b 100644 --- a/src/server/collision/Management/MMapFactory.cpp +++ b/src/server/collision/Management/MMapFactory.cpp @@ -25,14 +25,14 @@ namespace MMAP { // ######################## MMapFactory ######################## // our global singleton copy - MMapManager* g_MMapManager = NULL; + MMapManager* _manager = NULL; - MMapManager* MMapFactory::createOrGetMMapManager() + MMapManager* MMapFactory::CreateOrGetMMapManager() { - if (g_MMapManager == NULL) - g_MMapManager = new MMapManager(); + if (_manager == NULL) + _manager = new MMapManager(); - return g_MMapManager; + return _manager; } bool MMapFactory::IsPathfindingEnabled(uint32 mapId) @@ -41,12 +41,12 @@ namespace MMAP && !DisableMgr::IsDisabledFor(DISABLE_TYPE_MMAP, mapId, NULL, MMAP_DISABLE_PATHFINDING); } - void MMapFactory::clear() + void MMapFactory::Clear() { - if (g_MMapManager) + if (_manager) { - delete g_MMapManager; - g_MMapManager = NULL; + delete _manager; + _manager = NULL; } } } \ No newline at end of file diff --git a/src/server/collision/Management/MMapFactory.h b/src/server/collision/Management/MMapFactory.h index 038d44a941..c7e3283d22 100644 --- a/src/server/collision/Management/MMapFactory.h +++ b/src/server/collision/Management/MMapFactory.h @@ -20,10 +20,6 @@ #define _MMAP_FACTORY_H #include "MMapManager.h" -#include "UnorderedMap.h" -#include "DetourAlloc.h" -#include "DetourNavMesh.h" -#include "DetourNavMeshQuery.h" namespace MMAP { @@ -40,8 +36,8 @@ namespace MMAP class MMapFactory { public: - static MMapManager* createOrGetMMapManager(); - static void clear(); + static MMapManager* CreateOrGetMMapManager(); + static void Clear(); static bool IsPathfindingEnabled(uint32 mapId); }; } diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index 4e6b3bb6d1..c29d6fa4b5 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -22,32 +22,29 @@ namespace MMAP { - // ######################## MMapManager ######################## MMapManager::~MMapManager() { - for (MMapDataSet::iterator i = loadedMMaps.begin(); i != loadedMMaps.end(); ++i) + for (MMapDataSet::iterator i = _loadedMaps.begin(); i != _loadedMaps.end(); ++i) delete i->second; - - // by now we should not have maps loaded - // if we had, tiles in MMapData->mmapLoadedTiles, their actual data is lost! } - bool MMapManager::loadMapData(uint32 mapId) + bool MMapManager::LoadMap(uint32 mapId) { - // we already have this map loaded? - if (loadedMMaps.find(mapId) != loadedMMaps.end()) + // Do not load a map twice. + if (_loadedMaps.find(mapId) != _loadedMaps.end()) return true; // load and init dtNavMesh - read parameters from file - uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i.mmap")+1; - char *fileName = new char[pathLen]; - snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i.mmap").c_str(), mapId); + std::string basePath = sWorld->GetDataPath(); + uint32 pathLen = basePath.length() + strlen("mmaps/%03i.mmap") + 1; + char* fileName = new char[pathLen]; + snprintf(fileName, pathLen, (basePath + "mmaps/%03i.mmap").c_str(), mapId); FILE* file = fopen(fileName, "rb"); if (!file) { - TC_LOG_DEBUG("maps", "MMAP:loadMapData: Error: Could not open mmap file '%s'", fileName); - delete [] fileName; + TC_LOG_DEBUG("maps", "MMAP::LoadMap: Error: Could not open mmap file '%s'", fileName); + delete[] fileName; return false; } @@ -56,80 +53,75 @@ namespace MMAP fclose(file); if (count != 1) { - TC_LOG_DEBUG("maps", "MMAP:loadMapData: Error: Could not read params from file '%s'", fileName); - delete [] fileName; + TC_LOG_DEBUG("maps", "MMAP::LoadMap: Error: Could not read params from file '%s'", fileName); + delete[] fileName; return false; } dtNavMesh* mesh = dtAllocNavMesh(); - ASSERT(mesh); if (dtStatusFailed(mesh->init(¶ms))) { dtFreeNavMesh(mesh); - TC_LOG_ERROR("maps", "MMAP:loadMapData: Failed to initialize dtNavMesh for mmap %03u from file %s", mapId, fileName); - delete [] fileName; + TC_LOG_ERROR("maps", "MMAP::LoadMap: Failed to initialize dtNavMesh for mmap %03u from file %s", mapId, fileName); + delete[] fileName; return false; } - delete [] fileName; + delete[] fileName; - TC_LOG_INFO("maps", "MMAP:loadMapData: Loaded %03i.mmap", mapId); + TC_LOG_INFO("maps", "MMAP::LoadMap: Loaded %03i.mmap", mapId); // store inside our map list - MMapData* mmap_data = new MMapData(mesh); - mmap_data->mmapLoadedTiles.clear(); + MMapData* mmapData = new MMapData(mesh); + mmapData->_loadedTiles.clear(); - loadedMMaps.insert(std::pair(mapId, mmap_data)); + _loadedMaps.insert(std::pair(mapId, mmapData)); return true; } - uint32 MMapManager::packTileID(int32 x, int32 y) - { - return uint32(x << 16 | y); - } - - bool MMapManager::loadMap(const std::string& /*basePath*/, uint32 mapId, int32 x, int32 y) + bool MMapManager::LoadMapTile(uint32 mapId, int32 x, int32 y) { // make sure the mmap is loaded and ready to load tiles - if (!loadMapData(mapId)) + if (!LoadMap(mapId)) return false; // get this mmap data - MMapData* mmap = loadedMMaps[mapId]; + MMapData* mmap = _loadedMaps[mapId]; ASSERT(mmap->navMesh); - // check if we already have this tile loaded - uint32 packedGridPos = packTileID(x, y); - if (mmap->mmapLoadedTiles.find(packedGridPos) != mmap->mmapLoadedTiles.end()) + // Check if we already have this tile loaded + uint32 pos = PackTileId(x, y); + if (mmap->_loadedTiles.find(pos) != mmap->_loadedTiles.end()) return false; - // load this tile :: mmaps/MMMXXYY.mmtile - uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i%02i%02i.mmtile")+1; - char *fileName = new char[pathLen]; + std::string basePath = sWorld->GetDataPath(); + uint32 pathLen = basePath.length() + strlen("mmaps/%03i%02i%02i.mmtile") + 1; + char* fileName = new char[pathLen]; - snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i%02i%02i.mmtile").c_str(), mapId, x, y); + snprintf(fileName, pathLen, (basePath + "mmaps/%03i%02i%02i.mmtile").c_str(), mapId, x, y); FILE* file = fopen(fileName, "rb"); if (!file) { - TC_LOG_DEBUG("maps", "MMAP:loadMap: Could not open mmtile file '%s'", fileName); - delete [] fileName; + TC_LOG_DEBUG("maps", "MMAP::LoadMapTile: Could not open mmtile file '%s'", fileName); + delete[] fileName; return false; } - delete [] fileName; + + delete[] fileName; // read header MmapTileHeader fileHeader; if (fread(&fileHeader, sizeof(MmapTileHeader), 1, file) != 1 || fileHeader.mmapMagic != MMAP_MAGIC) { - TC_LOG_ERROR("maps", "MMAP:loadMap: Bad header in mmap %03u%02i%02i.mmtile", mapId, x, y); + TC_LOG_ERROR("maps", "MMAP::LoadMapTile: Bad header in mmap %03u%02i%02i.mmtile", mapId, x, y); fclose(file); return false; } if (fileHeader.mmapVersion != MMAP_VERSION) { - TC_LOG_ERROR("maps", "MMAP:loadMap: %03u%02i%02i.mmtile was built with generator v%i, expected v%i", + TC_LOG_ERROR("maps", "MMAP::LoadMapTile: %03u%02i%02i.mmtile was built with generator v%i, expected v%i", mapId, x, y, fileHeader.mmapVersion, MMAP_VERSION); fclose(file); return false; @@ -139,9 +131,9 @@ namespace MMAP ASSERT(data); size_t result = fread(data, fileHeader.size, 1, file); - if (!result) + if (result != 1) { - TC_LOG_ERROR("maps", "MMAP:loadMap: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, x, y); + TC_LOG_ERROR("maps", "MMAP::LoadMapTile: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, x, y); fclose(file); return false; } @@ -154,14 +146,14 @@ namespace MMAP // memory allocated for data is now managed by detour, and will be deallocated when the tile is removed if (dtStatusSucceed(mmap->navMesh->addTile(data, fileHeader.size, DT_TILE_FREE_DATA, 0, &tileRef))) { - mmap->mmapLoadedTiles.insert(std::pair(packedGridPos, tileRef)); - ++loadedTiles; - TC_LOG_INFO("maps", "MMAP:loadMap: Loaded mmtile %03i[%02i, %02i] into %03i[%02i, %02i]", mapId, x, y, mapId, header->x, header->y); + mmap->_loadedTiles.insert(std::pair(pos, tileRef)); + ++_loadedTiles; + TC_LOG_INFO("maps", "MMAP::LoadMapTile: Loaded mmtile %03i[%02i, %02i] into %03i[%02i, %02i]", mapId, x, y, mapId, header->x, header->y); return true; } else { - TC_LOG_ERROR("maps", "MMAP:loadMap: Could not load %03u%02i%02i.mmtile into navmesh", mapId, x, y); + TC_LOG_ERROR("maps", "MMAP::LoadMapTile: Could not load %03u%02i%02i.mmtile into navmesh", mapId, x, y); dtFree(data); return false; } @@ -169,28 +161,26 @@ namespace MMAP return false; } - bool MMapManager::unloadMap(uint32 mapId, int32 x, int32 y) + bool MMapManager::UnloadMapTile(uint32 mapId, int32 x, int32 y) { - // check if we have this map loaded - if (loadedMMaps.find(mapId) == loadedMMaps.end()) + // Do not attempt to remove tiles from a not-loaded map + if (_loadedMaps.find(mapId) == _loadedMaps.end()) { - // file may not exist, therefore not loaded - TC_LOG_DEBUG("maps", "MMAP:unloadMap: Asked to unload not loaded navmesh map. %03u%02i%02i.mmtile", mapId, x, y); + TC_LOG_DEBUG("maps", "MMAP::UnloadMapTile: Asked to unload not loaded navmesh map. %03u%02i%02i.mmtile", mapId, x, y); return false; } - MMapData* mmap = loadedMMaps[mapId]; + MMapData* mmap = _loadedMaps[mapId]; // check if we have this tile loaded - uint32 packedGridPos = packTileID(x, y); - if (mmap->mmapLoadedTiles.find(packedGridPos) == mmap->mmapLoadedTiles.end()) + uint32 pos = PackTileId(x, y); + if (mmap->_loadedTiles.find(pos) == mmap->_loadedTiles.end()) { - // file may not exist, therefore not loaded - TC_LOG_DEBUG("maps", "MMAP:unloadMap: Asked to unload not loaded navmesh tile. %03u%02i%02i.mmtile", mapId, x, y); + TC_LOG_DEBUG("maps", "MMAP::UnloadMapTile: Asked to unload not loaded navmesh tile. %03u%02i%02i.mmtile", mapId, x, y); return false; } - dtTileRef tileRef = mmap->mmapLoadedTiles[packedGridPos]; + dtTileRef tileRef = mmap->_loadedTiles[pos]; // unload, and mark as non loaded if (dtStatusFailed(mmap->navMesh->removeTile(tileRef, NULL, NULL))) @@ -198,107 +188,106 @@ namespace MMAP // this is technically a memory leak // if the grid is later reloaded, dtNavMesh::addTile will return error but no extra memory is used // we cannot recover from this error - assert out - TC_LOG_ERROR("maps", "MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, x, y); + TC_LOG_ERROR("maps", "MMAP::UnloadMapTile: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, x, y); ASSERT(false); } else { - mmap->mmapLoadedTiles.erase(packedGridPos); - --loadedTiles; - TC_LOG_INFO("maps", "MMAP:unloadMap: Unloaded mmtile %03i[%02i, %02i] from %03i", mapId, x, y, mapId); + mmap->_loadedTiles.erase(pos); + --_loadedTiles; + TC_LOG_INFO("maps", "MMAP::UnloadMapTile: Unloaded mmtile [%02i, %02i] from %03i", x, y, mapId); return true; } return false; } - bool MMapManager::unloadMap(uint32 mapId) + bool MMapManager::UnloadMap(uint32 mapId) { - if (loadedMMaps.find(mapId) == loadedMMaps.end()) + if (_loadedMaps.find(mapId) == _loadedMaps.end()) { // file may not exist, therefore not loaded - TC_LOG_DEBUG("maps", "MMAP:unloadMap: Asked to unload not loaded navmesh map %03u", mapId); + TC_LOG_DEBUG("maps", "MMAP::UnloadMap: Asked to unload not loaded navmesh map %03u", mapId); return false; } // unload all tiles from given map - MMapData* mmap = loadedMMaps[mapId]; - for (MMapTileSet::iterator i = mmap->mmapLoadedTiles.begin(); i != mmap->mmapLoadedTiles.end(); ++i) + MMapData* mmap = _loadedMaps[mapId]; + for (MMapTileSet::iterator i = mmap->_loadedTiles.begin(); i != mmap->_loadedTiles.end(); ++i) { uint32 x = (i->first >> 16); uint32 y = (i->first & 0x0000FFFF); if (dtStatusFailed(mmap->navMesh->removeTile(i->second, NULL, NULL))) - TC_LOG_ERROR("maps", "MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, x, y); + TC_LOG_ERROR("maps", "MMAP::UnloadMap: Could not unload %03u%02u%02u.mmtile from navmesh", mapId, x, y); else { - --loadedTiles; - TC_LOG_INFO("maps", "MMAP:unloadMap: Unloaded mmtile %03i[%02i, %02i] from %03i", mapId, x, y, mapId); + --_loadedTiles; + TC_LOG_INFO("maps", "MMAP::UnloadMap: Unloaded mmtile [%02u, %02u] from %03u", x, y, mapId); } } delete mmap; - loadedMMaps.erase(mapId); - TC_LOG_INFO("maps", "MMAP:unloadMap: Unloaded %03i.mmap", mapId); + _loadedMaps.erase(mapId); + TC_LOG_INFO("maps", "MMAP::UnloadMap: Unloaded %03u.mmap", mapId); return true; } - bool MMapManager::unloadMapInstance(uint32 mapId, uint32 instanceId) + bool MMapManager::UnloadMapInstance(uint32 mapId, uint32 instanceId) { // check if we have this map loaded - if (loadedMMaps.find(mapId) == loadedMMaps.end()) + if (_loadedMaps.find(mapId) == _loadedMaps.end()) { // file may not exist, therefore not loaded - TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Asked to unload not loaded navmesh map %03u", mapId); + TC_LOG_DEBUG("maps", "MMAP::UnloadMapInstance: Asked to unload not loaded navmesh map %03u", mapId); return false; } - MMapData* mmap = loadedMMaps[mapId]; - if (mmap->navMeshQueries.find(instanceId) == mmap->navMeshQueries.end()) + MMapData* mmap = _loadedMaps[mapId]; + if (mmap->_navMeshQueries.find(instanceId) == mmap->_navMeshQueries.end()) { - TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Asked to unload not loaded dtNavMeshQuery mapId %03u instanceId %u", mapId, instanceId); + TC_LOG_DEBUG("maps", "MMAP::UnloadMapInstance: Asked to unload not loaded dtNavMeshQuery mapId %03u instanceId %u", mapId, instanceId); return false; } - dtNavMeshQuery* query = mmap->navMeshQueries[instanceId]; + dtNavMeshQuery* query = mmap->_navMeshQueries[instanceId]; dtFreeNavMeshQuery(query); - mmap->navMeshQueries.erase(instanceId); - TC_LOG_INFO("maps", "MMAP:unloadMapInstance: Unloaded mapId %03u instanceId %u", mapId, instanceId); + mmap->_navMeshQueries.erase(instanceId); + TC_LOG_INFO("maps", "MMAP::UnloadMapInstance: Unloaded mapId %03u instanceId %u", mapId, instanceId); return true; } dtNavMesh const* MMapManager::GetNavMesh(uint32 mapId) { - if (loadedMMaps.find(mapId) == loadedMMaps.end()) + if (_loadedMaps.find(mapId) == _loadedMaps.end()) return NULL; - return loadedMMaps[mapId]->navMesh; + return _loadedMaps[mapId]->navMesh; } dtNavMeshQuery const* MMapManager::GetNavMeshQuery(uint32 mapId, uint32 instanceId) { - if (loadedMMaps.find(mapId) == loadedMMaps.end()) + if (_loadedMaps.find(mapId) == _loadedMaps.end()) return NULL; - MMapData* mmap = loadedMMaps[mapId]; - if (mmap->navMeshQueries.find(instanceId) == mmap->navMeshQueries.end()) + MMapData* mmap = _loadedMaps[mapId]; + if (mmap->_navMeshQueries.find(instanceId) == mmap->_navMeshQueries.end()) { // allocate mesh query dtNavMeshQuery* query = dtAllocNavMeshQuery(); - ASSERT(query); - if (dtStatusFailed(query->init(mmap->navMesh, 1024))) + if (dtStatusFailed(query->init(mmap->navMesh, 2048))) { dtFreeNavMeshQuery(query); - TC_LOG_ERROR("maps", "MMAP:GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); + TC_LOG_ERROR("maps", "MMAP::GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); return NULL; } TC_LOG_INFO("maps", "MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); - mmap->navMeshQueries.insert(std::pair(instanceId, query)); + mmap->_navMeshQueries.insert(std::pair(instanceId, query)); } - return mmap->navMeshQueries[instanceId]; + return mmap->_navMeshQueries[instanceId]; } } diff --git a/src/server/collision/Management/MMapManager.h b/src/server/collision/Management/MMapManager.h index 9a04d63880..9d90d1bb2a 100644 --- a/src/server/collision/Management/MMapManager.h +++ b/src/server/collision/Management/MMapManager.h @@ -36,7 +36,7 @@ namespace MMAP MMapData(dtNavMesh* mesh) : navMesh(mesh) { } ~MMapData() { - for (NavMeshQuerySet::iterator i = navMeshQueries.begin(); i != navMeshQueries.end(); ++i) + for (NavMeshQuerySet::iterator i = _navMeshQueries.begin(); i != _navMeshQueries.end(); ++i) dtFreeNavMeshQuery(i->second); if (navMesh) @@ -46,8 +46,8 @@ namespace MMAP dtNavMesh* navMesh; // we have to use single dtNavMeshQuery for every instance, since those are not thread safe - NavMeshQuerySet navMeshQueries; // instanceId to query - MMapTileSet mmapLoadedTiles; // maps [map grid coords] to [dtTile] + NavMeshQuerySet _navMeshQueries; // instanceId to query + MMapTileSet _loadedTiles; // maps [map grid coords] to [dtTile] }; @@ -58,26 +58,27 @@ namespace MMAP class MMapManager { public: - MMapManager() : loadedTiles(0) { } + MMapManager() : _loadedTiles(0) {} + ~MMapManager(); - bool loadMap(const std::string& basePath, uint32 mapId, int32 x, int32 y); - bool unloadMap(uint32 mapId, int32 x, int32 y); - bool unloadMap(uint32 mapId); - bool unloadMapInstance(uint32 mapId, uint32 instanceId); + bool LoadMapTile(uint32 mapId, int32 x, int32 y); + bool UnloadMapTile(uint32 mapId, int32 x, int32 y); + bool UnloadMap(uint32 mapId); + bool UnloadMapInstance(uint32 mapId, uint32 instanceId); // the returned [dtNavMeshQuery const*] is NOT threadsafe dtNavMeshQuery const* GetNavMeshQuery(uint32 mapId, uint32 instanceId); dtNavMesh const* GetNavMesh(uint32 mapId); - uint32 getLoadedTilesCount() const { return loadedTiles; } - uint32 getLoadedMapsCount() const { return loadedMMaps.size(); } + uint32 GetLoadedTilesCount() const { return _loadedTiles; } + uint32 GetLoadedMapsCount() const { return _loadedMaps.size(); } private: - bool loadMapData(uint32 mapId); - uint32 packTileID(int32 x, int32 y); + bool LoadMap(uint32 mapId); + uint32 PackTileId(int32 x, int32 y) { return uint32(x << 16 | y); } - MMapDataSet loadedMMaps; - uint32 loadedTiles; + MMapDataSet _loadedMaps; + uint32 _loadedTiles; }; } diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 0d5af4f880..7c0e04aa95 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -22,6 +22,7 @@ #include "Define.h" #include #include "Object.h" +#include "QuestDef.h" #include "GameObject.h" #include "CreatureAI.h" @@ -51,7 +52,7 @@ class GameObjectAI virtual bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; } virtual bool QuestAccept(Player* /*player*/, Quest const* /*quest*/) { return false; } virtual bool QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } - virtual uint32 GetDialogStatus(Player* /*player*/) { return 100; } + virtual uint32 GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) { } virtual uint32 GetData(uint32 /*id*/) const { return 0; } virtual void SetData64(uint32 /*id*/, uint64 /*value*/) { } diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 18daf1ef8d..bc13172448 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -131,7 +131,7 @@ void PetAI::UpdateAI(uint32 diff) HandleReturnMovement(); } - // Autocast (casted only in combat or persistent spells in any state) + // Autocast (cast only in combat or persistent spells in any state) if (!me->HasUnitState(UNIT_STATE_CASTING)) { typedef std::vector > TargetSpellList; diff --git a/src/server/game/AI/CoreAI/TotemAI.cpp b/src/server/game/AI/CoreAI/TotemAI.cpp index 464021e1e5..9d751976f8 100644 --- a/src/server/game/AI/CoreAI/TotemAI.cpp +++ b/src/server/game/AI/CoreAI/TotemAI.cpp @@ -52,7 +52,7 @@ void TotemAI::UpdateAI(uint32 /*diff*/) if (me->ToTotem()->GetTotemType() != TOTEM_ACTIVE) return; - if (!me->IsAlive() || me->IsNonMeleeSpellCasted(false)) + if (!me->IsAlive() || me->IsNonMeleeSpellCast(false)) return; // Search spell diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index c70fc45be3..6d5ddfcae2 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -156,7 +156,7 @@ void ScriptedAI::DoStopAttack() void ScriptedAI::DoCastSpell(Unit* target, SpellInfo const* spellInfo, bool triggered) { - if (!target || me->IsNonMeleeSpellCasted(false)) + if (!target || me->IsNonMeleeSpellCast(false)) return; me->StopMoving(); diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 1ced9e7967..8b914d7ca2 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -905,7 +905,10 @@ bool SmartGameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 o } // Called when the dialog status between a player and the gameobject is requested. -uint32 SmartGameObjectAI::GetDialogStatus(Player* /*player*/) { return 100; } +uint32 SmartGameObjectAI::GetDialogStatus(Player* /*player*/) +{ + return DIALOG_STATUS_SCRIPTED_NO_STATUS; +} // Called when the gameobject is destroyed (destructible buildings only). void SmartGameObjectAI::Destroyed(Player* player, uint32 eventId) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index a45e45e58c..b90ca2ed8c 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -17,6 +17,7 @@ #include "Cell.h" #include "CellImpl.h" +#include "Chat.h" #include "CreatureTextMgr.h" #include "DatabaseEnv.h" #include "GossipDef.h" @@ -40,41 +41,22 @@ class TrinityStringTextBuilder { public: - TrinityStringTextBuilder(WorldObject* obj, ChatMsg msgtype, int32 id, uint32 language, uint64 targetGUID) - : _source(obj), _msgType(msgtype), _textId(id), _language(language), _targetGUID(targetGUID) + TrinityStringTextBuilder(WorldObject* obj, ChatMsg msgtype, int32 id, uint32 language, WorldObject* target) + : _source(obj), _msgType(msgtype), _textId(id), _language(language), _target(target) { } size_t operator()(WorldPacket* data, LocaleConstant locale) const { std::string text = sObjectMgr->GetTrinityString(_textId, locale); - std::string localizedName = _source->GetNameForLocaleIdx(locale); - - *data << uint8(_msgType); - *data << uint32(_language); - *data << uint64(_source->GetGUID()); - *data << uint32(1); // 2.1.0 - *data << uint32(localizedName.size() + 1); - *data << localizedName; - size_t whisperGUIDpos = data->wpos(); - *data << uint64(_targetGUID); // Unit Target - if (_targetGUID && !IS_PLAYER_GUID(_targetGUID)) - { - *data << uint32(1); // target name length - *data << uint8(0); // target name - } - *data << uint32(text.length() + 1); - *data << text; - *data << uint8(0); // ChatTag - - return whisperGUIDpos; + return ChatHandler::BuildChatPacket(*data, _msgType, Language(_language), _source, _target, text, 0, "", locale); } WorldObject* _source; ChatMsg _msgType; int32 _textId; uint32 _language; - uint64 _targetGUID; + WorldObject* _target; }; SmartScript::SmartScript() @@ -547,7 +529,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags); } else - TC_LOG_DEBUG("scripts.ai", "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId())); + TC_LOG_DEBUG("scripts.ai", "Spell %u not cast because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId())); } delete targets; @@ -578,7 +560,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u tempLastInvoker->GetGUIDLow(), e.action.cast.spell, (*itr)->GetGUIDLow(), e.action.cast.flags); } else - TC_LOG_DEBUG("scripts.ai", "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId())); + TC_LOG_DEBUG("scripts.ai", "Spell %u not cast because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*itr)->GetGUID(), (*itr)->GetEntry(), uint32((*itr)->GetTypeId())); } delete targets; @@ -777,7 +759,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->DoFleeToGetAssistance(); if (e.action.flee.withEmote) { - TrinityStringTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, LANG_FLEE, LANG_UNIVERSAL, 0); + TrinityStringTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, LANG_FLEE, LANG_UNIVERSAL, NULL); sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); } TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_FLEE_FOR_ASSIST: Creature %u DoFleeToGetAssistance", me->GetGUIDLow()); @@ -1020,7 +1002,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->CallForHelp((float)e.action.callHelp.range); if (e.action.callHelp.withEmote) { - TrinityStringTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, LANG_CALL_FOR_HELP, LANG_UNIVERSAL, 0); + TrinityStringTextBuilder builder(me, CHAT_MSG_MONSTER_EMOTE, LANG_CALL_FOR_HELP, LANG_UNIVERSAL, NULL); sCreatureTextMgr->SendChatPacket(me, builder, CHAT_MSG_MONSTER_EMOTE); } TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_CALL_FOR_HELP: Creature %u", me->GetGUIDLow()); @@ -1747,7 +1729,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u unit->CastSpell((*it)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED)); } else - TC_LOG_DEBUG("scripts.ai", "Spell %u not casted because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*it)->GetGUID(), (*it)->GetEntry(), uint32((*it)->GetTypeId())); + TC_LOG_DEBUG("scripts.ai", "Spell %u not cast because it has flag SMARTCAST_AURA_NOT_PRESENT and the target (Guid: " UI64FMTD " Entry: %u Type: %u) already has the aura", e.action.cast.spell, (*it)->GetGUID(), (*it)->GetEntry(), uint32((*it)->GetTypeId())); } } @@ -2748,7 +2730,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui Unit* victim = me->GetVictim(); - if (!victim || !victim->IsNonMeleeSpellCasted(false, false, true)) + if (!victim || !victim->IsNonMeleeSpellCast(false, false, true)) return; if (e.event.targetCasting.spellId > 0) @@ -3174,12 +3156,12 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff) if (e.GetEventType() == SMART_EVENT_UPDATE_IC && (!me || !me->IsInCombat())) return; - if (e.GetEventType() == SMART_EVENT_UPDATE_OOC && (me && me->IsInCombat()))//can be used with me=NULL (go script) + if (e.GetEventType() == SMART_EVENT_UPDATE_OOC && (me && me->IsInCombat())) //can be used with me=NULL (go script) return; if (e.timer < diff) { - // delay spell cast event if another spell is being casted + // delay spell cast event if another spell is being cast if (e.GetActionType() == SMART_ACTION_CAST) { if (!(e.action.cast.flags & SMARTCAST_INTERRUPT_PREVIOUS)) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 03aabefcd8..e97fcfaa1a 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1149,7 +1149,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: /* FIXME: for online player only currently */ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED: - case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED: SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_HIGHEST); break; diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index a5602a1b41..67288e0fad 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -804,7 +804,7 @@ uint32 BattlefieldWG::GetData(uint32 data) const { switch (data) { - // Used to determine when the phasing spells must be casted + // Used to determine when the phasing spells must be cast // See: SpellArea::IsFitToRequirements case AREA_THE_SUNKEN_RING: case AREA_THE_BROKEN_TEMPLATE: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h index cdfbbc480b..74c5e70a63 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h @@ -58,7 +58,7 @@ enum BattlegroundDSCreatures enum BattlegroundDSSpells { BG_DS_SPELL_FLUSH = 57405, // Visual and target selector for the starting knockback from the pipe - BG_DS_SPELL_FLUSH_KNOCKBACK = 61698, // Knockback effect for previous spell (triggered, not need to be casted) + BG_DS_SPELL_FLUSH_KNOCKBACK = 61698, // Knockback effect for previous spell (triggered, not needed to be cast) BG_DS_SPELL_WATER_SPOUT = 58873 // Knockback effect of the central waterfall }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp index aa3568a62d..5ebef03051 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp @@ -397,10 +397,8 @@ bool BattlegroundIC::SetupBattleground() return false; } - //Send transport init packet to all player in map - for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) - if (Player* player = ObjectAccessor::FindPlayer(itr->first)) - GetBgMap()->SendInitTransports(player); + gunshipHorde->EnableMovement(false); + gunshipAlliance->EnableMovement(false); // setting correct factions for Keep Cannons for (uint8 i = BG_IC_NPC_KEEP_CANNON_1; i < BG_IC_NPC_KEEP_CANNON_12; ++i) diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index c65d76cecd..1faa168b3a 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -600,14 +600,6 @@ void Channel::Say(uint64 guid, std::string const& what, uint32 lang) if (what.empty()) return; - uint8 chatTag = 0; - bool isGM = false; - if (Player* player = ObjectAccessor::FindPlayer(guid)) - { - chatTag = player->GetChatTag(); - isGM = player->GetSession()->HasPermission(rbac::RBAC_PERM_COMMAND_GM_CHAT); - } - // TODO: Add proper RBAC check if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHANNEL)) lang = LANG_UNIVERSAL; @@ -629,7 +621,11 @@ void Channel::Say(uint64 guid, std::string const& what, uint32 lang) } WorldPacket data; - ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), guid, guid, what, chatTag, "", "", 0, isGM, _name); + if (Player* player = ObjectAccessor::FindPlayer(guid)) + ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), player, player, what, 0, _name); + else + ChatHandler::BuildChatPacket(data, CHAT_MSG_CHANNEL, Language(lang), guid, guid, what, 0, "", "", 0, false, _name); + SendToAll(&data, !playersStore[guid].IsModerator() ? guid : false); } diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 0d7d520b4f..215ce1c594 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -258,7 +258,7 @@ enum AchievementCriteriaTypes ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT = 101, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED = 102, ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED = 103, - ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED = 104, + ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST = 104, ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED = 105, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED = 106, ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED = 107, diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index e416500f77..949ca6324e 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1081,15 +1081,17 @@ void Creature::SelectLevel(const CreatureTemplate* cinfo) SetModifierValue(UNIT_MOD_MANA, BASE_VALUE, (float)mana); //damage - //float damagemod = _GetDamageMod(rank); // Set during loading templates into dmg_multiplier field - SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, cinfo->mindmg); - SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, cinfo->maxdmg); + float basedamage = stats->GenerateBaseDamage(cinfo); - SetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE, cinfo->minrangedmg); - SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, cinfo->maxrangedmg); + SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, ((basedamage + (stats->AttackPower / 14)) * cinfo->dmg_multiplier) * (cinfo->baseattacktime / 1000)); + SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (((basedamage * 1.5) + (stats->AttackPower / 14)) * cinfo->dmg_multiplier) * (cinfo->baseattacktime / 1000)); + SetBaseWeaponDamage(RANGED_ATTACK, MINDAMAGE, (basedamage + (stats->RangedAttackPower / 14)) * (cinfo->rangeattacktime / 1000)); + SetBaseWeaponDamage(RANGED_ATTACK, MAXDAMAGE, ((basedamage * 1.5) + (stats->RangedAttackPower / 14)) * (cinfo->rangeattacktime / 1000)); - SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, cinfo->attackpower); + float damagemod = 1.0f;//_GetDamageMod(rank); + + SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, stats->AttackPower * damagemod); } @@ -1484,7 +1486,7 @@ void Creature::setDeathState(DeathState s) CreatureTemplate const* cinfo = GetCreatureTemplate(); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); - ClearUnitState(uint32(UNIT_STATE_ALL_STATE)); + ClearUnitState(uint32(UNIT_STATE_ALL_STATE & ~UNIT_STATE_IGNORE_PATHFINDING)); SetMeleeDamageSchool(SpellSchools(cinfo->dmgschool)); LoadCreaturesAddon(true); Motion_Initialize(); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index d54a1a6125..6599bab80c 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -175,6 +175,7 @@ struct CreatureTemplate // Benchmarked: Faster than std::map (insert/find) typedef UNORDERED_MAP CreatureTemplateContainer; +#define MAX_CREATURE_BASE_DAMAGE 3 // GCC have alternative #pragma pack(N) syntax and old gcc version not support pack(push, N), also any gcc version not support it at some platform #if defined(__GNUC__) #pragma pack(1) @@ -182,12 +183,15 @@ typedef UNORDERED_MAP CreatureTemplateContainer; #pragma pack(push, 1) #endif -// Defines base stats for creatures (used to calculate HP/mana/armor). +// Defines base stats for creatures (used to calculate HP/mana/armor/attackpower/rangedattackpower/all damage). struct CreatureBaseStats { uint32 BaseHealth[MAX_CREATURE_BASE_HP]; uint32 BaseMana; uint32 BaseArmor; + uint32 AttackPower; + uint32 RangedAttackPower; + float BaseDamage[MAX_CREATURE_BASE_DAMAGE]; // Helpers @@ -210,6 +214,11 @@ struct CreatureBaseStats return uint32(ceil(BaseArmor * info->ModArmor)); } + float GenerateBaseDamage(CreatureTemplate const* info) const + { + return BaseDamage[info->expansion]; + } + static CreatureBaseStats const* GetBaseStats(uint8 level, uint8 unitClass); }; diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 1af9b7fa73..5b9f92103e 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -297,7 +297,7 @@ void QuestMenu::ClearMenu() _questMenuItems.clear(); } -void PlayerMenu::SendQuestGiverQuestList(QEmote eEmote, const std::string& Title, uint64 npcGUID) +void PlayerMenu::SendQuestGiverQuestList(QEmote const& eEmote, const std::string& Title, uint64 npcGUID) { WorldPacket data(SMSG_QUESTGIVER_QUEST_LIST, 100); // guess size data << uint64(npcGUID); @@ -480,8 +480,8 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const data << uint32(quest->GetRewOrReqMoney()); // reward money (below max lvl) data << uint32(quest->GetRewMoneyMaxLevel()); // used in XP calculation at client - data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast == 0) - data << int32(quest->GetRewSpellCast()); // casted spell + data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (cast if RewSpellCast == 0) + data << int32(quest->GetRewSpellCast()); // cast spell // rewarded honor points data << uint32(quest->GetRewHonorAddition()); diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h index c76febc016..8c720c5f55 100644 --- a/src/server/game/Entities/Creature/GossipDef.h +++ b/src/server/game/Entities/Creature/GossipDef.h @@ -273,7 +273,7 @@ class PlayerMenu /*********************************************************/ void SendQuestGiverStatus(uint32 questStatus, uint64 npcGUID) const; - void SendQuestGiverQuestList(QEmote eEmote, const std::string& Title, uint64 npcGUID); + void SendQuestGiverQuestList(QEmote const& eEmote, const std::string& Title, uint64 npcGUID); void SendQuestQueryResponse(Quest const* quest) const; void SendQuestGiverQuestDetails(Quest const* quest, uint64 npcGUID, bool activateAccept) const; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 97287aabe3..d36a1bad93 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -652,7 +652,7 @@ void GameObject::Update(uint32 diff) void GameObject::Refresh() { - // not refresh despawned not casted GO (despawned casted GO destroyed in all cases anyway) + // Do not refresh despawned GO from spellcast (GO's from spellcast are destroyed after despawn) if (m_respawnTime > 0 && m_spawnedByDefault) return; @@ -1486,7 +1486,7 @@ void GameObject::Use(Unit* user) if (spellId == 62330) // GO store nonexistent spell, replace by expected { // spell have reagent and mana cost but it not expected use its - // it triggered spell in fact casted at currently channeled GO + // it triggered spell in fact cast at currently channeled GO spellId = 61993; triggered = true; } diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 01dfd92e34..98eaec8781 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -103,7 +103,7 @@ void AddItemsSetItem(Player* player, Item* item) break; } - // spell casted only if fit form requirement, in other case will casted at form change + // spell cast only if fit form requirement, in other case will cast at form change player->ApplyEquipSpell(spellInfo, NULL, true); eff->spells[y] = spellInfo; break; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 149560fd89..74d05ca58e 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1738,6 +1738,10 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const { + // TODO: Allow transports to be part of dynamic vmap tree + if (GetTransport()) + return; + switch (GetTypeId()) { case TYPEID_UNIT: diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 45381864aa..f9d96225e3 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2198,7 +2198,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati SetSemaphoreTeleportFar(false); //setup delayed teleport flag SetDelayedTeleportFlag(IsCanDelayTeleport()); - //if teleport spell is casted in Unit::Update() func + //if teleport spell is cast in Unit::Update() func //then we need to delay it until update process will be finished if (IsHasDelayedTeleport()) { @@ -2261,7 +2261,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati SetSemaphoreTeleportNear(false); //setup delayed teleport flag SetDelayedTeleportFlag(IsCanDelayTeleport()); - //if teleport spell is casted in Unit::Update() func + //if teleport spell is cast in Unit::Update() func //then we need to delay it until update process will be finished if (IsHasDelayedTeleport()) { @@ -2307,7 +2307,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati // stop spellcasting // not attempt interrupt teleportation spell at caster teleport if (!(options & TELE_TO_SPELL)) - if (IsNonMeleeSpellCasted(true)) + if (IsNonMeleeSpellCast(true)) InterruptNonMeleeSpells(true); //remove auras before removing from map... @@ -8713,7 +8713,7 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]); if (!spellInfo) { - TC_LOG_ERROR("entities.player.items", "Player::CastItemCombatSpell(GUID: %u, name: %s, enchant: %i): unknown spell %i is casted, ignoring...", + TC_LOG_ERROR("entities.player.items", "Player::CastItemCombatSpell(GUID: %u, name: %s, enchant: %i): unknown spell %i is cast, ignoring...", GetGUIDLow(), GetName().c_str(), pEnchant->ID, pEnchant->spellid[s]); continue; } @@ -8774,7 +8774,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 // use triggered flag only for items with many spell casts and for not first cast uint8 count = 0; - // item spells casted at use + // item spells cast at use for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) { _Spell const& spellData = proto->Spells[i]; @@ -8803,7 +8803,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 ++count; } - // Item enchantments spells casted at use + // Item enchantments spells cast at use for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot) { if (e_slot > PRISMATIC_ENCHANTMENT_SLOT && e_slot < PROP_ENCHANTMENT_SLOT_0) // not holding enchantment id @@ -11464,7 +11464,7 @@ 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_CLIENT_LOCKED_OUT; // maybe exist better err - if (IsNonMeleeSpellCasted(false)) + if (IsNonMeleeSpellCast(false)) return EQUIP_ERR_CLIENT_LOCKED_OUT; } @@ -21395,7 +21395,7 @@ bool Player::ActivateTaxiPathTo(std::vector const& nodes, Creature* npc } // not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi - if (IsNonMeleeSpellCasted(false)) + if (IsNonMeleeSpellCast(false)) { GetSession()->SendActivateTaxiReply(ERR_TAXIPLAYERBUSY); return false; @@ -24149,7 +24149,7 @@ void Player::RemoveItemDependentAurasAndCasts(Item* pItem) RemoveOwnedAura(itr); } - // currently casted spells can be dependent from item + // currently cast spells can be dependent from item for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i) if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i))) if (spell->getState() != SPELL_STATE_DELAYED && !HasItemFitToSpellRequirements(spell->m_spellInfo, pItem)) @@ -26514,7 +26514,7 @@ void Player::ActivateSpec(uint8 spec) if (spec > GetSpecsCount()) return; - if (IsNonMeleeSpellCasted(false)) + if (IsNonMeleeSpellCast(false)) InterruptNonMeleeSpells(false); SQLTransaction trans = CharacterDatabase.BeginTransaction(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 17deabeba7..bec86f9ce9 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1120,7 +1120,7 @@ class TradeData uint64 m_money; // m_player place money to trade uint32 m_spell; // m_player apply spell to non-traded slot item - uint64 m_spellCastItem; // applied spell casted by item use + uint64 m_spellCastItem; // applied spell cast by item use uint64 m_items[TRADE_SLOT_COUNT]; // traded items from m_player side including non-traded slot }; diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 9026f4c0e4..b1d8c02f41 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -90,8 +90,7 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa SetPeriod(tInfo->pathTime); SetEntry(goinfo->entry); SetDisplayId(goinfo->displayId); - SetGoState(GO_STATE_READY); - _pendingStop = goinfo->moTransport.canBeStopped != 0; + SetGoState(!goinfo->moTransport.canBeStopped ? GO_STATE_READY : GO_STATE_ACTIVE); SetGoType(GAMEOBJECT_TYPE_MO_TRANSPORT); SetGoAnimProgress(animprogress); SetName(goinfo->name); @@ -111,7 +110,8 @@ void Transport::Update(uint32 diff) if (GetKeyFrames().size() <= 1) return; - m_goValue.Transport.PathProgress += diff; + if (IsMoving() || !_pendingStop) + m_goValue.Transport.PathProgress += diff; uint32 timer = m_goValue.Transport.PathProgress % GetPeriod(); @@ -132,31 +132,23 @@ void Transport::Update(uint32 diff) if (timer < _currentFrame->DepartureTime) { SetMoving(false); - if (_pendingStop) + if (_pendingStop && GetGoState() != GO_STATE_READY) + { SetGoState(GO_STATE_READY); + m_goValue.Transport.PathProgress = (m_goValue.Transport.PathProgress / GetPeriod()); + m_goValue.Transport.PathProgress *= GetPeriod(); + m_goValue.Transport.PathProgress += _currentFrame->ArriveTime; + } break; // its a stop frame and we are waiting } } - if (_pendingStop && timer >= _currentFrame->DepartureTime && GetGoState() == GO_STATE_READY) - { - m_goValue.Transport.PathProgress = (m_goValue.Transport.PathProgress / GetPeriod()); - m_goValue.Transport.PathProgress *= GetPeriod(); - m_goValue.Transport.PathProgress += _currentFrame->ArriveTime; - break; - } - if (timer >= _currentFrame->DepartureTime && !_triggeredDepartureEvent) { DoEventIfAny(*_currentFrame, true); // departure event _triggeredDepartureEvent = true; } - if (timer >= _currentFrame->DepartureTime && timer < _currentFrame->NextArriveTime) - break; // found current waypoint - - MoveToNextWaypoint(); - // not waiting anymore SetMoving(true); @@ -164,13 +156,18 @@ void Transport::Update(uint32 diff) if (GetGOInfo()->moTransport.canBeStopped) SetGoState(GO_STATE_ACTIVE); + if (timer >= _currentFrame->DepartureTime && timer < _currentFrame->NextArriveTime) + break; // found current waypoint + + MoveToNextWaypoint(); + sScriptMgr->OnRelocate(this, _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z); TC_LOG_DEBUG("entities.transport", "Transport %u (%s) moved to node %u %u %f %f %f", GetEntry(), GetName().c_str(), _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z); // Departure event if (_currentFrame->IsTeleportFrame()) - if (TeleportTransport(_nextFrame->Node->mapid, _nextFrame->Node->x, _nextFrame->Node->y, _nextFrame->Node->z)) + if (TeleportTransport(_nextFrame->Node->mapid, _nextFrame->Node->x, _nextFrame->Node->y, _nextFrame->Node->z, _nextFrame->InitialOrientation)) return; // Update more in new map thread } @@ -185,7 +182,18 @@ void Transport::Update(uint32 diff) G3D::Vector3 pos, dir; _currentFrame->Spline->evaluate_percent(_currentFrame->Index, t, pos); _currentFrame->Spline->evaluate_derivative(_currentFrame->Index, t, dir); - UpdatePosition(pos.x, pos.y, pos.z, atan2(dir.x, dir.y)); + UpdatePosition(pos.x, pos.y, pos.z, atan2(dir.y, dir.x) + M_PI); + } + else + { + /* There are four possible scenarios that trigger loading/unloading passengers: + 1. transport moves from inactive to active grid + 2. the grid that transport is currently in becomes active + 3. transport moves from active to inactive grid + 4. the grid that transport is currently in unloads + */ + if (_staticPassengers.empty() && GetMap()->IsGridLoaded(GetPositionX(), GetPositionY())) // 2. + LoadStaticPassengers(); } } @@ -313,7 +321,7 @@ void Transport::UpdatePosition(float x, float y, float z, float o) 3. transport moves from active to inactive grid 4. the grid that transport is currently in unloads */ - if (_staticPassengers.empty() && newActive) // 1. and 2. + if (_staticPassengers.empty() && newActive) // 1. LoadStaticPassengers(); else if (!_staticPassengers.empty() && !newActive && Cell(x, y).DiffGrid(Cell(GetPositionX(), GetPositionY()))) // 3. UnloadStaticPassengers(); @@ -403,52 +411,24 @@ float Transport::CalculateSegmentPos(float now) return segmentPos / frame.NextDistFromPrev; } -bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z) +bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z, float o) { Map const* oldMap = GetMap(); if (oldMap->GetId() != newMapid) { Map* newMap = sMapMgr->CreateBaseMap(newMapid); - Map::PlayerList const& oldPlayers = GetMap()->GetPlayers(); - if (!oldPlayers.isEmpty()) - { - UpdateData data(GetMapId()); - BuildOutOfRangeUpdateBlock(&data); - WorldPacket packet; - data.BuildPacket(&packet); - for (Map::PlayerList::const_iterator itr = oldPlayers.begin(); itr != oldPlayers.end(); ++itr) - if (itr->GetSource()->GetTransport() != this) - itr->GetSource()->SendDirectMessage(&packet); - } - UnloadStaticPassengers(); GetMap()->RemoveFromMap(this, false); SetMap(newMap); - Map::PlayerList const& newPlayers = GetMap()->GetPlayers(); - if (!newPlayers.isEmpty()) - { - for (Map::PlayerList::const_iterator itr = newPlayers.begin(); itr != newPlayers.end(); ++itr) - { - if (itr->GetSource()->GetTransport() != this) - { - UpdateData data(newMapid); - BuildCreateUpdateBlockForPlayer(&data, itr->GetSource()); - WorldPacket packet; - data.BuildPacket(&packet); - itr->GetSource()->SendDirectMessage(&packet); - } - } - } - for (std::set::iterator itr = _passengers.begin(); itr != _passengers.end();) { WorldObject* obj = (*itr++); float destX, destY, destZ, destO; obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO); - TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, GetOrientation()); + TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o); switch (obj->GetTypeId()) { @@ -474,7 +454,7 @@ bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z) } } - Relocate(x, y, z, GetOrientation()); + Relocate(x, y, z, o); GetMap()->AddToMap(this); return true; } @@ -487,13 +467,13 @@ bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z) { float destX, destY, destZ, destO; (*itr)->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO); - TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, GetOrientation()); + TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o); (*itr)->ToUnit()->NearTeleportTo(destX, destY, destZ, destO); } } - UpdatePosition(x, y, z, GetOrientation()); + UpdatePosition(x, y, z, o); return false; } } diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index e290a5d5e0..b0e80ea27b 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -78,7 +78,7 @@ class Transport : public GameObject, public TransportBase private: void MoveToNextWaypoint(); float CalculateSegmentPos(float perc); - bool TeleportTransport(uint32 newMapid, float x, float y, float z); + bool TeleportTransport(uint32 newMapid, float x, float y, float z, float o); void UpdatePassengerPositions(std::set& passengers); void DoEventIfAny(KeyFrame const& node, bool departure); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 02bdc5f3a8..0f2104bd8c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1834,7 +1834,7 @@ void Unit::AttackerStateUpdate (Unit* victim, WeaponAttackType attType, bool ext if (attType != BASE_ATTACK && attType != OFF_ATTACK) return; // ignore ranged case - // melee attack spell casted at main hand attack only - no normal melee dmg dealt + // melee attack spell cast at main hand attack only - no normal melee dmg dealt if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra) m_currentSpells[CURRENT_MELEE_SPELL]->cast(); else @@ -2496,7 +2496,7 @@ uint32 Unit::GetUnitMeleeSkill(Unit const* target) const float Unit::GetUnitDodgeChance() const { - if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STATE_CONTROLLED)) + if (IsNonMeleeSpellCast(false) || HasUnitState(UNIT_STATE_CONTROLLED)) return 0.0f; if (GetTypeId() == TYPEID_PLAYER) @@ -2516,7 +2516,7 @@ float Unit::GetUnitDodgeChance() const float Unit::GetUnitParryChance() const { - if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STATE_CONTROLLED)) + if (IsNonMeleeSpellCast(false) || HasUnitState(UNIT_STATE_CONTROLLED)) return 0.0f; float chance = 0.0f; @@ -2559,7 +2559,7 @@ float Unit::GetUnitMissChance(WeaponAttackType attType) const float Unit::GetUnitBlockChance() const { - if (IsNonMeleeSpellCasted(false) || HasUnitState(UNIT_STATE_CONTROLLED)) + if (IsNonMeleeSpellCast(false) || HasUnitState(UNIT_STATE_CONTROLLED)) return 0.0f; if (Player const* player = ToPlayer()) @@ -2698,7 +2698,7 @@ void Unit::_UpdateAutoRepeatSpell() { // check "realtime" interrupts // don't cancel spells which are affected by a SPELL_AURA_CAST_WHILE_WALKING effect - if (((GetTypeId() == TYPEID_PLAYER && ToPlayer()->isMoving()) || IsNonMeleeSpellCasted(false, false, true, m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == 75)) && + if (((GetTypeId() == TYPEID_PLAYER && ToPlayer()->isMoving()) || IsNonMeleeSpellCast(false, false, true, m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == 75)) && !HasAuraTypeWithAffectMask(SPELL_AURA_CAST_WHILE_WALKING, m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo)) { // cancel wand shoot @@ -2732,7 +2732,7 @@ void Unit::_UpdateAutoRepeatSpell() } } -void Unit::SetCurrentCastedSpell(Spell* pSpell) +void Unit::SetCurrentCastSpell(Spell* pSpell) { ASSERT(pSpell); // NULL may be never passed here, use InterruptSpell or InterruptNonMeleeSpells @@ -2845,16 +2845,16 @@ void Unit::FinishSpell(CurrentSpellTypes spellType, bool ok /*= true*/) spell->finish(ok); } -bool Unit::IsNonMeleeSpellCasted(bool withDelayed, bool skipChanneled, bool skipAutorepeat, bool isAutoshoot, bool skipInstant) const +bool Unit::IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled, bool skipAutorepeat, bool isAutoshoot, bool skipInstant) const { // We don't do loop here to explicitly show that melee spell is excluded. // Maybe later some special spells will be excluded too. - // if skipInstant then instant spells shouldn't count as being casted + // if skipInstant then instant spells shouldn't count as being cast if (skipInstant && m_currentSpells[CURRENT_GENERIC_SPELL] && !m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime()) return false; - // generic spells are casted when they are not finished and not delayed + // generic spells are cast when they are not finished and not delayed if (m_currentSpells[CURRENT_GENERIC_SPELL] && (m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_FINISHED) && (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED)) @@ -2862,14 +2862,14 @@ bool Unit::IsNonMeleeSpellCasted(bool withDelayed, bool skipChanneled, bool skip if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) return true; } - // channeled spells may be delayed, but they are still considered casted + // channeled spells may be delayed, but they are still considered cast else if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] && (m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED)) { if (!isAutoshoot || !(m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)) return true; } - // autorepeat spells may be finished or delayed, but they are still considered casted + // autorepeat spells may be finished or delayed, but they are still considered cast else if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]) return true; @@ -6334,7 +6334,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // Runic Power Back on Snare/Root if (dummySpell->Id == 61257) { - // only for spells and hit/crit (trigger start always) and not start from self casted spells + // only for spells and hit/crit (trigger start always) and not start from self cast spells if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT|PROC_EX_CRITICAL_HIT)) || this == victim) return false; // Need snare or root mechanic @@ -7585,7 +7585,7 @@ bool Unit::AttackStop() void Unit::CombatStop(bool includingCast) { - if (includingCast && IsNonMeleeSpellCasted(false)) + if (includingCast && IsNonMeleeSpellCast(false)) InterruptNonMeleeSpells(false); AttackStop(); @@ -8134,7 +8134,7 @@ int32 Unit::DealHeal(Unit* victim, uint32 addhealth) if (gain) player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, 0, victim); - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST, addhealth); } if (Player* player = victim->ToPlayer()) @@ -10651,7 +10651,7 @@ void Unit::setDeathState(DeathState s) getHostileRefManager().deleteReferences(); ClearComboPointHolders(); // any combo points pointed to unit lost at it death - if (IsNonMeleeSpellCasted(false)) + if (IsNonMeleeSpellCast(false)) InterruptNonMeleeSpells(false); ExitVehicle(); // Exit vehicle before calling RemoveAllControlled @@ -11070,7 +11070,7 @@ int32 Unit::ModSpellDuration(SpellInfo const* spellProto, Unit const* target, in } } - // Glyphs which increase duration of selfcasted buffs + // Glyphs which increase duration of selfcast buffs if (target == this) { switch (spellProto->SpellFamilyName) @@ -11117,7 +11117,7 @@ DiminishingLevels Unit::GetDiminishing(DiminishingGroup group) if (!i->hitTime) return DIMINISHING_LEVEL_1; - // If last spell was casted more than 15 seconds ago - reset the count. + // If last spell was cast more than 15 seconds ago - reset the count. if (i->stack == 0 && getMSTimeDiff(i->hitTime, getMSTime()) > 15000) { i->hitCount = DIMINISHING_LEVEL_1; @@ -11775,7 +11775,7 @@ void Unit::CleanupBeforeRemoveFromMap(bool finalCleanup) if (finalCleanup) m_cleanupDone = true; - m_Events.KillAllEvents(false); // non-delatable (currently casted spells) will not deleted now but it will deleted at call in Map::RemoveAllObjectsInRemoveList + m_Events.KillAllEvents(false); // non-delatable (currently cast spells) will not deleted now but it will deleted at call in Map::RemoveAllObjectsInRemoveList CombatStop(); ClearComboPointHolders(); DeleteThreatList(); @@ -12947,7 +12947,7 @@ void Unit::ApplyCastTimePercentMod(float val, bool apply) uint32 Unit::GetCastingTimeForBonus(SpellInfo const* spellProto, DamageEffectType damagetype, uint32 CastingTime) const { - // Not apply this to creature casted spells with casttime == 0 + // Not apply this to creature cast spells with casttime == 0 if (CastingTime == 0 && GetTypeId() == TYPEID_UNIT && !ToCreature()->IsPet()) return 3500; @@ -15804,7 +15804,7 @@ void Unit::StopAttackFaction(uint32 faction_id) if (victim->GetFactionTemplateEntry()->faction == faction_id) { AttackStop(); - if (IsNonMeleeSpellCasted(false)) + if (IsNonMeleeSpellCast(false)) InterruptNonMeleeSpells(false); // melee and ranged forced attack cancel @@ -15835,7 +15835,7 @@ void Unit::OutDebugInfo() const { TC_LOG_ERROR("entities.unit", "Unit::OutDebugInfo"); TC_LOG_INFO("entities.unit", "GUID " UI64FMTD ", entry %u, type %u, name %s", GetGUID(), GetEntry(), (uint32)GetTypeId(), GetName().c_str()); - TC_LOG_INFO("entities.unit", "OwnerGUID " UI64FMTD ", MinionGUID " UI64FMTD ", CharmerGUID " UI64FMTD ", CharmedGUID "UI64FMTD, GetOwnerGUID(), GetMinionGUID(), GetCharmerGUID(), GetCharmGUID()); + TC_LOG_INFO("entities.unit", "OwnerGUID " UI64FMTD ", MinionGUID " UI64FMTD ", CharmerGUID " UI64FMTD ", CharmedGUID " UI64FMTD, GetOwnerGUID(), GetMinionGUID(), GetCharmerGUID(), GetCharmGUID()); TC_LOG_INFO("entities.unit", "In world %u, unit type mask %u", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask); if (IsInWorld()) TC_LOG_INFO("entities.unit", "Mapid %u", GetMapId()); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 8411b28240..22a48d791e 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1828,15 +1828,15 @@ class Unit : public WorldObject float GetNegStat(Stats stat) const { return GetFloatValue(UNIT_FIELD_NEGSTAT0+stat); } float GetCreateStat(Stats stat) const { return m_createStats[stat]; } - void SetCurrentCastedSpell(Spell* pSpell); + void SetCurrentCastSpell(Spell* pSpell); virtual void ProhibitSpellSchool(SpellSchoolMask /*idSchoolMask*/, uint32 /*unTimeMs*/) { } void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed = true, bool withInstant = true); void FinishSpell(CurrentSpellTypes spellType, bool ok = true); - // set withDelayed to true to account delayed spells as casted - // delayed+channeled spells are always accounted as casted + // set withDelayed to true to account delayed spells as cast + // delayed+channeled spells are always accounted as cast // we can skip channeled or delayed checks using flags - bool IsNonMeleeSpellCasted(bool withDelayed, bool skipChanneled = false, bool skipAutorepeat = false, bool isAutoshoot = false, bool skipInstant = true) const; + bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled = false, bool skipAutorepeat = false, bool isAutoshoot = false, bool skipInstant = true) const; // set withDelayed to true to interrupt delayed spells too // delayed+channeled spells are always interrupted @@ -2180,8 +2180,8 @@ class Unit : public WorldObject uint32 m_removedAurasCount; AuraEffectList m_modAuras[TOTAL_AURAS]; - AuraList m_scAuras; // casted singlecast auras - AuraApplicationList m_interruptableAuras; // auras which have interrupt mask applied on unit + AuraList m_scAuras; // cast singlecast auras + AuraApplicationList m_interruptableAuras; // auras which have interrupt mask applied on unit AuraStateAurasMap m_auraStateAuras; // Used for improve performance of aura state checks on aura apply/remove uint32 m_interruptMask; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 4877d904f7..c4963f6372 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1627,7 +1627,8 @@ void ObjectMgr::LoadCreatures() continue; } - if (data.spawnMask & ~spawnMasks[data.mapid]) + // Skip spawnMask check for transport maps + if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid]) TC_LOG_ERROR("sql.sql", "Table `creature` have creature (GUID: %u) that have wrong spawn mask %u including not supported difficulty modes for map (Id: %u) spawnMasks[data.mapid]: %u.", guid, data.spawnMask, data.mapid, spawnMasks[data.mapid]); bool ok = true; @@ -1962,7 +1963,7 @@ void ObjectMgr::LoadGameobjects() data.spawnMask = fields[14].GetUInt8(); - if (data.spawnMask & ~spawnMasks[data.mapid]) + if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid]) TC_LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: %u Entry: %u) that has wrong spawn mask %u including not supported difficulty modes for map (Id: %u), skip", guid, data.id, data.spawnMask, data.mapid); data.phaseMask = fields[15].GetUInt32(); @@ -4071,21 +4072,21 @@ void ObjectMgr::LoadQuests() { TC_LOG_ERROR("sql.sql", "Quest %u has `RewardSpellCast` = %u but spell %u does not exist, quest will not have a spell reward.", qinfo->GetQuestId(), qinfo->RewardSpellCast, qinfo->RewardSpellCast); - qinfo->RewardSpellCast = 0; // no spell will be casted on player + qinfo->RewardSpellCast = 0; // no spell will be cast on player } else if (!SpellMgr::IsSpellValid(spellInfo)) { TC_LOG_ERROR("sql.sql", "Quest %u has `RewardSpellCast` = %u but spell %u is broken, quest will not have a spell reward.", qinfo->GetQuestId(), qinfo->RewardSpellCast, qinfo->RewardSpellCast); - qinfo->RewardSpellCast = 0; // no spell will be casted on player + qinfo->RewardSpellCast = 0; // no spell will be cast on player } else if (GetTalentSpellCost(qinfo->RewardSpellCast)) { TC_LOG_ERROR("sql.sql", "Quest %u has `RewardSpell` = %u but spell %u is talent, quest will not have a spell reward.", qinfo->GetQuestId(), qinfo->RewardSpellCast, qinfo->RewardSpellCast); - qinfo->RewardSpellCast = 0; // no spell will be casted on player + qinfo->RewardSpellCast = 0; // no spell will be cast on player } } @@ -6471,6 +6472,8 @@ void ObjectMgr::LoadGameObjectTemplate() TC_LOG_ERROR("sql.sql", "GameObject (Entry: %u GoType: %u) have data0=%u but TaxiPath (Id: %u) not exist.", entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId); } + if (uint32 transportMap = got.moTransport.mapID) + _transportMaps.insert(transportMap); break; } case GAMEOBJECT_TYPE_SUMMONING_RITUAL: //18 @@ -8545,8 +8548,8 @@ CreatureBaseStats const* ObjectMgr::GetCreatureBaseStats(uint8 level, uint8 unit void ObjectMgr::LoadCreatureClassLevelStats() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 6 7 - QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basehp3, basemana, basearmor FROM creature_classlevelstats"); + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basehp3, basemana, basearmor, attackpower, rangedattackpower, damage_base, damage_exp1, damage_exp2 FROM creature_classlevelstats"); if (!result) { @@ -8570,6 +8573,12 @@ void ObjectMgr::LoadCreatureClassLevelStats() stats.BaseMana = fields[6].GetUInt32(); stats.BaseArmor = fields[7].GetUInt32(); + stats.AttackPower = fields[8].GetInt16(); + stats.RangedAttackPower = fields[9].GetInt16(); + + for (uint8 i = 0; i < MAX_CREATURE_BASE_DAMAGE; ++i) + stats.BaseDamage[i] = fields[i + 10].GetFloat(); + if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0) TC_LOG_ERROR("sql.sql", "Creature base stats for level %u has invalid class %u", Level, Class); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index fb106884bb..dfd0192dfe 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1408,7 +1408,9 @@ class ObjectMgr GO_TO_GO, GO_TO_CREATURE // GO is dependant on creature }; + HotfixData _hotfixData; + std::set _transportMaps; // Helper container storing map ids that are for transports only, loaded from gameobject_template }; #define sObjectMgr ACE_Singleton::instance() diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index e33e8f73cd..73c46cc037 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -415,7 +415,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); WorldPacket data; - ChatHandler::BuildChatPacket(data, uint8(type), Language(lang), _player, NULL, msg); + ChatHandler::BuildChatPacket(data, type, Language(lang), _player, NULL, msg); group->BroadcastPacket(&data, false); } break; case CHAT_MSG_RAID_WARNING: @@ -445,7 +445,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group); WorldPacket data; - ChatHandler::BuildChatPacket(data, uint8(type), Language(lang), _player, NULL, msg);; + ChatHandler::BuildChatPacket(data, type, Language(lang), _player, NULL, msg);; group->BroadcastPacket(&data, false); } break; case CHAT_MSG_CHANNEL: @@ -614,7 +614,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) return; WorldPacket data; - ChatHandler::BuildChatPacket(data, type, uint32(LANG_ADDON), this, this, message, 0, "", DEFAULT_LOCALE, prefix.c_str()); + ChatHandler::BuildChatPacket(data, type, LANG_ADDON, this, this, message, 0, "", DEFAULT_LOCALE, prefix.c_str()); group->BroadcastAddonMessagePacket(&data, prefix, false); break; } @@ -647,7 +647,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData) break; WorldPacket data; - ChatHandler::BuildChatPacket(data, type, uint32(LANG_ADDON), this, this, message, 0, "", DEFAULT_LOCALE, prefix.c_str()); + ChatHandler::BuildChatPacket(data, type, LANG_ADDON, this, this, message, 0, "", DEFAULT_LOCALE, prefix.c_str()); group->BroadcastAddonMessagePacket(&data, prefix, true, -1, group->GetMemberGroup(sender->GetGUID())); break; } diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 9a32df7d4a..7b1e2474c8 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -238,7 +238,7 @@ void WorldSession::HandleLootOpcode(WorldPacket& recvData) GetPlayer()->SendLoot(guid, LOOT_CORPSE); // interrupt cast - if (GetPlayer()->IsNonMeleeSpellCasted(false)) + if (GetPlayer()->IsNonMeleeSpellCast(false)) GetPlayer()->InterruptNonMeleeSpells(false); } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index a1ece86de0..0cb1a51329 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -37,7 +37,6 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket& recvData) uint64 guid; recvData >> guid; uint32 questStatus = DIALOG_STATUS_NONE; - uint32 defstatus = DIALOG_STATUS_NONE; Object* questgiver = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); if (!questgiver) @@ -50,23 +49,23 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket& recvData) { case TYPEID_UNIT: { - TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for npc, guid = %u", uint32(GUID_LOPART(guid))); - Creature* cr_questgiver=questgiver->ToCreature(); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for npc, guid = %u", questgiver->GetGUIDLow()); + Creature* cr_questgiver = questgiver->ToCreature(); if (!cr_questgiver->IsHostileTo(_player)) // do not show quest status to enemies { questStatus = sScriptMgr->GetDialogStatus(_player, cr_questgiver); - if (questStatus > 6) - questStatus = getDialogStatus(_player, cr_questgiver, defstatus); + if (questStatus == DIALOG_STATUS_SCRIPTED_NO_STATUS) + questStatus = getDialogStatus(_player, cr_questgiver); } break; } case TYPEID_GAMEOBJECT: { - TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for GameObject guid = %u", uint32(GUID_LOPART(guid))); - GameObject* go_questgiver=(GameObject*)questgiver; + TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for GameObject guid = %u", questgiver->GetGUIDLow()); + GameObject* go_questgiver = questgiver->ToGameObject(); questStatus = sScriptMgr->GetDialogStatus(_player, go_questgiver); - if (questStatus > 6) - questStatus = getDialogStatus(_player, go_questgiver, defstatus); + if (questStatus == DIALOG_STATUS_SCRIPTED_NO_STATUS) + questStatus = getDialogStatus(_player, go_questgiver); break; } default: @@ -75,7 +74,7 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket& recvData) } //inform client about status of quest - _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, guid); + _player->PlayerTalkClass->SendQuestGiverStatus(uint8(questStatus), guid); } void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket& recvData) @@ -665,9 +664,9 @@ void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket) } } -uint32 WorldSession::getDialogStatus(Player* player, Object* questgiver, uint32 defstatus) +uint32 WorldSession::getDialogStatus(Player* player, Object* questgiver) { - uint32 result = defstatus; + uint32 result = DIALOG_STATUS_NONE; QuestRelationBounds qr; QuestRelationBounds qir; @@ -708,7 +707,7 @@ uint32 WorldSession::getDialogStatus(Player* player, Object* questgiver, uint32 if ((status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(quest_id)) || (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))) { - if (quest->IsAutoComplete() && quest->IsRepeatable()) + if (quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) result2 = DIALOG_STATUS_REWARD_REP; else result2 = DIALOG_STATUS_REWARD; @@ -739,11 +738,11 @@ uint32 WorldSession::getDialogStatus(Player* player, Object* questgiver, uint32 { if (player->SatisfyQuestLevel(quest, false)) { - if (quest->IsAutoComplete() || (quest->IsRepeatable() && player->IsQuestRewarded(quest_id))) + if (quest->IsAutoComplete()) result2 = DIALOG_STATUS_REWARD_REP; else if (player->getLevel() <= ((player->GetQuestLevel(quest) == -1) ? player->getLevel() : player->GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF))) { - if (quest->HasFlag(QUEST_FLAGS_DAILY) || quest->HasFlag(QUEST_FLAGS_WEEKLY)) + if (quest->IsDaily()) result2 = DIALOG_STATUS_AVAILABLE_REP; else result2 = DIALOG_STATUS_AVAILABLE; @@ -775,7 +774,6 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket for (Player::ClientGUIDs::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { uint32 questStatus = DIALOG_STATUS_NONE; - uint32 defstatus = DIALOG_STATUS_NONE; if (IS_CRE_OR_VEH_OR_PET_GUID(*itr)) { @@ -785,9 +783,10 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket continue; if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; + questStatus = sScriptMgr->GetDialogStatus(_player, questgiver); - if (questStatus > 6) - questStatus = getDialogStatus(_player, questgiver, defstatus); + if (questStatus == DIALOG_STATUS_SCRIPTED_NO_STATUS) + questStatus = getDialogStatus(_player, questgiver); data << uint64(questgiver->GetGUID()); data << uint32(questStatus); @@ -796,13 +795,12 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket else if (IS_GAMEOBJECT_GUID(*itr)) { GameObject* questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); - if (!questgiver) - continue; - if (questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) + if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; + questStatus = sScriptMgr->GetDialogStatus(_player, questgiver); - if (questStatus > 6) - questStatus = getDialogStatus(_player, questgiver, defstatus); + if (questStatus == DIALOG_STATUS_SCRIPTED_NO_STATUS) + questStatus = getDialogStatus(_player, questgiver); data << uint64(questgiver->GetGUID()); data << uint32(questStatus); diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 9324f52be3..5da2512b87 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -86,10 +86,10 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) return; uint8 bagIndex, slot, castFlags; - uint8 castCount; // next cast if exists (single or not) + uint8 castCount; // next cast if exists (single or not) uint64 itemGUID; uint32 glyphIndex; // something to do with glyphs? - uint32 spellId; // casted spell id + uint32 spellId; // cast spell id recvPacket >> bagIndex >> slot >> castCount >> spellId >> itemGUID >> glyphIndex >> castFlags; @@ -401,7 +401,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) } } - // Client is resending autoshot cast opcode when other spell is casted during shoot rotation + // Client is resending autoshot cast opcode when other spell is cast during shoot rotation // Skip it to prevent "interrupt" message if (spellInfo->IsAutoRepeatRangedSpell() && caster->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL) && caster->GetCurrentSpell(CURRENT_AUTOREPEAT_SPELL)->m_spellInfo == spellInfo) @@ -427,7 +427,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) { SpellInfo const* actualSpellInfo = spellInfo->GetAuraRankForLevel(targets.GetUnitTarget()->getLevel()); - // if rank not found then function return NULL but in explicit cast case original spell can be casted and later failed with appropriate error message + // if rank not found then function return NULL but in explicit cast case original spell can be cast and later failed with appropriate error message if (actualSpellInfo) spellInfo = actualSpellInfo; } @@ -445,7 +445,7 @@ void WorldSession::HandleCancelCastOpcode(WorldPacket& recvPacket) recvPacket.read_skip(); // counter, increments with every CANCEL packet, don't use for now recvPacket >> spellId; - if (_player->IsNonMeleeSpellCasted(false)) + if (_player->IsNonMeleeSpellCast(false)) _player->InterruptNonMeleeSpells(false, spellId, false); } @@ -462,7 +462,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket) if (spellInfo->Attributes & SPELL_ATTR0_CANT_CANCEL) return; - // channeled spell case (it currently casted then) + // channeled spell case (it currently cast then) if (spellInfo->IsChanneled()) { if (Spell* curSpell = _player->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 44e590cb79..650301575c 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -412,7 +412,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) Spell* his_spell = NULL; SpellCastTargets his_targets; - // not accept if spell can't be casted now (cheating) + // not accept if spell can't be cast now (cheating) if (uint32 my_spell_id = my_trade->GetSpell()) { SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(my_spell_id); @@ -447,7 +447,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) } } - // not accept if spell can't be casted now (cheating) + // not accept if spell can't be cast now (cheating) if (uint32 his_spell_id = his_trade->GetSpell()) { SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(his_spell_id); diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 2d7dbad254..9ccc3a839b 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -249,6 +249,16 @@ AI* GetInstanceAI(T* obj, char const* scriptName) return new AI(obj); return NULL; -} +}; + +template +AI* GetInstanceAI(T* obj) +{ + if (InstanceMap* instance = obj->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + return new AI(obj); + + return NULL; +}; #endif // TRINITY_INSTANCE_DATA_H diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 4f3640fe73..bc478f260c 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -63,19 +63,12 @@ Map::~Map() obj->ResetMap(); } - for (TransportsContainer::iterator itr = _transports.begin(); itr != _transports.end();) - { - Transport* transport = *itr; - ++itr; - - transport->RemoveFromWorld(); - delete transport; - } - if (!m_scriptSchedule.empty()) sScriptMgr->DecreaseScheduledScriptCount(m_scriptSchedule.size()); - MMAP::MMapFactory::createOrGetMMapManager()->unloadMapInstance(GetId(), i_InstanceId); + MMAP::MMapManager* manager = MMAP::MMapFactory::CreateOrGetMMapManager(); + manager->UnloadMapInstance(GetId(), i_InstanceId); // Delete the dtNavMeshQuery + manager->UnloadMap(GetId()); // Unload the loaded tiles and delete the dtNavMesh } bool Map::ExistMap(uint32 mapid, int gx, int gy) @@ -128,12 +121,16 @@ bool Map::ExistVMap(uint32 mapid, int gx, int gy) void Map::LoadMMap(int gx, int gy) { - bool mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gx, gy); + bool mmapLoadResult = false; + if (GetEntry()->Instanceable()) + mmapLoadResult = MMAP::MMapFactory::CreateOrGetMMapManager()->LoadMapTile(GetId(), 0, 0); // Ignore the tile entry for instances, as they only have 1 tile. + else + mmapLoadResult = MMAP::MMapFactory::CreateOrGetMMapManager()->LoadMapTile(GetId(), gx, gy); if (mmapLoadResult) - TC_LOG_INFO("maps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + TC_LOG_INFO("maps", "MMAP loaded name: %s, id: %d, x: %d, y: %d", GetMapName(), GetId(), gx, gy); else - TC_LOG_INFO("maps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + TC_LOG_INFO("maps", "Could not load MMAP name: %s, id: %d, x: %d, y: %d", GetMapName(), GetId(), gx, gy); } void Map::LoadVMap(int gx, int gy) @@ -235,9 +232,9 @@ i_gridExpiry(expiry), i_scriptLock(false) { m_parentMap = (_parent ? _parent : this); - for (unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx) + for (unsigned int idx = 0; idx < MAX_NUMBER_OF_GRIDS; ++idx) { - for (unsigned int j=0; j < MAX_NUMBER_OF_GRIDS; ++j) + for (unsigned int j = 0; j < MAX_NUMBER_OF_GRIDS; ++j) { //z code GridMaps[idx][j] =NULL; @@ -562,6 +559,22 @@ bool Map::AddToMap(Transport* obj) obj->AddToWorld(); _transports.insert(obj); + // Broadcast creation to players + if (!GetPlayers().isEmpty()) + { + for (Map::PlayerList::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) + { + if (itr->GetSource()->GetTransport() != obj) + { + UpdateData data; + obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource()); + WorldPacket packet; + data.BuildPacket(&packet); + itr->GetSource()->SendDirectMessage(&packet); + } + } + } + return true; } @@ -810,6 +823,18 @@ void Map::RemoveFromMap(Transport* obj, bool remove) { obj->RemoveFromWorld(); + Map::PlayerList const& players = GetPlayers(); + if (!players.isEmpty()) + { + UpdateData data; + obj->BuildOutOfRangeUpdateBlock(&data); + WorldPacket packet; + data.BuildPacket(&packet); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (itr->GetSource()->GetTransport() != obj) + itr->GetSource()->SendDirectMessage(&packet); + } + if (_transportsUpdateIter != _transports.end()) { TransportsContainer::iterator itr = _transports.find(obj); @@ -1317,7 +1342,7 @@ bool Map::UnloadGrid(NGridType& ngrid, bool unloadAll) delete GridMaps[gx][gy]; } VMAP::VMapFactory::createOrGetVMapManager()->unloadMap(GetId(), gx, gy); - MMAP::MMapFactory::createOrGetMMapManager()->unloadMap(GetId(), gx, gy); + MMAP::MMapFactory::CreateOrGetMMapManager()->UnloadMapTile(GetId(), gx, gy); } else ((MapInstanced*)m_parentMap)->RemoveGridMapReference(GridCoord(gx, gy)); @@ -1357,6 +1382,17 @@ void Map::UnloadAll() ++i; UnloadGrid(grid, true); // deletes the grid and removes it from the GridRefManager } + + for (TransportsContainer::iterator itr = _transports.begin(); itr != _transports.end();) + { + Transport* transport = *itr; + ++itr; + + transport->RemoveFromWorld(); + delete transport; + } + + _transports.clear(); } // ***************************** diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index 667f94fb53..d191293eca 100644 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -260,7 +260,7 @@ bool MapInstanced::DestroyInstance(InstancedMaps::iterator &itr) if (m_InstancedMaps.size() <= 1 && sWorld->getBoolConfig(CONFIG_GRID_UNLOAD)) { VMAP::VMapFactory::createOrGetVMapManager()->unloadMap(itr->second->GetId()); - MMAP::MMapFactory::createOrGetMMapManager()->unloadMap(itr->second->GetId()); + MMAP::MMapFactory::CreateOrGetMMapManager()->UnloadMap(itr->second->GetId()); // in that case, unload grids of the base map, too // so in the next map creation, (EnsureGridCreated actually) VMaps will be reloaded Map::UnloadAll(); diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp index 1179820139..328342ab30 100644 --- a/src/server/game/Maps/TransportMgr.cpp +++ b/src/server/game/Maps/TransportMgr.cpp @@ -87,28 +87,60 @@ void TransportMgr::LoadTransportTemplates() TC_LOG_INFO("server.loading", ">> Loaded %u transport templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +class SplineRawInitializer +{ +public: + SplineRawInitializer(Movement::PointsArray& points) : _points(points) { } + + void operator()(uint8& mode, bool& cyclic, Movement::PointsArray& points, int& lo, int& hi) const + { + mode = Movement::SplineBase::ModeCatmullrom; + cyclic = false; + points.assign(_points.begin(), _points.end()); + lo = 1; + hi = points.size() - 2; + } + + Movement::PointsArray& _points; +}; + void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTemplate* transport) { uint32 pathId = goInfo->moTransport.taxiPathId; TaxiPathNodeList const& path = sTaxiPathNodesByPath[pathId]; std::vector& keyFrames = transport->keyFrames; - Movement::PointsArray splinePath; + Movement::PointsArray splinePath, allPoints; bool mapChange = false; - bool cyclic = true; + for (size_t i = 0; i < path.size(); ++i) + allPoints.push_back(G3D::Vector3(path[i].x, path[i].y, path[i].z)); + + // Add extra points to allow derivative calculations for all path nodes + allPoints.insert(allPoints.begin(), allPoints.front().lerp(allPoints[1], -0.2f)); + allPoints.push_back(allPoints.back().lerp(allPoints[allPoints.size() - 2], -0.2f)); + allPoints.push_back(allPoints.back().lerp(allPoints[allPoints.size() - 2], -1.0f)); + + SplineRawInitializer initer(allPoints); + TransportSpline orientationSpline; + orientationSpline.init_spline_custom(initer); + orientationSpline.initLengths(); + for (size_t i = 0; i < path.size(); ++i) { if (!mapChange) { TaxiPathNodeEntry const& node_i = path[i]; - if (i != path.size() - 1 && (node_i.actionFlag == 1 || node_i.mapid != path[i + 1].mapid)) + if (i != path.size() - 1 && (node_i.actionFlag & 1 || node_i.mapid != path[i + 1].mapid)) { - cyclic = false; keyFrames.back().Teleport = true; mapChange = true; } else { KeyFrame k(node_i); + G3D::Vector3 h; + orientationSpline.evaluate_derivative(i + 1, 0.0f, h); + k.InitialOrientation = Position::NormalizeOrientation(atan2(h.y, h.x) + M_PI); + keyFrames.push_back(k); splinePath.push_back(G3D::Vector3(node_i.x, node_i.y, node_i.z)); transport->mapsUsed.insert(k.Node->mapid); @@ -118,16 +150,15 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl mapChange = false; } - // Not sure if data8 means the transport can be stopped or that its path in dbc does not contain extra spline points - if (!goInfo->moTransport.canBeStopped && splinePath.size() >= 2) + if (splinePath.size() >= 2) { // Remove special catmull-rom spline points - splinePath.erase(splinePath.begin()); - keyFrames.erase(keyFrames.begin()); - splinePath.pop_back(); - keyFrames.pop_back(); - // Cyclic spline has one more extra point - if (cyclic && !splinePath.empty()) + if (!keyFrames.front().IsStopFrame() && !keyFrames.front().Node->arrivalEventID && !keyFrames.front().Node->departureEventID) + { + splinePath.erase(splinePath.begin()); + keyFrames.erase(keyFrames.begin()); + } + if (!keyFrames.back().IsStopFrame() && !keyFrames.back().Node->arrivalEventID && !keyFrames.back().Node->departureEventID) { splinePath.pop_back(); keyFrames.pop_back(); @@ -170,67 +201,41 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl // find the rest of the distances between key points // Every path segment has its own spline - if (cyclic) + size_t start = 0; + for (size_t i = 1; i < keyFrames.size(); ++i) { - TransportSpline* spline = new TransportSpline(); - spline->init_cyclic_spline(&splinePath[0], splinePath.size(), Movement::SplineBase::ModeCatmullrom, 0); - spline->initLengths(); - keyFrames[0].DistFromPrev = spline->length(spline->last() - 2, spline->last() - 1); - keyFrames[0].Spline = spline; - for (size_t i = 0; i < keyFrames.size(); ++i) + if (keyFrames[i - 1].Teleport || i + 1 == keyFrames.size()) { - keyFrames[i].Index = i + 1; - keyFrames[i].DistFromPrev = spline->length(i, i + 1); - if (i > 0) - keyFrames[i - 1].NextDistFromPrev = keyFrames[i].DistFromPrev; - keyFrames[i].Spline = spline; - if (keyFrames[i].IsStopFrame()) + size_t extra = !keyFrames[i - 1].Teleport ? 1 : 0; + TransportSpline* spline = new TransportSpline(); + spline->init_spline(&splinePath[start], i - start + extra, Movement::SplineBase::ModeCatmullrom); + spline->initLengths(); + for (size_t j = start; j < i + extra; ++j) { - // remember first stop frame - if (firstStop == -1) - firstStop = i; - lastStop = i; + keyFrames[j].Index = j - start + 1; + keyFrames[j].DistFromPrev = spline->length(j - start, j + 1 - start); + if (j > 0) + keyFrames[j - 1].NextDistFromPrev = keyFrames[j].DistFromPrev; + keyFrames[j].Spline = spline; } + + if (keyFrames[i - 1].Teleport) + { + keyFrames[i].Index = i - start + 1; + keyFrames[i].DistFromPrev = 0.0f; + keyFrames[i - 1].NextDistFromPrev = 0.0f; + keyFrames[i].Spline = spline; + } + + start = i; } - } - else - { - size_t start = 0; - for (size_t i = 1; i < keyFrames.size(); ++i) + + if (keyFrames[i].IsStopFrame()) { - if (keyFrames[i - 1].Teleport || i + 1 == keyFrames.size()) - { - size_t extra = !keyFrames[i - 1].Teleport ? 1 : 0; - TransportSpline* spline = new TransportSpline(); - spline->init_spline(&splinePath[start], i - start + extra, Movement::SplineBase::ModeCatmullrom); - spline->initLengths(); - for (size_t j = start; j < i + extra; ++j) - { - keyFrames[j].Index = j - start + 1; - keyFrames[j].DistFromPrev = spline->length(j - start, j + 1 - start); - if (j > 0) - keyFrames[j - 1].NextDistFromPrev = keyFrames[j].DistFromPrev; - keyFrames[j].Spline = spline; - } - - if (keyFrames[i - 1].Teleport) - { - keyFrames[i].Index = i - start + 1; - keyFrames[i].DistFromPrev = 0.0f; - keyFrames[i - 1].NextDistFromPrev = 0.0f; - keyFrames[i].Spline = spline; - } - - start = i; - } - - if (keyFrames[i].IsStopFrame()) - { - // remember first stop frame - if (firstStop == -1) - firstStop = i; - lastStop = i; - } + // remember first stop frame + if (firstStop == -1) + firstStop = i; + lastStop = i; } } @@ -373,7 +378,7 @@ Transport* TransportMgr::CreateTransport(uint32 entry, uint32 guid /*= 0*/, Map* float x = startNode->x; float y = startNode->y; float z = startNode->z; - float o = 0.0f; + float o = tInfo->keyFrames.begin()->InitialOrientation; // initialize the gameobject base uint32 guidLow = guid ? guid : sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT); diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index 205a614eab..c2f82069b3 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -38,7 +38,7 @@ typedef UNORDERED_MAP > TransportInstanceMap; struct KeyFrame { - explicit KeyFrame(TaxiPathNodeEntry const& _node) : Index(0), Node(&_node), + explicit KeyFrame(TaxiPathNodeEntry const& _node) : Index(0), Node(&_node), InitialOrientation(0.0f), DistSinceStop(-1.0f), DistUntilStop(-1.0f), DistFromPrev(-1.0f), TimeFrom(0.0f), TimeTo(0.0f), Teleport(false), ArriveTime(0), DepartureTime(0), Spline(NULL), NextDistFromPrev(0.0f), NextArriveTime(0) { @@ -46,6 +46,7 @@ struct KeyFrame uint32 Index; TaxiPathNodeEntry const* Node; + float InitialOrientation; float DistSinceStop; float DistUntilStop; float DistFromPrev; diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index ddca3a92fd..03c44cc3a7 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -396,7 +396,7 @@ enum SpellAttr3 SPELL_ATTR3_ONLY_TARGET_PLAYERS = 0x00000100, // 8 can only target players SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2 = 0x00000200, // 9 triggered from effect? SPELL_ATTR3_MAIN_HAND = 0x00000400, // 10 Main hand weapon required - SPELL_ATTR3_BATTLEGROUND = 0x00000800, // 11 Can casted only on battleground + SPELL_ATTR3_BATTLEGROUND = 0x00000800, // 11 Can only be cast in battleground SPELL_ATTR3_ONLY_TARGET_GHOSTS = 0x00001000, // 12 SPELL_ATTR3_UNK13 = 0x00002000, // 13 SPELL_ATTR3_IS_HONORLESS_TARGET = 0x00004000, // 14 "Honorless Target" only this spells have this flag @@ -4049,7 +4049,7 @@ enum PartyResult }; const uint32 MMAP_MAGIC = 0x4d4d4150; // 'MMAP' -#define MMAP_VERSION 4 +#define MMAP_VERSION 5 struct MmapTileHeader { diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp index ef24b11225..63b1cf283a 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp @@ -86,7 +86,6 @@ bool ConfusedMovementGenerator::DoUpdate(T* unit, uint32 diff) unit->MovePositionToFirstCollision(pos, dest, 0.0f); PathGenerator path(unit); - path.SetPathLengthLimit(30.0f); bool result = path.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ); if (!result || (path.GetPathType() & PATHFIND_NOPATH)) { diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index f78411fc54..1c65499fe5 100644 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -44,7 +44,6 @@ void FleeingMovementGenerator::_setTargetLocation(T* owner) _getPoint(owner, x, y, z); PathGenerator path(owner); - path.SetPathLengthLimit(30.0f); bool result = path.CalculatePath(x, y, z); if (!result || (path.GetPathType() & PATHFIND_NOPATH)) { diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index 2d9fe4dd27..ecf9e0c9ed 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -60,7 +60,7 @@ void HomeMovementGenerator::_setTargetLocation(Creature* owner) arrived = false; - owner->ClearUnitState(uint32(UNIT_STATE_ALL_STATE & ~UNIT_STATE_EVADE)); + owner->ClearUnitState(uint32(UNIT_STATE_ALL_STATE & ~(UNIT_STATE_EVADE | UNIT_STATE_IGNORE_PATHFINDING))); } bool HomeMovementGenerator::DoUpdate(Creature* owner, const uint32 /*time_diff*/) diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index 91ad6d2b67..19295f6371 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify @@ -26,21 +27,19 @@ #include "DetourCommon.h" #include "DetourNavMeshQuery.h" +float PathGenerator::MinWallDistance = 2.5f; + ////////////////// PathGenerator ////////////////// PathGenerator::PathGenerator(const Unit* owner) : - _polyLength(0), _type(PATHFIND_BLANK), _useStraightPath(false), - _forceDestination(false), _pointPathLimit(MAX_POINT_PATH_LENGTH), - _endPosition(G3D::Vector3::zero()), _sourceUnit(owner), _navMesh(NULL), - _navMeshQuery(NULL) + _type(PATHFIND_BLANK), _endPosition(G3D::Vector3::zero()), + _sourceUnit(owner), _navMesh(NULL), _navMeshQuery(NULL) { - memset(_pathPolyRefs, 0, sizeof(_pathPolyRefs)); - - TC_LOG_DEBUG("maps", "++ PathGenerator::PathGenerator for %u \n", _sourceUnit->GetGUIDLow()); + TC_LOG_DEBUG("maps", "PathGenerator::PathGenerator for %u \n", _sourceUnit->GetGUIDLow()); uint32 mapId = _sourceUnit->GetMapId(); if (MMAP::MMapFactory::IsPathfindingEnabled(mapId)) { - MMAP::MMapManager* mmap = MMAP::MMapFactory::createOrGetMMapManager(); + MMAP::MMapManager* mmap = MMAP::MMapFactory::CreateOrGetMMapManager(); _navMesh = mmap->GetNavMesh(mapId); _navMeshQuery = mmap->GetNavMeshQuery(mapId, _sourceUnit->GetInstanceId()); } @@ -50,16 +49,23 @@ PathGenerator::PathGenerator(const Unit* owner) : PathGenerator::~PathGenerator() { - TC_LOG_DEBUG("maps", "++ PathGenerator::~PathGenerator() for %u \n", _sourceUnit->GetGUIDLow()); + TC_LOG_DEBUG("maps", "PathGenerator::~PathGenerator() for %u \n", _sourceUnit->GetGUIDLow()); } bool PathGenerator::CalculatePath(float destX, float destY, float destZ, bool forceDest) { + // Clear the previous path, just in case that the same PathGenerator instance is being used + _pathPoints.clear(); + float x, y, z; _sourceUnit->GetPosition(x, y, z); if (!Trinity::IsValidMapCoord(destX, destY, destZ) || !Trinity::IsValidMapCoord(x, y, z)) + { + TC_LOG_DEBUG("maps", "PathGenerator::CalculatePath() called with invalid map coords, destX: %f destY: %f destZ: %f x: %f y: %f z: %f for creature %u", destX, destY, destZ, x, y, z, _sourceUnit->GetGUIDLow()); + _type = PATHFIND_NOPATH; return false; + } G3D::Vector3 dest(destX, destY, destZ); SetEndPosition(dest); @@ -67,463 +73,103 @@ bool PathGenerator::CalculatePath(float destX, float destY, float destZ, bool fo G3D::Vector3 start(x, y, z); SetStartPosition(start); - _forceDestination = forceDest; - - TC_LOG_DEBUG("maps", "++ PathGenerator::CalculatePath() for %u \n", _sourceUnit->GetGUIDLow()); + TC_LOG_DEBUG("maps", "PathGenerator::CalculatePath() for %u \n", _sourceUnit->GetGUIDLow()); // make sure navMesh works - we can run on map w/o mmap // check if the start and end point have a .mmtile loaded (can we pass via not loaded tile on the way?) - if (!_navMesh || !_navMeshQuery || _sourceUnit->HasUnitState(UNIT_STATE_IGNORE_PATHFINDING) || - !HaveTile(start) || !HaveTile(dest)) + if (!_navMesh || !_navMeshQuery || _sourceUnit->HasUnitState(UNIT_STATE_IGNORE_PATHFINDING)) { - BuildShortcut(); + TC_LOG_DEBUG("maps", "PathGenerator::CalculatePath() navmesh is not initialized for %u \n", _sourceUnit->GetGUIDLow()); _type = PathType(PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH); + _pathPoints.push_back(start); + _pathPoints.push_back(dest); return true; } UpdateFilter(); - BuildPolyPath(start, dest); - return true; -} + float startPos[3]; + startPos[0] = -y; + startPos[1] = z; + startPos[2] = -x; -dtPolyRef PathGenerator::GetPathPolyByPosition(dtPolyRef const* polyPath, uint32 polyPathSize, float const* point, float* distance) const -{ - if (!polyPath || !polyPathSize) - return INVALID_POLYREF; + float endPos[3]; + endPos[0] = -destY; + endPos[1] = destZ; + endPos[2] = -destX; - dtPolyRef nearestPoly = INVALID_POLYREF; - float minDist2d = FLT_MAX; - float minDist3d = 0.0f; + float polyPickExt[3]; + polyPickExt[0] = 2.5f; + polyPickExt[1] = 2.5f; + polyPickExt[2] = 2.5f; - for (uint32 i = 0; i < polyPathSize; ++i) + // + dtPolyRef startRef; + dtPolyRef endRef; + + float nearestPt[3]; + + _navMeshQuery->findNearestPoly(startPos, polyPickExt, &_filter, &startRef, nearestPt); + _navMeshQuery->findNearestPoly(endPos, polyPickExt, &_filter, &endRef, nearestPt); + + if (!startRef || !endRef) { - float closestPoint[VERTEX_SIZE]; - if (dtStatusFailed(_navMeshQuery->closestPointOnPoly(polyPath[i], point, closestPoint))) - continue; - - float d = dtVdist2DSqr(point, closestPoint); - if (d < minDist2d) - { - minDist2d = d; - nearestPoly = polyPath[i]; - minDist3d = dtVdistSqr(point, closestPoint); - } - - if (minDist2d < 1.0f) // shortcut out - close enough for us - break; - } - - if (distance) - *distance = dtSqrt(minDist3d); - - return (minDist2d < 3.0f) ? nearestPoly : INVALID_POLYREF; -} - -dtPolyRef PathGenerator::GetPolyByLocation(float const* point, float* distance) const -{ - // first we check the current path - // if the current path doesn't contain the current poly, - // we need to use the expensive navMesh.findNearestPoly - dtPolyRef polyRef = GetPathPolyByPosition(_pathPolyRefs, _polyLength, point, distance); - if (polyRef != INVALID_POLYREF) - return polyRef; - - // we don't have it in our old path - // try to get it by findNearestPoly() - // first try with low search box - float extents[VERTEX_SIZE] = {3.0f, 5.0f, 3.0f}; // bounds of poly search area - float closestPoint[VERTEX_SIZE] = {0.0f, 0.0f, 0.0f}; - if (dtStatusSucceed(_navMeshQuery->findNearestPoly(point, extents, &_filter, &polyRef, closestPoint)) && polyRef != INVALID_POLYREF) - { - *distance = dtVdist(closestPoint, point); - return polyRef; - } - - // still nothing .. - // try with bigger search box - // Note that the extent should not overlap more than 128 polygons in the navmesh (see dtNavMeshQuery::findNearestPoly) - extents[1] = 50.0f; - - if (dtStatusSucceed(_navMeshQuery->findNearestPoly(point, extents, &_filter, &polyRef, closestPoint)) && polyRef != INVALID_POLYREF) - { - *distance = dtVdist(closestPoint, point); - return polyRef; - } - - return INVALID_POLYREF; -} - -void PathGenerator::BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 const& endPos) -{ - // *** getting start/end poly logic *** - - float distToStartPoly, distToEndPoly; - float startPoint[VERTEX_SIZE] = {startPos.y, startPos.z, startPos.x}; - float endPoint[VERTEX_SIZE] = {endPos.y, endPos.z, endPos.x}; - - dtPolyRef startPoly = GetPolyByLocation(startPoint, &distToStartPoly); - dtPolyRef endPoly = GetPolyByLocation(endPoint, &distToEndPoly); - - // we have a hole in our mesh - // make shortcut path and mark it as NOPATH ( with flying and swimming exception ) - // its up to caller how he will use this info - if (startPoly == INVALID_POLYREF || endPoly == INVALID_POLYREF) - { - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: (startPoly == 0 || endPoly == 0)\n"); - BuildShortcut(); - bool path = _sourceUnit->GetTypeId() == TYPEID_UNIT && _sourceUnit->ToCreature()->CanFly(); - - bool waterPath = _sourceUnit->GetTypeId() == TYPEID_UNIT && _sourceUnit->ToCreature()->CanSwim(); - if (waterPath) - { - // 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 = _sourceUnit->GetBaseMap()->getLiquidStatus(_pathPoints[i].x, _pathPoints[i].y, _pathPoints[i].z, MAP_ALL_LIQUIDS, NULL); - // One of the points is not in the water, cancel movement. - if (status == LIQUID_MAP_NO_WATER) - { - waterPath = false; - break; - } - } - } - - _type = (path || waterPath) ? PathType(PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH) : PATHFIND_NOPATH; - return; - } - - // we may need a better number here - bool farFromPoly = (distToStartPoly > 7.0f || distToEndPoly > 7.0f); - if (farFromPoly) - { - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: farFromPoly distToStartPoly=%.3f distToEndPoly=%.3f\n", distToStartPoly, distToEndPoly); - - bool buildShotrcut = false; - if (_sourceUnit->GetTypeId() == TYPEID_UNIT) - { - Creature* owner = (Creature*)_sourceUnit; - - G3D::Vector3 const& p = (distToStartPoly > 7.0f) ? startPos : endPos; - if (_sourceUnit->GetBaseMap()->IsUnderWater(p.x, p.y, p.z)) - { - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: underWater case\n"); - if (owner->CanSwim()) - buildShotrcut = true; - } - else - { - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: flying case\n"); - if (owner->CanFly()) - buildShotrcut = true; - } - } - - if (buildShotrcut) - { - BuildShortcut(); - _type = PathType(PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH); - return; - } - else - { - float closestPoint[VERTEX_SIZE]; - // we may want to use closestPointOnPolyBoundary instead - if (dtStatusSucceed(_navMeshQuery->closestPointOnPoly(endPoly, endPoint, closestPoint))) - { - dtVcopy(endPoint, closestPoint); - SetActualEndPosition(G3D::Vector3(endPoint[2], endPoint[0], endPoint[1])); - } - - _type = PATHFIND_INCOMPLETE; - } - } - - // *** poly path generating logic *** - - // start and end are on same polygon - // just need to move in straight line - if (startPoly == endPoly) - { - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: (startPoly == endPoly)\n"); - - BuildShortcut(); - - _pathPolyRefs[0] = startPoly; - _polyLength = 1; - - _type = farFromPoly ? PATHFIND_INCOMPLETE : PATHFIND_NORMAL; - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: path type %d\n", _type); - return; - } - - // look for startPoly/endPoly in current path - /// @todo we can merge it with getPathPolyByPosition() loop - bool startPolyFound = false; - bool endPolyFound = false; - uint32 pathStartIndex = 0; - uint32 pathEndIndex = 0; - - if (_polyLength) - { - for (; pathStartIndex < _polyLength; ++pathStartIndex) - { - // here to carch few bugs - ASSERT(_pathPolyRefs[pathStartIndex] != INVALID_POLYREF); - - if (_pathPolyRefs[pathStartIndex] == startPoly) - { - startPolyFound = true; - break; - } - } - - for (pathEndIndex = _polyLength-1; pathEndIndex > pathStartIndex; --pathEndIndex) - if (_pathPolyRefs[pathEndIndex] == endPoly) - { - endPolyFound = true; - break; - } - } - - if (startPolyFound && endPolyFound) - { - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: (startPolyFound && endPolyFound)\n"); - - // we moved along the path and the target did not move out of our old poly-path - // our path is a simple subpath case, we have all the data we need - // just "cut" it out - - _polyLength = pathEndIndex - pathStartIndex + 1; - memmove(_pathPolyRefs, _pathPolyRefs + pathStartIndex, _polyLength * sizeof(dtPolyRef)); - } - else if (startPolyFound && !endPolyFound) - { - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: (startPolyFound && !endPolyFound)\n"); - - // we are moving on the old path but target moved out - // so we have atleast part of poly-path ready - - _polyLength -= pathStartIndex; - - // try to adjust the suffix of the path instead of recalculating entire length - // at given interval the target cannot get too far from its last location - // thus we have less poly to cover - // sub-path of optimal path is optimal - - // take ~80% of the original length - /// @todo play with the values here - uint32 prefixPolyLength = uint32(_polyLength * 0.8f + 0.5f); - memmove(_pathPolyRefs, _pathPolyRefs+pathStartIndex, prefixPolyLength * sizeof(dtPolyRef)); - - dtPolyRef suffixStartPoly = _pathPolyRefs[prefixPolyLength-1]; - - // we need any point on our suffix start poly to generate poly-path, so we need last poly in prefix data - float suffixEndPoint[VERTEX_SIZE]; - if (dtStatusFailed(_navMeshQuery->closestPointOnPoly(suffixStartPoly, endPoint, suffixEndPoint))) - { - // we can hit offmesh connection as last poly - closestPointOnPoly() don't like that - // try to recover by using prev polyref - --prefixPolyLength; - suffixStartPoly = _pathPolyRefs[prefixPolyLength-1]; - if (dtStatusFailed(_navMeshQuery->closestPointOnPoly(suffixStartPoly, endPoint, suffixEndPoint))) - { - // suffixStartPoly is still invalid, error state - BuildShortcut(); - _type = PATHFIND_NOPATH; - return; - } - } - - // generate suffix - uint32 suffixPolyLength = 0; - dtStatus dtResult = _navMeshQuery->findPath( - suffixStartPoly, // start polygon - endPoly, // end polygon - suffixEndPoint, // start position - endPoint, // end position - &_filter, // polygon search filter - _pathPolyRefs + prefixPolyLength - 1, // [out] path - (int*)&suffixPolyLength, - MAX_PATH_LENGTH-prefixPolyLength); // max number of polygons in output path - - if (!suffixPolyLength || dtStatusFailed(dtResult)) - { - // this is probably an error state, but we'll leave it - // and hopefully recover on the next Update - // we still need to copy our preffix - TC_LOG_ERROR("maps", "%u's Path Build failed: 0 length path", _sourceUnit->GetGUIDLow()); - } - - TC_LOG_DEBUG("maps", "++ m_polyLength=%u prefixPolyLength=%u suffixPolyLength=%u \n", _polyLength, prefixPolyLength, suffixPolyLength); - - // new path = prefix + suffix - overlap - _polyLength = prefixPolyLength + suffixPolyLength - 1; - } - else - { - TC_LOG_DEBUG("maps", "++ BuildPolyPath :: (!startPolyFound && !endPolyFound)\n"); - - // either we have no path at all -> first run - // or something went really wrong -> we aren't moving along the path to the target - // just generate new path - - // free and invalidate old path data - Clear(); - - dtStatus dtResult = _navMeshQuery->findPath( - startPoly, // start polygon - endPoly, // end polygon - startPoint, // start position - endPoint, // end position - &_filter, // polygon search filter - _pathPolyRefs, // [out] path - (int*)&_polyLength, - MAX_PATH_LENGTH); // max number of polygons in output path - - if (!_polyLength || dtStatusFailed(dtResult)) - { - // only happens if we passed bad data to findPath(), or navmesh is messed up - TC_LOG_ERROR("maps", "%u's Path Build failed: 0 length path", _sourceUnit->GetGUIDLow()); - BuildShortcut(); - _type = PATHFIND_NOPATH; - return; - } - } - - // by now we know what type of path we can get - if (_pathPolyRefs[_polyLength - 1] == endPoly && !(_type & PATHFIND_INCOMPLETE)) - _type = PATHFIND_NORMAL; - else - _type = PATHFIND_INCOMPLETE; - - // generate the point-path out of our up-to-date poly-path - BuildPointPath(startPoint, endPoint); -} - -void PathGenerator::BuildPointPath(const float *startPoint, const float *endPoint) -{ - float pathPoints[MAX_POINT_PATH_LENGTH*VERTEX_SIZE]; - uint32 pointCount = 0; - dtStatus dtResult = DT_FAILURE; - if (_useStraightPath) - { - dtResult = _navMeshQuery->findStraightPath( - startPoint, // start position - endPoint, // end position - _pathPolyRefs, // current path - _polyLength, // lenth of current path - pathPoints, // [out] path corner points - NULL, // [out] flags - NULL, // [out] shortened path - (int*)&pointCount, - _pointPathLimit); // maximum number of points/polygons to use - } - else - { - dtResult = FindSmoothPath( - startPoint, // start position - endPoint, // end position - _pathPolyRefs, // current path - _polyLength, // length of current path - pathPoints, // [out] path corner points - (int*)&pointCount, - _pointPathLimit); // maximum number of points - } - - if (pointCount < 2 || dtStatusFailed(dtResult)) - { - // only happens if pass bad data to findStraightPath or navmesh is broken - // single point paths can be generated here - /// @todo check the exact cases - TC_LOG_DEBUG("maps", "++ PathGenerator::BuildPointPath FAILED! path sized %d returned\n", pointCount); - BuildShortcut(); - _type = PATHFIND_NOPATH; - return; - } - else if (pointCount == _pointPathLimit) - { - TC_LOG_DEBUG("maps", "++ PathGenerator::BuildPointPath FAILED! path sized %d returned, lower than limit set to %d\n", pointCount, _pointPathLimit); - BuildShortcut(); - _type = PATHFIND_SHORT; - return; - } - - _pathPoints.resize(pointCount); - for (uint32 i = 0; i < pointCount; ++i) - _pathPoints[i] = G3D::Vector3(pathPoints[i*VERTEX_SIZE+2], pathPoints[i*VERTEX_SIZE], pathPoints[i*VERTEX_SIZE+1]); - - NormalizePath(); - - // first point is always our current location - we need the next one - SetActualEndPosition(_pathPoints[pointCount-1]); - - // force the given destination, if needed - if (_forceDestination && - (!(_type & PATHFIND_NORMAL) || !InRange(GetEndPosition(), GetActualEndPosition(), 1.0f, 1.0f))) - { - // we may want to keep partial subpath - if (Dist3DSqr(GetActualEndPosition(), GetEndPosition()) < 0.3f * Dist3DSqr(GetStartPosition(), GetEndPosition())) - { - SetActualEndPosition(GetEndPosition()); - _pathPoints[_pathPoints.size()-1] = GetEndPosition(); - } - else - { - SetActualEndPosition(GetEndPosition()); - BuildShortcut(); - } - + TC_LOG_DEBUG("maps", "PathGenerator::CalculatePath() for %u no polygons found for start and end locations\n", _sourceUnit->GetGUIDLow()); _type = PathType(PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH); + _pathPoints.push_back(start); + _pathPoints.push_back(dest); + return false; } - TC_LOG_DEBUG("maps", "++ PathGenerator::BuildPointPath path type %d size %d poly-size %d\n", _type, pointCount, _polyLength); -} + int hops; + dtPolyRef* hopBuffer = new dtPolyRef[8192]; + dtStatus status = _navMeshQuery->findPath(startRef, endRef, startPos, endPos, &_filter, hopBuffer, &hops, 8192); -void PathGenerator::NormalizePath() -{ - for (uint32 i = 0; i < _pathPoints.size(); ++i) - _sourceUnit->UpdateAllowedPositionZ(_pathPoints[i].x, _pathPoints[i].y, _pathPoints[i].z); -} + if (!dtStatusSucceed(status)) + { + TC_LOG_DEBUG("maps", "PathGenerator::CalculatePath() for %u no path found for start and end locations\n", _sourceUnit->GetGUIDLow()); + _type = PathType(PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH); + _pathPoints.push_back(start); + _pathPoints.push_back(dest); + return false; + } -void PathGenerator::BuildShortcut() -{ - TC_LOG_DEBUG("maps", "++ BuildShortcut :: making shortcut\n"); + int resultHopCount; + float* straightPath = new float[2048 * 3]; + unsigned char* pathFlags = new unsigned char[2048]; + dtPolyRef* pathRefs = new dtPolyRef[2048]; - Clear(); + status = _navMeshQuery->findStraightPath(startPos, endPos, hopBuffer, hops, straightPath, pathFlags, pathRefs, &resultHopCount, 2048); + if (!dtStatusSucceed(status)) + { + TC_LOG_DEBUG("maps", "PathGenerator::CalculatePath() for %u no straight path found for start and end locations\n", _sourceUnit->GetGUIDLow()); + _type = PathType(PATHFIND_NORMAL | PATHFIND_NOT_USING_PATH); + _pathPoints.push_back(start); + _pathPoints.push_back(dest); + return false; + } - // make two point path, our curr pos is the start, and dest is the end - _pathPoints.resize(2); + SmoothPath(polyPickExt, resultHopCount, straightPath); // Separate the path from the walls - // set start and a default next position - _pathPoints[0] = GetStartPosition(); - _pathPoints[1] = GetActualEndPosition(); + for (uint32 i = 0; i < resultHopCount; ++i) + { + _pathPoints.push_back(G3D::Vector3(-straightPath[i * 3 + 2], -straightPath[i * 3 + 0], straightPath[i * 3 + 1])); + TC_LOG_DEBUG("maps", "PathGenerator::CalculatePath() for %u path point %u: (%f, %f, %f)", _sourceUnit->GetGUIDLow(), i, _pathPoints[i].x, _pathPoints[i].y, _pathPoints[i].z); + } - NormalizePath(); - - _type = PATHFIND_SHORTCUT; + _type = PATHFIND_NORMAL; + return true; } void PathGenerator::CreateFilter() { - uint16 includeFlags = 0; + uint16 includeFlags = POLY_FLAG_WALK | POLY_FLAG_SWIM; uint16 excludeFlags = 0; - if (_sourceUnit->GetTypeId() == TYPEID_UNIT) + if (_sourceUnit->GetTypeId() == TYPEID_UNIT && !_sourceUnit->ToCreature()->CanSwim()) { - Creature* creature = (Creature*)_sourceUnit; - if (creature->CanWalk()) - includeFlags |= NAV_GROUND; // walk - - // creatures don't take environmental damage - if (creature->CanSwim()) - includeFlags |= (NAV_WATER | NAV_MAGMA | NAV_SLIME); // swim - } - else // assume Player - { - // perfect support not possible, just stay 'safe' - includeFlags |= (NAV_GROUND | NAV_WATER | NAV_MAGMA | NAV_SLIME); + includeFlags = POLY_FLAG_WALK; + excludeFlags = POLY_FLAG_SWIM; } _filter.setIncludeFlags(includeFlags); @@ -534,275 +180,130 @@ void PathGenerator::CreateFilter() void PathGenerator::UpdateFilter() { - // allow creatures to cheat and use different movement types if they are moved - // forcefully into terrain they can't normally move in - if (_sourceUnit->IsInWater() || _sourceUnit->IsUnderWater()) - { - uint16 includedFlags = _filter.getIncludeFlags(); - includedFlags |= GetNavTerrain(_sourceUnit->GetPositionX(), - _sourceUnit->GetPositionY(), - _sourceUnit->GetPositionZ()); - _filter.setIncludeFlags(includedFlags); +} + +float PathGenerator::GetTriangleArea(float* verts, int nv) +{ + float area = 0; + for (int i = 0; i < nv - 1; i++) + area += verts[i * 3] * verts[i * 3 + 5] - verts[i * 3 + 3] * verts[i * 3 + 2]; + area += verts[(nv - 1) * 3] * verts[2] - verts[0] * verts[(nv - 1) * 3 + 2]; + return area * 0.5f; +} + +bool PathGenerator::PointInPoly(float* pos, float* verts, int nv, float err) +{ + // Poly area + float area = abs(PathGenerator::GetTriangleArea(verts, nv)); + + // Calculate each area of the triangles + float testTri[9]; + memcpy(testTri, pos, sizeof(float) * 3); + float area1 = 0; + for(int i = 0; i < nv - 1; ++i) + { + memcpy(&testTri[3], &verts[i * 3], sizeof(float) * 3); + memcpy(&testTri[6], &verts[i * 3 + 3], sizeof(float) * 3); + area1 += abs(PathGenerator::GetTriangleArea(testTri, 3)); + if (area1 - err > area) + return false; } + + // Last one + memcpy(&testTri[3], verts, sizeof(float) * 3); + memcpy(&testTri[6], &verts[nv * 3 - 3] , sizeof(float) * 3); + area1 += abs(PathGenerator::GetTriangleArea(testTri, 3)); + + return abs(area1 - area) < err; } -NavTerrain PathGenerator::GetNavTerrain(float x, float y, float z) +float PathGenerator::DistanceToWall(float* polyPickExt, float* pos, float* hitPos, float* hitNormal) { - LiquidData data; - ZLiquidStatus liquidStatus = _sourceUnit->GetBaseMap()->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &data); - if (liquidStatus == LIQUID_MAP_NO_WATER) - return NAV_GROUND; + float distanceToWall = 0; + dtPolyRef ref; - switch (data.type_flags) + dtStatus status = _navMeshQuery->findNearestPoly(pos, polyPickExt, &_filter, &ref, 0); + + if (!dtStatusSucceed(status) || ref == 0) + return -1; + + const dtMeshTile* tile = 0; + const dtPoly* poly = 0; + if (dtStatusFailed(_navMesh->getTileAndPolyByRef(ref, &tile, &poly))) + return -1; + + // Collect vertices. + float verts[DT_VERTS_PER_POLYGON * 3]; + int nv = 0; + for (unsigned char i = 0; i < poly->vertCount; ++i) { - case MAP_LIQUID_TYPE_WATER: - case MAP_LIQUID_TYPE_OCEAN: - return NAV_WATER; - case MAP_LIQUID_TYPE_MAGMA: - return NAV_MAGMA; - case MAP_LIQUID_TYPE_SLIME: - return NAV_SLIME; - default: - return NAV_GROUND; + dtVcopy(&verts[nv * 3], &tile->verts[poly->verts[i] * 3]); + nv++; } + + bool inside = PathGenerator::PointInPoly(pos, verts, nv, 0.05f); + if (!inside) + return -1; + + if (!dtStatusSucceed(_navMeshQuery->findDistanceToWall(ref, pos, 100.0f, &_filter, &distanceToWall, hitPos, hitNormal))) + return -1; + + return distanceToWall; } -bool PathGenerator::HaveTile(const G3D::Vector3& p) const +void PathGenerator::SmoothPath(float* polyPickExt, int pathLength, float*& straightPath) { - int tx = -1, ty = -1; - float point[VERTEX_SIZE] = {p.y, p.z, p.x}; + float hitPos[3]; + float hitNormal[3]; + float testPos[3]; + float distanceToWall = 0; + float up[]= { 0, 1, 0 }; + float origDis = 0; - _navMesh->calcTileLoc(point, &tx, &ty); - - /// Workaround - /// For some reason, often the tx and ty variables wont get a valid value - /// Use this check to prevent getting negative tile coords and crashing on getTileAt - if (tx < 0 || ty < 0) - return false; - - return (_navMesh->getTileAt(tx, ty, 0) != NULL); -} - -uint32 PathGenerator::FixupCorridor(dtPolyRef* path, uint32 npath, uint32 maxPath, dtPolyRef const* visited, uint32 nvisited) -{ - int32 furthestPath = -1; - int32 furthestVisited = -1; - - // Find furthest common polygon. - for (int32 i = npath-1; i >= 0; --i) + for (int i = 1; i < pathLength - 1; ++i) { - bool found = false; - for (int32 j = nvisited-1; j >= 0; --j) + dtPolyRef pt; + float* curPoi = &straightPath[i * 3]; + distanceToWall = DistanceToWall(polyPickExt, curPoi, hitPos, hitNormal); + + if (distanceToWall < PathGenerator::MinWallDistance && distanceToWall >= 0) { - if (path[i] == visited[j]) + float vec[3]; + dtVsub(vec, &straightPath[i * 3 - 3], &straightPath[i * 3]); + // If distanceToWall is 0 means the point is in the edge, so we can't get the hitpos. + if (distanceToWall == 0) { - furthestPath = i; - furthestVisited = j; - found = true; - } - } - if (found) - break; - } - - // If no intersection found just return current path. - if (furthestPath == -1 || furthestVisited == -1) - return npath; - - // Concatenate paths. - - // Adjust beginning of the buffer to include the visited. - uint32 req = nvisited - furthestVisited; - uint32 orig = uint32(furthestPath + 1) < npath ? furthestPath + 1 : npath; - uint32 size = npath > orig ? npath - orig : 0; - if (req + size > maxPath) - size = maxPath-req; - - if (size) - memmove(path + req, path + orig, size * sizeof(dtPolyRef)); - - // Store visited - for (uint32 i = 0; i < req; ++i) - path[i] = visited[(nvisited - 1) - i]; - - return req+size; -} - -bool PathGenerator::GetSteerTarget(float const* startPos, float const* endPos, - float minTargetDist, dtPolyRef const* path, uint32 pathSize, - float* steerPos, unsigned char& steerPosFlag, dtPolyRef& steerPosRef) -{ - // Find steer target. - static const uint32 MAX_STEER_POINTS = 3; - float steerPath[MAX_STEER_POINTS*VERTEX_SIZE]; - unsigned char steerPathFlags[MAX_STEER_POINTS]; - dtPolyRef steerPathPolys[MAX_STEER_POINTS]; - uint32 nsteerPath = 0; - dtStatus dtResult = _navMeshQuery->findStraightPath(startPos, endPos, path, pathSize, - steerPath, steerPathFlags, steerPathPolys, (int*)&nsteerPath, MAX_STEER_POINTS); - if (!nsteerPath || dtStatusFailed(dtResult)) - return false; - - // Find vertex far enough to steer to. - uint32 ns = 0; - while (ns < nsteerPath) - { - // Stop at Off-Mesh link or when point is further than slop away. - if ((steerPathFlags[ns] & DT_STRAIGHTPATH_OFFMESH_CONNECTION) || - !InRangeYZX(&steerPath[ns*VERTEX_SIZE], startPos, minTargetDist, 1000.0f)) - break; - ns++; - } - // Failed to find good point to steer to. - if (ns >= nsteerPath) - return false; - - dtVcopy(steerPos, &steerPath[ns*VERTEX_SIZE]); - steerPos[1] = startPos[1]; // keep Z value - steerPosFlag = steerPathFlags[ns]; - steerPosRef = steerPathPolys[ns]; - - return true; -} - -dtStatus PathGenerator::FindSmoothPath(float const* startPos, float const* endPos, - dtPolyRef const* polyPath, uint32 polyPathSize, - float* smoothPath, int* smoothPathSize, uint32 maxSmoothPathSize) -{ - *smoothPathSize = 0; - uint32 nsmoothPath = 0; - - dtPolyRef polys[MAX_PATH_LENGTH]; - memcpy(polys, polyPath, sizeof(dtPolyRef)*polyPathSize); - uint32 npolys = polyPathSize; - - float iterPos[VERTEX_SIZE], targetPos[VERTEX_SIZE]; - if (dtStatusFailed(_navMeshQuery->closestPointOnPolyBoundary(polys[0], startPos, iterPos))) - return DT_FAILURE; - - if (dtStatusFailed(_navMeshQuery->closestPointOnPolyBoundary(polys[npolys-1], endPos, targetPos))) - return DT_FAILURE; - - dtVcopy(&smoothPath[nsmoothPath*VERTEX_SIZE], iterPos); - nsmoothPath++; - - // Move towards target a small advancement at a time until target reached or - // when ran out of memory to store the path. - while (npolys && nsmoothPath < maxSmoothPathSize) - { - // Find location to steer towards. - float steerPos[VERTEX_SIZE]; - unsigned char steerPosFlag; - dtPolyRef steerPosRef = INVALID_POLYREF; - - if (!GetSteerTarget(iterPos, targetPos, SMOOTH_PATH_SLOP, polys, npolys, steerPos, steerPosFlag, steerPosRef)) - break; - - bool endOfPath = (steerPosFlag & DT_STRAIGHTPATH_END); - bool offMeshConnection = (steerPosFlag & DT_STRAIGHTPATH_OFFMESH_CONNECTION); - - // Find movement delta. - float delta[VERTEX_SIZE]; - dtVsub(delta, steerPos, iterPos); - float len = dtSqrt(dtVdot(delta, delta)); - // If the steer target is end of path or off-mesh link, do not move past the location. - if ((endOfPath || offMeshConnection) && len < SMOOTH_PATH_STEP_SIZE) - len = 1.0f; - else - len = SMOOTH_PATH_STEP_SIZE / len; - - float moveTgt[VERTEX_SIZE]; - dtVmad(moveTgt, iterPos, delta, len); - - // Move - float result[VERTEX_SIZE]; - const static uint32 MAX_VISIT_POLY = 16; - dtPolyRef visited[MAX_VISIT_POLY]; - - uint32 nvisited = 0; - _navMeshQuery->moveAlongSurface(polys[0], iterPos, moveTgt, &_filter, result, visited, (int*)&nvisited, MAX_VISIT_POLY); - npolys = FixupCorridor(polys, npolys, MAX_PATH_LENGTH, visited, nvisited); - - _navMeshQuery->getPolyHeight(polys[0], result, &result[1]); - result[1] += 0.5f; - dtVcopy(iterPos, result); - - // Handle end of path and off-mesh links when close enough. - if (endOfPath && InRangeYZX(iterPos, steerPos, SMOOTH_PATH_SLOP, 1.0f)) - { - // Reached end of path. - dtVcopy(iterPos, targetPos); - if (nsmoothPath < maxSmoothPathSize) - { - dtVcopy(&smoothPath[nsmoothPath*VERTEX_SIZE], iterPos); - nsmoothPath++; - } - break; - } - else if (offMeshConnection && InRangeYZX(iterPos, steerPos, SMOOTH_PATH_SLOP, 1.0f)) - { - // Advance the path up to and over the off-mesh connection. - dtPolyRef prevRef = INVALID_POLYREF; - dtPolyRef polyRef = polys[0]; - uint32 npos = 0; - while (npos < npolys && polyRef != steerPosRef) - { - prevRef = polyRef; - polyRef = polys[npos]; - npos++; - } - - for (uint32 i = npos; i < npolys; ++i) - polys[i-npos] = polys[i]; - - npolys -= npos; - - // Handle the connection. - float startPos[VERTEX_SIZE], endPos[VERTEX_SIZE]; - if (dtStatusSucceed(_navMesh->getOffMeshConnectionPolyEndPoints(prevRef, polyRef, startPos, endPos))) - { - if (nsmoothPath < maxSmoothPathSize) + // Test the left side + dtVcross(testPos, vec, up); + dtVadd(testPos, testPos, curPoi); + float ft = PathGenerator::MinWallDistance / dtVdist(testPos, curPoi); + dtVlerp(testPos, curPoi, testPos, ft); + distanceToWall = DistanceToWall(polyPickExt, testPos, hitPos, hitNormal); + if (abs(PathGenerator::MinWallDistance - distanceToWall) > 0.1f) { - dtVcopy(&smoothPath[nsmoothPath*VERTEX_SIZE], startPos); - nsmoothPath++; + // Test the right side + dtVcross(testPos, up, vec); + dtVadd(testPos, testPos, curPoi); + ft = PathGenerator::MinWallDistance / dtVdist(testPos, curPoi); + dtVlerp(testPos, curPoi, testPos, ft); + distanceToWall = DistanceToWall(polyPickExt, testPos, hitPos, hitNormal); } - // Move position at the other side of the off-mesh link. - dtVcopy(iterPos, endPos); - _navMeshQuery->getPolyHeight(polys[0], iterPos, &iterPos[1]); - iterPos[1] += 0.5f; + + // If the test point is better than the orig point, replace it. + if (abs(distanceToWall - PathGenerator::MinWallDistance) < 0.1f) + dtVcopy(curPoi, testPos); + } + else + { + // We get the hitpos with a ray + float ft = PathGenerator::MinWallDistance / distanceToWall; + dtVlerp(testPos, hitPos, curPoi, ft); + distanceToWall = DistanceToWall(polyPickExt, testPos, hitPos, hitNormal); + + if (abs(distanceToWall - PathGenerator::MinWallDistance) < 0.1f) + dtVcopy(curPoi, testPos); } } - - // Store results. - if (nsmoothPath < maxSmoothPathSize) - { - dtVcopy(&smoothPath[nsmoothPath*VERTEX_SIZE], iterPos); - nsmoothPath++; - } } - - *smoothPathSize = nsmoothPath; - - // this is most likely a loop - return nsmoothPath < MAX_POINT_PATH_LENGTH ? DT_SUCCESS : DT_FAILURE; -} - -bool PathGenerator::InRangeYZX(const float* v1, const float* v2, float r, float h) const -{ - const float dx = v2[0] - v1[0]; - const float dy = v2[1] - v1[1]; // elevation - const float dz = v2[2] - v1[2]; - return (dx * dx + dz * dz) < r * r && fabsf(dy) < h; -} - -bool PathGenerator::InRange(G3D::Vector3 const& p1, G3D::Vector3 const& p2, float r, float h) const -{ - G3D::Vector3 d = p1 - p2; - return (d.x * d.x + d.y * d.y) < r * r && fabsf(d.z) < h; -} - -float PathGenerator::Dist3DSqr(G3D::Vector3 const& p1, G3D::Vector3 const& p2) const -{ - return (p1 - p2).squaredLength(); } diff --git a/src/server/game/Movement/PathGenerator.h b/src/server/game/Movement/PathGenerator.h index ac66b7cec5..075d6dabc9 100644 --- a/src/server/game/Movement/PathGenerator.h +++ b/src/server/game/Movement/PathGenerator.h @@ -26,18 +26,6 @@ class Unit; -// 74*4.0f=296y number_of_points*interval = max_path_len -// this is way more than actual evade range -// I think we can safely cut those down even more -#define MAX_PATH_LENGTH 74 -#define MAX_POINT_PATH_LENGTH 74 - -#define SMOOTH_PATH_STEP_SIZE 4.0f -#define SMOOTH_PATH_SLOP 0.3f - -#define VERTEX_SIZE 3 -#define INVALID_POLYREF 0 - enum PathType { PATHFIND_BLANK = 0x00, // path not built yet @@ -49,6 +37,12 @@ enum PathType PATHFIND_SHORT = 0x20, // path is longer or equal to its limited path length }; +enum PolyFlag +{ + POLY_FLAG_WALK = 1, + POLY_FLAG_SWIM = 2 +}; + class PathGenerator { public: @@ -59,10 +53,6 @@ class PathGenerator // return: true if new path was calculated, false otherwise (no change needed) bool CalculatePath(float destX, float destY, float destZ, bool forceDest = false); - // option setters - use optional - void SetUseStraightPath(bool useStraightPath) { _useStraightPath = useStraightPath; } - void SetPathLengthLimit(float distance) { _pointPathLimit = std::min(uint32(distance/SMOOTH_PATH_STEP_SIZE), MAX_POINT_PATH_LENGTH); } - // result getters G3D::Vector3 const& GetStartPosition() const { return _startPosition; } G3D::Vector3 const& GetEndPosition() const { return _endPosition; } @@ -71,19 +61,13 @@ class PathGenerator Movement::PointsArray const& GetPath() const { return _pathPoints; } PathType GetPathType() const { return _type; } + + static float MinWallDistance; private: - - dtPolyRef _pathPolyRefs[MAX_PATH_LENGTH]; // array of detour polygon references - uint32 _polyLength; // number of polygons in the path - Movement::PointsArray _pathPoints; // our actual (x,y,z) path to the target PathType _type; // tells what kind of path this is - bool _useStraightPath; // type of path will be generated - bool _forceDestination; // when set, we will always arrive at given point - uint32 _pointPathLimit; // limit point path size; min(this, MAX_POINT_PATH_LENGTH) - G3D::Vector3 _startPosition; // {x, y, z} of current location G3D::Vector3 _endPosition; // {x, y, z} of the destination G3D::Vector3 _actualEndPosition; // {x, y, z} of the closest possible point to given destination @@ -97,37 +81,16 @@ class PathGenerator void SetStartPosition(G3D::Vector3 const& point) { _startPosition = point; } void SetEndPosition(G3D::Vector3 const& point) { _actualEndPosition = point; _endPosition = point; } void SetActualEndPosition(G3D::Vector3 const& point) { _actualEndPosition = point; } - void NormalizePath(); - void Clear() - { - _polyLength = 0; - _pathPoints.clear(); - } + // Path smoothing + void SmoothPath(float* polyPickExt, int pathLength, float*& straightPath); + float DistanceToWall(float* polyPickExt, float* pos, float* hitPos, float* hitNormal); + // dtPointInPolygon will return false when the point is too close to the edge, so we rewrite the test function. + static bool PointInPoly(float* pos, float* verts, int nv, float err); + static float GetTriangleArea(float* verts, int nv); - bool InRange(G3D::Vector3 const& p1, G3D::Vector3 const& p2, float r, float h) const; - float Dist3DSqr(G3D::Vector3 const& p1, G3D::Vector3 const& p2) const; - bool InRangeYZX(float const* v1, float const* v2, float r, float h) const; - - dtPolyRef GetPathPolyByPosition(dtPolyRef const* polyPath, uint32 polyPathSize, float const* Point, float* Distance = NULL) const; - dtPolyRef GetPolyByLocation(float const* Point, float* Distance) const; - bool HaveTile(G3D::Vector3 const& p) const; - - void BuildPolyPath(G3D::Vector3 const& startPos, G3D::Vector3 const& endPos); - void BuildPointPath(float const* startPoint, float const* endPoint); - void BuildShortcut(); - - NavTerrain GetNavTerrain(float x, float y, float z); void CreateFilter(); void UpdateFilter(); - - // smooth path aux functions - uint32 FixupCorridor(dtPolyRef* path, uint32 npath, uint32 maxPath, dtPolyRef const* visited, uint32 nvisited); - bool GetSteerTarget(float const* startPos, float const* endPos, float minTargetDist, dtPolyRef const* path, uint32 pathSize, float* steerPos, - unsigned char& steerPosFlag, dtPolyRef& steerPosRef); - dtStatus FindSmoothPath(float const* startPos, float const* endPos, - dtPolyRef const* polyPath, uint32 polyPathSize, - float* smoothPath, int* smoothPathSize, uint32 smoothPathMaxSize); }; #endif diff --git a/src/server/game/Movement/Spline/Spline.cpp b/src/server/game/Movement/Spline/Spline.cpp index 887541e228..6424afc5d6 100644 --- a/src/server/game/Movement/Spline/Spline.cpp +++ b/src/server/game/Movement/Spline/Spline.cpp @@ -156,7 +156,7 @@ float SplineBase::SegLengthLinear(index_type index) const return (points[index] - points[index+1]).length(); } -float SplineBase::SegLengthCatmullRom( index_type index ) const +float SplineBase::SegLengthCatmullRom(index_type index) const { ASSERT(index >= index_lo && index < index_hi); diff --git a/src/server/game/Movement/Spline/Spline.h b/src/server/game/Movement/Spline/Spline.h index dab31e957f..1444b2872d 100644 --- a/src/server/game/Movement/Spline/Spline.h +++ b/src/server/game/Movement/Spline/Spline.h @@ -118,7 +118,7 @@ public: /** As i can see there are a lot of ways how spline can be initialized would be no harm to have some custom initializers. */ - template inline void init_spline(Init& initializer) + template inline void init_spline_custom(Init& initializer) { initializer(m_mode, cyclic, points, index_lo, index_hi); } diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 599780d5cb..2464b99c0a 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -123,6 +123,9 @@ enum QuestGiverStatus DIALOG_STATUS_AVAILABLE = 0x100, DIALOG_STATUS_REWARD2 = 0x200, // no yellow dot on minimap DIALOG_STATUS_REWARD = 0x400 // yellow dot on minimap + + // Custom value meaning that script call did not return any valid quest status + DIALOG_STATUS_SCRIPTED_NO_STATUS = 0x1000, }; enum QuestFlags diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index 7f2e1f095e..b9765bbbdc 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -166,7 +166,7 @@ inline Unit* Map::_GetScriptUnit(Object* obj, bool isSource, const ScriptInfo* s { unit = obj->ToUnit(); if (!unit) - TC_LOG_ERROR("scripts", "%s %s object could not be casted to unit.", + TC_LOG_ERROR("scripts", "%s %s object could not be cast to unit.", scriptInfo->GetDebugInfo().c_str(), isSource ? "source" : "target"); } return unit; @@ -242,7 +242,7 @@ inline void Map::_ScriptProcessDoor(Object* source, Object* target, const Script { WorldObject* wSource = dynamic_cast (source); if (!wSource) - TC_LOG_ERROR("scripts", "%s source object could not be casted to world object (TypeId: %u, Entry: %u, GUID: %u), skipping.", + TC_LOG_ERROR("scripts", "%s source object could not be cast to world object (TypeId: %u, Entry: %u, GUID: %u), skipping.", scriptInfo->GetDebugInfo().c_str(), source->GetTypeId(), source->GetEntry(), source->GetGUIDLow()); else { diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index ddf6fe3a09..20b40051c1 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -778,8 +778,7 @@ uint32 ScriptMgr::GetDialogStatus(Player* player, Creature* creature) ASSERT(player); ASSERT(creature); - /// @todo 100 is a funny magic number to have hanging around here... - GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, 100); + GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS); player->PlayerTalkClass->ClearMenus(); return tmpscript->GetDialogStatus(player, creature); } @@ -864,8 +863,7 @@ uint32 ScriptMgr::GetDialogStatus(Player* player, GameObject* go) ASSERT(player); ASSERT(go); - /// @todo 100 is a funny magic number to have hanging around here... - GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, 100); + GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS); player->PlayerTalkClass->ClearMenus(); return tmpscript->GetDialogStatus(player, go); } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 86ddc377bc..a10707924e 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -24,6 +24,7 @@ #include #include "DBCStores.h" +#include "QuestDef.h" #include "SharedDefines.h" #include "World.h" #include "Weather.h" @@ -446,7 +447,7 @@ class CreatureScript : public UnitScript, public UpdatableScript virtual bool OnQuestReward(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } // Called when the dialog status between a player and the creature is requested. - virtual uint32 GetDialogStatus(Player* /*player*/, Creature* /*creature*/) { return 100; } + virtual uint32 GetDialogStatus(Player* /*player*/, Creature* /*creature*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } // Called when a CreatureAI object is needed for the creature. virtual CreatureAI* GetAI(Creature* /*creature*/) const { return NULL; } @@ -481,7 +482,7 @@ class GameObjectScript : public ScriptObject, public UpdatableScript virtual bool OnQuestReward(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; } // Called when the dialog status between a player and the gameobject is requested. - virtual uint32 GetDialogStatus(Player* /*player*/, GameObject* /*go*/) { return 100; } + virtual uint32 GetDialogStatus(Player* /*player*/, GameObject* /*go*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; } // Called when the game object is destroyed (destructible buildings only). virtual void OnDestroyed(GameObject* /*go*/, Player* /*player*/) { } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 4954d099da..7227254b9f 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -363,7 +363,7 @@ class WorldSession uint32 GetLatency() const { return m_latency; } void SetLatency(uint32 latency) { m_latency = latency; } void ResetClientTimeDelay() { m_clientTimeDelay = 0; } - uint32 getDialogStatus(Player* player, Object* questgiver, uint32 defstatus); + uint32 getDialogStatus(Player* player, Object* questgiver); ACE_Atomic_Op m_timeOutTime; void UpdateTimeOutTime(uint32 diff) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 4a9854333a..53350f8328 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -804,7 +804,7 @@ void AuraEffect::ApplySpellMod(Unit* target, bool apply) { Aura* aura = iter->second->GetBase(); // only passive and permament auras-active auras should have amount set on spellcast and not be affected - // if aura is casted by others, it will not be affected + // if aura is cast by others, it will not be affected if ((aura->IsPassive() || aura->IsPermanent()) && aura->GetCasterGUID() == guid && aura->GetSpellInfo()->IsAffectedBySpellMod(m_spellmod)) { if (GetMiscValue() == SPELLMOD_ALL_EFFECTS) @@ -4704,7 +4704,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool case 42783: // Wrath of the Astromancer target->CastSpell(target, GetAmount(), true, NULL, this); break; - case 46308: // Burning Winds casted only at creatures at spawn + case 46308: // Burning Winds cast only at creatures at spawn target->CastSpell(target, 47287, true, NULL, this); break; case 52172: // Coyote Spirit Despawn Aura diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index a984ee7b03..4a1eeed46b 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -114,12 +114,12 @@ void AuraApplication::_Remove() void AuraApplication::_InitFlags(Unit* caster, uint8 effMask) { - // mark as selfcasted if needed + // mark as selfcast if needed _flags |= (GetBase()->GetCasterGUID() == GetTarget()->GetGUID()) ? AFLAG_CASTER : AFLAG_NONE; - // aura is casted by self or an enemy + // aura is cast by self or an enemy // one negative effect and we know aura is negative - if (IsSelfcasted() || !caster || !caster->IsFriendlyTo(GetTarget())) + if (IsSelfcast() || !caster || !caster->IsFriendlyTo(GetTarget())) { bool negativeFound = false; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) @@ -132,7 +132,7 @@ void AuraApplication::_InitFlags(Unit* caster, uint8 effMask) } _flags |= negativeFound ? AFLAG_NEGATIVE : AFLAG_POSITIVE; } - // aura is casted by friend + // aura is cast by friend // one positive effect and we know aura is positive else { @@ -315,7 +315,7 @@ Aura* Aura::Create(SpellInfo const* spellproto, uint8 effMask, WorldObject* owne // check if aura can be owned by owner if (owner->isType(TYPEMASK_UNIT)) if (!owner->IsInWorld() || ((Unit*)owner)->IsDuringRemoveFromWorld()) - // owner not in world so don't allow to own not self casted single target auras + // owner not in world so don't allow to own not self cast single target auras if (casterGUID != owner->GetGUID() && spellproto->IsSingleTarget()) return NULL; @@ -1284,7 +1284,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b } break; case SPELLFAMILY_ROGUE: - // Sprint (skip non player casted spells by category) + // Sprint (skip non player cast spells by category) if (GetSpellInfo()->SpellFamilyFlags[0] & 0x40 && GetSpellInfo()->GetCategory() == 44) // in official maybe there is only one icon? if (target->HasAura(58039)) // Glyph of Blurred Speed @@ -1500,7 +1500,7 @@ bool Aura::CanBeAppliedOn(Unit* target) // area auras mustn't be applied if (GetOwner() != target) return false; - // not selfcasted single target auras mustn't be applied + // do not apply non-selfcast single target auras if (GetCasterGUID() != GetOwner()->GetGUID() && GetSpellInfo()->IsSingleTarget()) return false; return true; diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 9e7d0cce82..123ad9d5a8 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -69,7 +69,7 @@ class AuraApplication uint8 GetEffectMask() const { return _flags & (AFLAG_EFF_INDEX_0 | AFLAG_EFF_INDEX_1 | AFLAG_EFF_INDEX_2); } bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return _flags & (1<AttributesEx3 & SPELL_ATTR3_CANT_TRIGGER_PROC) && unitTarget->CanProc() && CanExecuteTriggersOnHit(mask); Unit* spellHitTarget = NULL; @@ -3000,7 +3000,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered m_caster->m_Events.AddEvent(Event, m_caster->m_Events.CalculateTime(1)); //Prevent casting at cast another spell (ServerSide check) - if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS) && m_caster->IsNonMeleeSpellCasted(false, true, true) && m_cast_count) + if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS) && m_caster->IsNonMeleeSpellCast(false, true, true) && m_cast_count) { SendCastResult(SPELL_FAILED_SPELL_IN_PROGRESS); finish(false); @@ -3067,7 +3067,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered else m_casttime = m_spellInfo->CalcCastTime(m_caster->getLevel(), this); - // don't allow channeled spells / spells with cast time to be casted while moving + // don't allow channeled spells / spells with cast time to be cast while moving // (even if they are interrupted on moving, spells with almost immediate effect get to have their effect processed before movement interrupter kicks in) // don't cancel spells which are affected by a SPELL_AURA_CAST_WHILE_WALKING effect if (((m_spellInfo->IsChanneled() || m_casttime) && m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->isMoving() && @@ -3084,7 +3084,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered TC_LOG_DEBUG("spells", "Spell::prepare: spell id %u source %u caster %d customCastFlags %u mask %u", m_spellInfo->Id, m_caster->GetEntry(), m_originalCaster ? m_originalCaster->GetEntry() : -1, _triggeredCastFlags, m_targets.GetTargetMask()); //Containers for channeled spells have to be set - /// @todoApply this to all casted spells if needed + /// @todoApply this to all cast spells if needed // Why check duration? 29350: channelled triggers channelled if ((_triggeredCastFlags & TRIGGERED_CAST_DIRECTLY) && (!m_spellInfo->IsChanneled() || !m_spellInfo->GetMaxDuration())) cast(true); @@ -3103,7 +3103,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered } } - m_caster->SetCurrentCastedSpell(this); + m_caster->SetCurrentCastSpell(this); SendSpellStart(); // set target for proper facing @@ -3213,7 +3213,7 @@ void Spell::cast(bool skipCheck) if (m_caster->GetTypeId() == TYPEID_PLAYER) { // Set spell which will drop charges for triggered cast spells - // if not successfully casted, will be remove in finish(false) + // if not successfully cast, will be remove in finish(false) m_caster->ToPlayer()->SetSpellModTakingSpell(this, true); } @@ -3250,7 +3250,7 @@ void Spell::cast(bool skipCheck) { if (!my_trade->IsInAcceptProcess()) { - // Spell will be casted at completing the trade. Silently ignore at this place + // Spell will be cast after completing the trade. Silently ignore at this place my_trade->SetSpell(m_spellInfo->Id, m_CastItem); SendCastResult(SPELL_FAILED_DONT_REPORT); SendInterrupted(0); @@ -3340,7 +3340,7 @@ void Spell::cast(bool skipCheck) m_spellState = SPELL_STATE_DELAYED; SetDelayStart(0); - if (m_caster->HasUnitState(UNIT_STATE_CASTING) && !m_caster->IsNonMeleeSpellCasted(false, false, true)) + if (m_caster->HasUnitState(UNIT_STATE_CASTING) && !m_caster->IsNonMeleeSpellCast(false, false, true)) m_caster->ClearUnitState(UNIT_STATE_CASTING); } else @@ -3667,7 +3667,7 @@ void Spell::finish(bool ok) if (m_spellInfo->IsChanneled()) m_caster->UpdateInterruptMask(); - if (m_caster->HasUnitState(UNIT_STATE_CASTING) && !m_caster->IsNonMeleeSpellCasted(false, false, true)) + if (m_caster->HasUnitState(UNIT_STATE_CASTING) && !m_caster->IsNonMeleeSpellCast(false, false, true)) m_caster->ClearUnitState(UNIT_STATE_CASTING); // Unsummon summon as possessed creatures on spell cancel @@ -4029,7 +4029,7 @@ void Spell::SendSpellGo() if (castFlags & CAST_FLAG_RUNE_LIST) // rune cooldowns list { - /// @todo There is a crash caused by a spell with CAST_FLAG_RUNE_LIST casted by a creature + /// @todo There is a crash caused by a spell with CAST_FLAG_RUNE_LIST cast by a creature //The creature is the mover of a player, so HandleCastSpellOpcode uses it as the caster if (Player* player = m_caster->ToPlayer()) { @@ -4975,7 +4975,7 @@ SpellCastResult Spell::CheckCast(bool strict) if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER) && !target->HasInArc(static_cast(M_PI), m_caster)) return SPELL_FAILED_NOT_INFRONT; - if (m_caster->GetEntry() != WORLD_TRIGGER) // Ignore LOS for gameobjects casts (wrongly casted by a trigger) + if (m_caster->GetEntry() != WORLD_TRIGGER) // Ignore LOS for gameobjects casts (wrongly cast by a trigger) if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS) && !m_caster->IsWithinLOSInMap(target)) return SPELL_FAILED_LINE_OF_SIGHT; } @@ -5007,7 +5007,7 @@ SpellCastResult Spell::CheckCast(bool strict) } } - // Spell casted only on battleground + // Spell cast only in battleground if ((m_spellInfo->AttributesEx3 & SPELL_ATTR3_BATTLEGROUND) && m_caster->GetTypeId() == TYPEID_PLAYER) if (!m_caster->ToPlayer()->InBattleground()) return SPELL_FAILED_ONLY_BATTLEGROUNDS; @@ -5230,7 +5230,6 @@ SpellCastResult Spell::CheckCast(bool strict) target->GetContactPoint(m_caster, pos.m_positionX, pos.m_positionY, pos.m_positionZ); target->GetFirstCollisionPosition(pos, CONTACT_DISTANCE, target->GetRelativeAngle(m_caster)); - m_preGeneratedPath.SetPathLengthLimit(m_spellInfo->GetMaxRange(true) * 1.5f); bool result = m_preGeneratedPath.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ + target->GetObjectSize()); if (m_preGeneratedPath.GetPathType() & PATHFIND_SHORT) return SPELL_FAILED_OUT_OF_RANGE; @@ -5554,7 +5553,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (!m_targets.GetUnitTarget()) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; - // can be casted at non-friendly unit or own pet/charm + // can be cast at non-friendly unit or own pet/charm if (m_caster->IsFriendlyTo(m_targets.GetUnitTarget())) return SPELL_FAILED_TARGET_FRIENDLY; @@ -5783,7 +5782,7 @@ SpellCastResult Spell::CheckCasterAuras() const } } } - // You are prevented from casting and the spell casted does not grant immunity. Return a failed error. + // You are prevented from casting and the spell cast does not grant immunity. Return a failed error. else return prevented_reason; } @@ -6190,19 +6189,39 @@ SpellCastResult Spell::CheckItems() } } - SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(m_spellInfo->Effects[i].MiscValue); + SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(m_spellInfo->Effects[i].MiscValue); // do not allow adding usable enchantments to items that have use effect already - if (pEnchant && isItemUsable) + if (enchantEntry) + { for (uint8 s = 0; s < MAX_ITEM_ENCHANTMENT_EFFECTS; ++s) - if (pEnchant->type[s] == ITEM_ENCHANTMENT_TYPE_USE_SPELL) - return SPELL_FAILED_ON_USE_ENCHANT; + { + switch (enchantEntry->type[s]) + { + case ITEM_ENCHANTMENT_TYPE_USE_SPELL: + if (isItemUsable) + return SPELL_FAILED_ON_USE_ENCHANT; + break; + case ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET: + { + uint32 numSockets = 0; + for (uint32 socket = 0; socket < MAX_ITEM_PROTO_SOCKETS; ++socket) + if (targetItem->GetTemplate()->Socket[socket].Color) + ++numSockets; + + if (numSockets == MAX_ITEM_PROTO_SOCKETS || targetItem->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT)) + return SPELL_FAILED_MAX_SOCKETS; + break; + } + } + } + } // Not allow enchant in trade slot for some enchant type if (targetItem->GetOwner() != m_caster) { - if (!pEnchant) + if (!enchantEntry) return SPELL_FAILED_ERROR; - if (pEnchant->slot & ENCHANTMENT_CAN_SOULBOUND) + if (enchantEntry->slot & ENCHANTMENT_CAN_SOULBOUND) return SPELL_FAILED_NOT_TRADEABLE; } break; @@ -6671,11 +6690,11 @@ bool SpellEvent::Execute(uint64 e_time, uint32 p_time) /* if (m_Spell->m_spellInfo->IsChanneled()) { - // evented channeled spell is processed separately, casted once after delay, and not destroyed till finish + // evented channeled spell is processed separately, cast once after delay, and not destroyed till finish // check, if we have casting anything else except this channeled spell and autorepeat - if (m_Spell->GetCaster()->IsNonMeleeSpellCasted(false, true, true)) + if (m_Spell->GetCaster()->IsNonMeleeSpellCast(false, true, true)) { - // another non-melee non-delayed spell is casted now, abort + // another non-melee non-delayed spell is cast now, abort m_Spell->cancel(); } else @@ -6898,7 +6917,7 @@ SpellCastResult Spell::CanOpenLock(uint32 effIndex, uint32 lockId, SkillType& sk 0 : m_caster->ToPlayer()->GetSkillValue(skillId); // skill bonus provided by casting spell (mostly item spells) - // add the effect base points modifier from the spell casted (cheat lock / skeleton key etc.) + // add the effect base points modifier from the spell cast (cheat lock / skeleton key etc.) if (m_spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET || m_spellInfo->Effects[effIndex].TargetB.GetTarget() == TARGET_GAMEOBJECT_ITEM_TARGET) skillValue += m_spellInfo->Effects[effIndex].CalcValue(); @@ -7199,7 +7218,7 @@ bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToC bool Spell::CanExecuteTriggersOnHit(uint8 effMask, SpellInfo const* triggeredByAura) const { bool only_on_caster = (triggeredByAura && (triggeredByAura->AttributesEx4 & SPELL_ATTR4_PROC_ONLY_ON_CASTER)); - // If triggeredByAura has SPELL_ATTR4_PROC_ONLY_ON_CASTER then it can only proc on a casted spell with TARGET_UNIT_CASTER + // If triggeredByAura has SPELL_ATTR4_PROC_ONLY_ON_CASTER then it can only proc on a cast spell with TARGET_UNIT_CASTER for (uint8 i = 0;i < MAX_SPELL_EFFECTS; ++i) { if ((effMask & (1 << i)) && (!only_on_caster || (m_spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_CASTER))) @@ -7289,7 +7308,7 @@ void Spell::TriggerGlobalCooldown() return; // Global cooldown can't leave range 1..1.5 secs - // There are some spells (mostly not casted directly by player) that have < 1 sec and > 1.5 sec global cooldowns + // There are some spells (mostly not cast directly by player) that have < 1 sec and > 1.5 sec global cooldowns // but as tests show are not affected by any spell mods. if (m_spellInfo->StartRecoveryTime >= MIN_GCD && m_spellInfo->StartRecoveryTime <= MAX_GCD) { diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 37316e1d6b..b6cf0a1f9b 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -209,7 +209,7 @@ enum SpellEffectHandleMode class Spell { - friend void Unit::SetCurrentCastedSpell(Spell* pSpell); + friend void Unit::SetCurrentCastSpell(Spell* pSpell); friend class SpellScript; public: diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index a22e32abf8..922074970b 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4614,8 +4614,8 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex) if (unitTarget->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) return; - // Instantly interrupt non melee spells being casted - if (unitTarget->IsNonMeleeSpellCasted(true)) + // Instantly interrupt non melee spells being cast + if (unitTarget->IsNonMeleeSpellCast(true)) unitTarget->InterruptNonMeleeSpells(true); float ratio = 0.1f; @@ -4716,8 +4716,6 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex) if (!unitTarget) return; - float speedZ = (float)(m_spellInfo->Effects[effIndex].CalcValue() / 10); - float speedXY = (float)(m_spellInfo->Effects[effIndex].MiscValue/10); Position pos; if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_PULL_TOWARDS_DEST) { @@ -4731,6 +4729,9 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex) pos.Relocate(m_caster); } + float speedXY = float(m_spellInfo->Effects[effIndex].MiscValue) * 0.1f; + float speedZ = unitTarget->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; + unitTarget->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 79a8c54cdb..9bf2059b61 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1478,10 +1478,10 @@ SpellCastResult SpellInfo::CheckShapeshift(uint32 form) const uint32 stanceMask = (form ? 1 << (form - 1) : 0); - if (stanceMask & StancesNot) // can explicitly not be casted in this stance + if (stanceMask & StancesNot) // can explicitly not be cast in this stance return SPELL_FAILED_NOT_SHAPESHIFT; - if (stanceMask & Stances) // can explicitly be casted in this stance + if (stanceMask & Stances) // can explicitly be cast in this stance return SPELL_CAST_OK; bool actAsShifted = false; @@ -2711,12 +2711,12 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const case SPELL_AURA_PREVENT_RESURRECTION: return false; case SPELL_AURA_PERIODIC_DAMAGE: // used in positive spells also. - // part of negative spell if casted at self (prevent cancel) + // part of negative spell if cast at self (prevent cancel) if (Effects[effIndex].TargetA.GetTarget() == TARGET_UNIT_CASTER) return false; break; case SPELL_AURA_MOD_DECREASE_SPEED: // used in positive spells also - // part of positive spell if casted at self + // part of positive spell if cast at self if (Effects[effIndex].TargetA.GetTarget() != TARGET_UNIT_CASTER) return false; // but not this if this first effect (didn't find better check) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 6d58da9095..945f907f54 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1528,8 +1528,8 @@ void SpellMgr::LoadSpellLearnSpells() if (!GetSpellInfo(dbc_node.spell)) continue; - // talent or passive spells or skill-step spells auto-casted and not need dependent learning, - // pet teaching spells must not be dependent learning (casted) + // talent or passive spells or skill-step spells auto-cast and not need dependent learning, + // pet teaching spells must not be dependent learning (cast) // other required explicit dependent learning dbc_node.autoLearned = entry->Effects[i].TargetA.GetTarget() == TARGET_UNIT_PET || GetTalentSpellCost(spell) > 0 || entry->IsPassive() || entry->HasEffect(SPELL_EFFECT_SKILL_STEP); @@ -3725,7 +3725,7 @@ void SpellMgr::LoadSpellInfoCorrections() break; // This would never crit on retail and it has attribute for SPELL_ATTR3_NO_DONE_BONUS because is handled from player, // until someone figures how to make scions not critting without hack and without making them main casters this should stay here. - case 63934: // Arcane Barrage (casted by players and NONMELEEDAMAGELOG with caster Scion of Eternity (original caster)). + case 63934: // Arcane Barrage (cast by players and NONMELEEDAMAGELOG with caster Scion of Eternity (original caster)). spellInfo->AttributesEx2 |= SPELL_ATTR2_CANT_CRIT; break; // ENDOF EYE OF ETERNITY SPELLS diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 0d5643bc50..4c25adb047 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -775,11 +775,11 @@ class AuraScript : public _SpellScript // returns spellid of the spell uint32 GetId() const; - // returns guid of object which casted the aura (m_originalCaster of the Spell class) + // returns guid of object which cast the aura (m_originalCaster of the Spell class) uint64 GetCasterGUID() const; - // returns unit which casted the aura or NULL if not avalible (caster logged out for example) + // returns unit which cast the aura or NULL if not avalible (caster logged out for example) Unit* GetCaster() const; - // returns object on which aura was casted, target for non-area auras, area aura source for area auras + // returns object on which aura was cast, target for non-area auras, area aura source for area auras WorldObject* GetOwner() const; // returns owner if it's unit or unit derived object, NULL otherwise (only for persistent area auras NULL is returned) Unit* GetUnitOwner() const; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 8c3d92dcbf..91606b7214 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -152,7 +152,7 @@ World::~World() delete command; VMAP::VMapFactory::clear(); - MMAP::MMapFactory::clear(); + MMAP::MMapFactory::Clear(); /// @todo free addSessQueue } diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index b3f2cadf3a..31c3c5a905 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1376,7 +1376,10 @@ public: } else { + Position pos; + transport->GetPosition(&pos); handler->PSendSysMessage("Transport %s is %s", transport->GetName().c_str(), transport->GetGoState() == GO_STATE_READY ? "stopped" : "moving"); + handler->PSendSysMessage("Transport position: %s", pos.ToString().c_str()); return true; } diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index 54ea09c399..af2b6cd89b 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -112,7 +112,7 @@ public: { std::string name = param1; WorldDatabase.EscapeString(name); - whereClause << ", creature_template WHERE creature.id = creature_template.entry AND creature_template.name "_LIKE_" '" << name << '\''; + whereClause << ", creature_template WHERE creature.id = creature_template.entry AND creature_template.name " _LIKE_" '" << name << '\''; } else whereClause << "WHERE guid = '" << guid << '\''; diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index a49926678b..14e072b9de 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -238,7 +238,7 @@ public: WorldDatabase.EscapeString(name); result = WorldDatabase.PQuery( "SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ " - "FROM gameobject, gameobject_template WHERE gameobject_template.entry = gameobject.id AND map = %i AND name "_LIKE_" "_CONCAT3_("'%%'", "'%s'", "'%%'")" ORDER BY order_ ASC LIMIT 1", + "FROM gameobject, gameobject_template WHERE gameobject_template.entry = gameobject.id AND map = %i AND name " _LIKE_" " _CONCAT3_("'%%'", "'%s'", "'%%'")" ORDER BY order_ ASC LIMIT 1", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), name.c_str()); } } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 406fac9cd6..0ebc90c53f 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -186,7 +186,7 @@ public: uint32 haveMap = Map::ExistMap(mapId, gridX, gridY) ? 1 : 0; uint32 haveVMap = Map::ExistVMap(mapId, gridX, gridY) ? 1 : 0; - uint32 haveMMap = (MMAP::MMapFactory::IsPathfindingEnabled(mapId) && MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId())) ? 1 : 0; + uint32 haveMMap = (MMAP::MMapFactory::IsPathfindingEnabled(mapId) && MMAP::MMapFactory::CreateOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId())) ? 1 : 0; if (haveVMap) { @@ -2273,7 +2273,7 @@ public: // stop combat + make player unattackable + duel stop + stop some spells player->setFaction(35); player->CombatStop(); - if (player->IsNonMeleeSpellCasted(true)) + if (player->IsNonMeleeSpellCast(true)) player->InterruptNonMeleeSpells(true); player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp index 690988ebac..88e364878c 100644 --- a/src/server/scripts/Commands/cs_mmaps.cpp +++ b/src/server/scripts/Commands/cs_mmaps.cpp @@ -30,11 +30,13 @@ #include "PointMovementGenerator.h" #include "PathGenerator.h" #include "MMapFactory.h" +#include "DetourCommon.h" #include "Map.h" #include "TargetedMovementGenerator.h" #include "GridNotifiers.h" #include "GridNotifiersImpl.h" #include "CellImpl.h" +#include "MMapManager.h" class mmaps_commandscript : public CommandScript { @@ -61,9 +63,137 @@ public: return commandTable; } + static float Fix_GetXZArea(float* verts, int nv) + { + float area = 0; + for(int i=0; iarea) + return false; + } + + //last one + memcpy(&TestTri[3],verts,sizeof(float)*3); + memcpy(&TestTri[6],&verts[nv*3-3],sizeof(float)*3); + area1+= abs(Fix_GetXZArea(TestTri,3)); + + return abs(area1-area)findNearestPoly(pos, polyPickExt, &filter, &ref, 0))==false || ref ==0) + return -1; + + const dtMeshTile* tile = 0; + const dtPoly* poly = 0; + if (dtStatusFailed(navMesh->getTileAndPolyByRef(ref, &tile, &poly))) + return -1; + + // Collect vertices. + float verts[DT_VERTS_PER_POLYGON*3]; + int nv = 0; + for (int i = 0; i < (int)poly->vertCount; ++i) + { + dtVcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]); + nv++; + } + + bool inside = Fix_PointIsInPoly(pos, verts, nv,0.05f); + if(inside == false) + return -1; + + if(dtStatusSucceed(navQuery->findDistanceToWall(ref, pos, 100.0f, &filter, &distanceToWall, hitPos, hitNormal))==false) + return -1; + + return distanceToWall; + } + + #define MIN_WALL_DISTANCE 1.5f //set this value bigger to make the path point far way from wall + + //Try to fix the path, + static void FixPath(dtNavMesh* navMesh, dtNavMeshQuery* navQuery, float* polyPickExt, dtQueryFilter& filter, int pathLength, float*& straightPath) + { + float hitPos[3]; + float hitNormal[3]; + float TestPos[3]; + float distanceToWall=0; + float up[3]={0,1,0}; + float origDis = 0; + + for(int i=1;i=0) + { + float vec[3]; + dtVsub(vec,&straightPath[i*3-3],&straightPath[i*3]); + //distanceToWall is 0 means the point is in the edge.so we can't get the hitpos. + if(distanceToWall == 0) + { + //test left side + dtVcross(TestPos,vec,up); + dtVadd(TestPos,TestPos,pCurPoi); + float ft = MIN_WALL_DISTANCE/dtVdist(TestPos,pCurPoi); + dtVlerp(TestPos,pCurPoi,TestPos,ft); + distanceToWall = DistanceToWall(navQuery, navMesh, polyPickExt, filter,TestPos,hitPos,hitNormal); + if(abs(MIN_WALL_DISTANCE - distanceToWall)>0.1f) + { + //test right side + dtVcross(TestPos,up,vec); + dtVadd(TestPos,TestPos,pCurPoi); + ft = MIN_WALL_DISTANCE/dtVdist(TestPos,pCurPoi); + dtVlerp(TestPos,pCurPoi,TestPos,ft); + distanceToWall = DistanceToWall(navQuery, navMesh, polyPickExt, filter,TestPos,hitPos,hitNormal); + } + + //if test point is better than the orig point,replace it. + if(abs(distanceToWall-MIN_WALL_DISTANCE)<0.1f) + dtVcopy(pCurPoi,TestPos); + } + else + { + //ok,we get the hitpos,just make a ray + float ft = MIN_WALL_DISTANCE/distanceToWall; + dtVlerp(TestPos,hitPos,pCurPoi,ft); + distanceToWall = DistanceToWall(navQuery, navMesh, polyPickExt, filter, TestPos,hitPos,hitNormal); + + if(abs(distanceToWall-MIN_WALL_DISTANCE)<0.1f) + dtVcopy(pCurPoi,TestPos); + } + } + } + } + static bool HandleMmapPathCommand(ChatHandler* handler, char const* args) { - if (!MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId())) + if (!MMAP::MMapFactory::CreateOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId())) { handler->PSendSysMessage("NavMesh not loaded for current map."); return true; @@ -91,10 +221,10 @@ public: player->GetPosition(x, y, z); // path - PathGenerator path(target); + /*PathGenerator path(target); path.SetUseStraightPath(useStraightPath); bool result = path.CalculatePath(x, y, z); - + Movement::PointsArray const& pointPath = path.GetPath(); handler->PSendSysMessage("%s's path to %s:", target->GetName().c_str(), player->GetName().c_str()); handler->PSendSysMessage("Building: %s", useStraightPath ? "StraightPath" : "SmoothPath"); @@ -107,13 +237,64 @@ public: handler->PSendSysMessage("StartPosition (%.3f, %.3f, %.3f)", start.x, start.y, start.z); handler->PSendSysMessage("EndPosition (%.3f, %.3f, %.3f)", end.x, end.y, end.z); handler->PSendSysMessage("ActualEndPosition (%.3f, %.3f, %.3f)", actualEnd.x, actualEnd.y, actualEnd.z); + */ + float m_spos[3]; + m_spos[0] = -y; + m_spos[1] = z; + m_spos[2] = -x; + + // + float m_epos[3]; + m_epos[0] = -target->GetPositionY(); + m_epos[1] = target->GetPositionZ(); + m_epos[2] = -target->GetPositionX(); + + // + dtQueryFilter m_filter; + m_filter.setIncludeFlags(3); + m_filter.setExcludeFlags(2); + + // + float m_polyPickExt[3]; + m_polyPickExt[0] = 2.5f; + m_polyPickExt[1] = 2.5f; + m_polyPickExt[2] = 2.5f; + + // + dtPolyRef m_startRef; + dtPolyRef m_endRef; + + const dtNavMesh* navMesh = MMAP::MMapFactory::CreateOrGetMMapManager()->GetNavMesh(player->GetMapId()); + const dtNavMeshQuery* navMeshQuery = MMAP::MMapFactory::CreateOrGetMMapManager()->GetNavMeshQuery(player->GetMapId(), handler->GetSession()->GetPlayer()->GetInstanceId()); + + float nearestPt[3]; + + navMeshQuery->findNearestPoly(m_spos, m_polyPickExt, &m_filter, &m_startRef, nearestPt); + navMeshQuery->findNearestPoly(m_epos, m_polyPickExt, &m_filter, &m_endRef, nearestPt); + + if ( !m_startRef || !m_endRef ) + { + std::cerr << "Could not find any nearby poly's (" << m_startRef << "," << m_endRef << ")" << std::endl; + return 0; + } + + int hops; + dtPolyRef* hopBuffer = new dtPolyRef[8192]; + dtStatus status = navMeshQuery->findPath(m_startRef, m_endRef, m_spos, m_epos, &m_filter, hopBuffer, &hops, 8192); + + int resultHopCount; + float* straightPath = new float[2048*3]; + unsigned char* pathFlags = new unsigned char[2048]; + dtPolyRef* pathRefs = new dtPolyRef[2048]; + + status = navMeshQuery->findStraightPath(m_spos, m_epos, hopBuffer, hops, straightPath, pathFlags, pathRefs, &resultHopCount, 2048); + FixPath(const_cast(navMesh), const_cast(navMeshQuery), m_polyPickExt, m_filter, resultHopCount, straightPath); + for (uint32 i = 0; i < resultHopCount; ++i) + player->SummonCreature(VISUAL_WAYPOINT, -straightPath[i * 3 + 2], -straightPath[i * 3 + 0], straightPath[i * 3 + 1], 0, TEMPSUMMON_TIMED_DESPAWN, 9000); if (!player->IsGameMaster()) handler->PSendSysMessage("Enable GM mode to see the path points."); - for (uint32 i = 0; i < pointPath.size(); ++i) - player->SummonCreature(VISUAL_WAYPOINT, pointPath[i].x, pointPath[i].y, pointPath[i].z, 0, TEMPSUMMON_TIMED_DESPAWN, 9000); - return true; } @@ -131,8 +312,8 @@ public: handler->PSendSysMessage("gridloc [%i, %i]", gx, gy); // calculate navmesh tile location - dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId()); - dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(handler->GetSession()->GetPlayer()->GetMapId(), player->GetInstanceId()); + dtNavMesh const* navmesh = MMAP::MMapFactory::CreateOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId()); + dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::CreateOrGetMMapManager()->GetNavMeshQuery(handler->GetSession()->GetPlayer()->GetMapId(), player->GetInstanceId()); if (!navmesh || !navmeshquery) { handler->PSendSysMessage("NavMesh not loaded for current map."); @@ -142,8 +323,8 @@ public: float const* min = navmesh->getParams()->orig; float x, y, z; player->GetPosition(x, y, z); - float location[VERTEX_SIZE] = {y, z, x}; - float extents[VERTEX_SIZE] = {3.0f, 5.0f, 3.0f}; + float location[] = {y, z, x}; + float extents[] = {3.0f, 5.0f, 3.0f}; int32 tilex = int32((y - min[0]) / SIZE_OF_GRIDS); int32 tiley = int32((x - min[2]) / SIZE_OF_GRIDS); @@ -152,14 +333,14 @@ public: // navmesh poly -> navmesh tile location dtQueryFilter filter = dtQueryFilter(); - dtPolyRef polyRef = INVALID_POLYREF; + dtPolyRef polyRef = 0; if (dtStatusFailed(navmeshquery->findNearestPoly(location, extents, &filter, &polyRef, NULL))) { handler->PSendSysMessage("Dt [??,??] (invalid poly, probably no tile loaded)"); return true; } - if (polyRef == INVALID_POLYREF) + if (polyRef == 0) handler->PSendSysMessage("Dt [??, ??] (invalid poly, probably no tile loaded)"); else { @@ -183,8 +364,8 @@ public: static bool HandleMmapLoadedTilesCommand(ChatHandler* handler, char const* /*args*/) { uint32 mapid = handler->GetSession()->GetPlayer()->GetMapId(); - dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(mapid); - dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(mapid, handler->GetSession()->GetPlayer()->GetInstanceId()); + dtNavMesh const* navmesh = MMAP::MMapFactory::CreateOrGetMMapManager()->GetNavMesh(mapid); + dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::CreateOrGetMMapManager()->GetNavMeshQuery(mapid, handler->GetSession()->GetPlayer()->GetInstanceId()); if (!navmesh || !navmeshquery) { handler->PSendSysMessage("NavMesh not loaded for current map."); @@ -211,8 +392,8 @@ public: handler->PSendSysMessage("mmap stats:"); handler->PSendSysMessage(" global mmap pathfinding is %sabled", MMAP::MMapFactory::IsPathfindingEnabled(mapId) ? "en" : "dis"); - MMAP::MMapManager* manager = MMAP::MMapFactory::createOrGetMMapManager(); - handler->PSendSysMessage(" %u maps loaded with %u tiles overall", manager->getLoadedMapsCount(), manager->getLoadedTilesCount()); + MMAP::MMapManager* manager = MMAP::MMapFactory::CreateOrGetMMapManager(); + handler->PSendSysMessage(" %u maps loaded with %u tiles overall", manager->GetLoadedMapsCount(), manager->GetLoadedTilesCount()); dtNavMesh const* navmesh = manager->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId()); if (!navmesh) diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 19693d8670..135606b947 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -276,7 +276,11 @@ public: uint32 db_guid = creature->GetDBTableGUIDLow(); - // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); + // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells() + // current "creature" variable is deleted and created fresh new, otherwise old values might trigger asserts or cause undefined behavior + creature->CleanupsBeforeDelete(); + delete creature; + creature = new Creature(); if (!creature->LoadCreatureFromDB(db_guid, map)) { delete creature; diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index 83e65d2f01..cdae7a8838 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -201,7 +201,7 @@ public: } } - // All creature/GO slain/casted (not required, but otherwise it will display "Creature slain 0/10") + // All creature/GO slain/cast (not required, but otherwise it will display "Creature slain 0/10") for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) { int32 creature = quest->RequiredNpcOrGo[i]; diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp index 34fc09fe80..7a054d68da 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -208,7 +208,7 @@ class boss_alizabal : public CreatureScript { DoCast(target, SPELL_SKEWER, true); Talk(SAY_SKEWER); - Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID()); + Talk(SAY_SKEWER_ANNOUNCE, target); } _skewer = true; events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index ee8f22ca66..e2a4359f6a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -117,7 +117,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_grimstoneAI(creature); + return GetInstanceAI(creature); } struct npc_grimstoneAI : public npc_escortAI @@ -207,12 +207,9 @@ public: Event_Timer = 5000; break; case 5: - if (instance) - { - instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_GRIMSTONE, me); - instance->SetData(TYPE_RING_OF_LAW, DONE); - TC_LOG_DEBUG("scripts", "npc_grimstone: event reached end and set complete."); - } + instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_GRIMSTONE, me); + instance->SetData(TYPE_RING_OF_LAW, DONE); + TC_LOG_DEBUG("scripts", "npc_grimstone: event reached end and set complete."); break; } } @@ -224,9 +221,6 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!instance) - return; - if (MobDeath_Timer) { if (MobDeath_Timer <= diff) @@ -1237,7 +1231,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_rocknotAI(creature); + return GetInstanceAI(creature); } struct npc_rocknotAI : public npc_escortAI @@ -1269,9 +1263,6 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (!instance) - return; - switch (waypointId) { case 1: @@ -1295,9 +1286,6 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!instance) - return; - if (BreakKeg_Timer) { if (BreakKeg_Timer <= diff) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp index 25f93a2b6b..ecdfafea64 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp @@ -39,7 +39,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_draganthaurissanAI(creature); + return GetInstanceAI(creature); } struct boss_draganthaurissanAI : public ScriptedAI @@ -92,7 +92,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_HANDOFTHAURISSAN); - //3 Hands of Thaurissan will be casted + //3 Hands of Thaurissan will be cast //if (Counter < 3) //{ // HandOfThaurissan_Timer = 1000; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp index 55e6862bda..2353f8bc4d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp @@ -140,7 +140,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_doomrelAI(creature); + return GetInstanceAI(creature); } struct boss_doomrelAI : public ScriptedAI @@ -170,13 +170,10 @@ public: // was set before event start, so set again me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - if (instance) - { - if (instance->GetData(DATA_GHOSTKILL) >= 7) - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - else - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - } + if (instance->GetData(DATA_GHOSTKILL) >= 7) + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + else + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -192,14 +189,12 @@ public: if (me->IsAlive()) me->GetMotionMaster()->MoveTargetedHome(); me->SetLootRecipient(NULL); - if (instance) - instance->SetData64(DATA_EVENSTARTER, 0); + instance->SetData64(DATA_EVENSTARTER, 0); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_GHOSTKILL, 1); + instance->SetData(DATA_GHOSTKILL, 1); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp index dbc3056b1f..b2d496501f 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp @@ -162,7 +162,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_gythAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp index 26540eb38a..11f421ac19 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp @@ -64,8 +64,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_LORD_VALTHALAK, DONE); + instance->SetData(DATA_LORD_VALTHALAK, DONE); } void UpdateAI(uint32 diff) OVERRIDE @@ -128,7 +127,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lord_valthalakAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp index 1c40385c0f..65cddb55b8 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp @@ -79,23 +79,20 @@ public: void Reset() OVERRIDE { - if (instance) - { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); - events.Reset(); - // Apply auras on spawn and reset - // DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); // Need to find this in old DBC if possible - me->RemoveAura(SPELL_EMBERSEER_FULL_STRENGTH); - me->RemoveAura(SPELL_EMBERSEER_GROWING); - me->RemoveAura(SPELL_EMBERSEER_GROWING_TRIGGER); - events.ScheduleEvent(EVENT_RESPAWN, 5000); - // Hack for missing trigger spell - events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + events.Reset(); + // Apply auras on spawn and reset + // DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); // Need to find this in old DBC if possible + me->RemoveAura(SPELL_EMBERSEER_FULL_STRENGTH); + me->RemoveAura(SPELL_EMBERSEER_GROWING); + me->RemoveAura(SPELL_EMBERSEER_GROWING_TRIGGER); + events.ScheduleEvent(EVENT_RESPAWN, 5000); + // Hack for missing trigger spell + events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); - // Open doors on reset - if (instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS) - OpenDoors(false); // Opens 2 entrance doors - } + // Open doors on reset + if (instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS) + OpenDoors(false); // Opens 2 entrance doors } void SetData(uint32 /*type*/, uint32 data) OVERRIDE @@ -132,15 +129,12 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - // Activate all the runes - UpdateRunes(GO_STATE_READY); - // Opens all 3 doors - OpenDoors(true); - // Complete encounter - instance->SetBossState(DATA_PYROGAURD_EMBERSEER, DONE); - } + // Activate all the runes + UpdateRunes(GO_STATE_READY); + // Opens all 3 doors + OpenDoors(true); + // Complete encounter + instance->SetBossState(DATA_PYROGAURD_EMBERSEER, DONE); } void SpellHit(Unit* /*caster*/, SpellInfo const* spell) OVERRIDE @@ -185,24 +179,21 @@ public: void UpdateRunes(GOState state) { - if (instance) - { - // update all runes - if (GameObject* rune1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_1))) - rune1->SetGoState(state); - if (GameObject* rune2 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_2))) - rune2->SetGoState(state); - if (GameObject* rune3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_3))) - rune3->SetGoState(state); - if (GameObject* rune4 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_4))) - rune4->SetGoState(state); - if (GameObject* rune5 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_5))) - rune5->SetGoState(state); - if (GameObject* rune6 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_6))) - rune6->SetGoState(state); - if (GameObject* rune7 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_7))) - rune7->SetGoState(state); - } + // update all runes + if (GameObject* rune1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_1))) + rune1->SetGoState(state); + if (GameObject* rune2 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_2))) + rune2->SetGoState(state); + if (GameObject* rune3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_3))) + rune3->SetGoState(state); + if (GameObject* rune4 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_4))) + rune4->SetGoState(state); + if (GameObject* rune5 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_5))) + rune5->SetGoState(state); + if (GameObject* rune6 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_6))) + rune6->SetGoState(state); + if (GameObject* rune7 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_7))) + rune7->SetGoState(state); } void UpdateAI(uint32 diff) OVERRIDE @@ -316,7 +307,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_pyroguard_emberseerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp index ff839e3cac..efe53d0825 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp @@ -438,7 +438,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_rend_blackhandAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp index ccd74b204c..5849ab1442 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp @@ -23,11 +23,11 @@ enum Spells { SPELL_SNAPKICK = 15618, - SPELL_CLEAVE = 15579, + SPELL_CLEAVE = 15284, SPELL_UPPERCUT = 10966, SPELL_MORTALSTRIKE = 16856, SPELL_PUMMEL = 15615, - SPELL_THROWAXE = 16075, + SPELL_THROWAXE = 16075 }; enum Events @@ -37,7 +37,7 @@ enum Events EVENT_UPPERCUT = 3, EVENT_MORTAL_STRIKE = 4, EVENT_PUMMEL = 5, - EVENT_THROW_AXE = 6, + EVENT_THROW_AXE = 6 }; class boss_warmaster_voone : public CreatureScript @@ -45,11 +45,6 @@ class boss_warmaster_voone : public CreatureScript public: boss_warmaster_voone() : CreatureScript("boss_warmaster_voone") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_warmastervooneAI(creature); - } - struct boss_warmastervooneAI : public BossAI { boss_warmastervooneAI(Creature* creature) : BossAI(creature, DATA_WARMASTER_VOONE) { } @@ -119,6 +114,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_warmastervooneAI(creature); + } }; void AddSC_boss_warmastervoone() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp index c9dc3d8f13..77afea4b65 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp @@ -116,7 +116,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_broodlordAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index 05effabe55..9878720b1d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -282,7 +282,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_chromaggusAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp index 0d79f3faee..222bd6f80e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp @@ -92,7 +92,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ebonrocAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp index 369e4e02f5..983fe60a2d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp @@ -94,7 +94,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_firemawAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp index 060bfeb60b..63b43d81ae 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp @@ -100,7 +100,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_flamegorAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 9d34cb680e..7c368fae96 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -170,11 +170,12 @@ public: void Reset() OVERRIDE { + SpawnedAdds = 0; + if (me->GetMapId() == 469) { if (!me->FindNearestCreature(NPC_NEFARIAN, 1000.0f, true)) _Reset(); - SpawnedAdds = 0; me->SetVisible(true); me->SetPhaseMask(1, true); @@ -376,7 +377,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_victor_nefariusAI(creature); + return GetInstanceAI(creature); } }; @@ -443,8 +444,7 @@ public: { if (canDespawn && DespawnTimer <= diff) { - if (instance) - instance->SetBossState(BOSS_NEFARIAN, FAIL); + instance->SetBossState(BOSS_NEFARIAN, FAIL); std::list constructList; me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f); @@ -572,7 +572,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_nefarianAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index caf2719eff..6b24cd0b74 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -75,8 +75,7 @@ public: _Reset(); secondPhase = false; - if (instance) - instance->SetData(DATA_EGG_EVENT, NOT_STARTED); + instance->SetData(DATA_EGG_EVENT, NOT_STARTED); } void JustDied(Unit* /*killer*/) OVERRIDE @@ -84,8 +83,7 @@ public: _JustDied(); Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_EGG_EVENT, NOT_STARTED); + instance->SetData(DATA_EGG_EVENT, NOT_STARTED); } void DoChangePhase() @@ -156,7 +154,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_razorgoreAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp index 0fdb88923b..bc94f1b026 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp @@ -179,7 +179,7 @@ class npc_core_rager : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_core_ragerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index 1001516d42..19b4bea885 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -161,8 +161,7 @@ class boss_majordomo : public CreatureScript me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); break; case EVENT_OUTRO_2: - if (instance) - instance->instance->SummonCreature(NPC_RAGNAROS, RagnarosSummonPos); + instance->instance->SummonCreature(NPC_RAGNAROS, RagnarosSummonPos); break; case EVENT_OUTRO_3: Talk(SAY_ARRIVAL2_MAJ); @@ -207,7 +206,7 @@ class boss_majordomo : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_majordomoAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index d03f756f36..364d171ed3 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -147,9 +147,8 @@ class boss_ragnaros : public CreatureScript break; case EVENT_INTRO_4: Talk(SAY_ARRIVAL5_RAG); - if (instance) - if (Creature* executus = Unit::GetCreature(*me, instance->GetData64(BOSS_MAJORDOMO_EXECUTUS))) - me->Kill(executus); + if (Creature* executus = Unit::GetCreature(*me, instance->GetData64(BOSS_MAJORDOMO_EXECUTUS))) + me->Kill(executus); break; case EVENT_INTRO_5: me->SetReactState(REACT_AGGRESSIVE); @@ -163,29 +162,26 @@ class boss_ragnaros : public CreatureScript } else { - if (instance) + if (_isBanished && ((_emergeTimer <= diff) || (instance->GetData(DATA_RAGNAROS_ADDS)) > 8)) { - if (_isBanished && ((_emergeTimer <= diff) || (instance->GetData(DATA_RAGNAROS_ADDS)) > 8)) - { - //Become unbanished again - me->SetReactState(REACT_AGGRESSIVE); - me->setFaction(14); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - AttackStart(target); - instance->SetData(DATA_RAGNAROS_ADDS, 0); + //Become unbanished again + me->SetReactState(REACT_AGGRESSIVE); + me->setFaction(14); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + AttackStart(target); + instance->SetData(DATA_RAGNAROS_ADDS, 0); - //DoCast(me, SPELL_RAGEMERGE); //"phase spells" didnt worked correctly so Ive commented them and wrote solution witch doesnt need core support - _isBanished = false; - } - else if (_isBanished) - { - _emergeTimer -= diff; - //Do nothing while banished - return; - } + //DoCast(me, SPELL_RAGEMERGE); //"phase spells" didnt worked correctly so Ive commented them and wrote solution witch doesnt need core support + _isBanished = false; + } + else if (_isBanished) + { + _emergeTimer -= diff; + //Do nothing while banished + return; } //Return since we have no target @@ -306,7 +302,7 @@ class boss_ragnaros : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ragnarosAI(creature); + return GetInstanceAI(creature); } }; @@ -324,8 +320,7 @@ class npc_son_of_flame : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_RAGNAROS_ADDS, 1); + instance->SetData(DATA_RAGNAROS_ADDS, 1); } void UpdateAI(uint32 /*diff*/) OVERRIDE @@ -342,7 +337,7 @@ class npc_son_of_flame : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_son_of_flameAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp index 8a7836b310..57879c812e 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp @@ -45,7 +45,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_mr_smiteAI(creature); + return GetInstanceAI(creature); } struct boss_mr_smiteAI : public ScriptedAI @@ -127,12 +127,11 @@ public: ++uiHealth; DoCastAOE(SPELL_SMITE_STOMP, false); SetCombatMovement(false); - if (instance) - if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_SMITE_CHEST))) - { - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 3.0f, go->GetPositionY(), go->GetPositionZ()); - } + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_SMITE_CHEST))) + { + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 3.0f, go->GetPositionY(), go->GetPositionZ()); + } } if (uiPhase) diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index 46683442a6..325e39e638 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -90,7 +90,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_blastmaster_emi_shortfuseAI(creature); + return GetInstanceAI(creature); } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE @@ -186,20 +186,15 @@ public: if (bBool) { - if (instance) - if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) - instance->HandleGameObject(0, false, go); + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) + instance->HandleGameObject(0, false, go); }else - if (instance) - if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) - instance->HandleGameObject(0, false, go); + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) + instance->HandleGameObject(0, false, go); } void SetInFace(bool bBool) { - if (!instance) - return; - if (bBool) { if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) @@ -211,9 +206,6 @@ public: void RestoreAll() { - if (!instance) - return; - if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) instance->HandleGameObject(0, false, go); @@ -318,9 +310,6 @@ public: NextStep(2000, true); break; case 2: - if (!instance) - return; - switch (uiValue) { case 1: @@ -441,9 +430,8 @@ public: SetInFace(true); Talk(SAY_BLASTMASTER_5); Summon(1); - if (instance) - if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) - instance->HandleGameObject(0, true, go); + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) + instance->HandleGameObject(0, true, go); NextStep(3000, true); break; case 7: @@ -488,9 +476,8 @@ public: case 16: Talk(SAY_BLASTMASTER_14); SetInFace(false); - if (instance) - if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) - instance->HandleGameObject(0, true, go); + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) + instance->HandleGameObject(0, true, go); NextStep(2000, true); break; case 17: diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index 30416aca1b..129a9af823 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -82,6 +82,7 @@ public: void Reset() OVERRIDE { ResetTimer = 0; + Midnight = 0; } void EnterEvadeMode() OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index fc37c42be8..06e5745c87 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -98,7 +98,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_moroesAI(creature); + return GetInstanceAI(creature); } struct boss_moroesAI : public ScriptedAI @@ -138,14 +138,12 @@ public: if (me->IsAlive()) SpawnAdds(); - if (instance) - instance->SetData(TYPE_MOROES, NOT_STARTED); + instance->SetData(TYPE_MOROES, NOT_STARTED); } void StartEvent() { - if (instance) - instance->SetData(TYPE_MOROES, IN_PROGRESS); + instance->SetData(TYPE_MOROES, IN_PROGRESS); DoZoneInCombat(); } @@ -168,14 +166,12 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(TYPE_MOROES, DONE); + instance->SetData(TYPE_MOROES, DONE); DeSpawnAdds(); //remove aura from spell Garrote when Moroes dies - if (instance) - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); } void SpawnAdds() @@ -349,15 +345,11 @@ struct boss_moroes_guestAI : public ScriptedAI void Reset() OVERRIDE { - if (instance) - instance->SetData(TYPE_MOROES, NOT_STARTED); + instance->SetData(TYPE_MOROES, NOT_STARTED); } void AcquireGUID() { - if (!instance) - return; - if (Creature* Moroes = Unit::GetCreature(*me, instance->GetData64(DATA_MOROES))) for (uint8 i = 0; i < 4; ++i) if (uint64 GUID = CAST_AI(boss_moroes::boss_moroesAI, Moroes->AI())->AddGUID[i]) @@ -393,7 +385,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_baroness_dorothea_millstipeAI(creature); + return GetInstanceAI(creature); } struct boss_baroness_dorothea_millstipeAI : public boss_moroes_guestAI @@ -456,7 +448,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_baron_rafe_dreugerAI(creature); + return GetInstanceAI(creature); } struct boss_baron_rafe_dreugerAI : public boss_moroes_guestAI @@ -513,7 +505,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lady_catriona_von_indiAI(creature); + return GetInstanceAI(creature); } struct boss_lady_catriona_von_indiAI : public boss_moroes_guestAI @@ -583,7 +575,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lady_keira_berrybuckAI(creature); + return GetInstanceAI(creature); } struct boss_lady_keira_berrybuckAI : public boss_moroes_guestAI @@ -657,7 +649,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lord_robin_darisAI(creature); + return GetInstanceAI(creature); } struct boss_lord_robin_darisAI : public boss_moroes_guestAI @@ -713,7 +705,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lord_crispin_ferenceAI(creature); + return GetInstanceAI(creature); } struct boss_lord_crispin_ferenceAI : public boss_moroes_guestAI diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp index f80ff5b602..52bec6dbf2 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp @@ -71,7 +71,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_netherspiteAI(creature); + return GetInstanceAI(creature); } struct boss_netherspiteAI : public ScriptedAI @@ -172,7 +172,7 @@ public: for (int j=0; j<3; ++j) // j = color if (Creature* portal = Unit::GetCreature(*me, PortalGUID[j])) { - // the one who's been casted upon before + // the one who's been cast upon before Unit* current = Unit::GetUnit(*portal, BeamTarget[j]); // temporary store for the best suitable beam reciever Unit* target = me; @@ -308,7 +308,7 @@ public: if (PhaseTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { SwitchToBanishPhase(); return; @@ -327,7 +327,7 @@ public: if (PhaseTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { SwitchToPortalPhase(); return; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index 984ef902f0..b4cfd33990 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -71,7 +71,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_nightbaneAI(creature); + return GetInstanceAI(creature); } struct boss_nightbaneAI : public ScriptedAI @@ -131,13 +131,10 @@ public: me->SetWalk(false); me->setActive(true); - if (instance) - { - if (instance->GetData(TYPE_NIGHTBANE) == DONE || instance->GetData(TYPE_NIGHTBANE) == IN_PROGRESS) - me->DisappearAndDie(); - else - instance->SetData(TYPE_NIGHTBANE, NOT_STARTED); - } + if (instance->GetData(TYPE_NIGHTBANE) == DONE || instance->GetData(TYPE_NIGHTBANE) == IN_PROGRESS) + me->DisappearAndDie(); + else + instance->SetData(TYPE_NIGHTBANE, NOT_STARTED); HandleTerraceDoors(true); @@ -153,17 +150,13 @@ public: void HandleTerraceDoors(bool open) { - if (instance) - { - instance->HandleGameObject(instance->GetData64(DATA_MASTERS_TERRACE_DOOR_1), open); - instance->HandleGameObject(instance->GetData64(DATA_MASTERS_TERRACE_DOOR_2), open); - } + instance->HandleGameObject(instance->GetData64(DATA_MASTERS_TERRACE_DOOR_1), open); + instance->HandleGameObject(instance->GetData64(DATA_MASTERS_TERRACE_DOOR_2), open); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetData(TYPE_NIGHTBANE, IN_PROGRESS); + instance->SetData(TYPE_NIGHTBANE, IN_PROGRESS); HandleTerraceDoors(false); Talk(YELL_AGGRO); @@ -177,8 +170,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(TYPE_NIGHTBANE, DONE); + instance->SetData(TYPE_NIGHTBANE, DONE); HandleTerraceDoors(true); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index 7c6cdd4cb3..6ceceb5ab6 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -179,7 +179,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_malchezaarAI(creature); + return GetInstanceAI(creature); } struct boss_malchezaarAI : public ScriptedAI @@ -239,8 +239,7 @@ public: SunderArmorTimer = urand(5000, 10000); phase = 1; - if (instance) - instance->HandleGameObject(instance->GetData64(DATA_GO_NETHER_DOOR), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_NETHER_DOOR), true); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -260,16 +259,14 @@ public: for (uint8 i = 0; i < TOTAL_INFERNAL_POINTS; ++i) positions.push_back(&InfernalPoints[i]); - if (instance) - instance->HandleGameObject(instance->GetData64(DATA_GO_NETHER_DOOR), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_NETHER_DOOR), true); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->HandleGameObject(instance->GetData64(DATA_GO_NETHER_DOOR), false); // Open the door leading further in + instance->HandleGameObject(instance->GetData64(DATA_GO_NETHER_DOOR), false); // Open the door leading further in } void InfernalCleanup() @@ -569,7 +566,7 @@ public: void DoMeleeAttacksIfReady() { - if (me->IsWithinMeleeRange(me->GetVictim()) && !me->IsNonMeleeSpellCasted(false)) + if (me->IsWithinMeleeRange(me->GetVictim()) && !me->IsNonMeleeSpellCast(false)) { //Check for base attack if (me->isAttackReady() && me->GetVictim()) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 2d3fabb810..3d7ee24a64 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -86,7 +86,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_aranAI(creature); + return GetInstanceAI(creature); } struct boss_aranAI : public ScriptedAI @@ -147,12 +147,9 @@ public: Drinking = false; DrinkInturrupted = false; - if (instance) - { - // Not in progress - instance->SetData(TYPE_ARAN, NOT_STARTED); - instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true); - } + // Not in progress + instance->SetData(TYPE_ARAN, NOT_STARTED); + instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -164,22 +161,16 @@ public: { Talk(SAY_DEATH); - if (instance) - { - instance->SetData(TYPE_ARAN, DONE); - instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true); - } + instance->SetData(TYPE_ARAN, DONE); + instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), true); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - { - instance->SetData(TYPE_ARAN, IN_PROGRESS); - instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); - } + instance->SetData(TYPE_ARAN, IN_PROGRESS); + instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); } void FlameWreathEffect() @@ -226,11 +217,8 @@ public: { if (CloseDoorTimer <= diff) { - if (instance) - { - instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); - CloseDoorTimer = 0; - } + instance->HandleGameObject(instance->GetData64(DATA_GO_LIBRARY_DOOR), false); + CloseDoorTimer = 0; } else CloseDoorTimer -= diff; } @@ -305,7 +293,7 @@ public: //Normal casts if (NormalCastTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (!target) @@ -486,10 +474,10 @@ public: void SpellHit(Unit* /*pAttacker*/, const SpellInfo* Spell) OVERRIDE { - //We only care about interrupt effects and only if they are durring a spell currently being casted + //We only care about interrupt effects and only if they are durring a spell currently being cast if ((Spell->Effects[0].Effect != SPELL_EFFECT_INTERRUPT_CAST && Spell->Effects[1].Effect != SPELL_EFFECT_INTERRUPT_CAST && - Spell->Effects[2].Effect != SPELL_EFFECT_INTERRUPT_CAST) || !me->IsNonMeleeSpellCasted(false)) + Spell->Effects[2].Effect != SPELL_EFFECT_INTERRUPT_CAST) || !me->IsNonMeleeSpellCast(false)) return; //Interrupt effect diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 6355fe3372..c20d424cb9 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -71,7 +71,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_kilrekAI(creature); + return GetInstanceAI(creature); } struct npc_kilrekAI : public ScriptedAI @@ -95,25 +95,17 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (!instance) - { - ERROR_INST_DATA(me); - return; - } } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) + uint64 TerestianGUID = instance->GetData64(DATA_TERESTIAN); + if (TerestianGUID) { - uint64 TerestianGUID = instance->GetData64(DATA_TERESTIAN); - if (TerestianGUID) - { - Unit* Terestian = Unit::GetUnit(*me, TerestianGUID); - if (Terestian && Terestian->IsAlive()) - DoCast(Terestian, SPELL_BROKEN_PACT, true); - } - } else ERROR_INST_DATA(me); + Unit* Terestian = Unit::GetUnit(*me, TerestianGUID); + if (Terestian && Terestian->IsAlive()) + DoCast(Terestian, SPELL_BROKEN_PACT, true); + } } void UpdateAI(uint32 diff) OVERRIDE @@ -256,7 +248,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_terestianAI(creature); + return GetInstanceAI(creature); } struct boss_terestianAI : public ScriptedAI @@ -306,8 +298,7 @@ public: SummonedPortals = false; Berserk = false; - if (instance) - instance->SetData(TYPE_TERESTIAN, NOT_STARTED); + instance->SetData(TYPE_TERESTIAN, NOT_STARTED); me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT); @@ -362,8 +353,7 @@ public: Talk(SAY_DEATH); - if (instance) - instance->SetData(TYPE_TERESTIAN, DONE); + instance->SetData(TYPE_TERESTIAN, DONE); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index da14ab8646..e3a97ae72d 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -118,7 +118,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_dorotheeAI(creature); + return GetInstanceAI(creature); } struct boss_dorotheeAI : public ScriptedAI @@ -167,8 +167,7 @@ public: { Talk(SAY_DOROTHEE_DEATH); - if (instance) - SummonCroneIfReady(instance, me); + SummonCroneIfReady(instance, me); } void AttackStart(Unit* who) OVERRIDE @@ -299,7 +298,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_strawmanAI(creature); + return GetInstanceAI(creature); } struct boss_strawmanAI : public ScriptedAI @@ -366,8 +365,7 @@ public: { Talk(SAY_STRAWMAN_DEATH); - if (instance) - SummonCroneIfReady(instance, me); + SummonCroneIfReady(instance, me); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -414,7 +412,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_tinheadAI(creature); + return GetInstanceAI(creature); } struct boss_tinheadAI : public ScriptedAI @@ -472,8 +470,7 @@ public: { Talk(SAY_TINHEAD_DEATH); - if (instance) - SummonCroneIfReady(instance, me); + SummonCroneIfReady(instance, me); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -524,7 +521,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_roarAI(creature); + return GetInstanceAI(creature); } struct boss_roarAI : public ScriptedAI @@ -580,8 +577,7 @@ public: { Talk(SAY_ROAR_DEATH); - if (instance) - SummonCroneIfReady(instance, me); + SummonCroneIfReady(instance, me); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -633,7 +629,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_croneAI(creature); + return GetInstanceAI(creature); } struct boss_croneAI : public ScriptedAI @@ -675,15 +671,12 @@ public: { Talk(SAY_CRONE_DEATH); - if (instance) - { - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); + instance->SetData(TYPE_OPERA, DONE); + instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - } + if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) + pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } void UpdateAI(uint32 diff) OVERRIDE @@ -813,7 +806,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_bigbadwolfAI(creature); + return GetInstanceAI(creature); } struct boss_bigbadwolfAI : public ScriptedAI @@ -865,15 +858,12 @@ public: { DoPlaySoundToSet(me, SOUND_WOLF_DEATH); - if (instance) - { - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); + instance->SetData(TYPE_OPERA, DONE); + instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - } + if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) + pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } void UpdateAI(uint32 diff) OVERRIDE @@ -1015,7 +1005,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_julianneAI(creature); + return GetInstanceAI(creature); } struct boss_julianneAI : public ScriptedAI @@ -1112,14 +1102,11 @@ public: { Talk(SAY_JULIANNE_DEATH02); - if (instance) - { - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - } + instance->SetData(TYPE_OPERA, DONE); + instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); + if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) + pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -1138,7 +1125,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_romuloAI(creature); + return GetInstanceAI(creature); } struct boss_romuloAI : public ScriptedAI @@ -1267,15 +1254,12 @@ public: { Talk(SAY_ROMULO_DEATH); - if (instance) - { - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); + instance->SetData(TYPE_OPERA, DONE); + instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORLEFT), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_STAGEDOORRIGHT), true); - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - } + if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetData64(DATA_GO_SIDE_ENTRANCE_DOOR))) + pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } void KilledUnit(Unit* /*victim*/) OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index e59889d24a..ae08d580e5 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -158,15 +158,11 @@ public: PerformanceReady = false; - if (instance) - m_uiEventId = instance->GetData(DATA_OPERA_PERFORMANCE); + m_uiEventId = instance->GetData(DATA_OPERA_PERFORMANCE); } void StartEvent() { - if (!instance) - return; - instance->SetData(TYPE_OPERA, IN_PROGRESS); //resets count for this event, in case earlier failed @@ -180,9 +176,6 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (!instance) - return; - switch (waypointId) { case 0: @@ -412,7 +405,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_barnesAI(creature); + return GetInstanceAI(creature); } }; @@ -476,7 +469,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_image_of_medivhAI(creature); + return GetInstanceAI(creature); } struct npc_image_of_medivhAI : public ScriptedAI @@ -500,6 +493,8 @@ public: void Reset() OVERRIDE { ArcanagosGUID = 0; + EventStarted = false; + YellTimer = 0; if (instance && instance->GetData64(DATA_IMAGE_OF_MEDIVH) == 0) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index 074ad3f1b9..ddc8ceb0aa 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -96,7 +96,7 @@ public: CreatureAI* GetAI(Creature* c) const OVERRIDE { - return new boss_felblood_kaelthasAI(c); + return GetInstanceAI(c); } struct boss_felblood_kaelthasAI : public ScriptedAI @@ -150,17 +150,13 @@ public: Phase = 0; - if (instance) - instance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED); + instance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (!instance) - return; - instance->SetData(DATA_KAELTHAS_EVENT, DONE); // Enable the Translocation Orb Exit @@ -176,9 +172,6 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (!instance) - return; - instance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS); } @@ -371,8 +364,7 @@ public: Talk(SAY_GRAVITY_LAPSE); FirstGravityLapse = false; - if (instance) - instance->SetData(DATA_KAELTHAS_STATUES, 1); + instance->SetData(DATA_KAELTHAS_STATUES, 1); } else Talk(SAY_RECAST_GRAVITY); @@ -482,7 +474,7 @@ public: CreatureAI* GetAI(Creature* c) const OVERRIDE { - return new npc_felkael_phoenixAI(c); + return GetInstanceAI(c); } struct npc_felkael_phoenixAI : public ScriptedAI diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index c8ab4a147f..1571c94dc3 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -110,7 +110,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_priestess_delrissaAI(creature); + return GetInstanceAI(creature); } struct boss_priestess_delrissaAI : public ScriptedAI @@ -153,8 +153,7 @@ public: //this mean she at some point evaded void JustReachedHome() OVERRIDE { - if (instance) - instance->SetData(DATA_DELRISSA_EVENT, FAIL); + instance->SetData(DATA_DELRISSA_EVENT, FAIL); } void EnterCombat(Unit* who) OVERRIDE @@ -173,8 +172,7 @@ public: } } - if (instance) - instance->SetData(DATA_DELRISSA_EVENT, IN_PROGRESS); + instance->SetData(DATA_DELRISSA_EVENT, IN_PROGRESS); } void InitializeLackeys() @@ -241,9 +239,6 @@ public: { Talk(SAY_DEATH); - if (!instance) - return; - if (instance->GetData(DATA_DELRISSA_DEATH_COUNT) == MAX_ACTIVE_LACKEY) instance->SetData(DATA_DELRISSA_EVENT, DONE); else @@ -393,36 +388,30 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI if (!who) return; - if (instance) + for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) + if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUIDs[i])) { - if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUIDs[i])) + if (!pAdd->GetVictim() && pAdd != me) { - if (!pAdd->GetVictim() && pAdd != me) - { - who->SetInCombatWith(pAdd); - pAdd->AddThreat(who, 0.0f); - } + who->SetInCombatWith(pAdd); + pAdd->AddThreat(who, 0.0f); } } + } - if (Creature* pDelrissa = Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA))) + if (Creature* pDelrissa = Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA))) + { + if (pDelrissa->IsAlive() && !pDelrissa->GetVictim()) { - if (pDelrissa->IsAlive() && !pDelrissa->GetVictim()) - { - who->SetInCombatWith(pDelrissa); - pDelrissa->AddThreat(who, 0.0f); - } + who->SetInCombatWith(pDelrissa); + pDelrissa->AddThreat(who, 0.0f); } } } void JustDied(Unit* /*killer*/) OVERRIDE { - if (!instance) - return; - Creature* pDelrissa = Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA)); uint32 uiLackeyDeathCount = instance->GetData(DATA_DELRISSA_DEATH_COUNT); @@ -452,18 +441,12 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void KilledUnit(Unit* victim) OVERRIDE { - if (!instance) - return; - if (Creature* Delrissa = Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA))) Delrissa->AI()->KilledUnit(victim); } void AcquireGUIDs() { - if (!instance) - return; - if (Creature* Delrissa = (Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA)))) { for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) @@ -504,7 +487,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kagani_nightstrikeAI(creature); + return GetInstanceAI(creature); } struct boss_kagani_nightstrikeAI : public boss_priestess_lackey_commonAI @@ -608,7 +591,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ellris_duskhallowAI(creature); + return GetInstanceAI(creature); } struct boss_ellris_duskhallowAI : public boss_priestess_lackey_commonAI @@ -699,7 +682,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_eramas_brightblazeAI(creature); + return GetInstanceAI(creature); } struct boss_eramas_brightblazeAI : public boss_priestess_lackey_commonAI @@ -760,7 +743,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_yazzaiAI(creature); + return GetInstanceAI(creature); } struct boss_yazzaiAI : public boss_priestess_lackey_commonAI @@ -890,7 +873,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_warlord_salarisAI(creature); + return GetInstanceAI(creature); } struct boss_warlord_salarisAI : public boss_priestess_lackey_commonAI @@ -1010,7 +993,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_garaxxasAI(creature); + return GetInstanceAI(creature); } struct boss_garaxxasAI : public boss_priestess_lackey_commonAI @@ -1068,7 +1051,7 @@ public: if (Freezing_Trap_Timer <= diff) { - //attempt find go summoned from spell (casted by me) + //attempt find go summoned from spell (cast by me) GameObject* go = me->GetGameObject(SPELL_FREEZING_TRAP); //if we have a go, we need to wait (only one trap at a time) @@ -1121,7 +1104,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_apokoAI(creature); + return GetInstanceAI(creature); } struct boss_apokoAI : public boss_priestess_lackey_commonAI @@ -1219,7 +1202,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_zelfanAI(creature); + return GetInstanceAI(creature); } struct boss_zelfanAI : public boss_priestess_lackey_commonAI diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp index 849713d72b..936f30c413 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp @@ -66,7 +66,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_selin_fireheartAI(creature); + return GetInstanceAI(creature); }; struct boss_selin_fireheartAI : public ScriptedAI @@ -77,16 +77,13 @@ public: Crystals.clear(); //GUIDs per instance is static, so we only need to load them once. - if (instance) + uint32 size = instance->GetData(DATA_FEL_CRYSTAL_SIZE); + for (uint8 i = 0; i < size; ++i) { - uint32 size = instance->GetData(DATA_FEL_CRYSTAL_SIZE); - for (uint8 i = 0; i < size; ++i) - { - instance->SetData64(DATA_FEL_CRYSTAL, i); - uint64 guid = instance->GetData64(DATA_FEL_CRYSTAL); - TC_LOG_DEBUG("scripts", "Selin: Adding Fel Crystal " UI64FMTD " to list", guid); - Crystals.push_back(guid); - } + instance->SetData64(DATA_FEL_CRYSTAL, i); + uint64 guid = instance->GetData64(DATA_FEL_CRYSTAL); + TC_LOG_DEBUG("scripts", "Selin: Adding Fel Crystal " UI64FMTD " to list", guid); + Crystals.push_back(guid); } } @@ -107,25 +104,22 @@ public: void Reset() OVERRIDE { - if (instance) + //for (uint8 i = 0; i < CRYSTALS_NUMBER; ++i) + for (std::list::const_iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr) { - //for (uint8 i = 0; i < CRYSTALS_NUMBER; ++i) - for (std::list::const_iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr) + //Unit* unit = Unit::GetUnit(*me, FelCrystals[i]); + if (Creature* creature = Unit::GetCreature(*me, *itr)) { - //Unit* unit = Unit::GetUnit(*me, FelCrystals[i]); - if (Creature* creature = Unit::GetCreature(*me, *itr)) - { - if (!creature->IsAlive()) - creature->Respawn(); // Let the core handle setting death state, etc. + if (!creature->IsAlive()) + creature->Respawn(); // Let the core handle setting death state, etc. - // Only need to set unselectable flag. You can't attack unselectable units so non_attackable flag is not necessary here. - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } + // Only need to set unselectable flag. You can't attack unselectable units so non_attackable flag is not necessary here. + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } + } - // Set Inst data for encounter - instance->SetData(DATA_SELIN_EVENT, NOT_STARTED); - } else TC_LOG_ERROR("scripts", ERROR_INST_DATA); + // Set Inst data for encounter + instance->SetData(DATA_SELIN_EVENT, NOT_STARTED); DrainLifeTimer = urand(3000, 7000); DrainManaTimer = DrainLifeTimer + 5000; @@ -200,8 +194,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_SELIN_EVENT, IN_PROGRESS); + instance->SetData(DATA_SELIN_EVENT, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -235,9 +228,6 @@ public: { Talk(SAY_DEATH); - if (!instance) - return; - instance->SetData(DATA_SELIN_EVENT, DONE); // Encounter complete! ShatterRemainingCrystals(); } @@ -271,7 +261,7 @@ public: if (FelExplosionTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { DoCast(me, SPELL_FEL_EXPLOSION); FelExplosionTimer = 2000; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp index 24b48112bb..290c483025 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp @@ -76,7 +76,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_vexallusAI(creature); + return GetInstanceAI(creature); }; struct boss_vexallusAI : public BossAI @@ -103,8 +103,7 @@ public: IntervalHealthAmount = 1; Enraged = false; - if (instance) - instance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED); + instance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -115,16 +114,14 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { summons.DespawnAll(); - if (instance) - instance->SetData(DATA_VEXALLUS_EVENT, DONE); + instance->SetData(DATA_VEXALLUS_EVENT, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_VEXALLUS_EVENT, IN_PROGRESS); + instance->SetData(DATA_VEXALLUS_EVENT, IN_PROGRESS); } void JustSummoned(Creature* summoned) OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp index 694fdf9d84..7389d9afbf 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp @@ -93,7 +93,7 @@ public: if (!bShielded && !HealthAbovePct(50)) { //wait if we already casting - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; Talk(SAY_SPECIALAE); diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp index 6f028e3372..274be80b7b 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp @@ -66,7 +66,7 @@ public: return; //If we are <50% hp cast Soul Siphon rank 1 - if (!HealthAbovePct(50) && !me->IsNonMeleeSpellCasted(false)) + if (!HealthAbovePct(50) && !me->IsNonMeleeSpellCast(false)) { //SoulSiphon_Timer if (SoulSiphon_Timer <= diff) diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 442dcf91f3..f67d85469e 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -374,7 +374,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_headless_horsemanAI(creature); + return GetInstanceAI(creature); } struct boss_headless_horsemanAI : public ScriptedAI @@ -382,6 +382,7 @@ public: boss_headless_horsemanAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); + headGUID = 0; } InstanceScript* instance; @@ -434,8 +435,7 @@ public: } me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - //if (instance) - // instance->SetData(DATA_HORSEMAN_EVENT, NOT_STARTED); + //instance->SetData(DATA_HORSEMAN_EVENT, NOT_STARTED); } void FlyMode() @@ -471,8 +471,7 @@ public: break; } case 6: - if (instance) - instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject + instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject break; case 19: me->SetDisableGravity(false); @@ -494,8 +493,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetData(DATA_HORSEMAN_EVENT, IN_PROGRESS); + instance->SetData(DATA_HORSEMAN_EVENT, IN_PROGRESS); DoZoneInCombat(); } @@ -569,8 +567,7 @@ public: flame->CastSpell(flame, SPELL_BODY_FLAME, false); if (Creature* wisp = DoSpawnCreature(WISP_INVIS, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000)) CAST_AI(npc_wisp_invis::npc_wisp_invisAI, wisp->AI())->SetType(4); - if (instance) - instance->SetData(DATA_HORSEMAN_EVENT, DONE); + instance->SetData(DATA_HORSEMAN_EVENT, DONE); Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (!players.isEmpty()) @@ -800,8 +797,8 @@ public: float x, y, z; me->GetPosition(x, y, z); //this visual aura some under ground me->SetPosition(x, y, z + 0.35f, 0.0f); - Despawn(); debuffGUID = 0; + Despawn(); Creature* debuff = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 14500); if (debuff) { diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp index 40fe93155a..e4974ef7eb 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp @@ -99,7 +99,7 @@ public: return; //If we are <30% hp goes Enraged - if (!Enrage && !HealthAbovePct(30) && !me->IsNonMeleeSpellCasted(false)) + if (!Enrage && !HealthAbovePct(30) && !me->IsNonMeleeSpellCast(false)) { Talk(EMOTE_ENRAGE); Talk(SAY_ENRAGE); diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp index 46680730f7..ea624576db 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp @@ -83,7 +83,7 @@ public: return; //If we are <25% hp cast Heal - if (!HealthAbovePct(25) && !me->IsNonMeleeSpellCasted(false) && Heal_Timer <= diff) + if (!HealthAbovePct(25) && !me->IsNonMeleeSpellCast(false) && Heal_Timer <= diff) { DoCast(me, SPELL_HEAL); Heal_Timer = 30000; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp index a57c237c21..db10c31912 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp @@ -48,7 +48,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_interrogator_vishasAI(creature); + return GetInstanceAI(creature); } struct boss_interrogator_vishasAI : public ScriptedAI @@ -67,6 +67,8 @@ public: void Reset() OVERRIDE { ShadowWordPain_Timer = 5000; + Yell60 = false; + Yell30 = false; } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -81,9 +83,6 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (!instance) - return; - //Any other Actions to do with vorrel? setStandState? if (Creature* vorrel = Creature::GetCreature(*me, instance->GetData64(DATA_VORREL))) vorrel->AI()->Talk(SAY_TRIGGER_VORREL); diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp index 403416bb20..6490ee38ab 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp @@ -65,7 +65,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_scarlet_commander_mograineAI(creature); + return GetInstanceAI(creature); } struct boss_scarlet_commander_mograineAI : public ScriptedAI @@ -94,9 +94,8 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_STAND); - if (instance) - if (me->IsAlive()) - instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED); + if (me->IsAlive()) + instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED); _bHasDied = false; _bHeal = false; @@ -105,11 +104,8 @@ public: void JustReachedHome() OVERRIDE { - if (instance) - { - if (instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) != NOT_STARTED) - instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, FAIL); - } + if (instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) != NOT_STARTED) + instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, FAIL); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -130,9 +126,6 @@ public: if (damage < me->GetHealth() || _bHasDied || _bFakeDeath) return; - if (!instance) - return; - //On first death, fake death and open door, as well as initiate whitemane if exist if (Unit* Whitemane = Unit::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) { @@ -145,7 +138,7 @@ public: me->SetHealth(0); - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); me->ClearComboPointHolders(); @@ -170,8 +163,7 @@ public: Talk(SAY_MO_RESSURECTED); _bFakeDeath = false; - if (instance) - instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, SPECIAL); + instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, SPECIAL); } } @@ -231,7 +223,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_high_inquisitor_whitemaneAI(creature); + return GetInstanceAI(creature); } struct boss_high_inquisitor_whitemaneAI : public ScriptedAI @@ -261,9 +253,8 @@ public: _bCanResurrectCheck = false; _bCanResurrect = false; - if (instance) - if (me->IsAlive()) - instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED); + if (me->IsAlive()) + instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED); } void AttackStart(Unit* who) OVERRIDE @@ -313,7 +304,7 @@ public: //Cast Deep sleep when health is less than 50% if (!_bCanResurrectCheck && !HealthAbovePct(50)) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); DoCastVictim(SPELL_DEEPSLEEP); @@ -334,14 +325,11 @@ public: if (!HealthAbovePct(75)) target = me; - if (instance) + if (Creature* mograine = Unit::GetCreature((*me), instance->GetData64(DATA_MOGRAINE))) { - if (Creature* mograine = Unit::GetCreature((*me), instance->GetData64(DATA_MOGRAINE))) - { - // checking _bCanResurrectCheck prevents her healing Mograine while he is "faking death" - if (_bCanResurrectCheck && mograine->IsAlive() && !mograine->HealthAbovePct(75)) - target = mograine; - } + // checking _bCanResurrectCheck prevents her healing Mograine while he is "faking death" + if (_bCanResurrectCheck && mograine->IsAlive() && !mograine->HealthAbovePct(75)) + target = mograine; } if (target) diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index 2277c53ae6..558dc030ea 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -128,7 +128,7 @@ class boss_darkmaster_gandling : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_darkmaster_gandlingAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp index 88f95df69c..0f3929bda3 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp @@ -99,7 +99,7 @@ class boss_instructor_malicia : public CreatureScript events.ScheduleEvent(EVENT_RENEW, 10000); break; case EVENT_FLASHHEAL: - //5 Flashheals will be casted + //5 Flashheals will be cast DoCast(me, SPELL_FLASHHEAL); if (FlashCounter < 2) { @@ -113,7 +113,7 @@ class boss_instructor_malicia : public CreatureScript } break; case EVENT_HEALINGTOUCH: - //3 Healing Touch will be casted + //3 Healing Touch will be cast DoCast(me, SPELL_HEALINGTOUCH); if (TouchCounter < 2) { diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp index 2663146317..cbd996d04f 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp @@ -32,7 +32,7 @@ enum Spells //SPELL_ILLUSION = 17773, // Spells of Illusion of Jandice Barov - SPELL_CLEAVE = 15584 + SPELL_CLEAVE = 15284 }; class boss_jandice_barov : public CreatureScript 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 2433390f8f..e485db94e4 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -253,7 +253,7 @@ class boss_kirtonos_the_herald : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kirtonos_the_heraldAI(creature); + return GetInstanceAI(creature); } }; 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 e06c0d6bfb..17524ddf2b 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp @@ -28,8 +28,9 @@ EndScriptData */ enum Spells { - SPELL_IMMOLATE = 20294, // Old ID was 15570 - SPELL_VEILOFSHADOW = 17820 + SPELL_IMMOLATE = 20294, + SPELL_VEILOFSHADOW = 17820, + SPELL_UNHOLY_AURA = 17467 }; enum Events @@ -49,7 +50,9 @@ class boss_lord_alexei_barov : public CreatureScript void Reset() OVERRIDE { _Reset(); - me->LoadCreaturesAddon(); + + if (!me->HasAura(SPELL_UNHOLY_AURA)) + DoCast(me, SPELL_UNHOLY_AURA); } void EnterCombat(Unit* /*who*/) OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp index 8d89592090..b7ce218008 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp @@ -72,7 +72,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_shadowfang_prisonerAI(creature); + return GetInstanceAI(creature); } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE @@ -135,8 +135,7 @@ public: else Talk(SAY_POST1_DOOR_AD); - if (instance) - instance->SetData(TYPE_FREE_NPC, DONE); + instance->SetData(TYPE_FREE_NPC, DONE); break; case 13: if (me->GetEntry() != NPC_ASH) @@ -158,7 +157,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_arugal_voidwalkerAI(creature); + return GetInstanceAI(creature); } struct npc_arugal_voidwalkerAI : public ScriptedAI @@ -196,8 +195,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(TYPE_FENRUS, instance->GetData(TYPE_FENRUS) + 1); + instance->SetData(TYPE_FENRUS, instance->GetData(TYPE_FENRUS) + 1); } }; diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp index 16ec442d96..b6e7f850a0 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp @@ -68,7 +68,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_baron_rivendareAI(creature); + return GetInstanceAI(creature); } struct boss_baron_rivendareAI : public ScriptedAI @@ -99,8 +99,8 @@ public: void AttackStart(Unit* who) OVERRIDE { - if (instance)//can't use entercombat(), boss' dmg aura sets near players in combat, before entering the room's door - instance->SetData(TYPE_BARON, IN_PROGRESS); + //can't use entercombat(), boss' dmg aura sets near players in combat, before entering the room's door + instance->SetData(TYPE_BARON, IN_PROGRESS); ScriptedAI::AttackStart(who); } @@ -110,11 +110,10 @@ public: summoned->AI()->AttackStart(target); } - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (instance) - instance->SetData(TYPE_BARON, DONE); - } + void JustDied(Unit* /*killer*/) OVERRIDE + { + instance->SetData(TYPE_BARON, DONE); + } void UpdateAI(uint32 diff) OVERRIDE { diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp index 1812e2efd8..5cfa3766e1 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp @@ -42,7 +42,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_baroness_anastariAI(creature); + return GetInstanceAI(creature); } struct boss_baroness_anastariAI : public ScriptedAI @@ -71,11 +71,10 @@ public: { } - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (instance) - instance->SetData(TYPE_BARONESS, IN_PROGRESS); - } + void JustDied(Unit* /*killer*/) OVERRIDE + { + instance->SetData(TYPE_BARONESS, IN_PROGRESS); + } void UpdateAI(uint32 diff) OVERRIDE { diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp index 5847f7b132..951cb8e265 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp @@ -162,7 +162,7 @@ public: //BalnazzarTransform if (HealthBelowPct(40)) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); //restore hp, mana and stun diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp index 0f8340891a..daa5e754d1 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp @@ -43,7 +43,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_maleki_the_pallidAI(creature); + return GetInstanceAI(creature); } struct boss_maleki_the_pallidAI : public ScriptedAI @@ -72,8 +72,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(TYPE_PALLID, IN_PROGRESS); + instance->SetData(TYPE_PALLID, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp index 2cacf80e27..0a73e0ea47 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp @@ -42,7 +42,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_nerubenkanAI(creature); + return GetInstanceAI(creature); } struct boss_nerubenkanAI : public ScriptedAI @@ -73,8 +73,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(TYPE_NERUB, IN_PROGRESS); + instance->SetData(TYPE_NERUB, IN_PROGRESS); } void RaiseUndeadScarab(Unit* victim) diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp index 706c2e7b6f..7a3200bd16 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp @@ -58,7 +58,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_silver_hand_bossesAI(creature); + return GetInstanceAI(creature); } struct boss_silver_hand_bossesAI : public ScriptedAI @@ -78,26 +78,23 @@ public: HolyLight_Timer = 20000; DivineShield_Timer = 20000; - if (instance) + switch (me->GetEntry()) { - switch (me->GetEntry()) - { - case SH_AELMAR: - instance->SetData(TYPE_SH_AELMAR, 0); - break; - case SH_CATHELA: - instance->SetData(TYPE_SH_CATHELA, 0); - break; - case SH_GREGOR: - instance->SetData(TYPE_SH_GREGOR, 0); - break; - case SH_NEMAS: - instance->SetData(TYPE_SH_NEMAS, 0); - break; - case SH_VICAR: - instance->SetData(TYPE_SH_VICAR, 0); - break; - } + case SH_AELMAR: + instance->SetData(TYPE_SH_AELMAR, 0); + break; + case SH_CATHELA: + instance->SetData(TYPE_SH_CATHELA, 0); + break; + case SH_GREGOR: + instance->SetData(TYPE_SH_GREGOR, 0); + break; + case SH_NEMAS: + instance->SetData(TYPE_SH_NEMAS, 0); + break; + case SH_VICAR: + instance->SetData(TYPE_SH_VICAR, 0); + break; } } @@ -107,9 +104,6 @@ public: void JustDied(Unit* killer) OVERRIDE { - if (!instance) - return; - switch (me->GetEntry()) { case SH_AELMAR: diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp index 79b8dd7dfe..91e7ed222c 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp @@ -45,7 +45,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ramstein_the_gorgerAI(creature); + return GetInstanceAI(creature); } struct boss_ramstein_the_gorgerAI : public ScriptedAI @@ -78,8 +78,7 @@ public: mob->AI()->AttackStart(me->SelectNearestTarget(100.0f)); } - if (instance) - instance->SetData(TYPE_RAMSTEIN, DONE); + instance->SetData(TYPE_RAMSTEIN, DONE); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp index 37dda5a969..d80196f79e 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp @@ -217,7 +217,7 @@ public: { if (ConflagrationTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { me->InterruptSpell(CURRENT_GENERIC_SPELL); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) @@ -230,7 +230,7 @@ public: { if (ShadownovaTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); if (target) @@ -249,7 +249,7 @@ public: if (ConfoundingblowTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_CONFOUNDING_BLOW); @@ -276,7 +276,7 @@ public: if (ShadowbladesTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { DoCast(me, SPELL_SHADOW_BLADES); ShadowbladesTimer = 10000; @@ -291,7 +291,7 @@ public: Enraged = true; } else EnrageTimer -= diff; - if (me->isAttackReady() && !me->IsNonMeleeSpellCasted(false)) + if (me->isAttackReady() && !me->IsNonMeleeSpellCast(false)) { //If we are within range melee the target if (me->IsWithinMeleeRange(me->GetVictim())) @@ -548,7 +548,7 @@ public: { if (ShadownovaTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_SHADOW_NOVA); @@ -560,7 +560,7 @@ public: { if (ConflagrationTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { me->InterruptSpell(CURRENT_GENERIC_SPELL); Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); @@ -582,7 +582,7 @@ public: if (FlamesearTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { DoCast(me, SPELL_FLAME_SEAR); FlamesearTimer = 15000; @@ -591,7 +591,7 @@ public: if (PyrogenicsTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { DoCast(me, SPELL_PYROGENICS, true); PyrogenicsTimer = 15000; @@ -600,7 +600,7 @@ public: if (BlazeTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { DoCastVictim(SPELL_BLAZE); BlazeTimer = 3800; @@ -691,7 +691,7 @@ public: if (DarkstrikeTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { //If we are within range melee the target if (me->IsWithinMeleeRange(me->GetVictim())) diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index 80b4b98b0a..a52c008a16 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -404,7 +404,7 @@ public: events.Update(diff); - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; if (phase == PHASE_GROUND) diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index 28f4bae9f0..70331a87ab 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -441,7 +441,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kalecAI(creature); + return GetInstanceAI(creature); } struct boss_kalecAI : public ScriptedAI @@ -464,8 +464,7 @@ public: void Reset() OVERRIDE { - if (instance) - SathGUID = instance->GetData64(DATA_SATHROVARR); + SathGUID = instance->GetData64(DATA_SATHROVARR); RevitalizeTimer = 5000; HeroicStrikeTimer = 3000; @@ -575,7 +574,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_sathrovarrAI(creature); + return GetInstanceAI(creature); } struct boss_sathrovarrAI : public ScriptedAI @@ -605,11 +604,8 @@ public: { me->SetFullHealth();//dunno why it does not resets health at evade.. me->setActive(true); - if (instance) - { - KalecgosGUID = instance->GetData64(DATA_KALECGOS_DRAGON); - instance->SetBossState(DATA_KALECGOS, NOT_STARTED); - } + KalecgosGUID = instance->GetData64(DATA_KALECGOS_DRAGON); + instance->SetBossState(DATA_KALECGOS, NOT_STARTED); if (KalecGUID) { if (Creature* Kalec = ObjectAccessor::GetCreature(*me, KalecGUID)) @@ -674,8 +670,7 @@ public: CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = true; } - if (instance) - instance->SetBossState(DATA_KALECGOS, DONE); + instance->SetBossState(DATA_KALECGOS, DONE); } void TeleportAllPlayersBack() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index b3982200a1..c949e4d103 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -236,7 +236,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kalecgos_kjAI(creature); + return GetInstanceAI(creature); } struct boss_kalecgos_kjAI : public ScriptedAI @@ -265,9 +265,6 @@ public: GameObject* GetOrb(int32 index) { - if (!instance) - return NULL; - switch (index) { case 0: @@ -389,7 +386,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_kiljaeden_controllerAI(creature); + return GetInstanceAI(creature); } struct npc_kiljaeden_controllerAI : public ScriptedAI @@ -424,9 +421,8 @@ public: { phase = PHASE_DECEIVERS; - if (instance) - if (Creature* pKalecKJ = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ))) - CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs(); + if (Creature* pKalecKJ = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ))) + CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs(); deceiverDeathCount = 0; bSummonedDeceivers = false; bKiljaedenDeath = false; @@ -710,7 +706,7 @@ public: SpeechTimer += diff; break; case TIMER_SOUL_FLAY: - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { DoCastVictim(SPELL_SOUL_FLAY_SLOW, false); DoCastVictim(SPELL_SOUL_FLAY, false); @@ -718,7 +714,7 @@ public: } break; case TIMER_LEGION_LIGHTNING: - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { Unit* pRandomPlayer = NULL; @@ -740,7 +736,7 @@ public: } break; case TIMER_FIRE_BLOOM: - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { me->RemoveAurasDueToSpell(SPELL_SOUL_FLAY); DoCastAOE(SPELL_FIRE_BLOOM, false); @@ -760,7 +756,7 @@ public: Timer[TIMER_SOUL_FLAY] = 2000; break; case TIMER_SHADOW_SPIKE: //Phase 3 - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { CastSinisterReflection(); DoCastAOE(SPELL_SHADOW_SPIKE, false); @@ -774,7 +770,7 @@ public: Timer[TIMER_FLAME_DART] = 3000; /// @todo Timer break; case TIMER_DARKNESS: //Phase 3 - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { // Begins to channel for 8 seconds, then deals 50'000 damage to all raid members. if (!IsInDarkness) @@ -927,9 +923,6 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (!instance) - return; - if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER))) ++(CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->deceiverDeathCount); } @@ -1150,7 +1143,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_shield_orbAI(creature); + return GetInstanceAI(creature); } struct npc_shield_orbAI : public ScriptedAI diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 8da162bae1..5d525103d5 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -371,7 +371,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_muru_portalAI(creature); + return GetInstanceAI(creature); } struct npc_muru_portalAI : public ScriptedAI @@ -405,9 +405,8 @@ public: void JustSummoned(Creature* summoned) OVERRIDE { - if (instance) - if (Player* Target = ObjectAccessor::GetPlayer(*me, instance->GetData64(DATA_PLAYER_GUID))) - summoned->AI()->AttackStart(Target); + if (Player* Target = ObjectAccessor::GetPlayer(*me, instance->GetData64(DATA_PLAYER_GUID))) + summoned->AI()->AttackStart(Target); Summons.Summon(summoned); } @@ -571,7 +570,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_blackholeAI(creature); + return GetInstanceAI(creature); } struct npc_blackholeAI : public ScriptedAI @@ -593,6 +592,7 @@ public: DespawnTimer = 15000; SpellTimer = 5000; Phase = 0; + NeedForAHack = 0; me->AddUnitState(UNIT_STATE_STUNNED); DoCastAOE(SPELL_BLACKHOLE_SPAWN, true); diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp index 69ee53f076..726b9ea31a 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp @@ -86,8 +86,7 @@ class boss_archaedas : public CreatureScript bGuardiansAwake = false; bVaultWalkersAwake = false; - if (instance) - instance->SetData(0, 5); // respawn any dead minions + instance->SetData(0, 5); // respawn any dead minions me->setFaction(35); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); @@ -132,8 +131,6 @@ class boss_archaedas : public CreatureScript void UpdateAI(uint32 uiDiff) OVERRIDE { - if (!instance) - return; // we're still doing awaken animation if (bWakingUp && iAwakenTimer >= 0) { @@ -196,17 +193,14 @@ class boss_archaedas : public CreatureScript void JustDied (Unit* /*killer*/) { - if (instance) - { - instance->SetData(DATA_ANCIENT_DOOR, DONE); // open the vault door - instance->SetData(DATA_MINIONS, SPECIAL); // deactivate his minions - } + instance->SetData(DATA_ANCIENT_DOOR, DONE); // open the vault door + instance->SetData(DATA_MINIONS, SPECIAL); // deactivate his minions } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_archaedasAI(creature); + return GetInstanceAI(creature); } }; @@ -305,7 +299,7 @@ class npc_archaedas_minions : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_archaedas_minionsAI(creature); + return GetInstanceAI(creature); } }; @@ -361,14 +355,13 @@ class npc_stonekeepers : public CreatureScript void JustDied(Unit* /*attacker*/) OVERRIDE { DoCast (me, SPELL_SELF_DESTRUCT, true); - if (instance) - instance->SetData(DATA_STONE_KEEPERS, IN_PROGRESS); // activate next stonekeeper + instance->SetData(DATA_STONE_KEEPERS, IN_PROGRESS); // activate next stonekeeper } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_stonekeepersAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp index 830942ae2c..8ab31cc08f 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp @@ -48,14 +48,14 @@ class boss_ironaya : public CreatureScript boss_ironayaAI(Creature* creature) : ScriptedAI(creature) { } uint32 uiArcingTimer; - bool bHasCastedWstomp; - bool bHasCastedKnockaway; + bool bHasCastWstomp; + bool bHasCastKnockaway; void Reset() OVERRIDE { uiArcingTimer = 3000; - bHasCastedKnockaway = false; - bHasCastedWstomp = false; + bHasCastKnockaway = false; + bHasCastWstomp = false; } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -70,7 +70,7 @@ class boss_ironaya : public CreatureScript return; //If we are <50% hp do knockaway ONCE - if (!bHasCastedKnockaway && HealthBelowPct(50)) + if (!bHasCastKnockaway && HealthBelowPct(50)) { DoCastVictim(SPELL_KNOCKAWAY, true); @@ -84,7 +84,7 @@ class boss_ironaya : public CreatureScript me->TauntApply(target); //Shouldn't cast this agian - bHasCastedKnockaway = true; + bHasCastKnockaway = true; } //uiArcingTimer @@ -94,10 +94,10 @@ class boss_ironaya : public CreatureScript uiArcingTimer = 13000; } else uiArcingTimer -= uiDiff; - if (!bHasCastedWstomp && HealthBelowPct(25)) + if (!bHasCastWstomp && HealthBelowPct(25)) { DoCast(me, SPELL_WSTOMP); - bHasCastedWstomp = true; + bHasCastWstomp = true; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index 386b8818d5..415b04f34c 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -56,10 +56,10 @@ class boss_akilzon : public CreatureScript _JustDied(); } - void KilledUnit(Unit* victim) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_PLAYER_KILL); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void UpdateAI(uint32 diff) OVERRIDE @@ -88,7 +88,7 @@ class boss_akilzon : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetZulAmanAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index 8d9d1b5d5a..d9f05d929e 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -100,7 +100,7 @@ class boss_hexlord_malacrass : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetZulAmanAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp index 861c2921cd..b233e8ae54 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp @@ -97,7 +97,7 @@ class boss_janalai : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetZulAmanAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index fe7f99cebe..59809c13a7 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -102,7 +102,7 @@ class boss_nalorakk : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_nalorakkAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index 26cd58ab29..5f2729e9c4 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -126,7 +126,6 @@ class npc_voljin_zulaman : public CreatureScript void UpdateAI(uint32 diff) OVERRIDE { _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) @@ -214,7 +213,7 @@ class npc_voljin_zulaman : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetZulAmanAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index d7d9934d69..f12ac196ac 100644 --- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp @@ -39,17 +39,16 @@ EndContentData */ enum ProfessorPhizzlethorpe { // Yells - SAY_PROGRESS_1 = 0, - SAY_PROGRESS_2 = 1, - SAY_PROGRESS_3 = 2, - EMOTE_PROGRESS_4 = 3, - SAY_AGGRO = 4, - SAY_PROGRESS_5 = 5, - SAY_PROGRESS_6 = 6, - SAY_PROGRESS_7 = 7, - EMOTE_PROGRESS_8 = 8, - SAY_PROGRESS_9 = 9, - + SAY_PROGRESS_1 = 0, + SAY_PROGRESS_2 = 1, + SAY_PROGRESS_3 = 2, + EMOTE_PROGRESS_4 = 3, + SAY_AGGRO = 4, + SAY_PROGRESS_5 = 5, + SAY_PROGRESS_6 = 6, + SAY_PROGRESS_7 = 7, + EMOTE_PROGRESS_8 = 8, + SAY_PROGRESS_9 = 9, EVENT_SAY_3 = 1, EVENT_SAY_6 = 2, EVENT_SAY_8 = 3, @@ -57,19 +56,15 @@ enum ProfessorPhizzlethorpe // Quests QUEST_SUNKEN_TREASURE = 665, QUEST_GOGGLE_BOGGLE = 26050, - // Creatures - NPC_VENGEFUL_SURGE = 2776 + NPC_VENGEFUL_SURGE = 2776, + FACTION_SUNKEN_TREASURE = 113 }; class npc_professor_phizzlethorpe : public CreatureScript { public: - - npc_professor_phizzlethorpe() - : CreatureScript("npc_professor_phizzlethorpe") - { - } + npc_professor_phizzlethorpe() : CreatureScript("npc_professor_phizzlethorpe") { } struct npc_professor_phizzlethorpeAI : public npc_escortAI { @@ -113,6 +108,16 @@ class npc_professor_phizzlethorpe : public CreatureScript Talk(SAY_AGGRO); } + void sQuestAccept(Player* player, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) + { + Talk(SAY_PROGRESS_1, player); + npc_escortAI::Start(false, false, player->GetGUID(), quest); + me->setFaction(FACTION_SUNKEN_TREASURE); + } + } + void UpdateAI(uint32 diff) OVERRIDE { Player* player = GetPlayerForEscort(); @@ -145,23 +150,10 @@ class npc_professor_phizzlethorpe : public CreatureScript EventMap events; }; - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_professor_phizzlethorpeAI(creature); - } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE - { - if (quest->GetQuestId() == QUEST_GOGGLE_BOGGLE) - { - creature->AI()->Talk(SAY_PROGRESS_1, player); - if (npc_escortAI* pEscortAI = CAST_AI(npc_professor_phizzlethorpeAI, (creature->AI()))) - pEscortAI->Start(false, false, player->GetGUID(), quest); - - creature->setFaction(42); - } - return true; - } + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_professor_phizzlethorpeAI(creature); + } }; void AddSC_arathi_highlands() diff --git a/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp index b102873e94..c212592d49 100644 --- a/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * 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 @@ -16,28 +15,26 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Blasted_Lands -SD%Complete: 90 -SDComment: Quest support: 3628. Teleporter to Rise of the Defiler missing group support. -SDCategory: Blasted Lands -EndScriptData */ +/* +Blasted_Lands +Quest support: 3628. Teleporter to Rise of the Defiler. +*/ -/* ContentData +/* npc_deathly_usher -EndContentData */ +*/ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "SpellScript.h" #include "Player.h" +#include "Group.h" /*###### ## npc_deathly_usher ######*/ -#define GOSSIP_ITEM_USHER "I wish to to visit the Rise of the Defiler." - enum DeathlyUsher { SPELL_TELEPORT_SINGLE = 12885, @@ -50,30 +47,72 @@ class npc_deathly_usher : public CreatureScript public: npc_deathly_usher() : CreatureScript("npc_deathly_usher") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE + struct npc_deathly_usherAI : public ScriptedAI { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF) + npc_deathly_usherAI(Creature* creature) : ScriptedAI(creature) { } + + void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) OVERRIDE { player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, SPELL_TELEPORT_SINGLE, true); + me->CastSpell(player, SPELL_TELEPORT_GROUP, true); } + }; - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - if (player->GetQuestStatus(3628) == QUEST_STATUS_INCOMPLETE && player->HasItemCount(10757)) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_USHER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; + return new npc_deathly_usherAI(creature); } }; +/*##### +# spell_razelikh_teleport_group +#####*/ + +class spell_razelikh_teleport_group : public SpellScriptLoader +{ + public: spell_razelikh_teleport_group() : SpellScriptLoader("spell_razelikh_teleport_group") { } + + class spell_razelikh_teleport_group_SpellScript : public SpellScript + { + PrepareSpellScript(spell_razelikh_teleport_group_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_TELEPORT_SINGLE) && !sSpellMgr->GetSpellInfo(SPELL_TELEPORT_SINGLE_IN_GROUP)) + return false; + return true; + } + + void HandleScriptEffect(SpellEffIndex /* effIndex */) + { + if (Player* player = GetHitPlayer()) + { + if (Group* group = player->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + if (Player* member = itr->GetSource()) + if (member->IsWithinDistInMap(player, 20.0f) && !member->isDead()) + member->CastSpell(member, SPELL_TELEPORT_SINGLE_IN_GROUP, true); + } + else + player->CastSpell(player, SPELL_TELEPORT_SINGLE, true); + } + } + + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_razelikh_teleport_group_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_razelikh_teleport_group_SpellScript(); + } +}; + void AddSC_blasted_lands() { new npc_deathly_usher(); + new spell_razelikh_teleport_group(); } diff --git a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp index e575965987..fbb8db41fa 100644 --- a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp @@ -23,6 +23,38 @@ SDComment: SDCategory: Burning Steppes EndScriptData */ +enum RaggedJohn +{ + QUEST_THE_TRUE_MASTERS = 4224, + QUEST_MOTHERS_MILK = 4866, + SPELL_MOTHERS_MILK = 16468, + SPELL_WICKED_MILKING = 16472 +}; + + struct npc_ragged_johnAI : public ScriptedAI + { + npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() OVERRIDE { } + + void MoveInLineOfSight(Unit* who) OVERRIDE + { + if (who->HasAura(SPELL_MOTHERS_MILK)) + { + if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me)) + { + DoCast(who, SPELL_WICKED_MILKING); + if (Player* player = who->ToPlayer()) + player->AreaExploredOrEventHappens(QUEST_MOTHERS_MILK); + } + } + + ScriptedAI::MoveInLineOfSight(who); + } + + void EnterCombat(Unit* /*who*/) OVERRIDE { } + }; + void AddSC_burning_steppes() { diff --git a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp index a7fa73fa4a..7c9e33c98b 100644 --- a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp +++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp @@ -27,81 +27,45 @@ EndScriptData */ #include "ScriptedCreature.h" #include "Player.h" -enum Yells +enum TwilightCorrupter { - YELL_TWILIGHTCORRUPTOR_RESPAWN = 0, - YELL_TWILIGHTCORRUPTOR_AGGRO = 1, - YELL_TWILIGHTCORRUPTOR_KILL = 2, -}; + ITEM_FRAGMENT = 21149, + NPC_TWILIGHT_CORRUPTER = 15625, + YELL_TWILIGHTCORRUPTOR_RESPAWN = 0, + YELL_TWILIGHTCORRUPTOR_AGGRO = 1, + YELL_TWILIGHTCORRUPTOR_KILL = 2, + SPELL_SOUL_CORRUPTION = 25805, + SPELL_CREATURE_OF_NIGHTMARE = 25806, + SPELL_LEVEL_UP = 24312, - -/*###### -# at_twilight_grove -######*/ - -class at_twilight_grove : public AreaTriggerScript -{ -public: - at_twilight_grove() : AreaTriggerScript("at_twilight_grove") { } - - bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) OVERRIDE - { - if (player->HasQuestForItem(21149)) - { - if (Unit* TCorrupter = player->SummonCreature(15625, -10328.16f, -489.57f, 49.95f, 0, TEMPSUMMON_MANUAL_DESPAWN, 60000)) - { - TCorrupter->setFaction(14); - TCorrupter->SetMaxHealth(832750); - } - if (Creature* CorrupterSpeaker = player->SummonCreature(1, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()-1, 0, TEMPSUMMON_TIMED_DESPAWN, 15000)) - { - CorrupterSpeaker->SetName("Twilight Corrupter"); - CorrupterSpeaker->SetVisible(true); - CorrupterSpeaker->AI()->Talk(YELL_TWILIGHTCORRUPTOR_RESPAWN, player); - } - } - return false; - }; + EVENT_SOUL_CORRUPTION = 1, + EVENT_CREATURE_OF_NIGHTMARE = 2, + FACTION_HOSTILE = 14 }; /*###### # boss_twilight_corrupter ######*/ -enum TwilightCorrupter -{ - SPELL_SOUL_CORRUPTION = 25805, - SPELL_CREATURE_OF_NIGHTMARE = 25806, - SPELL_LEVEL_UP = 24312 -}; - class boss_twilight_corrupter : public CreatureScript { public: boss_twilight_corrupter() : CreatureScript("boss_twilight_corrupter") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_twilight_corrupterAI(creature); - } - struct boss_twilight_corrupterAI : public ScriptedAI { boss_twilight_corrupterAI(Creature* creature) : ScriptedAI(creature) { } - uint32 SoulCorruption_Timer; - uint32 CreatureOfNightmare_Timer; - uint8 KillCount; - void Reset() OVERRIDE { - SoulCorruption_Timer = 15000; - CreatureOfNightmare_Timer = 30000; - KillCount = 0; + KillCount = 0; } + void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(YELL_TWILIGHTCORRUPTOR_AGGRO); + _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, 15000); + _events.ScheduleEvent(EVENT_CREATURE_OF_NIGHTMARE, 30000); } void KilledUnit(Unit* victim) OVERRIDE @@ -123,19 +87,63 @@ public: { if (!UpdateVictim()) return; - if (SoulCorruption_Timer <= diff) - { - DoCastVictim(SPELL_SOUL_CORRUPTION); - SoulCorruption_Timer = rand()%4000+15000; //gotta confirm Timers - } else SoulCorruption_Timer-=diff; - if (CreatureOfNightmare_Timer <= diff) + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) { - DoCastVictim(SPELL_CREATURE_OF_NIGHTMARE); - CreatureOfNightmare_Timer = 45000; //gotta confirm Timers - } else CreatureOfNightmare_Timer-=diff; + switch (eventId) + { + case EVENT_SOUL_CORRUPTION: + DoCastVictim(SPELL_SOUL_CORRUPTION); + _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, rand()%4000+15000); + break; + case EVENT_CREATURE_OF_NIGHTMARE: + DoCastVictim(SPELL_CREATURE_OF_NIGHTMARE); + _events.ScheduleEvent(EVENT_CREATURE_OF_NIGHTMARE, 45000); + break; + default: + break; + } + } DoMeleeAttackIfReady(); - }; + } + + private: + EventMap _events; + uint8 KillCount; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_twilight_corrupterAI(creature); + } +}; + +/*###### +# at_twilight_grove +######*/ + +class at_twilight_grove : public AreaTriggerScript +{ +public: + at_twilight_grove() : AreaTriggerScript("at_twilight_grove") { } + + bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) OVERRIDE + { + if (player->HasQuestForItem(ITEM_FRAGMENT)) + { + if (Unit* corrupter = player->SummonCreature(NPC_TWILIGHT_CORRUPTER, -10328.16f, -489.57f, 49.95f, 0, TEMPSUMMON_MANUAL_DESPAWN, 60000)) + corrupter->setFaction(FACTION_HOSTILE); + + if (Creature* CorrupterSpeaker = player->SummonCreature(1, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()-1, 0, TEMPSUMMON_TIMED_DESPAWN, 15000)) + { + CorrupterSpeaker->SetName("Twilight Corrupter"); + CorrupterSpeaker->SetVisible(true); + CorrupterSpeaker->AI()->Talk(YELL_TWILIGHTCORRUPTOR_RESPAWN, player); + } + } + return false; }; }; diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp index bb7cab832d..450445fc9f 100644 --- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -24,7 +24,6 @@ SDCategory: Ghostlands EndScriptData */ /* ContentData -npc_rathis_tomber npc_ranger_lilatha EndContentData */ @@ -36,46 +35,12 @@ EndContentData */ #include "WorldSession.h" /*###### -## npc_rathis_tomber -######*/ -class npc_rathis_tomber : public CreatureScript -{ -public: - npc_rathis_tomber() : CreatureScript("npc_rathis_tomber") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor() && player->GetQuestRewardStatus(9152)) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - player->SEND_GOSSIP_MENU(8432, creature->GetGUID()); - } - else - player->SEND_GOSSIP_MENU(8431, creature->GetGUID()); - - return true; - } -}; - -/*###### ## npc_ranger_lilatha ######*/ enum RangerLilatha { - // Yells SAY_START = 0, SAY_PROGRESS1 = 1, SAY_PROGRESS2 = 2, @@ -83,18 +48,12 @@ enum RangerLilatha SAY_END1 = 4, SAY_END2 = 5, SAY_CAPTAIN_ANSWER = 0, - - // Quests QUEST_ESCAPE_FROM_THE_CATACOMBS = 9212, - - // Gameobjects GO_CAGE = 181152, - - // Creature NPC_CAPTAIN_HELIOS = 16220, - - // Factions - FACTION_SMOON_E = 1603 + NPC_MUMMIFIED_HEADHUNTER = 16342, + NPC_SHADOWPINE_ORACLE = 16343, + FACTION_QUEST_ESCAPE = 113 }; class npc_ranger_lilatha : public CreatureScript @@ -130,8 +89,8 @@ public: case 18: { Talk(SAY_PROGRESS3, player); - Creature* Summ1 = me->SummonCreature(16342, 7627.083984f, -7532.538086f, 152.128616f, 1.082733f, TEMPSUMMON_DEAD_DESPAWN, 0); - Creature* Summ2 = me->SummonCreature(16343, 7620.432129f, -7532.550293f, 152.454865f, 0.827478f, TEMPSUMMON_DEAD_DESPAWN, 0); + Creature* Summ1 = me->SummonCreature(NPC_MUMMIFIED_HEADHUNTER, 7627.083984f, -7532.538086f, 152.128616f, 1.082733f, TEMPSUMMON_DEAD_DESPAWN, 0); + Creature* Summ2 = me->SummonCreature(NPC_SHADOWPINE_ORACLE, 7620.432129f, -7532.550293f, 152.454865f, 0.827478f, TEMPSUMMON_DEAD_DESPAWN, 0); if (Summ1 && Summ2) { Summ1->Attack(me, true); @@ -174,7 +133,7 @@ public: { if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS) { - creature->setFaction(113); + creature->setFaction(FACTION_QUEST_ESCAPE); if (npc_escortAI* pEscortAI = CAST_AI(npc_ranger_lilatha::npc_ranger_lilathaAI, creature->AI())) pEscortAI->Start(true, false, player->GetGUID()); @@ -191,6 +150,5 @@ public: void AddSC_ghostlands() { - new npc_rathis_tomber(); new npc_ranger_lilatha(); } diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index d833ebc582..c3512ed7f7 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -24,7 +24,7 @@ SDCategory: The Hinterlands EndScriptData */ /* ContentData -npc_00x09hl +npc_oox09hl EndContentData */ #include "ScriptMgr.h" @@ -33,7 +33,7 @@ EndContentData */ #include "Player.h" /*###### -## npc_00x09hl +## npc_oox09hl ######*/ enum eOOX @@ -43,51 +43,48 @@ enum eOOX SAY_OOX_AMBUSH = 2, SAY_OOX_AMBUSH_REPLY = 3, SAY_OOX_END = 4, - QUEST_RESQUE_OOX_09 = 836, - NPC_MARAUDING_OWL = 7808, NPC_VILE_AMBUSHER = 7809, - FACTION_ESCORTEE_A = 774, FACTION_ESCORTEE_H = 775 }; -class npc_00x09hl : public CreatureScript +class npc_oox09hl : public CreatureScript { public: - npc_00x09hl() : CreatureScript("npc_00x09hl") { } + npc_oox09hl() : CreatureScript("npc_oox09hl") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) + struct npc_oox09hlAI : public npc_escortAI { - if (quest->GetQuestId() == QUEST_RESQUE_OOX_09) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - - if (player->GetTeam() == ALLIANCE) - creature->setFaction(FACTION_ESCORTEE_A); - else if (player->GetTeam() == HORDE) - creature->setFaction(FACTION_ESCORTEE_H); - - creature->AI()->Talk(SAY_OOX_START, player); - - if (npc_00x09hlAI* pEscortAI = CAST_AI(npc_00x09hl::npc_00x09hlAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_00x09hlAI(creature); - } - - struct npc_00x09hlAI : public npc_escortAI - { - npc_00x09hlAI(Creature* creature) : npc_escortAI(creature) { } + npc_oox09hlAI(Creature* creature) : npc_escortAI(creature) { } void Reset() OVERRIDE { } + void EnterCombat(Unit* who) OVERRIDE + { + if (who->GetEntry() == NPC_MARAUDING_OWL || who->GetEntry() == NPC_VILE_AMBUSHER) + return; + + Talk(SAY_OOX_AGGRO); + } + + void JustSummoned(Creature* summoned) OVERRIDE + { + summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + } + + void sQuestAccept(Player* player, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_RESQUE_OOX_09) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + me->setFaction(player->GetTeam() == ALLIANCE ? FACTION_ESCORTEE_A : FACTION_ESCORTEE_H); + Talk(SAY_OOX_START, player); + npc_escortAI::Start(false, false, player->GetGUID(), quest); + } + } + void WaypointReached(uint32 waypointId) { switch (waypointId) @@ -106,9 +103,9 @@ public: } } - void WaypointStart(uint32 uiPointId) + void WaypointStart(uint32 pointId) OVERRIDE { - switch (uiPointId) + switch (pointId) { case 27: for (uint8 i = 0; i < 3; ++i) @@ -130,23 +127,15 @@ public: break; } } - - void EnterCombat(Unit* who) - { - if (who->GetEntry() == NPC_MARAUDING_OWL || who->GetEntry() == NPC_VILE_AMBUSHER) - return; - - Talk(SAY_OOX_AGGRO); - } - - void JustSummoned(Creature* summoned) OVERRIDE - { - summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); - } }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_oox09hlAI(creature); + } }; void AddSC_hinterlands() { - new npc_00x09hl(); + new npc_oox09hl(); } diff --git a/src/server/scripts/Examples/example_spell.cpp b/src/server/scripts/Examples/example_spell.cpp index 2c76d9a40b..af028d539f 100644 --- a/src/server/scripts/Examples/example_spell.cpp +++ b/src/server/scripts/Examples/example_spell.cpp @@ -220,7 +220,7 @@ class spell_ex_66244 : public SpellScriptLoader // we initialize local variables if needed bool Load() OVERRIDE { - // do not load script if aura is casted by player or caster not avalible + // do not load script if aura is cast by player or caster not avalible if (Unit* caster = GetCaster()) if (caster->GetTypeId() == TYPEID_PLAYER) return true; diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp index e74ed93bc6..ac1403a26e 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp @@ -73,7 +73,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_blackfathom_deeps_eventAI(creature); + return GetInstanceAI(creature); } struct npc_blackfathom_deeps_eventAI : public ScriptedAI @@ -182,8 +182,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (me->IsSummon()) //we are not a normal spawn. - if (instance) - instance->SetData(DATA_EVENT, instance->GetData(DATA_EVENT) + 1); + instance->SetData(DATA_EVENT, instance->GetData(DATA_EVENT) + 1); } }; }; diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp index 139eed963c..55e28e3f19 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp @@ -31,7 +31,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_gelihastAI(creature); + return GetInstanceAI(creature); } struct boss_gelihastAI : public ScriptedAI @@ -48,20 +48,17 @@ public: void Reset() OVERRIDE { netTimer = urand(2000, 4000); - if (instance) - instance->SetData(TYPE_GELIHAST, NOT_STARTED); + instance->SetData(TYPE_GELIHAST, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetData(TYPE_GELIHAST, IN_PROGRESS); + instance->SetData(TYPE_GELIHAST, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(TYPE_GELIHAST, DONE); + instance->SetData(TYPE_GELIHAST, DONE); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp index 8eeedb6e15..e43ac0d4e7 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp @@ -36,7 +36,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kelrisAI(creature); + return GetInstanceAI(creature); } struct boss_kelrisAI : public ScriptedAI @@ -55,22 +55,19 @@ public: { mindBlastTimer = urand(2000, 5000); sleepTimer = urand(9000, 12000); - if (instance) - instance->SetData(TYPE_KELRIS, NOT_STARTED); + instance->SetData(TYPE_KELRIS, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(TYPE_KELRIS, IN_PROGRESS); + instance->SetData(TYPE_KELRIS, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - instance->SetData(TYPE_KELRIS, DONE); + instance->SetData(TYPE_KELRIS, DONE); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index 52f706d562..fa31628268 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -47,7 +47,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_anetheronAI(creature); + return GetInstanceAI(creature); } struct boss_anetheronAI : public hyjal_trashAI @@ -83,9 +83,10 @@ public: Talk(SAY_ONAGGRO); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_ONSLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_ONSLAY); } void WaypointReached(uint32 waypointId) OVERRIDE @@ -115,19 +116,16 @@ public: if (!go) { go = true; - if (instance) - { - AddWaypoint(0, 4896.08f, -1576.35f, 1333.65f); - AddWaypoint(1, 4898.68f, -1615.02f, 1329.48f); - AddWaypoint(2, 4907.12f, -1667.08f, 1321.00f); - AddWaypoint(3, 4963.18f, -1699.35f, 1340.51f); - AddWaypoint(4, 4989.16f, -1716.67f, 1335.74f); - AddWaypoint(5, 5026.27f, -1736.89f, 1323.02f); - AddWaypoint(6, 5037.77f, -1770.56f, 1324.36f); - AddWaypoint(7, 5067.23f, -1789.95f, 1321.17f); - Start(false, true); - SetDespawnAtEnd(false); - } + AddWaypoint(0, 4896.08f, -1576.35f, 1333.65f); + AddWaypoint(1, 4898.68f, -1615.02f, 1329.48f); + AddWaypoint(2, 4907.12f, -1667.08f, 1321.00f); + AddWaypoint(3, 4963.18f, -1699.35f, 1340.51f); + AddWaypoint(4, 4989.16f, -1716.67f, 1335.74f); + AddWaypoint(5, 5026.27f, -1736.89f, 1323.02f); + AddWaypoint(6, 5037.77f, -1770.56f, 1324.36f); + AddWaypoint(7, 5067.23f, -1789.95f, 1321.17f); + Start(false, true); + SetDespawnAtEnd(false); } } @@ -179,17 +177,15 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_towering_infernalAI(creature); + return GetInstanceAI(creature); } struct npc_towering_infernalAI : public ScriptedAI { npc_towering_infernalAI(Creature* creature) : ScriptedAI(creature) { - AnetheronGUID = 0; instance = creature->GetInstanceScript(); - if (instance) - AnetheronGUID = instance->GetData64(DATA_ANETHERON); + AnetheronGUID = instance->GetData64(DATA_ANETHERON); } uint32 ImmolationTimer; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 41cc1d0241..2708b39e8a 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -83,7 +83,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ancient_wispAI(creature); + return GetInstanceAI(creature); } struct npc_ancient_wispAI : public ScriptedAI @@ -102,8 +102,7 @@ public: { CheckTimer = 1000; - if (instance) - ArchimondeGUID = instance->GetData64(DATA_ARCHIMONDE); + ArchimondeGUID = instance->GetData64(DATA_ARCHIMONDE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } @@ -239,7 +238,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_archimondeAI(creature); + return GetInstanceAI(creature); } struct boss_archimondeAI : public hyjal_trashAI @@ -275,8 +274,7 @@ public: void Reset() OVERRIDE { - if (instance) - instance->SetData(DATA_ARCHIMONDEEVENT, NOT_STARTED); + instance->SetData(DATA_ARCHIMONDEEVENT, NOT_STARTED); DoomfireSpiritGUID = 0; damageTaken = 0; @@ -308,8 +306,7 @@ public: Talk(SAY_AGGRO); DoZoneInCombat(); - if (instance) - instance->SetData(DATA_ARCHIMONDEEVENT, IN_PROGRESS); + instance->SetData(DATA_ARCHIMONDEEVENT, IN_PROGRESS); } void KilledUnit(Unit* victim) OVERRIDE @@ -350,8 +347,7 @@ public: hyjal_trashAI::JustDied(killer); Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_ARCHIMONDEEVENT, DONE); + instance->SetData(DATA_ARCHIMONDEEVENT, DONE); } bool CanUseFingerOfDeath() @@ -471,19 +467,16 @@ public: { if (!me->IsInCombat()) { - if (instance) + // Do not let the raid skip straight to Archimonde. Visible and hostile ONLY if Azagalor is finished. + if ((instance->GetData(DATA_AZGALOREVENT) < DONE) && (me->IsVisible() || (me->getFaction() != 35))) { - // Do not let the raid skip straight to Archimonde. Visible and hostile ONLY if Azagalor is finished. - if ((instance->GetData(DATA_AZGALOREVENT) < DONE) && (me->IsVisible() || (me->getFaction() != 35))) - { - me->SetVisible(false); - me->setFaction(35); - } - else if ((instance->GetData(DATA_AZGALOREVENT) >= DONE) && (!me->IsVisible() || (me->getFaction() == 35))) - { - me->setFaction(1720); - me->SetVisible(true); - } + me->SetVisible(false); + me->setFaction(35); + } + else if ((instance->GetData(DATA_AZGALOREVENT) >= DONE) && (!me->IsVisible() || (me->getFaction() == 35))) + { + me->setFaction(1720); + me->SetVisible(true); } if (DrainNordrassilTimer <= diff) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp index dd486df16e..c4d68f76df 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp @@ -48,7 +48,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_azgalorAI(creature); + return GetInstanceAI(creature); } struct boss_azgalorAI : public hyjal_trashAI @@ -121,19 +121,16 @@ public: if (!go) { go = true; - if (instance) - { - AddWaypoint(0, 5492.91f, -2404.61f, 1462.63f); - AddWaypoint(1, 5531.76f, -2460.87f, 1469.55f); - AddWaypoint(2, 5554.58f, -2514.66f, 1476.12f); - AddWaypoint(3, 5554.16f, -2567.23f, 1479.90f); - AddWaypoint(4, 5540.67f, -2625.99f, 1480.89f); - AddWaypoint(5, 5508.16f, -2659.2f, 1480.15f); - AddWaypoint(6, 5489.62f, -2704.05f, 1482.18f); - AddWaypoint(7, 5457.04f, -2726.26f, 1485.10f); - Start(false, true); - SetDespawnAtEnd(false); - } + AddWaypoint(0, 5492.91f, -2404.61f, 1462.63f); + AddWaypoint(1, 5531.76f, -2460.87f, 1469.55f); + AddWaypoint(2, 5554.58f, -2514.66f, 1476.12f); + AddWaypoint(3, 5554.16f, -2567.23f, 1479.90f); + AddWaypoint(4, 5540.67f, -2625.99f, 1480.89f); + AddWaypoint(5, 5508.16f, -2659.2f, 1480.15f); + AddWaypoint(6, 5489.62f, -2704.05f, 1482.18f); + AddWaypoint(7, 5457.04f, -2726.26f, 1485.10f); + Start(false, true); + SetDespawnAtEnd(false); } } @@ -186,17 +183,15 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_lesser_doomguardAI(creature); + return GetInstanceAI(creature); } struct npc_lesser_doomguardAI : public hyjal_trashAI { npc_lesser_doomguardAI(Creature* creature) : hyjal_trashAI(creature) { - AzgalorGUID = 0; instance = creature->GetInstanceScript(); - if (instance) - AzgalorGUID = instance->GetData64(DATA_AZGALOR); + AzgalorGUID = instance->GetData64(DATA_AZGALOR); } uint32 CrippleTimer; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index 0c918f0b0c..eb4ef16889 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -49,7 +49,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kazrogalAI(creature); + return GetInstanceAI(creature); } struct boss_kazrogalAI : public hyjal_trashAI @@ -117,19 +117,16 @@ public: if (!go) { go = true; - if (instance) - { - AddWaypoint(0, 5492.91f, -2404.61f, 1462.63f); - AddWaypoint(1, 5531.76f, -2460.87f, 1469.55f); - AddWaypoint(2, 5554.58f, -2514.66f, 1476.12f); - AddWaypoint(3, 5554.16f, -2567.23f, 1479.90f); - AddWaypoint(4, 5540.67f, -2625.99f, 1480.89f); - AddWaypoint(5, 5508.16f, -2659.2f, 1480.15f); - AddWaypoint(6, 5489.62f, -2704.05f, 1482.18f); - AddWaypoint(7, 5457.04f, -2726.26f, 1485.10f); - Start(false, true); - SetDespawnAtEnd(false); - } + AddWaypoint(0, 5492.91f, -2404.61f, 1462.63f); + AddWaypoint(1, 5531.76f, -2460.87f, 1469.55f); + AddWaypoint(2, 5554.58f, -2514.66f, 1476.12f); + AddWaypoint(3, 5554.16f, -2567.23f, 1479.90f); + AddWaypoint(4, 5540.67f, -2625.99f, 1480.89f); + AddWaypoint(5, 5508.16f, -2659.2f, 1480.15f); + AddWaypoint(6, 5489.62f, -2704.05f, 1482.18f); + AddWaypoint(7, 5457.04f, -2726.26f, 1485.10f); + Start(false, true); + SetDespawnAtEnd(false); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp index c163e7c0f1..00c82b1117 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp @@ -44,7 +44,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_rage_winterchillAI(creature); + return GetInstanceAI(creature); } struct boss_rage_winterchillAI : public hyjal_trashAI @@ -112,19 +112,16 @@ public: if (!go) { go = true; - if (instance) - { - AddWaypoint(0, 4896.08f, -1576.35f, 1333.65f); - AddWaypoint(1, 4898.68f, -1615.02f, 1329.48f); - AddWaypoint(2, 4907.12f, -1667.08f, 1321.00f); - AddWaypoint(3, 4963.18f, -1699.35f, 1340.51f); - AddWaypoint(4, 4989.16f, -1716.67f, 1335.74f); - AddWaypoint(5, 5026.27f, -1736.89f, 1323.02f); - AddWaypoint(6, 5037.77f, -1770.56f, 1324.36f); - AddWaypoint(7, 5067.23f, -1789.95f, 1321.17f); - Start(false, true); - SetDespawnAtEnd(false); - } + AddWaypoint(0, 4896.08f, -1576.35f, 1333.65f); + AddWaypoint(1, 4898.68f, -1615.02f, 1329.48f); + AddWaypoint(2, 4907.12f, -1667.08f, 1321.00f); + AddWaypoint(3, 4963.18f, -1699.35f, 1340.51f); + AddWaypoint(4, 4989.16f, -1716.67f, 1335.74f); + AddWaypoint(5, 5026.27f, -1736.89f, 1323.02f); + AddWaypoint(6, 5037.77f, -1770.56f, 1324.36f); + AddWaypoint(7, 5067.23f, -1789.95f, 1321.17f); + Start(false, true); + SetDespawnAtEnd(false); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index f4d3f55958..a352c3493e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -102,6 +102,9 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { + if (!creature->GetInstanceScript()) + return NULL; + hyjalAI* ai = new hyjalAI(creature); ai->Reset(); @@ -184,6 +187,9 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { + if (!creature->GetInstanceScript()) + return NULL; + hyjalAI* ai = new hyjalAI(creature); ai->Reset(); @@ -209,6 +215,9 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { + if (!creature->GetInstanceScript()) + return NULL; + hyjalAI* ai = new hyjalAI(creature); ai->Reset(); ai->EnterEvadeMode(); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index 6d73485d98..70b0489447 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -397,17 +397,14 @@ void hyjalAI::Reset() memset(Spells, 0, sizeof(Spell) * HYJAL_AI_MAX_SPELLS); //Reset Instance Data for trash count - if (instance) + if ((!instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == JAINA) || (instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == THRALL)) { - if ((!instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == JAINA) || (instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == THRALL)) - { - //Reset World States - instance->DoUpdateWorldState(WORLD_STATE_WAVES, 0); - instance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); - instance->DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0); - instance->SetData(DATA_RESET_TRASH_COUNT, 0); - } - } else TC_LOG_ERROR("scripts", ERROR_INST_DATA); + //Reset World States + instance->DoUpdateWorldState(WORLD_STATE_WAVES, 0); + instance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); + instance->DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0); + instance->SetData(DATA_RESET_TRASH_COUNT, 0); + } //Visibility DoHide = true; @@ -517,11 +514,8 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) CAST_AI(hyjal_trashAI, creature->AI())->IsEvent = true; break; } - if (instance) - { - if (instance->GetData(DATA_RAIDDAMAGE) < MINRAIDDAMAGE) - creature->SetDisableReputationGain(true);//no repu for solo farming - } + if (instance->GetData(DATA_RAIDDAMAGE) < MINRAIDDAMAGE) + creature->SetDisableReputationGain(true);//no repu for solo farming // Check if Creature is a boss. if (creature->isWorldBoss()) { @@ -538,11 +532,6 @@ void hyjalAI::SummonNextWave(const Wave wave[18], uint32 Count, float Base[4][3] if (rand()%4 == 0) Talk(RALLY); - if (!instance) - { - TC_LOG_ERROR("scripts", ERROR_INST_DATA); - return; - } InfernalCount = 0;//reset infernal count every new wave EnemyCount = instance->GetData(DATA_TRASH); @@ -612,41 +601,34 @@ void hyjalAI::StartEvent(Player* player) uint32 hyjalAI::GetInstanceData(uint32 Event) { - if (instance) - return instance->GetData(Event); - else TC_LOG_ERROR("scripts", ERROR_INST_DATA); - - return 0; + return instance->GetData(Event); } void hyjalAI::Retreat() { - if (instance) - { - instance->SetData(TYPE_RETREAT, SPECIAL); + instance->SetData(TYPE_RETREAT, SPECIAL); - if (Faction == 0) + if (Faction == 0) + { + instance->SetData(DATA_ALLIANCE_RETREAT, 1); + AddWaypoint(0, JainaWPs[0][0], JainaWPs[0][1], JainaWPs[0][2]); + AddWaypoint(1, JainaWPs[1][0], JainaWPs[1][1], JainaWPs[1][2]); + Start(false, false); + SetDespawnAtEnd(false);//move to center of alliance base + } + if (Faction == 1) + { + instance->SetData(DATA_HORDE_RETREAT, 1); + Creature* JainaDummy = me->SummonCreature(JAINA, JainaDummySpawn[0][0], JainaDummySpawn[0][1], JainaDummySpawn[0][2], JainaDummySpawn[0][3], TEMPSUMMON_TIMED_DESPAWN, 60000); + if (JainaDummy) { - instance->SetData(DATA_ALLIANCE_RETREAT, 1); - AddWaypoint(0, JainaWPs[0][0], JainaWPs[0][1], JainaWPs[0][2]); - AddWaypoint(1, JainaWPs[1][0], JainaWPs[1][1], JainaWPs[1][2]); - Start(false, false); - SetDespawnAtEnd(false);//move to center of alliance base - } - if (Faction == 1) - { - instance->SetData(DATA_HORDE_RETREAT, 1); - Creature* JainaDummy = me->SummonCreature(JAINA, JainaDummySpawn[0][0], JainaDummySpawn[0][1], JainaDummySpawn[0][2], JainaDummySpawn[0][3], TEMPSUMMON_TIMED_DESPAWN, 60000); - if (JainaDummy) - { - JainaDummy->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - CAST_AI(hyjalAI, JainaDummy->AI())->IsDummy = true; - DummyGuid = JainaDummy->GetGUID(); - } - AddWaypoint(0, JainaDummySpawn[1][0], JainaDummySpawn[1][1], JainaDummySpawn[1][2]); - Start(false, false); - SetDespawnAtEnd(false);//move to center of alliance base + JainaDummy->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + CAST_AI(hyjalAI, JainaDummy->AI())->IsDummy = true; + DummyGuid = JainaDummy->GetGUID(); } + AddWaypoint(0, JainaDummySpawn[1][0], JainaDummySpawn[1][1], JainaDummySpawn[1][2]); + Start(false, false); + SetDespawnAtEnd(false);//move to center of alliance base } SpawnVeins(); Overrun = true; @@ -681,8 +663,6 @@ void hyjalAI::SpawnVeins() void hyjalAI::DeSpawnVeins() { - if (!instance) - return; if (Faction == 1) { Creature* unit=Unit::GetCreature((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); @@ -841,8 +821,7 @@ void hyjalAI::UpdateAI(uint32 diff) CheckTimer = 0; me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); BossGUID[i] = 0; - if (instance) - instance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); // Reset world state for enemies to disable it + instance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); // Reset world state for enemies to disable it } } } @@ -858,7 +837,7 @@ void hyjalAI::UpdateAI(uint32 diff) { if (SpellTimer[i] <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); Unit* target = NULL; @@ -899,18 +878,16 @@ void hyjalAI::JustDied(Unit* /*killer*/) RespawnTimer = 120000; Talk(DEATH); Summons.DespawnAll();//despawn all wave's summons - if (instance) - {//reset encounter if boss is despawned (ex: thrall is killed, boss despawns, event stucks at inprogress) - if (instance->GetData(DATA_RAGEWINTERCHILLEVENT) == IN_PROGRESS) - instance->SetData(DATA_RAGEWINTERCHILLEVENT, NOT_STARTED); - if (instance->GetData(DATA_ANETHERONEVENT) == IN_PROGRESS) - instance->SetData(DATA_ANETHERONEVENT, NOT_STARTED); - if (instance->GetData(DATA_KAZROGALEVENT) == IN_PROGRESS) - instance->SetData(DATA_KAZROGALEVENT, NOT_STARTED); - if (instance->GetData(DATA_AZGALOREVENT) == IN_PROGRESS) - instance->SetData(DATA_AZGALOREVENT, NOT_STARTED); - instance->SetData(DATA_RESET_RAIDDAMAGE, 0);//reset damage on die - } + //reset encounter if boss is despawned (ex: thrall is killed, boss despawns, event stucks at inprogress) + if (instance->GetData(DATA_RAGEWINTERCHILLEVENT) == IN_PROGRESS) + instance->SetData(DATA_RAGEWINTERCHILLEVENT, NOT_STARTED); + if (instance->GetData(DATA_ANETHERONEVENT) == IN_PROGRESS) + instance->SetData(DATA_ANETHERONEVENT, NOT_STARTED); + if (instance->GetData(DATA_KAZROGALEVENT) == IN_PROGRESS) + instance->SetData(DATA_KAZROGALEVENT, NOT_STARTED); + if (instance->GetData(DATA_AZGALOREVENT) == IN_PROGRESS) + instance->SetData(DATA_AZGALOREVENT, NOT_STARTED); + instance->SetData(DATA_RESET_RAIDDAMAGE, 0);//reset damage on die } void hyjalAI::HideNearPos(float x, float y) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 9245a0c648..0a369154ad 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -195,8 +195,7 @@ void hyjal_trashAI::DamageTaken(Unit* done_by, uint32 &damage) if (done_by->GetTypeId() == TYPEID_PLAYER || done_by->IsPet()) { damageTaken += damage; - if (instance) - instance->SetData(DATA_RAIDDAMAGE, damage);//store raid's damage + instance->SetData(DATA_RAIDDAMAGE, damage);//store raid's damage } } @@ -399,9 +398,6 @@ void hyjal_trashAI::UpdateAI(uint32 /*diff*/) void hyjal_trashAI::JustDied(Unit* /*killer*/) { - if (!instance) - return; - if (IsEvent && !me->isWorldBoss()) instance->SetData(DATA_TRASH, 0);//signal trash is dead @@ -488,16 +484,13 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetDisplayId(me->GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID)); CanMove = true; - if (instance) + if (instance->GetData(DATA_ALLIANCE_RETREAT) && !instance->GetData(DATA_HORDE_RETREAT)) { - if (instance->GetData(DATA_ALLIANCE_RETREAT) && !instance->GetData(DATA_HORDE_RETREAT)) - { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); - if (target && target->IsAlive()) - me->AddThreat(target, 0.0f); - } else if (instance->GetData(DATA_ALLIANCE_RETREAT) && instance->GetData(DATA_HORDE_RETREAT)){ - //do overrun - } + Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + if (target && target->IsAlive()) + me->AddThreat(target, 0.0f); + } else if (instance->GetData(DATA_ALLIANCE_RETREAT) && instance->GetData(DATA_HORDE_RETREAT)){ + //do overrun } } else spawnTimer -= diff; } @@ -510,12 +503,9 @@ public: if (!go) { go = true; - if (instance) - { - AddWaypoint(0, HordeWPs[7][0]+irand(-3, 3), HordeWPs[7][1]+irand(-3, 3), HordeWPs[7][2]);//HordeWPs[7] infront of thrall - Start(true, true); - SetDespawnAtEnd(false); - } + AddWaypoint(0, HordeWPs[7][0]+irand(-3, 3), HordeWPs[7][1]+irand(-3, 3), HordeWPs[7][2]);//HordeWPs[7] infront of thrall + Start(true, true); + SetDespawnAtEnd(false); } } @@ -537,7 +527,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_giant_infernalAI(creature); + return GetInstanceAI(creature); } }; @@ -548,7 +538,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_abominationAI(creature); + return GetInstanceAI(creature); } struct npc_abominationAI : public hyjal_trashAI @@ -606,21 +596,18 @@ public: if (!go) { go = true; - if (instance) + if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { - if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - }else//use alliance WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - } + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); + }else//use alliance WPs + { + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); } } } @@ -646,7 +633,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ghoulAI(creature); + return GetInstanceAI(creature); } struct npc_ghoulAI : public hyjal_trashAI @@ -709,21 +696,18 @@ public: if (!go) { go = true; - if (instance) + if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { - if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - }else//use alliance WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - } + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); + }else//use alliance WPs + { + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); } } } @@ -748,7 +732,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_necromancerAI(creature); + return GetInstanceAI(creature); } struct npc_necromancerAI : public hyjal_trashAI @@ -834,21 +818,18 @@ public: if (!go) { go = true; - if (instance) + if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { - if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); - Start(true, true); - SetDespawnAtEnd(false); - }else//use alliance WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); - Start(true, true); - SetDespawnAtEnd(false); - } + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + Start(true, true); + SetDespawnAtEnd(false); + }else//use alliance WPs + { + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + Start(true, true); + SetDespawnAtEnd(false); } } } @@ -875,7 +856,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_bansheeAI(creature); + return GetInstanceAI(creature); } struct npc_bansheeAI : public hyjal_trashAI @@ -930,21 +911,18 @@ public: if (!go) { go = true; - if (instance) + if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { - if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - }else//use alliance WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - } + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); + }else//use alliance WPs + { + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); } } } @@ -978,7 +956,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_crypt_fiendAI(creature); + return GetInstanceAI(creature); } struct npc_crypt_fiendAI : public hyjal_trashAI @@ -1029,22 +1007,18 @@ public: if (!go) { go = true; - if (instance) + if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { - if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - }else//use alliance WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - } - + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); + }else//use alliance WPs + { + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); } } } @@ -1068,7 +1042,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_fel_stalkerAI(creature); + return GetInstanceAI(creature); } struct npc_fel_stalkerAI : public hyjal_trashAI @@ -1119,22 +1093,18 @@ public: if (!go) { go = true; - if (instance) + if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs { - if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, use horde WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - }else//use alliance WPs - { - for (uint8 i = 0; i < 8; ++i) - AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - } - + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, HordeWPs[i][0]+irand(-3, 3), HordeWPs[i][1]+irand(-3, 3), HordeWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); + }else//use alliance WPs + { + for (uint8 i = 0; i < 8; ++i) + AddWaypoint(i, AllianceWPs[i][0]+irand(-3, 3), AllianceWPs[i][1]+irand(-3, 3), AllianceWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); } } } @@ -1158,7 +1128,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_frost_wyrmAI(creature); + return GetInstanceAI(creature); } struct npc_frost_wyrmAI : public hyjal_trashAI @@ -1221,20 +1191,17 @@ public: if (!go) { go = true; - if (instance) + if (!useFlyPath) { - if (!useFlyPath) - { - for (uint8 i = 0; i < 3; ++i) - AddWaypoint(i, FrostWyrmWPs[i][0], FrostWyrmWPs[i][1], FrostWyrmWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - }else{//fly path FlyPathWPs - for (uint8 i = 0; i < 3; ++i) - AddWaypoint(i, FlyPathWPs[i][0]+irand(-10, 10), FlyPathWPs[i][1]+irand(-10, 10), FlyPathWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - } + for (uint8 i = 0; i < 3; ++i) + AddWaypoint(i, FrostWyrmWPs[i][0], FrostWyrmWPs[i][1], FrostWyrmWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); + }else{//fly path FlyPathWPs + for (uint8 i = 0; i < 3; ++i) + AddWaypoint(i, FlyPathWPs[i][0]+irand(-10, 10), FlyPathWPs[i][1]+irand(-10, 10), FlyPathWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); } } } @@ -1270,7 +1237,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_gargoyleAI(creature); + return GetInstanceAI(creature); } struct npc_gargoyleAI : public hyjal_trashAI @@ -1334,20 +1301,17 @@ public: if (!go) { go = true; - if (instance) + if (!useFlyPath) { - if (!useFlyPath) - { - for (uint8 i = 0; i < 3; ++i) - AddWaypoint(i, GargoyleWPs[i][0]+irand(-10, 10), GargoyleWPs[i][1]+irand(-10, 10), GargoyleWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - }else{//fly path FlyPathWPs - for (uint8 i = 0; i < 3; ++i) - AddWaypoint(i, FlyPathWPs[i][0]+irand(-10, 10), FlyPathWPs[i][1]+irand(-10, 10), FlyPathWPs[i][2]); - Start(false, true); - SetDespawnAtEnd(false); - } + for (uint8 i = 0; i < 3; ++i) + AddWaypoint(i, GargoyleWPs[i][0]+irand(-10, 10), GargoyleWPs[i][1]+irand(-10, 10), GargoyleWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); + }else{//fly path FlyPathWPs + for (uint8 i = 0; i < 3; ++i) + AddWaypoint(i, FlyPathWPs[i][0]+irand(-10, 10), FlyPathWPs[i][1]+irand(-10, 10), FlyPathWPs[i][2]); + Start(false, true); + SetDespawnAtEnd(false); } } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp index c049be0309..07bfdae208 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp @@ -52,7 +52,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_epochAI(creature); + return GetInstanceAI(creature); } struct boss_epochAI : public ScriptedAI @@ -81,16 +81,14 @@ public: uiTimeStopTimer = 21300; uiWoundingStrikeTimer = 5300; - if (instance) - instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED); + instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_EPOCH_EVENT, IN_PROGRESS); + instance->SetData(DATA_EPOCH_EVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -132,8 +130,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_EPOCH_EVENT, DONE); + instance->SetData(DATA_EPOCH_EVENT, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp index 54438e3b8a..f9ea0f482f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp @@ -39,7 +39,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_infinite_corruptorAI(creature); + return GetInstanceAI(creature); } struct boss_infinite_corruptorAI : public ScriptedAI @@ -53,15 +53,13 @@ public: void Reset() OVERRIDE { - if (instance) - instance->SetData(DATA_INFINITE_EVENT, NOT_STARTED); + instance->SetData(DATA_INFINITE_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_INFINITE_EVENT, IN_PROGRESS); + instance->SetData(DATA_INFINITE_EVENT, IN_PROGRESS); } void UpdateAI(uint32 /*diff*/) OVERRIDE @@ -76,8 +74,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_INFINITE_EVENT, DONE); + instance->SetData(DATA_INFINITE_EVENT, DONE); } }; 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 e16ed88217..0e1d6e966c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -66,7 +66,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_mal_ganisAI(creature); + return GetInstanceAI(creature); } struct boss_mal_ganisAI : public ScriptedAI @@ -102,15 +102,13 @@ public: uiSleepTimer = urand(15000, 20000); uiOutroTimer = 1000; - if (instance) - instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED); + instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_MAL_GANIS_EVENT, IN_PROGRESS); + instance->SetData(DATA_MAL_GANIS_EVENT, IN_PROGRESS); } void DamageTaken(Unit* done_by, uint32 &damage) OVERRIDE @@ -154,8 +152,7 @@ public: { EnterEvadeMode(); me->DisappearAndDie(); - if (instance) - instance->SetData(DATA_MAL_GANIS_EVENT, FAIL); + instance->SetData(DATA_MAL_GANIS_EVENT, FAIL); } if (uiCarrionSwarmTimer < diff) @@ -228,13 +225,10 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - instance->SetData(DATA_MAL_GANIS_EVENT, DONE); - DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT); - // give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc - DoCastAOE(SPELL_KILL_CREDIT); - } + instance->SetData(DATA_MAL_GANIS_EVENT, DONE); + DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT); + // give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc + DoCastAOE(SPELL_KILL_CREDIT); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp index aff076f476..5b8ba2ad18 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp @@ -51,7 +51,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_meathookAI(creature); + return GetInstanceAI(creature); } struct boss_meathookAI : public ScriptedAI @@ -59,8 +59,7 @@ public: boss_meathookAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - if (instance) - Talk(SAY_SPAWN); + Talk(SAY_SPAWN); } uint32 uiChainTimer; @@ -75,16 +74,14 @@ public: uiDiseaseTimer = urand(2000, 4000); //approx 3s uiFrenzyTimer = urand(21000, 26000); //made it up - if (instance) - instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED); + instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_MEATHOOK_EVENT, IN_PROGRESS); + instance->SetData(DATA_MEATHOOK_EVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -119,8 +116,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_MEATHOOK_EVENT, DONE); + instance->SetData(DATA_MEATHOOK_EVENT, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp index fc5b3c4a8b..0716f71574 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp @@ -56,7 +56,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_salrammAI(creature); + return GetInstanceAI(creature); } struct boss_salrammAI : public ScriptedAI @@ -64,8 +64,7 @@ public: boss_salrammAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - if (instance) - Talk(SAY_SPAWN); + Talk(SAY_SPAWN); } uint32 uiCurseFleshTimer; @@ -84,16 +83,14 @@ public: uiStealFleshTimer = 12345; uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro - if (instance) - instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED); + instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_SALRAMM_EVENT, IN_PROGRESS); + instance->SetData(DATA_SALRAMM_EVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -142,8 +139,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_SALRAMM_EVENT, DONE); + instance->SetData(DATA_SALRAMM_EVENT, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index dbead663cf..e8f776d8a7 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -344,7 +344,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_arthasAI(creature); + return GetInstanceAI(creature); } struct npc_arthasAI : public npc_escortAI @@ -399,22 +399,20 @@ public: malganisGUID = 0; infiniteGUID = 0; - if (instance) { - instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED); - switch (instance->GetData(DATA_ARTHAS_EVENT)) - { - case NOT_STARTED: - bStepping = true; - step = 0; - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - bossEvent = DATA_MEATHOOK_EVENT; - gossipStep = 0; - break; - } - phaseTimer = 1000; - exorcismTimer = 7300; - wave = 0; + instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED); + switch (instance->GetData(DATA_ARTHAS_EVENT)) + { + case NOT_STARTED: + bStepping = true; + step = 0; + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + bossEvent = DATA_MEATHOOK_EVENT; + gossipStep = 0; + break; } + phaseTimer = 1000; + exorcismTimer = 7300; + wave = 0; } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -424,8 +422,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_ARTHAS_EVENT, FAIL); + instance->SetData(DATA_ARTHAS_EVENT, FAIL); } void SpawnTimeRift(uint32 timeRiftID, uint64* guidVector) @@ -559,9 +556,8 @@ public: Talk(SAY_PHASE403); break; case 36: - if (instance) - if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_SHKAF_GATE))) - pGate->SetGoState(GO_STATE_ACTIVE); + if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_SHKAF_GATE))) + pGate->SetGoState(GO_STATE_ACTIVE); break; case 45: SetRun(true); @@ -888,8 +884,7 @@ public: Talk(SAY_PHASE209); bossEvent = DATA_MEATHOOK_EVENT; - if (instance) - instance->SetData(DATA_ARTHAS_EVENT, IN_PROGRESS); + instance->SetData(DATA_ARTHAS_EVENT, IN_PROGRESS); me->SetReactState(REACT_DEFENSIVE); SetDespawnAtFar(false); @@ -961,25 +956,22 @@ public: break; case 50: //Wait Boss death case 60: - if (instance) + if (instance->GetData(bossEvent) == DONE) { - if (instance->GetData(bossEvent) == DONE) + JumpToNextStep(1000); + if (bossEvent == DATA_MEATHOOK_EVENT) + bossEvent = DATA_SALRAMM_EVENT; + else if (bossEvent == DATA_SALRAMM_EVENT) { - JumpToNextStep(1000); - if (bossEvent == DATA_MEATHOOK_EVENT) - bossEvent = DATA_SALRAMM_EVENT; - else if (bossEvent == DATA_SALRAMM_EVENT) - { - SetHoldState(false); - bStepping = false; - bossEvent = DATA_EPOCH_EVENT; - } + SetHoldState(false); + bStepping = false; + bossEvent = DATA_EPOCH_EVENT; } - else if (instance->GetData(bossEvent) == FAIL) - npc_escortAI::EnterEvadeMode(); - else - phaseTimer = 10000; } + else if (instance->GetData(bossEvent) == FAIL) + npc_escortAI::EnterEvadeMode(); + else + phaseTimer = 10000; break; //After Gossip 2 (waypoint 22) case 61: @@ -1096,53 +1088,47 @@ public: JumpToNextStep(1000); break; case 80: - if (instance) - if (instance->GetData(DATA_EPOCH_EVENT) != DONE) - { - SpawnTimeRift(17, &epochGUID); - if (Creature* epoch = Unit::GetCreature(*me, epochGUID)) - epoch->AI()->Talk(SAY_PHASE314); - me->SetTarget(epochGUID); - } + if (instance->GetData(DATA_EPOCH_EVENT) != DONE) + { + SpawnTimeRift(17, &epochGUID); + if (Creature* epoch = Unit::GetCreature(*me, epochGUID)) + epoch->AI()->Talk(SAY_PHASE314); + me->SetTarget(epochGUID); + } JumpToNextStep(18000); break; case 81: - if (instance) - if (instance->GetData(DATA_EPOCH_EVENT) != DONE) - Talk(SAY_PHASE315); + if (instance->GetData(DATA_EPOCH_EVENT) != DONE) + Talk(SAY_PHASE315); JumpToNextStep(6000); break; case 82: - if (instance) - if (instance->GetData(DATA_EPOCH_EVENT) != DONE) + if (instance->GetData(DATA_EPOCH_EVENT) != DONE) + { + if (Creature* epoch = Unit::GetCreature(*me, epochGUID)) { - if (Creature* epoch = Unit::GetCreature(*me, epochGUID)) - { - //Make Epoch attackable - epoch->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); - epoch->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - epoch->SetReactState(REACT_AGGRESSIVE); - } - + //Make Epoch attackable + epoch->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); + epoch->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + epoch->SetReactState(REACT_AGGRESSIVE); } + + } JumpToNextStep(1000); break; case 83: - if (instance) + if (instance->GetData(DATA_EPOCH_EVENT) == DONE) { - if (instance->GetData(DATA_EPOCH_EVENT) == DONE) - { - gossipStep = 3; - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - bStepping = false; - bossEvent = DATA_MAL_GANIS_EVENT; - JumpToNextStep(15000); - } - else if (instance->GetData(DATA_EPOCH_EVENT) == FAIL) - npc_escortAI::EnterEvadeMode(); - else - phaseTimer = 10000; + gossipStep = 3; + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + bStepping = false; + bossEvent = DATA_MAL_GANIS_EVENT; + JumpToNextStep(15000); } + else if (instance->GetData(DATA_EPOCH_EVENT) == FAIL) + npc_escortAI::EnterEvadeMode(); + else + phaseTimer = 10000; break; //After Gossip 4 case 84: @@ -1158,9 +1144,8 @@ public: malganisGUID = malganis->GetGUID(); malganis->SetReactState(REACT_PASSIVE); } - if (instance) - if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_MAL_GANIS_GATE_1))) - pGate->SetGoState(GO_STATE_ACTIVE); + if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_MAL_GANIS_GATE_1))) + pGate->SetGoState(GO_STATE_ACTIVE); SetHoldState(false); bStepping = false; JumpToNextStep(0); @@ -1180,18 +1165,15 @@ public: JumpToNextStep(1000); break; case 88: - if (instance) + if (instance->GetData(DATA_MAL_GANIS_EVENT) == DONE) { - if (instance->GetData(DATA_MAL_GANIS_EVENT) == DONE) - { - SetHoldState(false); - JumpToNextStep(1000); - } - else if (instance->GetData(DATA_MAL_GANIS_EVENT) == FAIL) - npc_escortAI::EnterEvadeMode(); - else - phaseTimer = 10000; + SetHoldState(false); + JumpToNextStep(1000); } + else if (instance->GetData(DATA_MAL_GANIS_EVENT) == FAIL) + npc_escortAI::EnterEvadeMode(); + else + phaseTimer = 10000; break; //After waypoint 56 case 89: @@ -1201,11 +1183,8 @@ public: JumpToNextStep(7000); break; case 90: - if (instance) - { - instance->SetData(DATA_ARTHAS_EVENT, DONE); //Rewards: Achiev & Chest ;D - me->SetTarget(instance->GetData64(DATA_MAL_GANIS_GATE_2)); //Look behind - } + instance->SetData(DATA_ARTHAS_EVENT, DONE); //Rewards: Achiev & Chest ;D + me->SetTarget(instance->GetData64(DATA_MAL_GANIS_GATE_2)); //Look behind Talk(SAY_PHASE504); bStepping = false; break; 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 3b51f6d0f8..d69137060e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp @@ -54,7 +54,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_captain_skarlocAI(creature); + return GetInstanceAI(creature); } struct boss_captain_skarlocAI : public ScriptedAI 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 3e650bf4fe..0c20669775 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp @@ -52,7 +52,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_epoch_hunterAI(creature); + return GetInstanceAI(creature); } struct boss_epoch_hunterAI : public ScriptedAI @@ -104,7 +104,7 @@ public: //Sand Breath if (SandBreath_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); DoCastVictim(SPELL_SAND_BREATH); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index bdf7d71a49..f4da323a74 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -188,7 +188,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_thrall_old_hillsbradAI(creature); + return GetInstanceAI(creature); } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE @@ -291,9 +291,6 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (!instance) - return; - switch (waypointId) { case 8: @@ -526,8 +523,7 @@ public: } void JustDied(Unit* slayer) OVERRIDE { - if (instance) - instance->SetData(TYPE_THRALL_EVENT, FAIL); + instance->SetData(TYPE_THRALL_EVENT, FAIL); // Don't do a yell if he kills self (if player goes too far or at the end). if (slayer == me) @@ -573,7 +569,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_tarethaAI(creature); + return GetInstanceAI(creature); } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp index c929a1b6a5..850dd3a10d 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp @@ -90,16 +90,14 @@ public: { Talk(SAY_DEATH); - if (instance) - { - instance->SetData(TYPE_RIFT, DONE); - instance->SetData(TYPE_MEDIVH, DONE); // FIXME: later should be removed - } + instance->SetData(TYPE_RIFT, DONE); + instance->SetData(TYPE_MEDIVH, DONE); // FIXME: later should be removed } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } void UpdateAI(uint32 diff) OVERRIDE @@ -140,7 +138,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_aeonusAI(creature); + return GetInstanceAI(creature); } }; 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 fe91f3ab71..8910631dc5 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 @@ -98,8 +98,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(TYPE_RIFT, SPECIAL); + instance->SetData(TYPE_RIFT, SPECIAL); } void UpdateAI(uint32 diff) OVERRIDE @@ -145,7 +144,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_chrono_lord_dejaAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp index 4d94edf733..35ddfc2df3 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp @@ -81,8 +81,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(TYPE_RIFT, SPECIAL); + instance->SetData(TYPE_RIFT, SPECIAL); } void MoveInLineOfSight(Unit* who) OVERRIDE @@ -143,7 +142,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_temporusAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp index cc3cf8192d..90e746367c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp @@ -70,7 +70,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_medivh_bmAI(creature); + return GetInstanceAI(creature); } struct npc_medivh_bmAI : public ScriptedAI @@ -97,9 +97,6 @@ public: Life50 = true; Life25 = true; - if (!instance) - return; - if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS) DoCast(me, SPELL_CHANNEL, true); else if (me->HasAura(SPELL_CHANNEL)) @@ -109,11 +106,7 @@ public: } void MoveInLineOfSight(Unit* who) OVERRIDE - { - if (!instance) - return; - if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 10.0f)) { if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS || instance->GetData(TYPE_MEDIVH) == DONE) @@ -175,9 +168,6 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!instance) - return; - if (SpellCorrupt_Timer) { if (SpellCorrupt_Timer <= diff) @@ -268,7 +258,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_time_riftAI(creature); + return GetInstanceAI(creature); } struct npc_time_riftAI : public ScriptedAI @@ -291,9 +281,6 @@ public: TimeRiftWave_Timer = 15000; mRiftWaveCount = 0; - if (!instance) - return; - mPortalCount = instance->GetData(DATA_PORTAL_COUNT); if (mPortalCount < 6) @@ -349,16 +336,13 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!instance) - return; - if (TimeRiftWave_Timer <= diff) { DoSelectSummon(); TimeRiftWave_Timer = 15000; } else TimeRiftWave_Timer -= diff; - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; TC_LOG_DEBUG("scripts", "npc_time_rift: not casting anylonger, i need to die."); diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index 79421ffe37..aef232ab3f 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -145,12 +145,9 @@ public: SummonWhelpCount = 0; IsMoving = false; - if (instance) - { - instance->SetBossState(DATA_ONYXIA, NOT_STARTED); - instance->SetData(DATA_ONYXIA_PHASE, Phase); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - } + instance->SetBossState(DATA_ONYXIA, NOT_STARTED); + instance->SetData(DATA_ONYXIA_PHASE, Phase); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -163,17 +160,13 @@ public: events.ScheduleEvent(EVENT_CLEAVE, urand (2000, 5000)); events.ScheduleEvent(EVENT_WING_BUFFET, urand (10000, 20000)); - if (instance) - { - instance->SetBossState(DATA_ONYXIA, IN_PROGRESS); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - } + instance->SetBossState(DATA_ONYXIA, IN_PROGRESS); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_ONYXIA, DONE); + instance->SetBossState(DATA_ONYXIA, DONE); Summons.DespawnAll(); } @@ -246,8 +239,7 @@ public: me->GetMotionMaster()->MovePoint(11, Phase2Location.GetPositionX(), Phase2Location.GetPositionY(), Phase2Location.GetPositionZ()+25); me->SetSpeed(MOVE_FLIGHT, 1.0f); Talk(SAY_PHASE_2_TRANS); - if (instance) - instance->SetData(DATA_ONYXIA_PHASE, Phase); + instance->SetData(DATA_ONYXIA_PHASE, Phase); events.ScheduleEvent(EVENT_WHELP_SPAWN, 5000); events.ScheduleEvent(EVENT_LAIR_GUARD, 15000); break; @@ -280,10 +272,7 @@ public: (Spell->Id >= 22267 && Spell->Id <= 22268)) && (target->GetTypeId() == TYPEID_PLAYER)) { - if (instance) - { instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL); - } } } @@ -383,8 +372,7 @@ public: if (HealthBelowPct(40)) { Phase = PHASE_END; - if (instance) - instance->SetData(DATA_ONYXIA_PHASE, PHASE_END); + instance->SetData(DATA_ONYXIA_PHASE, PHASE_END); Talk(SAY_PHASE_3_TRANS); SetCombatMovement(true); @@ -404,7 +392,7 @@ public: case EVENT_DEEP_BREATH: // Phase PHASE_BREATH if (!IsMoving) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); Talk(EMOTE_BREATH); @@ -469,7 +457,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_onyxiaAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp index 323fd92a8f..952ed5679f 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp @@ -69,9 +69,10 @@ public: Talk(SAY_AGGRO); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_KILL); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void JustDied(Unit* /*killer*/) OVERRIDE diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index abd76ebe50..6c4db288a0 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -321,7 +321,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_belnistraszAI(creature); + return GetInstanceAI(creature); } }; @@ -341,9 +341,6 @@ public: void SetData(uint32 /*type*/, uint32 data) OVERRIDE { - if (!instance) - return; - if (data < 7) { me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); @@ -362,7 +359,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_idol_room_spawnerAI(creature); + return GetInstanceAI(creature); } }; @@ -397,8 +394,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_WAVE, me->GetEntry()); + instance->SetData(DATA_WAVE, me->GetEntry()); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -433,7 +429,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_tomb_creatureAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp index 327fe0d135..1cdcfae113 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp @@ -232,7 +232,7 @@ class boss_ayamiss : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ayamissAI(creature); + return GetInstanceAI(creature); } }; @@ -286,7 +286,7 @@ class npc_hive_zara_larva : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_hive_zara_larvaAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp index 0890a9804f..ae4b42a422 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp @@ -236,7 +236,7 @@ class npc_buru_egg : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_buru_eggAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp index 0b58ded0b1..09c4734dc4 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp @@ -127,7 +127,7 @@ class boss_kurinnaxx : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kurinnaxxAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp index 366f74f469..06d193ee5b 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -136,26 +136,23 @@ class boss_ossirian : public CreatureScript DoCast(me, SPELL_SUPREME); Talk(SAY_AGGRO); - if (instance) + Map* map = me->GetMap(); + if (!map->IsDungeon()) + return; + + WorldPacket data(SMSG_WEATHER, (4+4+4)); + data << uint32(WEATHER_STATE_HEAVY_SANDSTORM) << float(1) << uint8(0); + map->SendToPlayers(&data); + + for (uint8 i = 0; i < NUM_TORNADOS; ++i) { - Map* map = me->GetMap(); - if (!map->IsDungeon()) - return; - - WorldPacket data(SMSG_WEATHER, (4+4+4)); - data << uint32(WEATHER_STATE_HEAVY_SANDSTORM) << float(1) << uint8(0); - map->SendToPlayers(&data); - - for (uint8 i = 0; i < NUM_TORNADOS; ++i) - { - Position Point; - me->GetRandomPoint(RoomCenter, RoomRadius, Point); - if (Creature* Tornado = me->GetMap()->SummonCreature(NPC_SAND_VORTEX, Point)) - Tornado->CastSpell(Tornado, SPELL_SAND_STORM, true); - } - - SpawnNextCrystal(); + Position Point; + me->GetRandomPoint(RoomCenter, RoomRadius, Point); + if (Creature* Tornado = me->GetMap()->SummonCreature(NPC_SAND_VORTEX, Point)) + Tornado->CastSpell(Tornado, SPELL_SAND_STORM, true); } + + SpawnNextCrystal(); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -273,7 +270,7 @@ class boss_ossirian : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ossirianAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index 8dd009cdb3..5f0481431a 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -32,7 +32,7 @@ enum Spells SPELL_CLEAVE = 26350, SPELL_TOXIC_VOLLEY = 25812, SPELL_POISON_CLOUD = 38718, //Only Spell with right dmg. - SPELL_ENRAGE = 34624, //Changed cause 25790 is casted on gamers too. Same prob with old explosion of twin emperors. + SPELL_ENRAGE = 34624, //Changed cause 25790 is cast on gamers too. Same prob with old explosion of twin emperors. SPELL_CHARGE = 26561, SPELL_KNOCKBACK = 26027, @@ -48,7 +48,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kriAI(creature); + return GetInstanceAI(creature); } struct boss_kriAI : public ScriptedAI @@ -83,14 +83,10 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - if (instance->GetData(DATA_BUG_TRIO_DEATH) < 2) - // Unlootable if death - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + if (instance->GetData(DATA_BUG_TRIO_DEATH) < 2)// Unlootable if death + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - instance->SetData(DATA_BUG_TRIO_DEATH, 1); - } + instance->SetData(DATA_BUG_TRIO_DEATH, 1); } void UpdateAI(uint32 diff) OVERRIDE { @@ -145,7 +141,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_vemAI(creature); + return GetInstanceAI(creature); } struct boss_vemAI : public ScriptedAI @@ -174,14 +170,10 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - instance->SetData(DATA_VEM_DEATH, 0); - if (instance->GetData(DATA_BUG_TRIO_DEATH) < 2) - // Unlootable if death - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - instance->SetData(DATA_BUG_TRIO_DEATH, 1); - } + instance->SetData(DATA_VEM_DEATH, 0); + if (instance->GetData(DATA_BUG_TRIO_DEATH) < 2)// Unlootable if death + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + instance->SetData(DATA_BUG_TRIO_DEATH, 1); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -238,7 +230,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_yaujAI(creature); + return GetInstanceAI(creature); } struct boss_yaujAI : public ScriptedAI @@ -267,13 +259,9 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - if (instance->GetData(DATA_BUG_TRIO_DEATH) < 2) - // Unlootable if death - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - instance->SetData(DATA_BUG_TRIO_DEATH, 1); - } + if (instance->GetData(DATA_BUG_TRIO_DEATH) < 2)// Unlootable if death + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + instance->SetData(DATA_BUG_TRIO_DEATH, 1); for (uint8 i = 0; i < 10; ++i) { @@ -306,22 +294,19 @@ public: //Casting Heal to other twins or herself. if (Heal_Timer <= diff) { - if (instance) + switch (urand(0, 2)) { - switch (urand(0, 2)) - { - case 0: - if (Creature* kri = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KRI))) - DoCast(kri, SPELL_HEAL); - break; - case 1: - if (Creature* vem = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VEM))) - DoCast(vem, SPELL_HEAL); - break; - case 2: - DoCast(me, SPELL_HEAL); - break; - } + case 0: + if (Creature* kri = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KRI))) + DoCast(kri, SPELL_HEAL); + break; + case 1: + if (Creature* vem = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VEM))) + DoCast(vem, SPELL_HEAL); + break; + case 2: + DoCast(me, SPELL_HEAL); + break; } Heal_Timer = 15000+rand()%15000; @@ -332,13 +317,10 @@ public: { if (!VemDead) { - if (instance) + if (instance->GetData(DATA_VEMISDEAD)) { - if (instance->GetData(DATA_VEMISDEAD)) - { - DoCast(me, SPELL_ENRAGE); - VemDead = true; - } + DoCast(me, SPELL_ENRAGE); + VemDead = true; } } Check_Timer = 2000; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index d2b5b5eaf8..67b093a2c3 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -153,7 +153,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new eye_of_cthunAI(creature); + return GetInstanceAI(creature); } struct eye_of_cthunAI : public ScriptedAI @@ -161,8 +161,6 @@ public: eye_of_cthunAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - if (!instance) - TC_LOG_ERROR("scripts", "No Instance eye_of_cthunAI"); SetCombatMovement(false); } @@ -206,8 +204,7 @@ public: me->SetVisible(true); //Reset Phase - if (instance) - instance->SetData(DATA_CTHUN_PHASE, PHASE_NOT_STARTED); + instance->SetData(DATA_CTHUN_PHASE, PHASE_NOT_STARTED); //to avoid having a following void zone Creature* pPortal= me->FindNearestCreature(NPC_CTHUN_PORTAL, 10); @@ -218,8 +215,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { DoZoneInCombat(); - if (instance) - instance->SetData(DATA_CTHUN_PHASE, PHASE_EYE_GREEN_BEAM); + instance->SetData(DATA_CTHUN_PHASE, PHASE_EYE_GREEN_BEAM); } void SpawnEyeTentacle(float x, float y) @@ -236,10 +232,6 @@ public: if (!UpdateVictim()) return; - //No instance - if (!instance) - return; - uint32 currentPhase = instance->GetData(DATA_CTHUN_PHASE); if (currentPhase == PHASE_EYE_GREEN_BEAM || currentPhase == PHASE_EYE_RED_BEAM) { @@ -404,10 +396,6 @@ public: void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE { - //No instance - if (!instance) - return; - switch (instance->GetData(DATA_CTHUN_PHASE)) { case PHASE_EYE_GREEN_BEAM: @@ -459,7 +447,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new cthunAI(creature); + return GetInstanceAI(creature); } struct cthunAI : public ScriptedAI @@ -469,8 +457,6 @@ public: SetCombatMovement(false); instance = creature->GetInstanceScript(); - if (!instance) - TC_LOG_ERROR("scripts", "No Instance eye_of_cthunAI"); } InstanceScript* instance; @@ -528,8 +514,7 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); me->SetVisible(false); - if (instance) - instance->SetData(DATA_CTHUN_PHASE, PHASE_NOT_STARTED); + instance->SetData(DATA_CTHUN_PHASE, PHASE_NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -615,10 +600,6 @@ public: me->SetTarget(0); - //No instance - if (!instance) - return; - uint32 currentPhase = instance->GetData(DATA_CTHUN_PHASE); if (currentPhase == PHASE_CTHUN_STOMACH || currentPhase == PHASE_CTHUN_WEAK) { @@ -861,16 +842,11 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_DONE); + instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_DONE); } void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE { - //No instance - if (!instance) - return; - switch (instance->GetData(DATA_CTHUN_PHASE)) { case PHASE_CTHUN_STOMACH: diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp index a3edd9ad83..f640173efb 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp @@ -160,7 +160,7 @@ public: //If she is 20% enrage if (!Enraged) { - if (!HealthAbovePct(20) && !me->IsNonMeleeSpellCasted(false)) + if (!HealthAbovePct(20) && !me->IsNonMeleeSpellCast(false)) { DoCast(me, SPELL_ENRAGE); Enraged = true; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index 1d888f3ce8..9020774683 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -80,7 +80,7 @@ struct boss_twinemperorsAI : public ScriptedAI uint32 AfterTeleportTimer; bool DontYellWhenDead; uint32 Abuse_Bug_Timer, BugsTimer; - bool tspellcasted; + bool tspellcast; uint32 EnrageTimer; virtual bool IAmVeklor() = 0; @@ -92,7 +92,7 @@ struct boss_twinemperorsAI : public ScriptedAI Heal_Timer = 0; // first heal immediately when they get close together Teleport_Timer = TELEPORTTIME; AfterTeleport = false; - tspellcasted = false; + tspellcast = false; AfterTeleportTimer = 0; Abuse_Bug_Timer = urand(10000, 17000); BugsTimer = 2000; @@ -103,10 +103,7 @@ struct boss_twinemperorsAI : public ScriptedAI Creature* GetOtherBoss() { - if (instance) - return Unit::GetCreature(*me, instance->GetData64(IAmVeklor() ? DATA_VEKNILASH : DATA_VEKLOR)); - else - return NULL; + return Unit::GetCreature(*me, instance->GetData64(IAmVeklor() ? DATA_VEKNILASH : DATA_VEKLOR)); } void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE @@ -210,9 +207,6 @@ struct boss_twinemperorsAI : public ScriptedAI void TeleportToMyBrother() { - if (!instance) - return; - Teleport_Timer = TELEPORTTIME; if (IAmVeklor()) @@ -243,21 +237,21 @@ struct boss_twinemperorsAI : public ScriptedAI me->AddUnitState(UNIT_STATE_STUNNED); AfterTeleport = true; AfterTeleportTimer = 2000; - tspellcasted = false; + tspellcast = false; } bool TryActivateAfterTTelep(uint32 diff) { if (AfterTeleport) { - if (!tspellcasted) + if (!tspellcast) { me->ClearUnitState(UNIT_STATE_STUNNED); DoCast(me, SPELL_TWIN_TELEPORT); me->AddUnitState(UNIT_STATE_STUNNED); } - tspellcasted = true; + tspellcast = true; if (AfterTeleportTimer <= diff) { @@ -378,7 +372,7 @@ struct boss_twinemperorsAI : public ScriptedAI { if (EnrageTimer <= diff) { - if (!me->IsNonMeleeSpellCasted(true)) + if (!me->IsNonMeleeSpellCast(true)) { DoCast(me, SPELL_BERSERK); EnrageTimer = 60*60000; @@ -394,7 +388,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_veknilashAI(creature); + return GetInstanceAI(creature); } struct boss_veknilashAI : public boss_twinemperorsAI @@ -480,7 +474,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_veklorAI(creature); + return GetInstanceAI(creature); } struct boss_veklorAI : public boss_twinemperorsAI diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp index 115d9d0d12..18dcc71884 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp @@ -263,8 +263,6 @@ class npc_glob_of_viscidus : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { InstanceScript* Instance = me->GetInstanceScript(); - if (!Instance) - return; if (Creature* Viscidus = me->GetMap()->GetCreature(Instance->GetData64(DATA_VISCIDUS))) { @@ -289,14 +287,15 @@ class npc_glob_of_viscidus : public CreatureScript if (id == ROOM_CENTER) { DoCast(me, SPELL_REJOIN_VISCIDUS); - ((TempSummon*)me)->UnSummon(); + if (TempSummon* summon = me->ToTempSummon()) + summon->UnSummon(); } } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_glob_of_viscidusAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp index a985f35397..9d4a6f54c3 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp @@ -81,7 +81,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_disciple_of_naralexAI(creature); + return GetInstanceAI(creature); } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE @@ -152,9 +152,6 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (!instance) - return; - switch (waypointId) { case 4: @@ -194,13 +191,10 @@ public: void JustDied(Unit* /*slayer*/) OVERRIDE { - if (instance) - { - instance->SetData(TYPE_NARALEX_EVENT, FAIL); - instance->SetData(TYPE_NARALEX_PART1, FAIL); - instance->SetData(TYPE_NARALEX_PART2, FAIL); - instance->SetData(TYPE_NARALEX_PART3, FAIL); - } + instance->SetData(TYPE_NARALEX_EVENT, FAIL); + instance->SetData(TYPE_NARALEX_PART1, FAIL); + instance->SetData(TYPE_NARALEX_PART2, FAIL); + instance->SetData(TYPE_NARALEX_PART3, FAIL); } void JustSummoned(Creature* summoned) OVERRIDE @@ -213,8 +207,6 @@ public: if (currentEvent != TYPE_NARALEX_PART3) npc_escortAI::UpdateAI(diff); - if (!instance) - return; if (eventTimer <= diff) { eventTimer = 0; diff --git a/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp b/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp index bc31fd118b..23cf3f56c3 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp @@ -78,8 +78,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_ZUM_RAH, DONE); + instance->SetData(DATA_ZUM_RAH, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -150,7 +149,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_zum_rahAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp index a2f98b2158..2fe443fd0a 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -97,7 +97,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_sergeant_blyAI(creature); + return GetInstanceAI(creature); } struct npc_sergeant_blyAI : public ScriptedAI @@ -148,12 +148,9 @@ public: if (Player* target = ObjectAccessor::GetPlayer(*me, PlayerGUID)) AttackStart(target); - if (instance) - { - switchFactionIfAlive(instance, ENTRY_RAVEN); - switchFactionIfAlive(instance, ENTRY_ORO); - switchFactionIfAlive(instance, ENTRY_MURTA); - } + switchFactionIfAlive(instance, ENTRY_RAVEN); + switchFactionIfAlive(instance, ENTRY_ORO); + switchFactionIfAlive(instance, ENTRY_MURTA); } postGossipStep++; } @@ -296,7 +293,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_weegli_blastfuseAI(creature); + return GetInstanceAI(creature); } struct npc_weegli_blastfuseAI : public ScriptedAI @@ -316,8 +313,7 @@ public: void Reset() OVERRIDE { - /*if (instance) - instance->SetData(0, NOT_STARTED);*/ + /*instance->SetData(0, NOT_STARTED);*/ } void AttackStart(Unit* victim) OVERRIDE @@ -327,8 +323,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - /*if (instance) - instance->SetData(0, DONE);*/ + /*instance->SetData(0, DONE);*/ } void UpdateAI(uint32 diff) OVERRIDE @@ -358,22 +353,19 @@ public: void MovementInform(uint32 /*type*/, uint32 /*id*/) OVERRIDE { - if (instance) + if (instance->GetData(EVENT_PYRAMID) == PYRAMID_CAGES_OPEN) { - if (instance->GetData(EVENT_PYRAMID) == PYRAMID_CAGES_OPEN) - { - instance->SetData(EVENT_PYRAMID, PYRAMID_ARRIVED_AT_STAIR); - Talk(SAY_WEEGLI_OHNO); - me->SetHomePosition(1882.69f, 1272.28f, 41.87f, 0); - } - else - if (destroyingDoor) - { - instance->DoUseDoorOrButton(instance->GetData64(GO_END_DOOR)); - /// @todo leave the area... - me->DespawnOrUnsummon(); - }; + instance->SetData(EVENT_PYRAMID, PYRAMID_ARRIVED_AT_STAIR); + Talk(SAY_WEEGLI_OHNO); + me->SetHomePosition(1882.69f, 1272.28f, 41.87f, 0); } + else + if (destroyingDoor) + { + instance->DoUseDoorOrButton(instance->GetData64(GO_END_DOOR)); + /// @todo leave the area... + me->DespawnOrUnsummon(); + }; } void DoAction(int32 /*param*/) OVERRIDE diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index b4aeced5e9..8304f5ba9e 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -37,133 +37,118 @@ EndContentData */ # npc_torek ####*/ -enum TorekSays +enum Torek { SAY_READY = 0, SAY_MOVE = 1, SAY_PREPARE = 2, SAY_WIN = 3, SAY_END = 4, -}; - -enum TorekSpells -{ - SPELL_REND = 11977, - SPELL_THUNDERCLAP = 8078, -}; - -enum TorekMisc -{ - QUEST_TOREK_ASSULT = 6544, - - ENTRY_SPLINTERTREE_RAIDER = 12859, - ENTRY_DURIEL = 12860, - ENTRY_SILVERWING_SENTINEL = 12896, - ENTRY_SILVERWING_WARRIOR = 12897, + SPELL_REND = 11977, + SPELL_THUNDERCLAP = 8078, + QUEST_TOREK_ASSULT = 6544, + NPC_SPLINTERTREE_RAIDER = 12859, + NPC_DURIEL = 12860, + NPC_SILVERWING_SENTINEL = 12896, + NPC_SILVERWING_WARRIOR = 12897, + FACTION_QUEST = 113 }; class npc_torek : public CreatureScript { - public: +public: + npc_torek() : CreatureScript("npc_torek") { } - npc_torek() : CreatureScript("npc_torek") + struct npc_torekAI : public npc_escortAI + { + npc_torekAI(Creature* creature) : npc_escortAI(creature) { } + + void Reset() OVERRIDE { + rend_Timer = 5000; + thunderclap_Timer = 8000; + _completed = false; } - struct npc_torekAI : public npc_escortAI + void EnterCombat(Unit* /*who*/) OVERRIDE { } + + void JustSummoned(Creature* summoned) OVERRIDE { - npc_torekAI(Creature* creature) : npc_escortAI(creature) { } - - uint32 Rend_Timer; - uint32 Thunderclap_Timer; - bool Completed; - - void WaypointReached(uint32 waypointId) OVERRIDE - { - if (Player* player = GetPlayerForEscort()) - { - switch (waypointId) - { - case 1: - Talk(SAY_MOVE, player); - break; - case 8: - Talk(SAY_PREPARE, player); - break; - case 19: - /// @todo verify location and creatures amount. - me->SummonCreature(ENTRY_DURIEL, 1776.73f, -2049.06f, 109.83f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(ENTRY_SILVERWING_SENTINEL, 1774.64f, -2049.41f, 109.83f, 1.40f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - me->SummonCreature(ENTRY_SILVERWING_WARRIOR, 1778.73f, -2049.50f, 109.83f, 1.67f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); - break; - case 20: - Talk(SAY_WIN, player); - Completed = true; - player->GroupEventHappens(QUEST_TOREK_ASSULT, me); - break; - case 21: - Talk(SAY_END, player); - break; - } - } - } - - void Reset() OVERRIDE - { - Rend_Timer = 5000; - Thunderclap_Timer = 8000; - Completed = false; - } - - void EnterCombat(Unit* /*who*/) OVERRIDE - { - } - - void JustSummoned(Creature* summoned) OVERRIDE - { - summoned->AI()->AttackStart(me); - } - - void UpdateAI(uint32 diff) OVERRIDE - { - npc_escortAI::UpdateAI(diff); - - if (!UpdateVictim()) - return; - - if (Rend_Timer <= diff) - { - DoCastVictim(SPELL_REND); - Rend_Timer = 20000; - } else Rend_Timer -= diff; - - if (Thunderclap_Timer <= diff) - { - DoCast(me, SPELL_THUNDERCLAP); - Thunderclap_Timer = 30000; - } else Thunderclap_Timer -= diff; - } - }; - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_torekAI(creature); + summoned->AI()->AttackStart(me); } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE + void sQuestAccept(Player* player, Quest const* quest) { if (quest->GetQuestId() == QUEST_TOREK_ASSULT) { /// @todo find companions, make them follow Torek, at any time (possibly done by core/database in future?) - creature->AI()->Talk(SAY_READY, player); - creature->setFaction(113); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_torekAI, creature->AI())) - pEscortAI->Start(true, true, player->GetGUID()); + Talk(SAY_READY, player); + me->setFaction(FACTION_QUEST); + npc_escortAI::Start(true, true, player->GetGUID()); } - - return true; } + + void WaypointReached(uint32 waypointId) OVERRIDE + { + if (Player* player = GetPlayerForEscort()) + { + switch (waypointId) + { + case 1: + Talk(SAY_MOVE, player); + break; + case 8: + Talk(SAY_PREPARE, player); + break; + case 19: + /// @todo verify location and creatures amount. + me->SummonCreature(NPC_DURIEL, 1776.73f, -2049.06f, 109.83f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_SILVERWING_SENTINEL, 1774.64f, -2049.41f, 109.83f, 1.40f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + me->SummonCreature(NPC_SILVERWING_WARRIOR, 1778.73f, -2049.50f, 109.83f, 1.67f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); + break; + case 20: + Talk(SAY_WIN, player); + _completed = true; + player->GroupEventHappens(QUEST_TOREK_ASSULT, me); + break; + case 21: + Talk(SAY_END, player); + break; + } + } + } + + void UpdateAI(uint32 diff) OVERRIDE + { + npc_escortAI::UpdateAI(diff); + + if (!UpdateVictim()) + return; + + if (rend_Timer <= diff) + { + DoCastVictim(SPELL_REND); + rend_Timer = 20000; + } else rend_Timer -= diff; + + if (thunderclap_Timer <= diff) + { + DoCast(me, SPELL_THUNDERCLAP); + thunderclap_Timer = 30000; + } else thunderclap_Timer -= diff; + } + + private: + uint32 rend_Timer; + uint32 thunderclap_Timer; + bool _completed; + + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_torekAI(creature); + } }; /*#### @@ -175,96 +160,90 @@ enum RuulSnowhoof NPC_THISTLEFUR_URSA = 3921, NPC_THISTLEFUR_TOTEMIC = 3922, NPC_THISTLEFUR_PATHFINDER = 3926, - QUEST_FREEDOM_TO_RUUL = 6482, - GO_CAGE = 178147 }; Position const RuulSnowhoofSummonsCoord[6] = { - {3449.218018f, -587.825073f, 174.978867f, 4.714445f}, - {3446.384521f, -587.830872f, 175.186279f, 4.714445f}, - {3444.218994f, -587.835327f, 175.380600f, 4.714445f}, - {3508.344482f, -492.024261f, 186.929031f, 4.145029f}, - {3506.265625f, -490.531006f, 186.740128f, 4.239277f}, - {3503.682373f, -489.393799f, 186.629684f, 4.349232f} + { 3449.218018f, -587.825073f, 174.978867f, 4.714445f }, + { 3446.384521f, -587.830872f, 175.186279f, 4.714445f }, + { 3444.218994f, -587.835327f, 175.380600f, 4.714445f }, + { 3508.344482f, -492.024261f, 186.929031f, 4.145029f }, + { 3506.265625f, -490.531006f, 186.740128f, 4.239277f }, + { 3503.682373f, -489.393799f, 186.629684f, 4.349232f } }; class npc_ruul_snowhoof : public CreatureScript { - public: - npc_ruul_snowhoof() : CreatureScript("npc_ruul_snowhoof") { } +public: + npc_ruul_snowhoof() : CreatureScript("npc_ruul_snowhoof") { } - struct npc_ruul_snowhoofAI : public npc_escortAI + struct npc_ruul_snowhoofAI : public npc_escortAI + { + npc_ruul_snowhoofAI(Creature* creature) : npc_escortAI(creature) { } + + void Reset() OVERRIDE { - npc_ruul_snowhoofAI(Creature* creature) : npc_escortAI(creature) { } - - void WaypointReached(uint32 waypointId) OVERRIDE - { - Player* player = GetPlayerForEscort(); - if (!player) - return; - - switch (waypointId) - { - case 0: - me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) - Cage->SetGoState(GO_STATE_ACTIVE); - break; - case 13: - me->SummonCreature(NPC_THISTLEFUR_TOTEMIC, RuulSnowhoofSummonsCoord[0], TEMPSUMMON_DEAD_DESPAWN, 60000); - me->SummonCreature(NPC_THISTLEFUR_URSA, RuulSnowhoofSummonsCoord[1], TEMPSUMMON_DEAD_DESPAWN, 60000); - me->SummonCreature(NPC_THISTLEFUR_PATHFINDER, RuulSnowhoofSummonsCoord[2], TEMPSUMMON_DEAD_DESPAWN, 60000); - break; - case 19: - me->SummonCreature(NPC_THISTLEFUR_TOTEMIC, RuulSnowhoofSummonsCoord[3], TEMPSUMMON_DEAD_DESPAWN, 60000); - me->SummonCreature(NPC_THISTLEFUR_URSA, RuulSnowhoofSummonsCoord[4], TEMPSUMMON_DEAD_DESPAWN, 60000); - me->SummonCreature(NPC_THISTLEFUR_PATHFINDER, RuulSnowhoofSummonsCoord[5], TEMPSUMMON_DEAD_DESPAWN, 60000); - break; - case 21: - player->GroupEventHappens(QUEST_FREEDOM_TO_RUUL, me); - break; - } - } - - void EnterCombat(Unit* /*who*/) OVERRIDE { } - - void Reset() OVERRIDE - { - if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) - Cage->SetGoState(GO_STATE_READY); - } - - void JustSummoned(Creature* summoned) OVERRIDE - { - summoned->AI()->AttackStart(me); - } - - void UpdateAI(uint32 diff) OVERRIDE - { - npc_escortAI::UpdateAI(diff); - } - }; - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_ruul_snowhoofAI(creature); + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) + Cage->SetGoState(GO_STATE_READY); } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE + void EnterCombat(Unit* /*who*/) OVERRIDE { } + + void JustSummoned(Creature* summoned) OVERRIDE { - if (quest->GetQuestId() == QUEST_FREEDOM_TO_RUUL) - { - creature->setFaction(113); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_ruul_snowhoofAI, (creature->AI()))) - pEscortAI->Start(true, false, player->GetGUID()); - } - - return true; + summoned->AI()->AttackStart(me); } + + void sQuestAccept(Player* player, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_TOREK_ASSULT) + { + me->setFaction(FACTION_QUEST); + npc_escortAI::Start(true, false, player->GetGUID()); + } + } + + void WaypointReached(uint32 waypointId) OVERRIDE + { + Player* player = GetPlayerForEscort(); + if (!player) + return; + + switch (waypointId) + { + case 0: + me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) + Cage->SetGoState(GO_STATE_ACTIVE); + break; + case 13: + me->SummonCreature(NPC_THISTLEFUR_TOTEMIC, RuulSnowhoofSummonsCoord[0], TEMPSUMMON_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_THISTLEFUR_URSA, RuulSnowhoofSummonsCoord[1], TEMPSUMMON_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_THISTLEFUR_PATHFINDER, RuulSnowhoofSummonsCoord[2], TEMPSUMMON_DEAD_DESPAWN, 60000); + break; + case 19: + me->SummonCreature(NPC_THISTLEFUR_TOTEMIC, RuulSnowhoofSummonsCoord[3], TEMPSUMMON_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_THISTLEFUR_URSA, RuulSnowhoofSummonsCoord[4], TEMPSUMMON_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_THISTLEFUR_PATHFINDER, RuulSnowhoofSummonsCoord[5], TEMPSUMMON_DEAD_DESPAWN, 60000); + break; + case 21: + player->GroupEventHappens(QUEST_FREEDOM_TO_RUUL, me); + break; + } + } + + void UpdateAI(uint32 diff) OVERRIDE + { + npc_escortAI::UpdateAI(diff); + } + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_ruul_snowhoofAI(creature); + } }; enum Muglash @@ -298,37 +277,68 @@ enum Muglash Position const FirstNagaCoord[3] = { - {3603.504150f, 1122.631104f, 1.635f, 0.0f}, // rider - {3589.293945f, 1148.664063f, 5.565f, 0.0f}, // sorceress - {3609.925537f, 1168.759521f, -1.168f, 0.0f} // razortail + { 3603.504150f, 1122.631104f, 1.635f, 0.0f }, // rider + { 3589.293945f, 1148.664063f, 5.565f, 0.0f }, // sorceress + { 3609.925537f, 1168.759521f, -1.168f, 0.0f } // razortail }; Position const SecondNagaCoord[3] = { - {3609.925537f, 1168.759521f, -1.168f, 0.0f}, // witch - {3645.652100f, 1139.425415f, 1.322f, 0.0f}, // priest - {3583.602051f, 1128.405762f, 2.347f, 0.0f} // myrmidon + { 3609.925537f, 1168.759521f, -1.168f, 0.0f }, // witch + { 3645.652100f, 1139.425415f, 1.322f, 0.0f }, // priest + { 3583.602051f, 1128.405762f, 2.347f, 0.0f } // myrmidon }; Position const VorshaCoord = {3633.056885f, 1172.924072f, -5.388f, 0.0f}; class npc_muglash : public CreatureScript { - public: - npc_muglash() : CreatureScript("npc_muglash") { } +public: + npc_muglash() : CreatureScript("npc_muglash") { } - struct npc_muglashAI : public npc_escortAI + struct npc_muglashAI : public npc_escortAI + { + npc_muglashAI(Creature* creature) : npc_escortAI(creature) { } + + void Reset() OVERRIDE { - npc_muglashAI(Creature* creature) : npc_escortAI(creature) { } + eventTimer = 10000; + waveId = 0; + _isBrazierExtinguished = false; + } - uint8 WaveId; - uint32 EventTimer; - bool IsBrazierExtinguished; + void EnterCombat(Unit* /*who*/) OVERRIDE + { + if (Player* player = GetPlayerForEscort()) + if (HasEscortState(STATE_ESCORT_PAUSED)) + { + if (urand(0, 1)) + Talk(SAY_MUG_ON_GUARD, player); + return; + } + } - void JustSummoned(Creature* summoned) OVERRIDE + void JustDied(Unit* /*killer*/) OVERRIDE + { + if (HasEscortState(STATE_ESCORT_ESCORTING)) + if (Player* player = GetPlayerForEscort()) + player->FailQuest(QUEST_VORSHA); + } + + void JustSummoned(Creature* summoned) OVERRIDE + { + summoned->AI()->AttackStart(me); + } + + void sQuestAccept(Player* player, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_VORSHA) { - summoned->AI()->AttackStart(me); + Talk(SAY_MUG_START1); + me->setFaction(FACTION_QUEST); + npc_escortAI::Start(true, false, player->GetGUID()); } + } void WaypointReached(uint32 waypointId) OVERRIDE { @@ -362,34 +372,9 @@ class npc_muglash : public CreatureScript } } - void EnterCombat(Unit* /*who*/) OVERRIDE - { - if (Player* player = GetPlayerForEscort()) - if (HasEscortState(STATE_ESCORT_PAUSED)) - { - if (urand(0, 1)) - Talk(SAY_MUG_ON_GUARD, player); - return; - } - } - - void Reset() OVERRIDE - { - EventTimer = 10000; - WaveId = 0; - IsBrazierExtinguished = false; - } - - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (HasEscortState(STATE_ESCORT_ESCORTING)) - if (Player* player = GetPlayerForEscort()) - player->FailQuest(QUEST_VORSHA); - } - void DoWaveSummon() { - switch (WaveId) + switch (waveId) { case 1: me->SummonCreature(NPC_WRATH_RIDER, FirstNagaCoord[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); @@ -411,48 +396,40 @@ class npc_muglash : public CreatureScript } } - void UpdateAI(uint32 uiDiff) OVERRIDE + void UpdateAI(uint32 diff) OVERRIDE { - npc_escortAI::UpdateAI(uiDiff); + npc_escortAI::UpdateAI(diff); if (!me->GetVictim()) { - if (HasEscortState(STATE_ESCORT_PAUSED) && IsBrazierExtinguished) + if (HasEscortState(STATE_ESCORT_PAUSED) && _isBrazierExtinguished) { - if (EventTimer < uiDiff) + if (eventTimer < diff) { - ++WaveId; + ++waveId; DoWaveSummon(); - EventTimer = 10000; + eventTimer = 10000; } else - EventTimer -= uiDiff; + eventTimer -= diff; } return; } DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_muglashAI(creature); - } + private: + uint32 eventTimer; + uint8 waveId; + public: + bool _isBrazierExtinguished; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE - { - if (quest->GetQuestId() == QUEST_VORSHA) - { - if (npc_muglashAI* pEscortAI = CAST_AI(npc_muglashAI, creature->AI())) - { - creature->AI()->Talk(SAY_MUG_START1); - creature->setFaction(113); + }; - pEscortAI->Start(true, false, player->GetGUID()); - } - } - return true; - } + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_muglashAI(creature); + } }; class go_naga_brazier : public GameObjectScript @@ -468,7 +445,7 @@ class go_naga_brazier : public GameObjectScript { creature->AI()->Talk(SAY_MUG_BRAZIER_WAIT); - pEscortAI->IsBrazierExtinguished = true; + pEscortAI->_isBrazierExtinguished = true; return false; } } diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index c2ae69373a..c225c3a857 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -48,9 +48,7 @@ EndContentData */ enum draeneiSurvivor { SAY_HEAL = 0, - SAY_HELP = 1, - SPELL_IRRIDATION = 35046, SPELL_STUNNED = 28630 }; @@ -60,11 +58,6 @@ class npc_draenei_survivor : public CreatureScript public: npc_draenei_survivor() : CreatureScript("npc_draenei_survivor") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_draenei_survivorAI(creature); - } - struct npc_draenei_survivorAI : public ScriptedAI { npc_draenei_survivorAI(Creature* creature) : ScriptedAI(creature) { } @@ -167,6 +160,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_draenei_survivorAI(creature); + } }; /*###### @@ -186,39 +183,11 @@ enum Overgrind SPELL_DYNAMITE = 7978 }; -#define GOSSIP_FIGHT "Traitor! You will be brought to justice!" - class npc_engineer_spark_overgrind : public CreatureScript { public: npc_engineer_spark_overgrind() : CreatureScript("npc_engineer_spark_overgrind") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF) - { - player->CLOSE_GOSSIP_MENU(); - creature->setFaction(FACTION_HOSTILE); - CAST_AI(npc_engineer_spark_overgrind::npc_engineer_spark_overgrindAI, creature->AI())->AttackStart(player); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (player->GetQuestStatus(QUEST_GNOMERCY) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FIGHT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_engineer_spark_overgrindAI(creature); - } - struct npc_engineer_spark_overgrindAI : public ScriptedAI { npc_engineer_spark_overgrindAI(Creature* creature) : ScriptedAI(creature) @@ -230,14 +199,6 @@ public: IsTreeEvent = true; } - uint32 NormFaction; - uint32 NpcFlags; - - uint32 DynamiteTimer; - uint32 EmoteTimer; - - bool IsTreeEvent; - void Reset() OVERRIDE { DynamiteTimer = 8000; @@ -254,6 +215,13 @@ public: Talk(ATTACK_YELL, who); } + void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) OVERRIDE + { + player->CLOSE_GOSSIP_MENU(); + me->setFaction(FACTION_HOSTILE); + me->Attack(player, true); + } + void UpdateAI(uint32 diff) OVERRIDE { if (!me->IsInCombat() && !IsTreeEvent) @@ -279,8 +247,19 @@ public: DoMeleeAttackIfReady(); } + + private: + uint32 NormFaction; + uint32 NpcFlags; + uint32 DynamiteTimer; + uint32 EmoteTimer; + bool IsTreeEvent; }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_engineer_spark_overgrindAI(creature); + } }; /*###### @@ -292,11 +271,6 @@ class npc_injured_draenei : public CreatureScript public: npc_injured_draenei() : CreatureScript("npc_injured_draenei") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_injured_draeneiAI(creature); - } - struct npc_injured_draeneiAI : public ScriptedAI { npc_injured_draeneiAI(Creature* creature) : ScriptedAI(creature) { } @@ -321,10 +295,13 @@ public: void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { } - void UpdateAI(uint32 /*diff*/) OVERRIDE { } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_injured_draeneiAI(creature); + } }; /*###### @@ -339,8 +316,8 @@ enum Magwin SAY_END1 = 3, SAY_END2 = 4, EMOTE_HUG = 5, - - QUEST_A_CRY_FOR_SAY_HELP = 9528 + QUEST_A_CRY_FOR_SAY_HELP = 9528, + FACTION_QUEST = 113 }; class npc_magwin : public CreatureScript @@ -348,26 +325,26 @@ class npc_magwin : public CreatureScript public: npc_magwin() : CreatureScript("npc_magwin") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE - { - if (quest->GetQuestId() == QUEST_A_CRY_FOR_SAY_HELP) - { - creature->setFaction(113); - if (npc_escortAI* pEscortAI = CAST_AI(npc_escortAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_magwinAI(creature); - } - struct npc_magwinAI : public npc_escortAI { npc_magwinAI(Creature* creature) : npc_escortAI(creature) { } + void Reset() OVERRIDE { } + + void EnterCombat(Unit* who) OVERRIDE + { + Talk(SAY_AGGRO, who); + } + + void sQuestAccept(Player* player, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_A_CRY_FOR_SAY_HELP) + { + me->setFaction(FACTION_QUEST); + npc_escortAI::Start(true, false, player->GetGUID()); + } + } + void WaypointReached(uint32 waypointId) OVERRIDE { if (Player* player = GetPlayerForEscort()) @@ -391,15 +368,12 @@ public: } } } - - void EnterCombat(Unit* who) OVERRIDE - { - Talk(SAY_AGGRO, who); - } - - void Reset() OVERRIDE { } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_magwinAI(creature); + } }; /*###### @@ -433,11 +407,6 @@ class npc_geezle : public CreatureScript public: npc_geezle() : CreatureScript("npc_geezle") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_geezleAI(creature); - } - struct npc_geezleAI : public ScriptedAI { npc_geezleAI(Creature* creature) : ScriptedAI(creature) { } @@ -568,6 +537,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_geezleAI(creature); + } }; enum RavegerCage @@ -606,11 +579,6 @@ class npc_death_ravager : public CreatureScript public: npc_death_ravager() : CreatureScript("npc_death_ravager") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_death_ravagerAI(creature); - } - struct npc_death_ravagerAI : public ScriptedAI { npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature){ } @@ -650,6 +618,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_death_ravagerAI(creature); + } }; /*######## diff --git a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp index 694d63d529..f71c07b5c7 100644 --- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp @@ -19,18 +19,18 @@ /* ScriptData SDName: Bloodmyst_Isle SD%Complete: 80 -SDComment: Quest support: 9670, 9756(gossip items text needed). +SDComment: Quest support: 9670, 9667 SDCategory: Bloodmyst Isle EndScriptData */ /* ContentData npc_webbed_creature -npc_captured_sunhawk_agent +npc_princess_stillpine +go_princess_stillpines_cage EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "ScriptedGossip.h" #include "Player.h" /*###### @@ -40,16 +40,16 @@ EndContentData */ //possible creatures to be spawned uint32 const possibleSpawns[32] = {17322, 17661, 17496, 17522, 17340, 17352, 17333, 17524, 17654, 17348, 17339, 17345, 17359, 17353, 17336, 17550, 17330, 17701, 17321, 17680, 17325, 17320, 17683, 17342, 17715, 17334, 17341, 17338, 17337, 17346, 17344, 17327}; +enum WebbedCreature +{ + NPC_EXPEDITION_RESEARCHER = 17681 +}; + class npc_webbed_creature : public CreatureScript { public: npc_webbed_creature() : CreatureScript("npc_webbed_creature") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_webbed_creatureAI(creature); - } - struct npc_webbed_creatureAI : public ScriptedAI { npc_webbed_creatureAI(Creature* creature) : ScriptedAI(creature) { } @@ -65,9 +65,8 @@ public: switch (urand(0, 2)) { case 0: - spawnCreatureID = 17681; if (Player* player = killer->ToPlayer()) - player->KilledMonsterCredit(spawnCreatureID, 0); + player->KilledMonsterCredit(NPC_EXPEDITION_RESEARCHER, 0); break; case 1: case 2: @@ -80,72 +79,10 @@ public: } }; -}; - -/*###### -## npc_captured_sunhawk_agent -######*/ - -#define C_SUNHAWK_TRIGGER 17974 - -#define GOSSIP_HELLO_CSA "[PH] " -#define GOSSIP_SELECT_CSA1 "[PH] " -#define GOSSIP_SELECT_CSA2 "[PH] " -#define GOSSIP_SELECT_CSA3 "[PH] " -#define GOSSIP_SELECT_CSA4 "[PH] " -#define GOSSIP_SELECT_CSA5 "[PH] " - -class npc_captured_sunhawk_agent : public CreatureScript -{ -public: - npc_captured_sunhawk_agent() : CreatureScript("npc_captured_sunhawk_agent") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_CSA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(9137, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_CSA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - player->SEND_GOSSIP_MENU(9138, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_CSA3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - player->SEND_GOSSIP_MENU(9139, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_CSA4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - player->SEND_GOSSIP_MENU(9140, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_CSA5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); - player->SEND_GOSSIP_MENU(9141, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+6: - player->CLOSE_GOSSIP_MENU(); - player->TalkedToCreature(C_SUNHAWK_TRIGGER, creature->GetGUID()); - break; - } - return true; + return new npc_webbed_creatureAI(creature); } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (player->HasAura(31609) && player->GetQuestStatus(9756) == QUEST_STATUS_INCOMPLETE) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_CSA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(9136, creature->GetGUID()); - } - else - player->SEND_GOSSIP_MENU(9134, creature->GetGUID()); - - return true; - } - }; /*###### @@ -206,7 +143,6 @@ public: void AddSC_bloodmyst_isle() { new npc_webbed_creature(); - new npc_captured_sunhawk_agent(); new npc_princess_stillpine(); new go_princess_stillpines_cage(); } diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index 4590b21f13..4f11a2ee16 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -59,18 +59,6 @@ class npc_aged_dying_ancient_kodo : public CreatureScript public: npc_aged_dying_ancient_kodo() : CreatureScript("npc_aged_dying_ancient_kodo") { } - bool OnGossipHello(Player* player, Creature* creature) - { - if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && creature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) - { - player->TalkedToCreature(creature->GetEntry(), 0); - player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF); - } - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - struct npc_aged_dying_ancient_kodoAI : public ScriptedAI { npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) { } @@ -108,6 +96,18 @@ public: } }; + bool OnGossipHello(Player* player, Creature* creature) OVERRIDE + { + if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && creature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) + { + player->TalkedToCreature(creature->GetEntry(), 0); + player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF); + } + + player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); + return true; + } + CreatureAI* GetAI(Creature* creature) const OVERRIDE { return new npc_aged_dying_ancient_kodoAI(creature); @@ -122,8 +122,7 @@ public: enum DemonPortal { NPC_DEMON_GUARDIAN = 11937, - - QUEST_PORTAL_OF_THE_LEGION = 5581, + QUEST_PORTAL_OF_THE_LEGION = 5581 }; class go_demon_portal : public GameObjectScript diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 49b557e9fa..849f72d2fc 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -340,10 +340,7 @@ public: BigWill = 0; } - void EnterCombat(Unit* /*who*/) OVERRIDE { } - void MoveInLineOfSight(Unit* who) OVERRIDE - { if (!who || !who->IsAlive() || EventInProgress) return; @@ -357,8 +354,6 @@ public: } } - void KilledUnit(Unit* /*victim*/) OVERRIDE { } - void UpdateAI(uint32 diff) OVERRIDE { if (EventInProgress) diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp index 5bb68a4c88..51b234846a 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp @@ -33,7 +33,7 @@ enum Spells SPELL_MIND_FLAY = 57941, SPELL_SHADOW_BOLT_VOLLEY = 57942, SPELL_SHIVER = 57949, - SPELL_CLONE_PLAYER = 57507, //casted on player during insanity + SPELL_CLONE_PLAYER = 57507, //cast on player during insanity SPELL_INSANITY_PHASING_1 = 57508, SPELL_INSANITY_PHASING_2 = 57509, SPELL_INSANITY_PHASING_3 = 57510, @@ -149,11 +149,8 @@ public: uiShadowBoltVolleyTimer = 5*IN_MILLISECONDS; uiShiverTimer = 15*IN_MILLISECONDS; - if (instance) - { - instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); - } + instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); // Visible for all players in insanity me->SetPhaseMask((1|16|32|64|128|256), true); @@ -172,11 +169,8 @@ public: { Talk(SAY_AGGRO); - if (instance) - { - instance->SetBossState(DATA_HERALD_VOLAZJ, IN_PROGRESS); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); - } + instance->SetBossState(DATA_HERALD_VOLAZJ, IN_PROGRESS); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); } void JustSummoned(Creature* summon) OVERRIDE @@ -295,22 +289,22 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_HERALD_VOLAZJ, DONE); + instance->SetBossState(DATA_HERALD_VOLAZJ, DONE); Summons.DespawnAll(); ResetPlayersPhaseMask(); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_volazjAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp index a68a122bc3..5cf57c18bc 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -101,15 +101,12 @@ public: bCanDown = false; volunteerWork = true; - if (instance) - { - if (!bFirstTime) - instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL); + if (!bFirstTime) + instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL); - instance->SetData64(DATA_PL_JEDOGA_TARGET, 0); - instance->SetData64(DATA_ADD_JEDOGA_OPFER, 0); - instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0); - } + instance->SetData64(DATA_PL_JEDOGA_TARGET, 0); + instance->SetData64(DATA_ADD_JEDOGA_OPFER, 0); + instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0); MoveUp(); bFirstTime = false; @@ -144,8 +141,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { Talk(TEXT_DEATH); - if (instance) - instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, DONE); + instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, DONE); } void DoAction(int32 action) OVERRIDE @@ -197,9 +193,6 @@ public: void MoveDown() { - if (!instance) - return; - bOpFerokFail = false; instance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 0); @@ -233,9 +226,6 @@ public: void MoveUp() { - if (!instance) - return; - me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true); me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); @@ -255,9 +245,6 @@ public: void OpferRufen() { - if (!instance) - return; - uint64 opfer = instance->GetData64(DATA_ADD_JEDOGA_INITIAND); if (opfer) @@ -281,9 +268,6 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!instance) - return; - if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && instance->GetData(DATA_ALL_INITIAND_DEAD)) MoveDown(); @@ -337,7 +321,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_jedoga_shadowseekerAI(creature); + return GetInstanceAI(creature); } }; @@ -361,9 +345,6 @@ public: void Reset() OVERRIDE { - if (!instance) - return; - bWalking = false; bCheckTimer = 2*IN_MILLISECONDS; @@ -503,7 +484,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_jedoga_initiandAI(creature); + return GetInstanceAI(creature); } }; @@ -528,8 +509,8 @@ public: instance = creature->GetInstanceScript(); bRemoved = false; bRemoved2 = false; - bCasted = false; - bCasted2 = false; + bCast = false; + bCast2 = false; SetCombatMovement(false); } @@ -538,8 +519,8 @@ public: bool bRemoved; bool bRemoved2; - bool bCasted; - bool bCasted2; + bool bCast; + bool bCast2; void Reset() OVERRIDE { } void EnterCombat(Unit* /*who*/) OVERRIDE { } @@ -549,9 +530,6 @@ public: void UpdateAI(uint32 /*diff*/) OVERRIDE { - if (!instance) - return; - if (!bRemoved && me->GetPositionX() > 440.0f) { if (instance->GetBossState(DATA_PRINCE_TALDARAM) == DONE) @@ -560,23 +538,23 @@ public: bRemoved = true; return; } - if (!bCasted) + if (!bCast) { DoCast(me, SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_1, false); - bCasted = true; + bCast = true; } } if (!bRemoved2 && me->GetPositionX() < 440.0f) { - if (!bCasted2 && instance->GetData(DATA_JEDOGA_TRIGGER_SWITCH)) + if (!bCast2 && instance->GetData(DATA_JEDOGA_TRIGGER_SWITCH)) { DoCast(me, SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_2, false); - bCasted2 = true; + bCast2 = true; } - if (bCasted2 && !instance->GetData(DATA_JEDOGA_TRIGGER_SWITCH)) + if (bCast2 && !instance->GetData(DATA_JEDOGA_TRIGGER_SWITCH)) { me->InterruptNonMeleeSpells(true); - bCasted2 = false; + bCast2 = false; } if (!bRemoved2 && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == DONE) { @@ -589,7 +567,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_jedogas_aufseher_triggerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index 8153026561..8315f09919 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -130,11 +130,8 @@ public: Summons.DespawnAll(); - if (instance) - { - instance->SetBossState(DATA_ANUBARAK, NOT_STARTED); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - } + instance->SetBossState(DATA_ANUBARAK, NOT_STARTED); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } Creature* DoSummonImpaleTarget(Unit* target) @@ -158,14 +155,12 @@ public: { Talk(SAY_AGGRO); DelayTimer = 0; - if (instance) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void DelayEventStart() { - if (instance) - instance->SetBossState(DATA_ANUBARAK, IN_PROGRESS); + instance->SetBossState(DATA_ANUBARAK, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -335,8 +330,7 @@ public: { Talk(SAY_DEATH); Summons.DespawnAll(); - if (instance) - instance->SetBossState(DATA_ANUBARAK, DONE); + instance->SetBossState(DATA_ANUBARAK, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -355,7 +349,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_anub_arakAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index 1664a1375a..a3227b02f1 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -102,14 +102,12 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_HADRONOX, DONE); + instance->SetBossState(DATA_HADRONOX, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_HADRONOX, IN_PROGRESS); + instance->SetBossState(DATA_HADRONOX, IN_PROGRESS); me->SetInCombatWithZone(); } @@ -192,7 +190,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_hadronoxAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 143ccc29e0..527b5d7697 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -104,8 +104,7 @@ public: uiMindFlayTimer = 15*IN_MILLISECONDS; uiCurseFatigueTimer = 12*IN_MILLISECONDS; - if (instance) - instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, NOT_STARTED); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -114,8 +113,7 @@ public: Summon(); uiSummonTimer = 15*IN_MILLISECONDS; - if (instance) - instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, IN_PROGRESS); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, IN_PROGRESS); } void Summon() @@ -175,8 +173,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, DONE); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -195,7 +192,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_krik_thirAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index 8c470f73e0..534d942b9e 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -45,7 +45,7 @@ enum Enums SPELL_TAIL_LASH = 56910, // A sweeping tail strike hits all enemies behind the caster, inflicting 3063 to 3937 damage and stunning them for 2 sec. SPELL_TAIL_LASH_H = 58957, // A sweeping tail strike hits all enemies behind the caster, inflicting 4375 to 5625 damage and stunning them for 2 sec. SPELL_WILL_OF_SARTHARION = 61254, // Sartharion's presence bolsters the resolve of the Twilight Drakes, increasing their total health by 25%. This effect also increases Sartharion's health by 25%. - SPELL_LAVA_STRIKE = 57571, // (Real spell casted should be 57578) 57571 then trigger visual missile, then summon Lava Blaze on impact(spell 57572) + SPELL_LAVA_STRIKE = 57571, // (Real spell cast should be 57578) 57571 then trigger visual missile, then summon Lava Blaze on impact(spell 57572) SPELL_TWILIGHT_REVENGE = 60639, NPC_FIRE_CYCLONE = 30648, @@ -78,44 +78,34 @@ enum Misc DATA_CAN_LOOT = 0 }; -struct Location -{ - float x, y, z; -}; - -static Location FlameRight1Spawn = { 3200.00f, 573.211f, 57.1551f }; -static Location FlameRight1Direction = { 3289.28f, 573.211f, 57.1551f }; -static Location FlameRight2Spawn = { 3200.00f, 532.211f, 57.1551f }; -static Location FlameRight2Direction = { 3289.28f, 532.211f, 57.1551f }; -static Location FlameRight3Spawn = { 3200.00f, 491.211f, 57.1551f }; -static Location FlameRight3Direction = { 3289.28f, 491.211f, 57.1551f }; -static Location FlameLeft1Spawn = { 3289.28f, 511.711f, 57.1551f }; -static Location FlameLeft1Direction = { 3200.00f, 511.711f, 57.1551f }; -static Location FlameLeft2Spawn = { 3289.28f, 552.711f, 57.1551f }; -static Location FlameLeft2Direction = { 3200.00f, 552.711f, 57.1551f }; - -struct Waypoint -{ - float m_fX, m_fY, m_fZ; -}; +Position const FlameRight1Spawn = { 3200.00f, 573.211f, 57.1551f, 0.0f }; +Position const FlameRight1Direction = { 3289.28f, 573.211f, 57.1551f, 0.0f }; +Position const FlameRight2Spawn = { 3200.00f, 532.211f, 57.1551f, 0.0f }; +Position const FlameRight2Direction = { 3289.28f, 532.211f, 57.1551f, 0.0f }; +Position const FlameRight3Spawn = { 3200.00f, 491.211f, 57.1551f, 0.0f }; +Position const FlameRight3Direction = { 3289.28f, 491.211f, 57.1551f, 0.0f }; +Position const FlameLeft1Spawn = { 3289.28f, 511.711f, 57.1551f, 0.0f }; +Position const FlameLeft1Direction = { 3200.00f, 511.711f, 57.1551f, 0.0f }; +Position const FlameLeft2Spawn = { 3289.28f, 552.711f, 57.1551f, 0.0f }; +Position const FlameLeft2Direction = { 3200.00f, 552.711f, 57.1551f, 0.0f }; //each dragons special points. First where fly to before connect to connon, second where land point is. -Waypoint m_aTene[]= +Position const TenebronPositions[] = { - {3212.854f, 575.597f, 109.856f}, // init - {3246.425f, 565.367f, 61.249f} // end + { 3212.854f, 575.597f, 109.856f, 0.0f }, // init + { 3246.425f, 565.367f, 61.249f, 0.0f } // end }; -Waypoint m_aShad[]= +Position const ShadronPositions[] = { - {3293.238f, 472.223f, 106.968f}, - {3271.669f, 526.907f, 61.931f} + { 3293.238f, 472.223f, 106.968f, 0.0f }, + { 3271.669f, 526.907f, 61.931f, 0.0f } }; -Waypoint m_aVesp[]= +Position const VesperonPositions[] = { - {3193.310f, 472.861f, 102.697f}, - {3227.268f, 533.238f, 59.995f} + { 3193.310f, 472.861f, 102.697f, 0.0f }, + { 3227.268f, 533.238f, 59.995f, 0.0f } }; enum SartharionEvents @@ -156,11 +146,8 @@ public: me->SetHomePosition(3246.57f, 551.263f, 58.6164f, 4.66003f); - if (instance) - { - DrakeRespawn(); - instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); - } + DrakeRespawn(); + instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); } void JustReachedHome() OVERRIDE @@ -174,8 +161,7 @@ public: _EnterCombat(); DoZoneInCombat(); - if (instance) - FetchDragons(); + FetchDragons(); events.ScheduleEvent(EVENT_LAVA_STRIKE, 5000); events.ScheduleEvent(EVENT_CLEAVE_ATTACK, 7000); @@ -192,25 +178,23 @@ public: Talk(SAY_SARTHARION_DEATH); _JustDied(); - if (instance) - { - if (Creature* tenebron = Unit::GetCreature(*me, instance->GetData64(DATA_TENEBRON))) - if (tenebron->IsAlive()) - tenebron->DisappearAndDie(); + if (Creature* tenebron = Unit::GetCreature(*me, instance->GetData64(DATA_TENEBRON))) + if (tenebron->IsAlive()) + tenebron->DisappearAndDie(); - if (Creature* shadron = Unit::GetCreature(*me, instance->GetData64(DATA_SHADRON))) - if (shadron->IsAlive()) - shadron->DisappearAndDie(); + if (Creature* shadron = Unit::GetCreature(*me, instance->GetData64(DATA_SHADRON))) + if (shadron->IsAlive()) + shadron->DisappearAndDie(); - if (Creature* vesperon = Unit::GetCreature(*me, instance->GetData64(DATA_VESPERON))) - if (vesperon->IsAlive()) - vesperon->DisappearAndDie(); - } + if (Creature* vesperon = Unit::GetCreature(*me, instance->GetData64(DATA_VESPERON))) + if (vesperon->IsAlive()) + vesperon->DisappearAndDie(); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SARTHARION_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SARTHARION_SLAY); } // me->ResetLootMode() is called from Reset() @@ -307,7 +291,7 @@ public: AddDrakeLootMode(); ++drakeCount; } - fetchTene->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aTene[0].m_fX, m_aTene[0].m_fY, m_aTene[0].m_fZ); + fetchTene->GetMotionMaster()->MovePoint(POINT_ID_INIT, TenebronPositions[0]); if (!fetchTene->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) fetchTene->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -325,7 +309,7 @@ public: AddDrakeLootMode(); ++drakeCount; } - fetchShad->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aShad[0].m_fX, m_aShad[0].m_fY, m_aShad[0].m_fZ); + fetchShad->GetMotionMaster()->MovePoint(POINT_ID_INIT, ShadronPositions[0]); if (!fetchShad->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) fetchShad->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -343,7 +327,7 @@ public: AddDrakeLootMode(); ++drakeCount; } - fetchVesp->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aVesp[0].m_fX, m_aVesp[0].m_fY, m_aVesp[0].m_fZ); + fetchVesp->GetMotionMaster()->MovePoint(POINT_ID_INIT, VesperonPositions[0]); if (!fetchVesp->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) fetchVesp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -356,40 +340,37 @@ public: void CallDragon(uint32 dataId) { - if (instance) + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(dataId))) { - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(dataId))) + if (temp->IsAlive() && !temp->GetVictim()) { - if (temp->IsAlive() && !temp->GetVictim()) + temp->SetWalk(false); + + if (temp->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + + uint8 textId = 0; + + switch (temp->GetEntry()) { - temp->SetWalk(false); - - if (temp->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - int32 textId = 0; - - switch (temp->GetEntry()) - { - case NPC_TENEBRON: - textId = SAY_SARTHARION_CALL_TENEBRON; - temp->AddAura(SPELL_POWER_OF_TENEBRON, temp); - temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, m_aTene[1].m_fX, m_aTene[1].m_fY, m_aTene[1].m_fZ); - break; - case NPC_SHADRON: - textId = SAY_SARTHARION_CALL_SHADRON; - temp->AddAura(SPELL_POWER_OF_SHADRON, temp); - temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, m_aShad[1].m_fX, m_aShad[1].m_fY, m_aShad[1].m_fZ); - break; - case NPC_VESPERON: - textId = SAY_SARTHARION_CALL_VESPERON; - temp->AddAura(SPELL_POWER_OF_VESPERON, temp); - temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, m_aVesp[1].m_fX, m_aVesp[1].m_fY, m_aVesp[1].m_fZ); - break; - } - - Talk(textId); + case NPC_TENEBRON: + textId = SAY_SARTHARION_CALL_TENEBRON; + temp->AddAura(SPELL_POWER_OF_TENEBRON, temp); + temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, TenebronPositions[1]); + break; + case NPC_SHADRON: + textId = SAY_SARTHARION_CALL_SHADRON; + temp->AddAura(SPELL_POWER_OF_SHADRON, temp); + temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, ShadronPositions[1]); + break; + case NPC_VESPERON: + textId = SAY_SARTHARION_CALL_VESPERON; + temp->AddAura(SPELL_POWER_OF_VESPERON, temp); + temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, VesperonPositions[1]); + break; } + + Talk(textId); } } } @@ -402,20 +383,6 @@ public: return 0; } - void SendFlameTsunami() - { - if (Map* map = me->GetMap()) - if (map->IsDungeon()) - { - Map::PlayerList const &PlayerList = map->GetPlayers(); - - if (!PlayerList.isEmpty()) - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (i->GetSource() && i->GetSource()->IsAlive()) - Talk(WHISPER_LAVA_CHURN, i->GetSource()); - } - } - // Selects a random Fire Cyclone and makes it cast Lava Strike. // FIXME: Frequency of the casts reduced to compensate 100% chance of spawning a Lava Blaze add void CastLavaStrikeOnTarget(Unit* target) @@ -428,13 +395,7 @@ public: if (fireCyclonesList.empty()) return; - std::list::iterator itr = fireCyclonesList.begin(); - uint32 rnd = rand()%fireCyclonesList.size(); - - for (uint32 i = 0; i < rnd; ++i) - ++itr; - - (*itr)->CastSpell(target, SPELL_LAVA_STRIKE, true); + Trinity::Containers::SelectRandomContainerElement(fireCyclonesList)->CastSpell(target, SPELL_LAVA_STRIKE, true); } void UpdateAI(uint32 diff) OVERRIDE @@ -456,25 +417,25 @@ public: } break; case EVENT_FLAME_TSUNAMI: - SendFlameTsunami(); + Talk(WHISPER_LAVA_CHURN); switch (urand(0, 1)) { case 0: { - if (Creature* right1 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight1Spawn.x, FlameRight1Spawn.y, FlameRight1Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) - right1->GetMotionMaster()->MovePoint(0, FlameRight1Direction.x, FlameRight1Direction.y, FlameRight1Direction.z); - if (Creature* right2 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight2Spawn.x, FlameRight2Spawn.y, FlameRight2Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) - right2->GetMotionMaster()->MovePoint(0, FlameRight2Direction.x, FlameRight2Direction.y, FlameRight2Direction.z); - if (Creature* right3 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight3Spawn.x, FlameRight3Spawn.y, FlameRight3Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) - right3->GetMotionMaster()->MovePoint(0, FlameRight3Direction.x, FlameRight3Direction.y, FlameRight3Direction.z); + if (Creature* right1 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight1Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000)) + right1->GetMotionMaster()->MovePoint(0, FlameRight1Direction); + if (Creature* right2 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight2Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000)) + right2->GetMotionMaster()->MovePoint(0, FlameRight2Direction); + if (Creature* right3 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight3Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000)) + right3->GetMotionMaster()->MovePoint(0, FlameRight3Direction); break; } case 1: { - if (Creature* left1 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameLeft1Spawn.x, FlameLeft1Spawn.y, FlameLeft1Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) - left1->GetMotionMaster()->MovePoint(0, FlameLeft1Direction.x, FlameLeft1Direction.y, FlameLeft1Direction.z); - if (Creature* left2 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameLeft2Spawn.x, FlameLeft2Spawn.y, FlameLeft2Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000)) - left2->GetMotionMaster()->MovePoint(0, FlameLeft2Direction.x, FlameLeft2Direction.y, FlameLeft2Direction.z); + if (Creature* left1 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameLeft1Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000)) + left1->GetMotionMaster()->MovePoint(0, FlameLeft1Direction); + if (Creature* left2 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameLeft2Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000)) + left2->GetMotionMaster()->MovePoint(0, FlameLeft2Direction); break; } } @@ -547,7 +508,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_sartharionAI(creature); + return GetObsidianSanctumAI(creature); } }; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp index 6aa1eb7470..2891834c6e 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp @@ -94,58 +94,44 @@ enum Misc DATA_CAN_LOOT = 0 }; -struct Location -{ - float x, y, z; -}; - -struct Locations -{ - float x, y, z; -}; - -struct Waypoint -{ - float m_fX, m_fY, m_fZ; -}; - #define MAX_WAYPOINT 6 //points around raid "isle", counter clockwise. should probably be adjusted to be more alike -Waypoint dragonCommon[MAX_WAYPOINT]= +Position const dragonCommon[MAX_WAYPOINT]= { - {3214.012f, 468.932f, 98.652f}, - {3244.950f, 468.427f, 98.652f}, - {3283.520f, 496.869f, 98.652f}, - {3287.316f, 555.875f, 98.652f}, - {3250.479f, 585.827f, 98.652f}, - {3209.969f, 566.523f, 98.652f} + { 3214.012f, 468.932f, 98.652f, 0.0f }, + { 3244.950f, 468.427f, 98.652f, 0.0f }, + { 3283.520f, 496.869f, 98.652f, 0.0f }, + { 3287.316f, 555.875f, 98.652f, 0.0f }, + { 3250.479f, 585.827f, 98.652f, 0.0f }, + { 3209.969f, 566.523f, 98.652f, 0.0f } }; -static Location AcolyteofShadron = { 3363.92f, 534.703f, 97.2683f }; -static Location AcolyteofShadron2 = { 3246.57f, 551.263f, 58.6164f }; -static Location AcolyteofVesperon = { 3145.68f, 520.71f, 89.7f }; -static Location AcolyteofVesperon2 = { 3246.57f, 551.263f, 58.6164f }; +Position const AcolyteofShadron = { 3363.92f, 534.703f, 97.2683f, 0.0f }; +Position const AcolyteofShadron2 = { 3246.57f, 551.263f, 58.6164f, 0.0f }; +Position const AcolyteofVesperon = { 3145.68f, 520.71f, 89.7f, 0.0f }; +Position const AcolyteofVesperon2 = { 3246.57f, 551.263f, 58.6164f, 0.0f }; -Locations TwilightEggs[] = +Position const TwilightEggs[] = { - {3219.28f, 669.121f, 88.5549f}, - {3221.55f, 682.852f, 90.5361f}, - {3239.77f, 685.94f, 90.3168f}, - {3250.33f, 669.749f, 88.7637f}, - {3246.6f, 642.365f, 84.8752f}, - {3233.68f, 653.117f, 85.7051f} -}; -Locations TwilightEggsSarth[] = -{ - {3252.73f, 515.762f, 58.5501f}, - {3256.56f, 521.119f, 58.6061f}, - {3255.63f, 527.513f, 58.7568f}, - {3264.90f, 525.865f, 58.6436f}, - {3264.26f, 516.364f, 58.8011f}, - {3257.54f, 502.285f, 58.2077f} + { 3219.28f, 669.121f, 88.5549f, 0.0f }, + { 3221.55f, 682.852f, 90.5361f, 0.0f }, + { 3239.77f, 685.94f, 90.3168f, 0.0f }, + { 3250.33f, 669.749f, 88.7637f, 0.0f }, + { 3246.6f, 642.365f, 84.8752f, 0.0f }, + { 3233.68f, 653.117f, 85.7051f, 0.0f } }; -enum SharedTextIDs +Position const TwilightEggsSarth[] = +{ + { 3252.73f, 515.762f, 58.5501f, 0.0f }, + { 3256.56f, 521.119f, 58.6061f, 0.0f }, + { 3255.63f, 527.513f, 58.7568f, 0.0f }, + { 3264.90f, 525.865f, 58.6436f, 0.0f }, + { 3264.26f, 516.364f, 58.8011f, 0.0f }, + { 3257.54f, 502.285f, 58.2077f, 0.0f } +}; + +enum SharedTextIds { SAY_AGGRO = 0, SAY_SLAY = 1, @@ -157,12 +143,24 @@ enum SharedTextIDs WHISPER_OPENED_PORTAL = 7 }; -enum DummyDragonEvents +enum DragonEvents { - EVENT_FREE_MOVEMENT = 1 + // Shared Events + EVENT_FREE_MOVEMENT = 1, + EVENT_SHADOW_FISSURE = 2, + EVENT_SHADOW_BREATH = 3, + + // Tenebron + EVENT_HATCH_EGGS = 4, + + // Shadron + EVENT_ACOLYTE_SHADRON = 5, + + // Vesperon + EVENT_ACOLYTE_VESPERON = 6 }; -//to control each dragons common abilities +// to control each dragons common abilities struct dummy_dragonAI : public ScriptedAI { dummy_dragonAI(Creature* creature) : ScriptedAI(creature) @@ -175,12 +173,22 @@ struct dummy_dragonAI : public ScriptedAI if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + events.Reset(); waypointId = 0; portalRespawnTime = 30000; _canMoveFree = false; _canLoot = true; } + void EnterCombat(Unit* /*who*/) OVERRIDE + { + Talk(SAY_AGGRO); + DoZoneInCombat(); + + events.ScheduleEvent(EVENT_SHADOW_FISSURE, 5000); + events.ScheduleEvent(EVENT_SHADOW_BREATH, 20000); + } + void SetData(uint32 type, uint32 value) OVERRIDE { if (type == DATA_CAN_LOOT) @@ -217,14 +225,11 @@ struct dummy_dragonAI : public ScriptedAI return; } - // get amount of common points - uint32 commonWPCount = sizeof(dragonCommon)/sizeof(Waypoint); - // increase - waypointId = pointId+1; + waypointId = pointId + 1; // if we have reached a point bigger or equal to count, it mean we must reset to point 0 - if (waypointId >= commonWPCount) + if (waypointId >= MAX_WAYPOINT) { if (!_canMoveFree) _canMoveFree = true; @@ -235,23 +240,6 @@ struct dummy_dragonAI : public ScriptedAI events.ScheduleEvent(EVENT_FREE_MOVEMENT, 500); } - // used when open portal and spawn mobs in phase - void DoRaidWhisper(int32 iTextId) - { - Map* map = me->GetMap(); - - if (map && map->IsDungeon()) - { - Map::PlayerList const &PlayerList = map->GetPlayers(); - - if (!PlayerList.isEmpty()) - { - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - Talk(iTextId, i->GetSource()); - } - } - } - // "opens" the portal and does the "opening" whisper void OpenPortal() { @@ -268,21 +256,21 @@ struct dummy_dragonAI : public ScriptedAI if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) { for (uint32 i = 0; i < 6; ++i) - me->SummonCreature(NPC_TWILIGHT_EGG, TwilightEggs[i].x, TwilightEggs[i].y, TwilightEggs[i].z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); + me->SummonCreature(NPC_TWILIGHT_EGG, TwilightEggs[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); } else { for (uint32 i = 0; i < 6; ++i) - me->SummonCreature(NPC_SARTHARION_TWILIGHT_EGG, TwilightEggsSarth[i].x, TwilightEggsSarth[i].y, TwilightEggsSarth[i].z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); + me->SummonCreature(NPC_SARTHARION_TWILIGHT_EGG, TwilightEggsSarth[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); } break; } case NPC_SHADRON: { if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) - me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron.x, AcolyteofShadron.y, AcolyteofShadron.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000); + me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000); else - me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron2.x, AcolyteofShadron2.y, AcolyteofShadron2.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000); + me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000); break; } @@ -290,7 +278,7 @@ struct dummy_dragonAI : public ScriptedAI { if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) { - if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon.x, AcolyteofVesperon.y, AcolyteofVesperon.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) { me->InterruptNonMeleeSpells(true); acolyte->InterruptNonMeleeSpells(true); @@ -299,7 +287,7 @@ struct dummy_dragonAI : public ScriptedAI } else { - if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon2.x, AcolyteofVesperon2.y, AcolyteofVesperon2.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) + if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) { me->InterruptNonMeleeSpells(true); acolyte->InterruptNonMeleeSpells(true); @@ -307,12 +295,12 @@ struct dummy_dragonAI : public ScriptedAI } } - break; + break; } } - DoRaidWhisper(WHISPER_OPEN_PORTAL); - DoRaidWhisper(WHISPER_OPENED_PORTAL); + Talk(WHISPER_OPEN_PORTAL); + Talk(WHISPER_OPENED_PORTAL); // By using SetRespawnTime() we will actually "spawn" the object with our defined time. // Once time is up, portal will disappear again. @@ -323,6 +311,12 @@ struct dummy_dragonAI : public ScriptedAI // Refresh respawnTime so time again are set to 30secs? } + void KilledUnit(Unit* who) OVERRIDE + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + void JustDied(Unit* /*killer*/) OVERRIDE { if (!_canLoot) @@ -356,22 +350,19 @@ struct dummy_dragonAI : public ScriptedAI Talk(SAY_DEATH); me->RemoveAurasDueToSpell(spellId); - if (instance) - { - instance->DoRemoveAurasDueToSpellOnPlayers(spellId); + instance->DoRemoveAurasDueToSpellOnPlayers(spellId); - // not if solo mini-boss fight - if (instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) - return; + // not if solo mini-boss fight + if (instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) + return; - // Twilight Revenge to main boss - if (Unit* sartharion = Unit::GetUnit(*me, instance->GetData64(DATA_SARTHARION))) - if (sartharion->IsAlive()) - { - sartharion->RemoveAurasDueToSpell(spellId); - DoCast(sartharion, SPELL_TWILIGHT_REVENGE, true); - } - } + // Twilight Revenge to main boss + if (Unit* sartharion = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_SARTHARION))) + if (sartharion->IsAlive()) + { + sartharion->RemoveAurasDueToSpell(spellId); + DoCast(sartharion, SPELL_TWILIGHT_REVENGE, true); + } } void UpdateAI(uint32 diff) OVERRIDE @@ -381,11 +372,30 @@ struct dummy_dragonAI : public ScriptedAI if (events.ExecuteEvent() == EVENT_FREE_MOVEMENT) { if (_canMoveFree && waypointId < MAX_WAYPOINT) - me->GetMotionMaster()->MovePoint(waypointId, dragonCommon[waypointId].m_fX, dragonCommon[waypointId].m_fY, dragonCommon[waypointId].m_fZ); + me->GetMotionMaster()->MovePoint(waypointId, dragonCommon[waypointId]); } } - private: + void ExecuteEvent(uint32 eventId) + { + switch (eventId) + { + case EVENT_SHADOW_FISSURE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, RAID_MODE(SPELL_SHADOW_FISSURE, SPELL_SHADOW_FISSURE)); + events.ScheduleEvent(eventId, urand(15000, 20000)); + break; + case EVENT_SHADOW_BREATH: + Talk(SAY_BREATH); + DoCastVictim(RAID_MODE(SPELL_SHADOW_BREATH, SPELL_SHADOW_BREATH_H)); + events.ScheduleEvent(eventId, urand(20000, 25000)); + break; + default: + break; + } + } + + protected: InstanceScript* instance; EventMap events; uint32 waypointId; @@ -398,13 +408,6 @@ struct dummy_dragonAI : public ScriptedAI ## Tenebron ######*/ -enum TenebronEvents -{ - EVENT_SHADOW_FISSURE_TENEBRON = 2, - EVENT_HATCH_EGGS = 3, - EVENT_SHADOW_BREATH_TENEBRON = 4 -}; - class npc_tenebron : public CreatureScript { public: @@ -419,23 +422,16 @@ public: dummy_dragonAI::Reset(); } - void EnterCombat(Unit* /*who*/) OVERRIDE + void EnterCombat(Unit* who) OVERRIDE { - Talk(SAY_AGGRO); - DoZoneInCombat(); - events.ScheduleEvent(EVENT_SHADOW_FISSURE_TENEBRON, 5000); - events.ScheduleEvent(EVENT_HATCH_EGGS, 30000); - events.ScheduleEvent(EVENT_SHADOW_BREATH_TENEBRON, 20000); - } + dummy_dragonAI::EnterCombat(who); - void KilledUnit(Unit* /*victim*/) OVERRIDE - { - Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_HATCH_EGGS, 30000); } void UpdateAI(uint32 diff) OVERRIDE { - //if no target, update dummy and return + // if no target, update dummy and return if (!UpdateVictim()) { dummy_dragonAI::UpdateAI(diff); @@ -448,32 +444,23 @@ public: { switch (eventId) { - case EVENT_SHADOW_FISSURE_TENEBRON: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, RAID_MODE(SPELL_SHADOW_FISSURE, SPELL_SHADOW_FISSURE)); - events.ScheduleEvent(EVENT_SHADOW_FISSURE_TENEBRON, urand(15000, 20000)); - break; case EVENT_HATCH_EGGS: OpenPortal(); events.ScheduleEvent(EVENT_HATCH_EGGS, 30000); break; - case EVENT_SHADOW_BREATH_TENEBRON: - Talk(SAY_BREATH); - DoCastVictim(RAID_MODE(SPELL_SHADOW_BREATH, SPELL_SHADOW_BREATH_H)); - events.ScheduleEvent(EVENT_SHADOW_BREATH_TENEBRON, urand(20000, 25000)); + default: + dummy_dragonAI::ExecuteEvent(eventId); break; } } + DoMeleeAttackIfReady(); } - - private: - EventMap events; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_tenebronAI(creature); + return GetObsidianSanctumAI(creature); } }; @@ -481,13 +468,6 @@ public: ## Shadron ######*/ -enum ShadronEvents -{ - EVENT_SHADOW_FISSURE_SHADRON = 5, - EVENT_ACOLYTE_SHADRON = 6, - EVENT_SHADOW_BREATH_SHADRON = 7 -}; - class npc_shadron : public CreatureScript { public: @@ -495,10 +475,7 @@ public: struct npc_shadronAI : public dummy_dragonAI { - npc_shadronAI(Creature* creature) : dummy_dragonAI(creature) - { - instance = creature->GetInstanceScript(); - } + npc_shadronAI(Creature* creature) : dummy_dragonAI(creature) { } void Reset() OVERRIDE { @@ -510,27 +487,19 @@ public: if (me->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA)) me->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA); - if (instance) - instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); + instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); } - void EnterCombat(Unit* /*who*/) OVERRIDE + void EnterCombat(Unit* who) OVERRIDE { - Talk(SAY_AGGRO); - DoZoneInCombat(); - events.ScheduleEvent(EVENT_SHADOW_FISSURE_SHADRON, 5000); + dummy_dragonAI::EnterCombat(who); + events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 60000); - events.ScheduleEvent(EVENT_SHADOW_BREATH_SHADRON, 20000); - } - - void KilledUnit(Unit* /*victim*/) OVERRIDE - { - Talk(SAY_SLAY); } void UpdateAI(uint32 diff) OVERRIDE { - //if no target, update dummy and return + // if no target, update dummy and return if (!UpdateVictim()) { dummy_dragonAI::UpdateAI(diff); @@ -543,11 +512,6 @@ public: { switch (eventId) { - case EVENT_SHADOW_FISSURE_SHADRON: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, RAID_MODE(SPELL_SHADOW_FISSURE, SPELL_SHADOW_FISSURE_H)); - events.ScheduleEvent(EVENT_SHADOW_FISSURE_SHADRON, urand(15000, 20000)); - break; case EVENT_ACOLYTE_SHADRON: if (instance->GetBossState(DATA_PORTAL_OPEN) == NOT_STARTED) events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 10000); @@ -558,30 +522,24 @@ public: OpenPortal(); - if (instance) - instance->SetBossState(DATA_PORTAL_OPEN, IN_PROGRESS); + instance->SetBossState(DATA_PORTAL_OPEN, IN_PROGRESS); events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, urand(60000, 65000)); } break; - case EVENT_SHADOW_BREATH_SHADRON: - Talk(SAY_BREATH); - DoCastVictim(RAID_MODE(SPELL_SHADOW_BREATH, SPELL_SHADOW_BREATH_H)); - events.ScheduleEvent(EVENT_SHADOW_BREATH_SHADRON, urand(20000, 25000)); + default: + dummy_dragonAI::ExecuteEvent(eventId); break; } } + DoMeleeAttackIfReady(); } - - private: - InstanceScript* instance; - EventMap events; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_shadronAI(creature); + return GetObsidianSanctumAI(creature); } }; @@ -589,13 +547,6 @@ public: ## Vesperon ######*/ -enum VesperonEvents -{ - EVENT_SHADOW_FISSURE_VESPERON = 8, - EVENT_ACOLYTE_VESPERON = 9, - EVENT_SHADOW_BREATH_VESPERON = 10 -}; - class npc_vesperon : public CreatureScript { public: @@ -603,33 +554,23 @@ public: struct npc_vesperonAI : public dummy_dragonAI { - npc_vesperonAI(Creature* creature) : dummy_dragonAI(creature) - { - instance = creature->GetInstanceScript(); - } + npc_vesperonAI(Creature* creature) : dummy_dragonAI(creature) { } void Reset() OVERRIDE { dummy_dragonAI::Reset(); } - void EnterCombat(Unit* /*who*/) OVERRIDE + void EnterCombat(Unit* who) OVERRIDE { - Talk(SAY_AGGRO); - DoZoneInCombat(); - events.ScheduleEvent(EVENT_SHADOW_FISSURE_VESPERON, 5000); - events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 60000); - events.ScheduleEvent(EVENT_SHADOW_BREATH_VESPERON, 20000); - } + dummy_dragonAI::EnterCombat(who); - void KilledUnit(Unit* /*victim*/) OVERRIDE - { - Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 60000); } void UpdateAI(uint32 diff) OVERRIDE { - //if no target, update dummy and return + // if no target, update dummy and return if (!UpdateVictim()) { dummy_dragonAI::UpdateAI(diff); @@ -642,11 +583,6 @@ public: { switch (eventId) { - case EVENT_SHADOW_FISSURE_VESPERON: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, RAID_MODE(SPELL_SHADOW_FISSURE, SPELL_SHADOW_FISSURE_H)); - events.ScheduleEvent(EVENT_SHADOW_FISSURE_VESPERON, urand(15000, 20000)); - break; case EVENT_ACOLYTE_VESPERON: if (instance->GetBossState(DATA_PORTAL_OPEN) == IN_PROGRESS) events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 10000); @@ -657,24 +593,19 @@ public: events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, urand(60000, 70000)); } break; - case EVENT_SHADOW_BREATH_VESPERON: - Talk(SAY_BREATH); - DoCastVictim(RAID_MODE(SPELL_SHADOW_BREATH, SPELL_SHADOW_BREATH_H)); - events.ScheduleEvent(EVENT_SHADOW_BREATH_VESPERON, urand(20000, 25000)); + default: + dummy_dragonAI::ExecuteEvent(eventId); break; } } + DoMeleeAttackIfReady(); } - - private: - InstanceScript* instance; - EventMap events; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_vesperonAI(creature); + return GetObsidianSanctumAI(creature); } }; @@ -684,23 +615,21 @@ public: class npc_acolyte_of_shadron : public CreatureScript { -public: - npc_acolyte_of_shadron() : CreatureScript("npc_acolyte_of_shadron") { } + public: + npc_acolyte_of_shadron() : CreatureScript("npc_acolyte_of_shadron") { } - struct npc_acolyte_of_shadronAI : public ScriptedAI - { - npc_acolyte_of_shadronAI(Creature* creature) : ScriptedAI(creature) + struct npc_acolyte_of_shadronAI : public ScriptedAI { - instance = creature->GetInstanceScript(); - } - - void Reset() OVERRIDE - { - // Despawn the NPC automatically after 28 seconds - me->DespawnOrUnsummon(28000); - - if (instance) + npc_acolyte_of_shadronAI(Creature* creature) : ScriptedAI(creature) { + instance = creature->GetInstanceScript(); + } + + void Reset() OVERRIDE + { + // Despawn the NPC automatically after 28 seconds + me->DespawnOrUnsummon(28000); + //if not solo fight, buff main boss, else place debuff on mini-boss. both spells TARGET_SCRIPT if (instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) { @@ -712,14 +641,11 @@ public: if (Creature* shadron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADRON))) shadron->AddAura(SPELL_GIFT_OF_TWILIGTH_SHA, shadron); } + + me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); } - me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); - } - - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (instance) + void JustDied(Unit* /*killer*/) OVERRIDE { if (ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADRON))) instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); @@ -727,7 +653,7 @@ public: Map* map = me->GetMap(); if (map->IsDungeon()) { - Map::PlayerList const &PlayerList = map->GetPlayers(); + Map::PlayerList const& PlayerList = map->GetPlayers(); if (PlayerList.isEmpty()) return; @@ -741,7 +667,7 @@ public: i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT); i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT_ENTER); } - } + } } // not solo fight, so main boss has debuff @@ -754,24 +680,23 @@ public: if (debuffTarget->IsAlive() && debuffTarget->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA)) debuffTarget->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA); } - } - void UpdateAI(uint32 /*diff*/) OVERRIDE + void UpdateAI(uint32 /*diff*/) OVERRIDE + { + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + + private: + InstanceScript* instance; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); + return GetObsidianSanctumAI(creature); } - - private: - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_acolyte_of_shadronAI(creature); - } }; /*###### @@ -780,34 +705,31 @@ public: class npc_acolyte_of_vesperon : public CreatureScript { -public: - npc_acolyte_of_vesperon() : CreatureScript("npc_acolyte_of_vesperon") { } + public: + npc_acolyte_of_vesperon() : CreatureScript("npc_acolyte_of_vesperon") { } - struct npc_acolyte_of_vesperonAI : public ScriptedAI - { - npc_acolyte_of_vesperonAI(Creature* creature) : ScriptedAI(creature) + struct npc_acolyte_of_vesperonAI : public ScriptedAI { - instance = creature->GetInstanceScript(); - } + npc_acolyte_of_vesperonAI(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + } - void Reset() OVERRIDE - { - // Despawn the NPC automatically after 28 seconds - me->DespawnOrUnsummon(28000); + void Reset() OVERRIDE + { + // Despawn the NPC automatically after 28 seconds + me->DespawnOrUnsummon(28000); - if (instance) me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); - DoCast(me, SPELL_TWILIGHT_TORMENT_VESP_ACO); - } + DoCast(me, SPELL_TWILIGHT_TORMENT_VESP_ACO); + } - void JustDied(Unit* /*killer*/) OVERRIDE - { - me->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP_ACO); - - // remove twilight torment on Vesperon - if (instance) + void JustDied(Unit* /*killer*/) OVERRIDE { + me->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP_ACO); + + // remove twilight torment on Vesperon if (Creature* vesperon = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VESPERON))) { instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); @@ -842,24 +764,23 @@ public: instance->DoRemoveAurasDueToSpellOnPlayers(57935); instance->DoRemoveAurasDueToSpellOnPlayers(58835); // Components of spell Twilight Torment } - } - void UpdateAI(uint32 /*diff*/) OVERRIDE + void UpdateAI(uint32 /*diff*/) OVERRIDE + { + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + + private: + InstanceScript* instance; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); + return GetObsidianSanctumAI(creature); } - - private: - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_acolyte_of_vesperonAI(creature); - } }; /*###### @@ -886,8 +807,7 @@ public: void Reset() OVERRIDE { - if (instance) - me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); + me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); events.ScheduleEvent(EVENT_TWILIGHT_EGGS, 20000); } @@ -928,7 +848,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_twilight_eggsAI(creature); + return GetObsidianSanctumAI(creature); } }; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h index 8cfb393137..d8f49a0657 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h @@ -15,8 +15,8 @@ * with this program. If not, see . */ -#ifndef DEF_OBSIDIAN_SANCTUM_H -#define DEF_OBSIDIAN_SANCTUM_H +#ifndef OBSIDIAN_SANCTUM_H_ +#define OBSIDIAN_SANCTUM_H_ #define OSScriptName "instance_obsidian_sanctum" @@ -45,4 +45,10 @@ enum GameObjectIds GO_TWILIGHT_PORTAL = 193988 }; -#endif +template +AI* GetObsidianSanctumAI(Creature* creature) +{ + return GetInstanceAI(creature, OSScriptName); +} + +#endif // OBSIDIAN_SANCTUM_H_ diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index f6fd1c14a9..7839ad3dde 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -196,8 +196,7 @@ public: if (MovementType != POINT_MOTION_TYPE) return; - if (instance) - instance->SetData(BOSS_ARGENT_CHALLENGE_E, DONE); + instance->SetData(BOSS_ARGENT_CHALLENGE_E, DONE); me->DisappearAndDie(); } @@ -248,7 +247,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_eadricAI(creature); + return GetInstanceAI(creature); } }; @@ -320,8 +319,7 @@ public: if (MovementType != POINT_MOTION_TYPE || Point != 0) return; - if (instance) - instance->SetData(BOSS_ARGENT_CHALLENGE_P, DONE); + instance->SetData(BOSS_ARGENT_CHALLENGE_P, DONE); me->DisappearAndDie(); } @@ -406,7 +404,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_paletressAI(creature); + return GetInstanceAI(creature); } }; @@ -582,14 +580,13 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, instance->GetData(DATA_ARGENT_SOLDIER_DEFEATED) + 1); + instance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, instance->GetData(DATA_ARGENT_SOLDIER_DEFEATED) + 1); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_argent_soldierAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp index 1922ad2606..29aac1cd40 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp @@ -293,14 +293,13 @@ public: { DoCast(me, SPELL_KILL_CREDIT); - if (instance) - instance->SetData(BOSS_BLACK_KNIGHT, DONE); + instance->SetData(BOSS_BLACK_KNIGHT, DONE); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_black_knightAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index 07ecaadef7..b3d756dd29 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -207,9 +207,6 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (!instance) - return; - switch (waypointId) { case 2: @@ -300,7 +297,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new generic_vehicleAI_toc5AI(creature); + return GetInstanceAI(creature); } }; @@ -426,14 +423,13 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); + instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_warrior_toc5AI(creature); + return GetInstanceAI(creature); } }; @@ -507,8 +503,7 @@ public: else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); + instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); EnterEvadeMode(); bHome = true; @@ -565,14 +560,13 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); + instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_mage_toc5AI(creature); + return GetInstanceAI(creature); } }; @@ -652,8 +646,7 @@ public: else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); + instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); EnterEvadeMode(); bHome = true; @@ -712,14 +705,13 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); + instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_shaman_toc5AI(creature); + return GetInstanceAI(creature); } }; @@ -798,8 +790,7 @@ public: else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); + instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); EnterEvadeMode(); bHome = true; @@ -868,14 +859,13 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); + instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_hunter_toc5AI(creature); + return GetInstanceAI(creature); } }; @@ -946,8 +936,7 @@ public: else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); + instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); EnterEvadeMode(); bHome = true; @@ -989,14 +978,13 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); + instance->SetData(BOSS_GRAND_CHAMPIONS, DONE); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_rouge_toc5AI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index 00b312aa40..3f01e05514 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -236,11 +236,8 @@ public: if (Vehicle* pVehicle = pBoss->GetVehicleKit()) if (Unit* unit = pVehicle->GetPassenger(0)) uiGrandChampionBoss1 = unit->GetGUID(); - if (instance) - { - instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_1, uiVehicle1GUID); - instance->SetData64(DATA_GRAND_CHAMPION_1, uiGrandChampionBoss1); - } + instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_1, uiVehicle1GUID); + instance->SetData64(DATA_GRAND_CHAMPION_1, uiGrandChampionBoss1); pBoss->AI()->SetData(1, 0); break; } @@ -251,11 +248,8 @@ public: if (Vehicle* pVehicle = pBoss->GetVehicleKit()) if (Unit* unit = pVehicle->GetPassenger(0)) uiGrandChampionBoss2 = unit->GetGUID(); - if (instance) - { - instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_2, uiVehicle2GUID); - instance->SetData64(DATA_GRAND_CHAMPION_2, uiGrandChampionBoss2); - } + instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_2, uiVehicle2GUID); + instance->SetData64(DATA_GRAND_CHAMPION_2, uiGrandChampionBoss2); pBoss->AI()->SetData(2, 0); break; } @@ -266,11 +260,8 @@ public: if (Vehicle* pVehicle = pBoss->GetVehicleKit()) if (Unit* unit = pVehicle->GetPassenger(0)) uiGrandChampionBoss3 = unit->GetGUID(); - if (instance) - { - instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_3, uiVehicle3GUID); - instance->SetData64(DATA_GRAND_CHAMPION_3, uiGrandChampionBoss3); - } + instance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_3, uiVehicle3GUID); + instance->SetData64(DATA_GRAND_CHAMPION_3, uiGrandChampionBoss3); pBoss->AI()->SetData(3, 0); break; } @@ -359,9 +350,6 @@ public: void StartEncounter() { - if (!instance) - return; - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); if (instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED) @@ -472,7 +460,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_announcer_toc5AI(creature); + return GetInstanceAI(creature); } bool OnGossipHello(Player* player, Creature* creature) OVERRIDE diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 32a8a2fe37..1f1b7f3ff3 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -201,8 +201,7 @@ class boss_anubarak_trial : public CreatureScript if (who->GetTypeId() == TYPEID_PLAYER) { Talk(SAY_KILL_PLAYER); - if (instance) - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); } } @@ -218,8 +217,7 @@ class boss_anubarak_trial : public CreatureScript void JustReachedHome() OVERRIDE { - if (instance) - instance->SetBossState(BOSS_ANUBARAK, FAIL); + instance->SetBossState(BOSS_ANUBARAK, FAIL); //Summon Scarab Swarms neutral at random places for (int i = 0; i < 10; i++) if (Creature* temp = me->SummonCreature(NPC_SCARAB, AnubarakLoc[1].GetPositionX()+urand(0, 50)-25, AnubarakLoc[1].GetPositionY()+urand(0, 50)-25, AnubarakLoc[1].GetPositionZ())) @@ -245,7 +243,6 @@ class boss_anubarak_trial : public CreatureScript void JustSummoned(Creature* summoned) OVERRIDE { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); switch (summoned->GetEntry()) { case NPC_BURROW: @@ -255,9 +252,12 @@ class boss_anubarak_trial : public CreatureScript summoned->SetDisplayId(summoned->GetCreatureTemplate()->Modelid2); break; case NPC_SPIKE: - summoned->CombatStart(target); summoned->SetDisplayId(summoned->GetCreatureTemplate()->Modelid1); - Talk(EMOTE_SPIKE, target); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + { + summoned->CombatStart(target); + Talk(EMOTE_SPIKE, target); + } break; default: break; @@ -423,7 +423,7 @@ class boss_anubarak_trial : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_anubarak_trialAI(creature); + return GetInstanceAI(creature); }; }; @@ -495,7 +495,7 @@ class npc_swarm_scarab : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_swarm_scarabAI(creature); + return GetInstanceAI(creature); }; }; @@ -583,7 +583,7 @@ class npc_nerubian_burrower : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_nerubian_burrowerAI(creature); + return GetInstanceAI(creature); }; }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 4c73d1a5f5..f510e2be99 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -539,7 +539,7 @@ class boss_toc_champion_controller : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_toc_champion_controllerAI(creature); + return GetInstanceAI(creature); } }; @@ -559,9 +559,8 @@ struct boss_faction_championsAI : public BossAI void JustReachedHome() OVERRIDE { - if (instance) - if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) - pChampionController->AI()->SetData(2, FAIL); + if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + pChampionController->AI()->SetData(2, FAIL); me->DespawnOrUnsummon(); } @@ -610,18 +609,16 @@ struct boss_faction_championsAI : public BossAI void JustDied(Unit* /*killer*/) OVERRIDE { if (_aiType != AI_PET) - if (instance) - if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) - pChampionController->AI()->SetData(2, DONE); + if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + pChampionController->AI()->SetData(2, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE { DoCast(me, SPELL_ANTI_AOE, true); _EnterCombat(); - if (instance) - if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) - pChampionController->AI()->SetData(2, IN_PROGRESS); + if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + pChampionController->AI()->SetData(2, IN_PROGRESS); } void KilledUnit(Unit* who) OVERRIDE @@ -635,20 +632,17 @@ struct boss_faction_championsAI : public BossAI if (Player* player = players.begin()->GetSource()) TeamInInstance = player->GetTeam(); - if (instance) + if (TeamInInstance == ALLIANCE) { - if (TeamInInstance == ALLIANCE) - { - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_VARIAN))) - temp->AI()->Talk(SAY_KILL_PLAYER); - } - else - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_GARROSH))) - temp->AI()->Talk(SAY_KILL_PLAYER); - - - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_VARIAN))) + temp->AI()->Talk(SAY_KILL_PLAYER); } + else + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_GARROSH))) + temp->AI()->Talk(SAY_KILL_PLAYER); + + + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); } } @@ -839,7 +833,7 @@ class npc_toc_druid : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_druidAI(creature); + return GetInstanceAI(creature); } }; @@ -932,7 +926,7 @@ class npc_toc_shaman : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_shamanAI(creature); + return GetInstanceAI(creature); } }; @@ -1036,7 +1030,7 @@ class npc_toc_paladin : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_paladinAI(creature); + return GetInstanceAI(creature); } }; @@ -1121,7 +1115,7 @@ class npc_toc_priest : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_priestAI(creature); + return GetInstanceAI(creature); } }; @@ -1219,7 +1213,7 @@ class npc_toc_shadow_priest : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_shadow_priestAI(creature); + return GetInstanceAI(creature); } }; @@ -1310,7 +1304,7 @@ class npc_toc_warlock : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_warlockAI(creature); + return GetInstanceAI(creature); } }; @@ -1404,7 +1398,7 @@ class npc_toc_mage : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_mageAI(creature); + return GetInstanceAI(creature); } }; @@ -1506,7 +1500,7 @@ class npc_toc_hunter : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_hunterAI(creature); + return GetInstanceAI(creature); } }; @@ -1598,7 +1592,7 @@ class npc_toc_boomkin : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_boomkinAI(creature); + return GetInstanceAI(creature); } }; @@ -1702,7 +1696,7 @@ class npc_toc_warrior : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_warriorAI(creature); + return GetInstanceAI(creature); } }; @@ -1798,7 +1792,7 @@ class npc_toc_dk : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_dkAI(creature); + return GetInstanceAI(creature); } }; @@ -1903,7 +1897,7 @@ class npc_toc_rogue : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_rogueAI(creature); + return GetInstanceAI(creature); } }; @@ -2029,7 +2023,7 @@ class npc_toc_enh_shaman : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_enh_shamanAI(creature); + return GetInstanceAI(creature); } }; @@ -2135,7 +2129,7 @@ class npc_toc_retro_paladin : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_retro_paladinAI(creature); + return GetInstanceAI(creature); } }; @@ -2187,7 +2181,7 @@ class npc_toc_pet_warlock : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_pet_warlockAI(creature); + return GetInstanceAI(creature); } }; @@ -2227,7 +2221,7 @@ class npc_toc_pet_hunter : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toc_pet_hunterAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index 3fa9ac7387..7fbdc30c0e 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -116,8 +116,7 @@ class boss_jaraxxus : public CreatureScript void JustReachedHome() OVERRIDE { _JustReachedHome(); - if (instance) - instance->SetBossState(BOSS_JARAXXUS, FAIL); + instance->SetBossState(BOSS_JARAXXUS, FAIL); DoCast(me, SPELL_JARAXXUS_CHAINS); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } @@ -127,8 +126,7 @@ class boss_jaraxxus : public CreatureScript if (who->GetTypeId() == TYPEID_PLAYER) { Talk(SAY_KILL_PLAYER); - if (instance) - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); } } @@ -214,7 +212,7 @@ class boss_jaraxxus : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_jaraxxusAI(creature); + return GetInstanceAI(creature); } }; @@ -250,7 +248,7 @@ class npc_legion_flame : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_legion_flameAI(creature); + return GetInstanceAI(creature); } }; @@ -355,7 +353,7 @@ class npc_fel_infernal : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_fel_infernalAI(creature); + return GetInstanceAI(creature); } }; @@ -488,7 +486,7 @@ class npc_mistress_of_pain : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_mistress_of_painAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 7843808a6a..0209c1d9ac 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -195,17 +195,14 @@ class boss_gormok : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(TYPE_NORTHREND_BEASTS, GORMOK_DONE); + instance->SetData(TYPE_NORTHREND_BEASTS, GORMOK_DONE); } void JustReachedHome() OVERRIDE { - if (instance) - { - instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); - instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); - } + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); + me->DespawnOrUnsummon(); } @@ -284,7 +281,7 @@ class boss_gormok : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_gormokAI(creature); + return GetInstanceAI(creature); } }; @@ -454,7 +451,7 @@ class npc_snobold_vassal : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_snobold_vassalAI(creature); + return GetInstanceAI(creature); } }; @@ -490,7 +487,7 @@ class npc_firebomb : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_firebombAI(creature); + return GetInstanceAI(creature); } }; @@ -514,20 +511,17 @@ struct boss_jormungarAI : public BossAI void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) + if (Creature* otherWorm = Unit::GetCreature(*me, instance->GetData64(OtherWormEntry))) { - if (Creature* otherWorm = Unit::GetCreature(*me, instance->GetData64(OtherWormEntry))) + if (!otherWorm->IsAlive()) { - if (!otherWorm->IsAlive()) - { - instance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_DONE); + instance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_DONE); - me->DespawnOrUnsummon(); - otherWorm->DespawnOrUnsummon(); - } - else - instance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_SPECIAL); + me->DespawnOrUnsummon(); + otherWorm->DespawnOrUnsummon(); } + else + instance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_SPECIAL); } } @@ -543,16 +537,14 @@ struct boss_jormungarAI : public BossAI void KilledUnit(Unit* who) OVERRIDE { if (who->GetTypeId() == TYPEID_PLAYER) - if (instance) - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); } void EnterCombat(Unit* /*who*/) OVERRIDE { _EnterCombat(); me->SetInCombatWithZone(); - if (instance) - instance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_IN_PROGRESS); + instance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -712,7 +704,7 @@ class boss_acidmaw : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_acidmawAI(creature); + return GetInstanceAI(creature); } }; @@ -770,8 +762,7 @@ class boss_dreadscale : public CreatureScript void JustReachedHome() OVERRIDE { - if (instance) - instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); boss_jormungarAI::JustReachedHome(); } @@ -779,7 +770,7 @@ class boss_dreadscale : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_dreadscaleAI(creature); + return GetInstanceAI(creature); } }; @@ -820,7 +811,7 @@ class npc_slime_pool : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_slime_poolAI(creature); + return GetInstanceAI(creature); } }; @@ -873,7 +864,7 @@ class boss_icehowl : public CreatureScript events.ScheduleEvent(EVENT_MASSIVE_CRASH, 30*IN_MILLISECONDS); _movementStarted = false; _movementFinish = false; - _trampleCasted = false; + _trampleCast = false; _trampleTargetGUID = 0; _trampleTargetX = 0; _trampleTargetY = 0; @@ -884,8 +875,7 @@ class boss_icehowl : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { _JustDied(); - if (instance) - instance->SetData(TYPE_NORTHREND_BEASTS, ICEHOWL_DONE); + instance->SetData(TYPE_NORTHREND_BEASTS, ICEHOWL_DONE); } void MovementInform(uint32 type, uint32 pointId) OVERRIDE @@ -933,11 +923,8 @@ class boss_icehowl : public CreatureScript void JustReachedHome() OVERRIDE { - if (instance) - { - instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); - instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); - } + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); me->DespawnOrUnsummon(); } @@ -945,26 +932,24 @@ class boss_icehowl : public CreatureScript { if (who->GetTypeId() == TYPEID_PLAYER) { - if (instance) - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); } } void EnterCombat(Unit* /*who*/) OVERRIDE { _EnterCombat(); - if (instance) - instance->SetData(TYPE_NORTHREND_BEASTS, ICEHOWL_IN_PROGRESS); + instance->SetData(TYPE_NORTHREND_BEASTS, ICEHOWL_IN_PROGRESS); } void SpellHitTarget(Unit* target, SpellInfo const* spell) OVERRIDE { if (spell->Id == SPELL_TRAMPLE && target->GetTypeId() == TYPEID_PLAYER) { - if (!_trampleCasted) + if (!_trampleCast) { DoCast(me, SPELL_FROTHING_RAGE, true); - _trampleCasted = true; + _trampleCast = true; } } } @@ -1025,7 +1010,7 @@ class boss_icehowl : public CreatureScript me->AttackStop(); _trampleTargetGUID = target->GetGUID(); me->SetTarget(_trampleTargetGUID); - _trampleCasted = false; + _trampleCast = false; SetCombatMovement(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); me->GetMotionMaster()->Clear(); @@ -1047,7 +1032,7 @@ class boss_icehowl : public CreatureScript { me->StopMoving(); me->AttackStop(); - _trampleCasted = false; + _trampleCast = false; _movementStarted = true; _trampleTargetX = target->GetPositionX(); _trampleTargetY = target->GetPositionY(); @@ -1100,7 +1085,7 @@ class boss_icehowl : public CreatureScript } break; case 6: - if (!_trampleCasted) + if (!_trampleCast) { DoCast(me, SPELL_STAGGERED_DAZE); Talk(EMOTE_TRAMPLE_CRASH); @@ -1131,13 +1116,13 @@ class boss_icehowl : public CreatureScript uint64 _trampleTargetGUID; bool _movementStarted; bool _movementFinish; - bool _trampleCasted; + bool _trampleCast; uint8 _stage; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_icehowlAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 0674696a03..e81cfee1b9 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -165,8 +165,7 @@ struct boss_twin_baseAI : public BossAI void JustReachedHome() OVERRIDE { - if (instance) - instance->SetBossState(BOSS_VALKIRIES, FAIL); + instance->SetBossState(BOSS_VALKIRIES, FAIL); summons.DespawnAll(); me->DespawnOrUnsummon(); @@ -193,8 +192,7 @@ struct boss_twin_baseAI : public BossAI if (who->GetTypeId() == TYPEID_PLAYER) { Talk(SAY_KILL_PLAYER); - if (instance) - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); + instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); } } @@ -227,21 +225,18 @@ struct boss_twin_baseAI : public BossAI void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) + if (Creature* pSister = GetSister()) { - if (Creature* pSister = GetSister()) + if (!pSister->IsAlive()) { - if (!pSister->IsAlive()) - { - me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - _JustDied(); - } - else - { - me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - instance->SetBossState(BOSS_VALKIRIES, SPECIAL); - } + me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + _JustDied(); + } + else + { + me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + instance->SetBossState(BOSS_VALKIRIES, SPECIAL); } } summons.DespawnAll(); @@ -256,15 +251,12 @@ struct boss_twin_baseAI : public BossAI void EnterCombat(Unit* /*who*/) OVERRIDE { me->SetInCombatWithZone(); - if (instance) + if (Creature* pSister = GetSister()) { - if (Creature* pSister = GetSister()) - { - me->AddAura(MyEmphatySpellId, pSister); - pSister->SetInCombatWithZone(); - } - instance->SetBossState(BOSS_VALKIRIES, IN_PROGRESS); + me->AddAura(MyEmphatySpellId, pSister); + pSister->SetInCombatWithZone(); } + instance->SetBossState(BOSS_VALKIRIES, IN_PROGRESS); Talk(SAY_AGGRO); DoCast(me, SurgeSpellId); @@ -420,15 +412,13 @@ class boss_fjola : public CreatureScript TouchSpellId = SPELL_LIGHT_TOUCH; SpikeSpellId = SPELL_LIGHT_TWIN_SPIKE; - if (instance) - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); boss_twin_baseAI::Reset(); } void EnterCombat(Unit* who) OVERRIDE { - if (instance) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); me->SummonCreature(NPC_BULLET_CONTROLLER, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 0.0f, TEMPSUMMON_MANUAL_DESPAWN); boss_twin_baseAI::EnterCombat(who); @@ -442,8 +432,7 @@ class boss_fjola : public CreatureScript void JustReachedHome() OVERRIDE { - if (instance) - instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); + instance->DoUseDoorOrButton(instance->GetData64(GO_MAIN_GATE_DOOR)); boss_twin_baseAI::JustReachedHome(); } @@ -451,7 +440,7 @@ class boss_fjola : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_fjolaAI(creature); + return GetInstanceAI(creature); } }; @@ -486,7 +475,7 @@ class boss_eydis : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_eydisAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 36cf9432d9..cd3a4e2692 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -357,7 +357,7 @@ class boss_lich_king_toc : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lich_king_tocAI(creature); + return GetInstanceAI(creature); } }; @@ -531,7 +531,7 @@ class npc_fizzlebang_toc : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_fizzlebang_tocAI(creature); + return GetInstanceAI(creature); } }; @@ -819,7 +819,7 @@ class npc_tirion_toc : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_tirion_tocAI(creature); + return GetInstanceAI(creature); } }; @@ -903,7 +903,7 @@ class npc_garrosh_toc : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_garrosh_tocAI(creature); + return GetInstanceAI(creature); } }; @@ -987,7 +987,7 @@ class npc_varian_toc : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_varian_tocAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp index f8f0752184..42f408861e 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp @@ -27,7 +27,7 @@ enum Spells { SPELL_BELLOWING_ROAR = 22686, // fears the group, can be resisted/dispelled SPELL_GRIEVOUS_BITE = 48920, - SPELL_MANGLING_SLASH = 48873, // casted on the current tank, adds debuf + SPELL_MANGLING_SLASH = 48873, // cast on the current tank, adds debuf SPELL_FEARSOME_ROAR = 48849, SPELL_PIERCING_SLASH = 48878, // debuff --> Armor reduced by 75% SPELL_RAPTOR_CALL = 59416, // dummy diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp index efca060b67..78399749fe 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp @@ -32,7 +32,7 @@ enum Spells SPELL_CURSE_OF_LIFE = 49527, SPELL_RAIN_OF_FIRE = 49518, SPELL_SHADOW_VOLLEY = 49528, - SPELL_DECAY_FLESH = 49356, // casted at end of phase 1, starts phase 2 + SPELL_DECAY_FLESH = 49356, // cast at end of phase 1, starts phase 2 // Flesh Spells (phase 2) SPELL_GIFT_OF_THARON_JA = 52509, SPELL_CLEAR_GIFT_OF_THARON_JA = 53242, diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index d9e34ee2af..445e3fa5f6 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -170,7 +170,7 @@ class instance_drak_tharon_keep : public InstanceMapScript return saveStream.str(); } - void Load(char const* str) OVERRIDE OVERRIDE + void Load(char const* str) OVERRIDE { if (!str) { diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index 2dedc986b0..5ef97aa87c 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -188,7 +188,7 @@ class boss_bronjahm : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_bronjahmAI(creature); + return GetInstanceAI(creature); } }; @@ -209,19 +209,16 @@ class npc_corrupted_soul_fragment : public CreatureScript if (type != CHASE_MOTION_TYPE) return; - if (instance) + if (TempSummon* summ = me->ToTempSummon()) { - if (TempSummon* summ = me->ToTempSummon()) - { - uint64 BronjahmGUID = instance->GetData64(DATA_BRONJAHM); - if (GUID_LOPART(BronjahmGUID) != id) - return; + uint64 BronjahmGUID = instance->GetData64(DATA_BRONJAHM); + if (GUID_LOPART(BronjahmGUID) != id) + return; - if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, BronjahmGUID)) - me->CastSpell(bronjahm, SPELL_CONSUME_SOUL, true); + if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, BronjahmGUID)) + me->CastSpell(bronjahm, SPELL_CONSUME_SOUL, true); - summ->UnSummon(); - } + summ->UnSummon(); } } @@ -231,7 +228,7 @@ class npc_corrupted_soul_fragment : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_corrupted_soul_fragmentAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index 7d923e7686..52ab910fb9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -345,7 +345,7 @@ class boss_devourer_of_souls : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_devourer_of_soulsAI(creature); + return GetInstanceAI(creature); } }; @@ -480,9 +480,7 @@ class spell_devourer_of_souls_mirrored_soul_target_selector : public SpellScript class achievement_three_faced : public AchievementCriteriaScript { public: - achievement_three_faced() : AchievementCriteriaScript("achievement_three_faced") - { - } + achievement_three_faced() : AchievementCriteriaScript("achievement_three_faced") { } bool OnCheck(Player* /*player*/, Unit* target) OVERRIDE { diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index cfa149c134..4d2a87a385 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -113,9 +113,6 @@ public: { if (phase == PHASE_INTRO) { - if (!instance) - return; - events.Update(diff); switch (events.ExecuteEvent()) { @@ -193,7 +190,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_sylvanas_fosAI(creature); + return GetInstanceAI(creature); } }; @@ -239,9 +236,6 @@ public: { if (phase == PHASE_INTRO) { - if (!instance) - return; - events.Update(diff); switch (events.ExecuteEvent()) { @@ -330,7 +324,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_jaina_fosAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp index e2d285f730..a7111a1d07 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp @@ -52,7 +52,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_falricAI(creature); + return GetInstanceAI(creature); } struct boss_falricAI : public boss_horAI @@ -67,15 +67,13 @@ public: uiHopelessnessCount = 0; - if (instance) - instance->SetBossState(DATA_FALRIC_EVENT, NOT_STARTED); + instance->SetBossState(DATA_FALRIC_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_FALRIC_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_FALRIC_EVENT, IN_PROGRESS); events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000); events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000); @@ -86,8 +84,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_FALRIC_EVENT, DONE); + instance->SetBossState(DATA_FALRIC_EVENT, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp index a87b7b6d93..ae448bdc65 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp @@ -51,7 +51,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_marwynAI(creature); + return GetInstanceAI(creature); } struct boss_marwynAI : public boss_horAI @@ -62,15 +62,13 @@ public: { boss_horAI::Reset(); - if (instance) - instance->SetBossState(DATA_MARWYN_EVENT, NOT_STARTED); + instance->SetBossState(DATA_MARWYN_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_MARWYN_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_MARWYN_EVENT, IN_PROGRESS); events.ScheduleEvent(EVENT_OBLITERATE, 30000); /// @todo Check timer events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000); @@ -82,8 +80,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_MARWYN_EVENT, DONE); + instance->SetBossState(DATA_MARWYN_EVENT, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 96b772df5a..9e4fe02a36 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -1283,7 +1283,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ghostly_priestAI(creature); + return GetInstanceAI(creature); } }; @@ -1355,7 +1355,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_phantom_mageAI(creature); + return GetInstanceAI(creature); } }; @@ -1377,7 +1377,7 @@ public: void EnterEvadeMode() OVERRIDE { - if (!me->GetOwner()->HasAura(AURA_HALLUCINATION)) + if (me->GetOwner() && !me->GetOwner()->HasAura(AURA_HALLUCINATION)) npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(); } @@ -1447,7 +1447,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_shadowy_mercenaryAI(creature); + return GetInstanceAI(creature); } }; @@ -1499,7 +1499,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_spectral_footmanAI(creature); + return GetInstanceAI(creature); } }; @@ -1558,7 +1558,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_tortured_riflemanAI(creature); + return GetInstanceAI(creature); } }; @@ -1674,7 +1674,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_frostworn_generalAI(creature); + return GetInstanceAI(creature); } }; @@ -1901,7 +1901,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_raging_ghoulAI(creature); + return GetInstanceAI(creature); } }; @@ -2021,7 +2021,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_risen_witch_doctorAI(creature); + return GetInstanceAI(creature); } }; @@ -2111,7 +2111,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_lumbering_abominationAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index 93030492ca..c8e58ca700 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -248,7 +248,7 @@ class boss_drakkari_colossus : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_drakkari_colossusAI(creature); + return GetInstanceAI(creature); } }; @@ -278,11 +278,8 @@ class boss_drakkari_elemental : public CreatureScript if (killer == me) return; - if (instance) - { - if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) - killer->Kill(colossus); - } + if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) + killer->Kill(colossus); } void UpdateAI(uint32 diff) OVERRIDE @@ -317,12 +314,9 @@ class boss_drakkari_elemental : public CreatureScript { case ACTION_RETURN_TO_COLOSSUS: DoCast(SPELL_SURGE_VISUAL); - if (instance) - { - if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) - // what if the elemental is more than 80 yards from drakkari colossus ? - DoCast(colossus, SPELL_MERGE, true); - } + if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) + // what if the elemental is more than 80 yards from drakkari colossus ? + DoCast(colossus, SPELL_MERGE, true); break; } } @@ -381,7 +375,7 @@ class boss_drakkari_elemental : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_drakkari_elementalAI(creature); + return GetInstanceAI(creature); } }; @@ -392,7 +386,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_living_mojoAI(creature); + return GetInstanceAI(creature); } struct npc_living_mojoAI : public ScriptedAI diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp index c11db7146d..71d1748a3e 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp @@ -37,7 +37,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_eckAI(creature); + return GetInstanceAI(creature); } struct boss_eckAI : public ScriptedAI @@ -65,14 +65,12 @@ public: bBerserk = false; - if (instance) - instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, NOT_STARTED); + instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, IN_PROGRESS); + instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -127,8 +125,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, DONE); + instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, DONE); } }; @@ -141,7 +138,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ruins_dwellerAI(creature); + return GetInstanceAI(creature); } struct npc_ruins_dwellerAI : public ScriptedAI @@ -155,12 +152,9 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - instance->SetData64(DATA_RUIN_DWELLER_DIED, me->GetGUID()); - if (instance->GetData(DATA_ALIVE_RUIN_DWELLERS) == 0) - me->SummonCreature(CREATURE_ECK, EckSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300*IN_MILLISECONDS); - } + instance->SetData64(DATA_RUIN_DWELLER_DIED, me->GetGUID()); + if (instance->GetData(DATA_ALIVE_RUIN_DWELLERS) == 0) + me->SummonCreature(CREATURE_ECK, EckSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300*IN_MILLISECONDS); } }; diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp index 7a5520ab14..5a3c4b8c69 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp @@ -70,7 +70,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_gal_darahAI(creature); + return GetInstanceAI(creature); } struct boss_gal_darahAI : public ScriptedAI @@ -118,16 +118,14 @@ public: me->SetDisplayId(DISPLAY_TROLL); - if (instance) - instance->SetData(DATA_GAL_DARAH_EVENT, NOT_STARTED); + instance->SetData(DATA_GAL_DARAH_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_GAL_DARAH_EVENT, IN_PROGRESS); + instance->SetData(DATA_GAL_DARAH_EVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -269,8 +267,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_GAL_DARAH_EVENT, DONE); + instance->SetData(DATA_GAL_DARAH_EVENT, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp index 0ccaea316e..a69e236c6e 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp @@ -54,7 +54,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_moorabiAI(creature); + return GetInstanceAI(creature); } struct boss_moorabiAI : public ScriptedAI @@ -81,8 +81,7 @@ public: uiTransformationTImer = 12*IN_MILLISECONDS; bPhase = false; - if (instance) - instance->SetData(DATA_MOORABI_EVENT, NOT_STARTED); + instance->SetData(DATA_MOORABI_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -90,8 +89,7 @@ public: Talk(SAY_AGGRO); DoCast(me, SPELL_MOJO_FRENZY, true); - if (instance) - instance->SetData(DATA_MOORABI_EVENT, IN_PROGRESS); + instance->SetData(DATA_MOORABI_EVENT, IN_PROGRESS); } void UpdateAI(uint32 uiDiff) OVERRIDE @@ -157,8 +155,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_MOORABI_EVENT, DONE); + instance->SetData(DATA_MOORABI_EVENT, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp index 441149c6dd..25989ca965 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp @@ -76,7 +76,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_slad_ranAI(creature); + return GetInstanceAI(creature); } struct boss_slad_ranAI : public ScriptedAI @@ -109,16 +109,14 @@ public: lSummons.DespawnAll(); - if (instance) - instance->SetData(DATA_SLAD_RAN_EVENT, NOT_STARTED); + instance->SetData(DATA_SLAD_RAN_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_SLAD_RAN_EVENT, IN_PROGRESS); + instance->SetData(DATA_SLAD_RAN_EVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -180,13 +178,13 @@ public: Talk(SAY_DEATH); lSummons.DespawnAll(); - if (instance) - instance->SetData(DATA_SLAD_RAN_EVENT, DONE); + instance->SetData(DATA_SLAD_RAN_EVENT, DONE); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } void JustSummoned(Creature* summoned) OVERRIDE diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index cdcd8ed796..92c97ce6ab 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -739,7 +739,7 @@ class npc_putricide_oozeAI : public ScriptedAI if (!UpdateVictim() && !_newTargetSelectTimer) return; - if (!_newTargetSelectTimer && !me->IsNonMeleeSpellCasted(false, false, true, false, true)) + if (!_newTargetSelectTimer && !me->IsNonMeleeSpellCast(false, false, true, false, true)) _newTargetSelectTimer = 1000; DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index bbd700b7ed..9684c7d9cd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -666,7 +666,7 @@ class npc_the_lich_king_controller : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_the_lich_king_controllerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index b873b3ee15..da2dc8583a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -59,7 +59,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_anubrekhanAI(creature); + return GetInstanceAI(creature); } struct boss_anubrekhanAI : public BossAI @@ -105,8 +105,7 @@ public: _JustDied(); // start achievement timer (kill Maexna within 20 min) - if (instance) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void EnterCombat(Unit* /*who*/) OVERRIDE { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index b723c2f413..2d216c78ea 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -216,7 +216,7 @@ class npc_faerlina_add : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_faerlina_addAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 9b336a77e2..b57cb3af19 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -89,7 +89,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_four_horsemenAI(creature); + return GetInstanceAI(creature); } struct boss_four_horsemenAI : public BossAI @@ -121,8 +121,7 @@ public: if (!encounterActionReset) DoEncounteraction(NULL, false, true, false); - if (instance) - instance->SetData(DATA_HORSEMEN0 + id, NOT_STARTED); + instance->SetData(DATA_HORSEMEN0 + id, NOT_STARTED); me->SetReactState(REACT_AGGRESSIVE); uiEventStarterGUID = 0; @@ -139,9 +138,6 @@ public: bool DoEncounteraction(Unit* who, bool attack, bool reset, bool checkAllDead) { - if (!instance) - return false; - Creature* Thane = Unit::GetCreature(*me, instance->GetData64(DATA_THANE)); Creature* Lady = Unit::GetCreature(*me, instance->GetData64(DATA_LADY)); Creature* Baron = Unit::GetCreature(*me, instance->GetData64(DATA_BARON)); @@ -301,10 +297,9 @@ public: events.Reset(); summons.DespawnAll(); - if (instance) - instance->SetData(DATA_HORSEMEN0 + id, DONE); + instance->SetData(DATA_HORSEMEN0 + id, DONE); - if (instance && DoEncounteraction(NULL, false, false, true)) + if (DoEncounteraction(NULL, false, false, true)) { instance->SetBossState(BOSS_HORSEMEN, DONE); instance->SaveToDB(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index f76c46d96f..9e5dac9c50 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -181,8 +181,7 @@ class boss_gothik : public CreatureScript DeadTriggerGUID.clear(); me->SetReactState(REACT_PASSIVE); - if (instance) - instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); + instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); _Reset(); mergedSides = false; phaseTwo = false; @@ -210,8 +209,7 @@ class boss_gothik : public CreatureScript events.ScheduleEvent(EVENT_SUMMON, 30000); DoTeleportTo(PosPlatform); Talk(SAY_SPEECH); - if (instance) - instance->SetData(DATA_GOTHIK_GATE, GO_STATE_READY); + instance->SetData(DATA_GOTHIK_GATE, GO_STATE_READY); } void JustSummoned(Creature* summon) OVERRIDE @@ -248,8 +246,7 @@ class boss_gothik : public CreatureScript DeadTriggerGUID.clear(); _JustDied(); Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); + instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); } void DoGothikSummon(uint32 entry) @@ -403,8 +400,7 @@ class boss_gothik : public CreatureScript if (!thirtyPercentReached && HealthBelowPct(30) && phaseTwo) { thirtyPercentReached = true; - if (instance) - instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); + instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); } if (me->HasUnitState(UNIT_STATE_CASTING)) @@ -429,8 +425,7 @@ class boss_gothik : public CreatureScript { if (!CheckGroupSplitted()) { - if (instance) - instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); + instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); DummyEntryCheckPredicate pred; summons.DoAction(0, pred); //! Magic numbers fail summons.DoZoneInCombat(); @@ -500,7 +495,7 @@ class boss_gothik : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_gothikAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index a8e2783602..3dad2798d2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -61,7 +61,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_heiganAI(creature); + return GetInstanceAI(creature); } struct boss_heiganAI : public BossAI diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index f9efdfce28..169c3241a7 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -310,8 +310,7 @@ public: FindGameObjects(); - if (instance) - instance->SetData(DATA_ABOMINATION_KILLED, 0); + instance->SetData(DATA_ABOMINATION_KILLED, 0); if (GameObject* pKTTrigger = me->GetMap()->GetGameObject(KTTriggerGUID)) { @@ -649,7 +648,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kelthuzadAI(creature); + return GetInstanceAI(creature); } }; @@ -769,7 +768,7 @@ class npc_kelthuzad_abomination : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_kelthuzad_abominationAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index d90db5e077..d653be216d 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -37,23 +37,20 @@ enum Noth NPC_GUARDIAN = 16981 }; -#define SPELL_BLINK RAND(29208, 29209, 29210, 29211) +#define SPELL_BLINK RAND(29208, 29209, 29210, 29211) // Teleport position of Noth on his balcony -#define TELE_X 2631.370f -#define TELE_Y -3529.680f -#define TELE_Z 274.040f -#define TELE_O 6.277f +Position const Teleport = { 2631.370f, -3529.680f, 274.040f, 6.277f }; #define MAX_SUMMON_POS 5 -const float SummonPos[MAX_SUMMON_POS][4] = +Position const SummonPos[MAX_SUMMON_POS] = { - {2728.12f, -3544.43f, 261.91f, 6.04f}, - {2729.05f, -3544.47f, 261.91f, 5.58f}, - {2728.24f, -3465.08f, 264.20f, 3.56f}, - {2704.11f, -3456.81f, 265.53f, 4.51f}, - {2663.56f, -3464.43f, 262.66f, 5.20f}, + { 2728.12f, -3544.43f, 261.91f, 6.04f }, + { 2729.05f, -3544.47f, 261.91f, 5.58f }, + { 2728.24f, -3465.08f, 264.20f, 3.56f }, + { 2704.11f, -3456.81f, 265.53f, 4.51f }, + { 2663.56f, -3464.43f, 262.66f, 5.20f } }; enum Events @@ -65,7 +62,7 @@ enum Events EVENT_WARRIOR, EVENT_BALCONY, EVENT_WAVE, - EVENT_GROUND, + EVENT_GROUND }; class boss_noth : public CreatureScript @@ -73,17 +70,10 @@ class boss_noth : public CreatureScript public: boss_noth() : CreatureScript("boss_noth") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_nothAI(creature); - } - struct boss_nothAI : public BossAI { boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH) { } - uint32 waveCount, balconyCount; - void Reset() OVERRIDE { me->SetReactState(REACT_AGGRESSIVE); @@ -104,6 +94,7 @@ public: me->SetReactState(REACT_AGGRESSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoZoneInCombat(); + if (me->getThreatManager().isThreatListEmpty()) EnterEvadeMode(); else @@ -138,11 +129,7 @@ public: void SummonUndead(uint32 entry, uint32 num) { for (uint32 i = 0; i < num; ++i) - { - uint32 pos = rand()%MAX_SUMMON_POS; - me->SummonCreature(entry, SummonPos[pos][0], SummonPos[pos][1], SummonPos[pos][2], - SummonPos[pos][3], TEMPSUMMON_CORPSE_DESPAWN, 60000); - } + me->SummonCreature(entry, SummonPos[rand()%MAX_SUMMON_POS], TEMPSUMMON_CORPSE_DESPAWN, 60000); } void UpdateAI(uint32 diff) OVERRIDE @@ -152,6 +139,9 @@ public: events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) @@ -176,7 +166,7 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->AttackStop(); me->RemoveAllAuras(); - me->NearTeleportTo(TELE_X, TELE_Y, TELE_Z, TELE_O); + me->NearTeleportTo(Teleport.GetPositionX(), Teleport.GetPositionY(), Teleport.GetPositionZ(), Teleport.GetOrientation()); events.Reset(); events.ScheduleEvent(EVENT_WAVE, urand(2000, 5000)); waveCount = 0; @@ -185,12 +175,20 @@ public: Talk(SAY_SUMMON); switch (balconyCount) { - case 0: SummonUndead(NPC_CHAMPION, RAID_MODE(2, 4)); break; - case 1: SummonUndead(NPC_CHAMPION, RAID_MODE(1, 2)); - SummonUndead(NPC_GUARDIAN, RAID_MODE(1, 2)); break; - case 2: SummonUndead(NPC_GUARDIAN, RAID_MODE(2, 4)); break; - default:SummonUndead(NPC_CHAMPION, RAID_MODE(5, 10)); - SummonUndead(NPC_GUARDIAN, RAID_MODE(5, 10));break; + case 0: + SummonUndead(NPC_CHAMPION, RAID_MODE(2, 4)); + break; + case 1: + SummonUndead(NPC_CHAMPION, RAID_MODE(1, 2)); + SummonUndead(NPC_GUARDIAN, RAID_MODE(1, 2)); + break; + case 2: + SummonUndead(NPC_GUARDIAN, RAID_MODE(2, 4)); + break; + default: + SummonUndead(NPC_CHAMPION, RAID_MODE(5, 10)); + SummonUndead(NPC_GUARDIAN, RAID_MODE(5, 10)); + break; } ++waveCount; events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, urand(30000, 45000)); @@ -211,8 +209,16 @@ public: if (me->HasReactState(REACT_AGGRESSIVE)) DoMeleeAttackIfReady(); } + + private: + uint32 waveCount; + uint32 balconyCount; }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetInstanceAI(creature); + } }; void AddSC_boss_noth() diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index 96f2d743ca..e414bdaaa3 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -57,7 +57,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_patchwerkAI(creature); + return GetInstanceAI(creature); } struct boss_patchwerkAI : public BossAI @@ -70,8 +70,7 @@ public: { _Reset(); - if (instance) - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); } void KilledUnit(Unit* /*Victim*/) OVERRIDE @@ -94,8 +93,7 @@ public: events.ScheduleEvent(EVENT_HATEFUL, 1000); events.ScheduleEvent(EVENT_BERSERK, 360000); - if (instance) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 60620804db..761529ab0f 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -96,6 +96,8 @@ class boss_sapphiron : public CreatureScript void InitializeAI() OVERRIDE { + _canTheHundredClub = true; + float x, y, z; me->GetPosition(x, y, z); me->SummonGameObject(GO_BIRTH, x, y, z, 0, 0, 0, 0, 0, 0); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index 3d12188747..1ef81faa57 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -110,7 +110,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_thaddiusAI(creature); + return GetInstanceAI(creature); } struct boss_thaddiusAI : public BossAI @@ -230,15 +230,13 @@ public: { if (!checkStalaggAlive) { - if (instance) - if (Creature* pStalagg = me->GetCreature(*me, instance->GetData64(DATA_STALAGG))) - pStalagg->Respawn(); + if (Creature* pStalagg = me->GetCreature(*me, instance->GetData64(DATA_STALAGG))) + pStalagg->Respawn(); } else { - if (instance) - if (Creature* pFeugen = me->GetCreature(*me, instance->GetData64(DATA_FEUGEN))) - pFeugen->Respawn(); + if (Creature* pFeugen = me->GetCreature(*me, instance->GetData64(DATA_FEUGEN))) + pFeugen->Respawn(); } } } @@ -285,7 +283,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_stalaggAI(creature); + return GetInstanceAI(creature); } struct npc_stalaggAI : public ScriptedAI @@ -302,10 +300,9 @@ public: void Reset() OVERRIDE { - if (instance) - if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) - if (pThaddius->AI()) - pThaddius->AI()->DoAction(ACTION_STALAGG_RESET); + if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) + if (pThaddius->AI()) + pThaddius->AI()->DoAction(ACTION_STALAGG_RESET); powerSurgeTimer = urand(20000, 25000); magneticPullTimer = 20000; } @@ -325,10 +322,9 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_STAL_DEATH); - if (instance) - if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) - if (pThaddius->AI()) - pThaddius->AI()->DoAction(ACTION_STALAGG_DIED); + if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) + if (pThaddius->AI()) + pThaddius->AI()->DoAction(ACTION_STALAGG_DIED); } void UpdateAI(uint32 uiDiff) OVERRIDE @@ -379,7 +375,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_feugenAI(creature); + return GetInstanceAI(creature); } struct npc_feugenAI : public ScriptedAI @@ -395,10 +391,9 @@ public: void Reset() OVERRIDE { - if (instance) - if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) - if (pThaddius->AI()) - pThaddius->AI()->DoAction(ACTION_FEUGEN_RESET); + if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) + if (pThaddius->AI()) + pThaddius->AI()->DoAction(ACTION_FEUGEN_RESET); staticFieldTimer = 5000; } @@ -417,10 +412,9 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_FEUG_DEATH); - if (instance) - if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) - if (pThaddius->AI()) - pThaddius->AI()->DoAction(ACTION_FEUGEN_DIED); + if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) + if (pThaddius->AI()) + pThaddius->AI()->DoAction(ACTION_FEUGEN_DIED); } void UpdateAI(uint32 uiDiff) OVERRIDE diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index c813577dd5..589b9a30d9 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -106,8 +106,8 @@ enum Spells SPELL_ARCANE_STORM_P_I = 61693, SPELL_VORTEX_1 = 56237, // seems that frezze object animation SPELL_VORTEX_2 = 55873, // visual effect - SPELL_VORTEX_3 = 56105, // this spell must handle all the script - casted by the boss and to himself - SPELL_VORTEX_6 = 73040, // teleport - (casted to all raid), caster vortex bunnies, targets players. + SPELL_VORTEX_3 = 56105, // this spell must handle all the script - cast by the boss and to himself + SPELL_VORTEX_6 = 73040, // teleport - (cast to all raid), caster vortex bunnies, targets players. // Phase II SPELL_TELEPORT_VISUAL_ONLY = 41232, // Light blue animation cast by arcane NPCs when spawned on Hover Disks @@ -117,7 +117,7 @@ enum Spells SPELL_SUMMON_ARCANE_BOMB = 56429, SPELL_ARCANE_BOMB_TRIGGER = 56430, SPELL_ARCANE_BOMB_KNOCKBACK_DAMAGE = 56431, - SPELL_ARCANE_OVERLOAD_1 = 56432, // casted by npc Arcane Overload ID: 30282 + SPELL_ARCANE_OVERLOAD_1 = 56432, // cast by npc Arcane Overload ID: 30282 // SPELL_ARCANE_OVERLOAD_2 = 56435, // Triggered by 56432 - resizing target // SPELL_ARCANE_OVERLOAD_3 = 56438, // Triggered by 56432 - damage reduction SPELL_SURGE_OF_POWER_P_II = 56505, @@ -376,8 +376,7 @@ public: SetPhase(PHASE_NOT_STARTED, true); me->SetReactState(REACT_PASSIVE); - if (instance) - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } uint32 GetData(uint32 data) const OVERRIDE @@ -568,27 +567,22 @@ public: // We can't call full function here since it includes DoZoneInCombat(), // if someone does it will be returned with a warning. me->setActive(true); - if (instance) + if (!instance->CheckRequiredBosses(DATA_MALYGOS_EVENT)) { - if (!instance->CheckRequiredBosses(DATA_MALYGOS_EVENT)) - { - EnterEvadeMode(); - return; - } - - instance->SetBossState(DATA_MALYGOS_EVENT, IN_PROGRESS); + EnterEvadeMode(); + return; } + instance->SetBossState(DATA_MALYGOS_EVENT, IN_PROGRESS); + Talk(SAY_START_P_ONE); DoCast(SPELL_BERSERK); // periodic aura, first tick in 10 minutes - if (instance) - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void EnterEvadeMode() OVERRIDE { - if (instance) - instance->SetBossState(DATA_MALYGOS_EVENT, FAIL); + instance->SetBossState(DATA_MALYGOS_EVENT, FAIL); SendLightOverride(LIGHT_GET_DEFAULT_FOR_MAP, 1*IN_MILLISECONDS); @@ -628,8 +622,7 @@ public: summons.DespawnAll(); } - if (instance) - instance->SetBossState(DATA_MALYGOS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_MALYGOS_EVENT, NOT_STARTED); } void KilledUnit(Unit* victim) OVERRIDE @@ -1074,7 +1067,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_malygosAI(creature); + return GetInstanceAI(creature); } }; @@ -1127,7 +1120,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_portal_eoeAI(creature); + return GetInstanceAI(creature); } }; @@ -1190,7 +1183,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_power_sparkAI(creature); + return GetInstanceAI(creature); } }; @@ -1292,7 +1285,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_melee_hover_diskAI(creature); + return GetInstanceAI(creature); } }; @@ -1374,7 +1367,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_caster_hover_diskAI(creature); + return GetInstanceAI(creature); } }; @@ -1450,7 +1443,7 @@ class npc_nexus_lord : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_nexus_lordAI(creature); + return GetInstanceAI(creature); } }; @@ -1517,7 +1510,7 @@ class npc_scion_of_eternity : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_scion_of_eternityAI(creature); + return GetInstanceAI(creature); } }; @@ -1575,7 +1568,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_arcane_overloadAI(creature); + return GetInstanceAI(creature); } }; @@ -1907,7 +1900,7 @@ class spell_malygos_vortex_visual : public SpellScriptLoader if (InstanceScript* instance = caster->GetInstanceScript()) { - // Teleport spell - I'm not sure but might be it must be casted by each vehicle when it's passenger leaves it. + // Teleport spell - I'm not sure but might be it must be cast by each vehicle when it's passenger leaves it. if (Creature* trigger = caster->GetMap()->GetCreature(instance->GetData64(DATA_TRIGGER))) trigger->CastSpell(targetPlayer, SPELL_VORTEX_6, true); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp index f05d065ab3..bffae212ee 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp @@ -95,24 +95,21 @@ class boss_anomalus : public CreatureScript uiChaoticRiftGUID = 0; chaosTheory = true; - if (instance) - instance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED); + instance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_ANOMALUS_EVENT, IN_PROGRESS); + instance->SetData(DATA_ANOMALUS_EVENT, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_ANOMALUS_EVENT, DONE); + instance->SetData(DATA_ANOMALUS_EVENT, DONE); } uint32 GetData(uint32 type) const OVERRIDE @@ -187,7 +184,7 @@ class boss_anomalus : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_anomalusAI(creature); + return GetInstanceAI(creature); } }; @@ -255,7 +252,7 @@ class npc_chaotic_rift : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_chaotic_riftAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 455653a136..b0d2334790 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -61,7 +61,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_keristraszaAI(creature); + return GetInstanceAI(creature); } struct boss_keristraszaAI : public ScriptedAI @@ -95,8 +95,7 @@ public: RemovePrison(CheckContainmentSpheres()); - if (instance) - instance->SetData(DATA_KERISTRASZA_EVENT, NOT_STARTED); + instance->SetData(DATA_KERISTRASZA_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -104,28 +103,24 @@ public: Talk(SAY_AGGRO); DoCastAOE(SPELL_INTENSE_COLD); - if (instance) - instance->SetData(DATA_KERISTRASZA_EVENT, IN_PROGRESS); + instance->SetData(DATA_KERISTRASZA_EVENT, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_KERISTRASZA_EVENT, DONE); + instance->SetData(DATA_KERISTRASZA_EVENT, DONE); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } bool CheckContainmentSpheres(bool remove_prison = false) { - if (!instance) - return false; - auiContainmentSphereGUIDs[0] = instance->GetData64(ANOMALUS_CONTAINMET_SPHERE); auiContainmentSphereGUIDs[1] = instance->GetData64(ORMOROKS_CONTAINMET_SPHERE); auiContainmentSphereGUIDs[2] = instance->GetData64(TELESTRAS_CONTAINMET_SPHERE); diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp index 8a01c40186..e528b9e163 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -65,7 +65,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_magus_telestraAI(creature); + return GetInstanceAI(creature); } struct boss_magus_telestraAI : public ScriptedAI @@ -118,29 +118,27 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetVisible(true); - if (instance) - instance->SetData(DATA_MAGUS_TELESTRA_EVENT, NOT_STARTED); + instance->SetData(DATA_MAGUS_TELESTRA_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_MAGUS_TELESTRA_EVENT, IN_PROGRESS); + instance->SetData(DATA_MAGUS_TELESTRA_EVENT, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE); + instance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_KILL); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void DoAction(int32 action) OVERRIDE diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp index e2789995ec..ddaf9f7e94 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp @@ -70,6 +70,12 @@ public: { boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) { } + void Reset() + { + BossAI::Reset(); + frenzy = false; + } + void EnterCombat(Unit* /*who*/) OVERRIDE { _EnterCombat(); @@ -82,8 +88,7 @@ public: Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_ORMOROK_EVENT, IN_PROGRESS); + instance->SetData(DATA_ORMOROK_EVENT, IN_PROGRESS); } void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) OVERRIDE @@ -102,13 +107,13 @@ public: Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_ORMOROK_EVENT, DONE); + instance->SetData(DATA_ORMOROK_EVENT, DONE); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_KILL); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void UpdateAI(uint32 diff) OVERRIDE @@ -159,7 +164,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ormorokAI(creature); + return GetInstanceAI(creature); } }; @@ -190,7 +195,11 @@ public: struct npc_crystal_spike_triggerAI : public ScriptedAI { - npc_crystal_spike_triggerAI(Creature* creature) : ScriptedAI(creature) { } + npc_crystal_spike_triggerAI(Creature* creature) : ScriptedAI(creature) + { + _count = 0; + _despawntimer = 0; + } void IsSummonedBy(Unit* owner) OVERRIDE { diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp index ca6f580633..1f7d47ccc3 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp @@ -99,9 +99,10 @@ class boss_eregos : public CreatureScript DoAction(ACTION_SET_NORMAL_EVENTS); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_KILL); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -165,7 +166,7 @@ class boss_eregos : public CreatureScript if (summon->GetEntry() != NPC_PLANAR_ANOMALY) return; - /// @todo: See why the spell is not casted + /// @todo: See why the spell is not cast summon->CastSpell(summon, SPELL_PLANAR_BLAST, true); } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp index f7c558879d..db1bb34228 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp @@ -248,7 +248,7 @@ class boss_urom : public CreatureScript arcaneExplosionTimer -= diff; } - if (!me->IsNonMeleeSpellCasted(false, true, true)) + if (!me->IsNonMeleeSpellCast(false, true, true)) { if (frostBombTimer <= diff) { diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 385f80ae37..074f3b9a13 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -217,17 +217,14 @@ class npc_azure_ring_captain : public CreatureScript switch (action) { case ACTION_CALL_DRAGON_EVENT: - if (instance) + if (Creature* varos = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VAROS))) { - if (Creature* varos = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VAROS))) + if (Unit* victim = varos->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0)) { - if (Unit* victim = varos->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - me->SetReactState(REACT_PASSIVE); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(ACTION_CALL_DRAGON_EVENT, victim->GetPositionX(), victim->GetPositionY(), victim->GetPositionZ() + 20.0f); - targetGUID = victim->GetGUID(); - } + me->SetReactState(REACT_PASSIVE); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(ACTION_CALL_DRAGON_EVENT, victim->GetPositionX(), victim->GetPositionY(), victim->GetPositionZ() + 20.0f); + targetGUID = victim->GetGUID(); } } break; @@ -241,7 +238,7 @@ class npc_azure_ring_captain : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_ring_captainAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index 944eacda34..b61d12df48 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -99,7 +99,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_bjarngrimAI(creature); + return GetInstanceAI(creature); } struct boss_bjarngrimAI : public ScriptedAI @@ -180,8 +180,7 @@ public: SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE); - if (instance) - instance->SetBossState(DATA_BJARNGRIM, NOT_STARTED); + instance->SetBossState(DATA_BJARNGRIM, NOT_STARTED); } void EnterEvadeMode() OVERRIDE @@ -201,8 +200,7 @@ public: //must get both lieutenants here and make sure they are with him me->CallForHelp(30.0f); - if (instance) - instance->SetBossState(DATA_BJARNGRIM, IN_PROGRESS); + instance->SetBossState(DATA_BJARNGRIM, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -214,8 +212,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_BJARNGRIM, DONE); + instance->SetBossState(DATA_BJARNGRIM, DONE); } /// @todo remove when removal is done by the core @@ -245,7 +242,7 @@ public: if (m_uiChangeStance_Timer <= uiDiff) { //wait for current spell to finish before change stance - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; DoRemoveStanceAura(m_uiStance); @@ -391,7 +388,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_stormforged_lieutenantAI(creature); + return GetInstanceAI(creature); } struct npc_stormforged_lieutenantAI : public ScriptedAI @@ -414,13 +411,10 @@ public: void EnterCombat(Unit* who) OVERRIDE { - if (instance) + if (Creature* pBjarngrim = instance->instance->GetCreature(instance->GetData64(DATA_BJARNGRIM))) { - if (Creature* pBjarngrim = instance->instance->GetCreature(instance->GetData64(DATA_BJARNGRIM))) - { - if (pBjarngrim->IsAlive() && !pBjarngrim->GetVictim()) - pBjarngrim->AI()->AttackStart(who); - } + if (pBjarngrim->IsAlive() && !pBjarngrim->GetVictim()) + pBjarngrim->AI()->AttackStart(who); } } @@ -440,13 +434,10 @@ public: if (m_uiRenewSteel_Timer <= uiDiff) { - if (instance) + if (Creature* pBjarngrim = instance->instance->GetCreature(instance->GetData64(DATA_BJARNGRIM))) { - if (Creature* pBjarngrim = instance->instance->GetCreature(instance->GetData64(DATA_BJARNGRIM))) - { - if (pBjarngrim->IsAlive()) - DoCast(pBjarngrim, SPELL_RENEW_STEEL_N); - } + if (pBjarngrim->IsAlive()) + DoCast(pBjarngrim, SPELL_RENEW_STEEL_N); } m_uiRenewSteel_Timer = urand(10000, 14000); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index af6beca608..3e35ae3fae 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -72,7 +72,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ionarAI(creature); + return GetInstanceAI(creature); } struct boss_ionarAI : public ScriptedAI @@ -115,16 +115,14 @@ public: if (!me->IsVisible()) me->SetVisible(true); - if (instance) - instance->SetBossState(DATA_IONAR, NOT_STARTED); + instance->SetBossState(DATA_IONAR, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_IONAR, IN_PROGRESS); + instance->SetBossState(DATA_IONAR, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE @@ -133,13 +131,13 @@ public: lSparkList.DespawnAll(); - if (instance) - instance->SetBossState(DATA_IONAR, DONE); + instance->SetBossState(DATA_IONAR, DONE); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } void SpellHit(Unit* /*caster*/, const SpellInfo* spell) OVERRIDE @@ -278,7 +276,7 @@ public: Talk(SAY_SPLIT); - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_DISPERSE, false); @@ -301,7 +299,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_spark_of_ionarAI(creature); + return GetInstanceAI(creature); } struct npc_spark_of_ionarAI : public ScriptedAI @@ -347,24 +345,21 @@ public: // Prevent them to follow players through the whole instance if (uiCheckTimer <= uiDiff) { - if (instance) + Creature* pIonar = instance->instance->GetCreature(instance->GetData64(DATA_IONAR)); + if (pIonar && pIonar->IsAlive()) { - Creature* pIonar = instance->instance->GetCreature(instance->GetData64(DATA_IONAR)); - if (pIonar && pIonar->IsAlive()) + if (me->GetDistance(pIonar) > DATA_MAX_SPARK_DISTANCE) { - if (me->GetDistance(pIonar) > DATA_MAX_SPARK_DISTANCE) - { - Position pos; - pIonar->GetPosition(&pos); + Position pos; + pIonar->GetPosition(&pos); - me->SetSpeed(MOVE_RUN, 2.0f); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(DATA_POINT_CALLBACK, pos); - } + me->SetSpeed(MOVE_RUN, 2.0f); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(DATA_POINT_CALLBACK, pos); } - else - me->DespawnOrUnsummon(); } + else + me->DespawnOrUnsummon(); uiCheckTimer = 2*IN_MILLISECONDS; } else diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index 61687de1b5..cb997ebe0e 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -69,7 +69,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lokenAI(creature); + return GetInstanceAI(creature); } struct boss_lokenAI : public ScriptedAI @@ -95,38 +95,30 @@ public: m_uiHealthAmountModifier = 1; - if (instance) - { - instance->SetBossState(DATA_LOKEN, NOT_STARTED); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); - } + instance->SetBossState(DATA_LOKEN, NOT_STARTED); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - { - instance->SetBossState(DATA_LOKEN, IN_PROGRESS); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); - } + instance->SetBossState(DATA_LOKEN, IN_PROGRESS); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - { - instance->SetBossState(DATA_LOKEN, DONE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PULSING_SHOCKWAVE_AURA); - } + instance->SetBossState(DATA_LOKEN, DONE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PULSING_SHOCKWAVE_AURA); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } void UpdateAI(uint32 uiDiff) OVERRIDE diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index b6790a088a..b756a9a3dc 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -75,7 +75,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_volkhanAI(creature); + return GetInstanceAI(creature); } struct boss_volkhanAI : public ScriptedAI @@ -120,16 +120,14 @@ public: DespawnGolem(); m_lGolemGUIDList.clear(); - if (instance) - instance->SetBossState(DATA_VOLKHAN, NOT_STARTED); + instance->SetBossState(DATA_VOLKHAN, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_VOLKHAN, IN_PROGRESS); + instance->SetBossState(DATA_VOLKHAN, IN_PROGRESS); } void AttackStart(Unit* who) OVERRIDE @@ -150,13 +148,13 @@ public: Talk(SAY_DEATH); DespawnGolem(); - if (instance) - instance->SetBossState(DATA_VOLKHAN, DONE); + instance->SetBossState(DATA_VOLKHAN, DONE); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } void DespawnGolem() @@ -286,7 +284,7 @@ public: { ++m_uiHealthAmountModifier; - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); Talk(SAY_FORGE); @@ -411,7 +409,7 @@ public: me->AttackStop(); // me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); //Set in DB // me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //Set in DB - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) me->GetMotionMaster()->MovementExpired(); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index b6a4375d0e..d445dc08ce 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -83,15 +83,13 @@ public: uiStompTimer = urand(20000, 29000); uiShatterTimer = 0; - if (instance) - instance->SetBossState(DATA_KRYSTALLUS, NOT_STARTED); + instance->SetBossState(DATA_KRYSTALLUS, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_KRYSTALLUS, IN_PROGRESS); + instance->SetBossState(DATA_KRYSTALLUS, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -143,8 +141,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_KRYSTALLUS, DONE); + instance->SetBossState(DATA_KRYSTALLUS, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index f4ea3ff556..d2e85438bc 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -77,22 +77,16 @@ public: ShockOfSorrowTimer = 20000+rand()%5000; PillarOfWoeTimer = urand(5000, 15000); - if (instance) - { - instance->SetBossState(DATA_MAIDEN_OF_GRIEF, NOT_STARTED); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); - } + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, NOT_STARTED); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - { - instance->SetBossState(DATA_MAIDEN_OF_GRIEF, IN_PROGRESS); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); - } + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, IN_PROGRESS); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } void UpdateAI(uint32 diff) OVERRIDE @@ -145,8 +139,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_MAIDEN_OF_GRIEF, DONE); + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index ff4a5d1b43..5fff9889fa 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -167,13 +167,10 @@ public: bMarnakActivated = false; bAbedneumActivated = false; - if (instance) - { - instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), false); - instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), false); - instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), false); - instance->HandleGameObject(instance->GetData64(DATA_GO_SKY_FLOOR), false); - } + instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), false); + instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), false); + instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), false); + instance->HandleGameObject(instance->GetData64(DATA_GO_SKY_FLOOR), false); KaddrakGUIDList.clear(); } @@ -324,8 +321,7 @@ public: DespawnDwarf(); - if (instance) - instance->SetBossState(DATA_BRANN_EVENT, NOT_STARTED); + instance->SetBossState(DATA_BRANN_EVENT, NOT_STARTED); } } @@ -362,8 +358,7 @@ public: break; case 17: Talk(SAY_EVENT_INTRO_2); - if (instance) - instance->HandleGameObject(instance->GetData64(DATA_GO_TRIBUNAL_CONSOLE), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_TRIBUNAL_CONSOLE), true); me->SetStandState(UNIT_STAND_STATE_KNEEL); SetEscortPaused(true); JumpToNextStep(8500); @@ -438,12 +433,9 @@ public: switch (uiStep) { case 1: - if (instance) - { - if (instance->GetBossState(DATA_BRANN_EVENT) != NOT_STARTED) - return; - instance->SetBossState(DATA_BRANN_EVENT, IN_PROGRESS); - } + if (instance->GetBossState(DATA_BRANN_EVENT) != NOT_STARTED) + return; + instance->SetBossState(DATA_BRANN_EVENT, IN_PROGRESS); bIsBattle = false; Talk(SAY_ESCORT_START); SetRun(true); @@ -454,25 +446,22 @@ public: JumpToNextStep(0); break; case 5: - if (instance) - if (Creature* temp = (Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM)))) - temp->AI()->Talk(SAY_EVENT_INTRO_3_ABED); - JumpToNextStep(8500); + if (Creature* temp = (Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM)))) + temp->AI()->Talk(SAY_EVENT_INTRO_3_ABED); + JumpToNextStep(8500); break; case 6: Talk(SAY_EVENT_A_1); JumpToNextStep(6500); break; case 7: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) - temp->AI()->Talk(SAY_EVENT_A_2_KADD); - JumpToNextStep(12500); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) + temp->AI()->Talk(SAY_EVENT_A_2_KADD); + JumpToNextStep(12500); break; case 8: Talk(SAY_EVENT_A_3); - if (instance) - instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), true); if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bKaddrakActivated = true; JumpToNextStep(5000); @@ -487,16 +476,14 @@ public: JumpToNextStep(6000); break; case 11: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) - temp->AI()->Talk(SAY_EVENT_B_2_MARN); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) + temp->AI()->Talk(SAY_EVENT_B_2_MARN); SpawnDwarf(1); JumpToNextStep(20000); break; case 12: Talk(SAY_EVENT_B_3); - if (instance) - instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), true); if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bMarnakActivated = true; JumpToNextStep(10000); @@ -519,16 +506,14 @@ public: JumpToNextStep(20000); break; case 17: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_C_2_ABED); - SpawnDwarf(1); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_C_2_ABED); + SpawnDwarf(1); JumpToNextStep(20000); break; case 18: Talk(SAY_EVENT_C_3); - if (instance) - instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), true); if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bAbedneumActivated = true; JumpToNextStep(5000); @@ -547,9 +532,8 @@ public: JumpToNextStep(20000); break; case 22: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_D_2_ABED); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_D_2_ABED); SpawnDwarf(1); JumpToNextStep(5000); break; @@ -571,9 +555,8 @@ public: JumpToNextStep(10000); break; case 27: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_D_4_ABED); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_D_4_ABED); SpawnDwarf(1); JumpToNextStep(10000); break; @@ -581,8 +564,7 @@ public: me->SetReactState(REACT_DEFENSIVE); Talk(SAY_EVENT_END_01); me->SetStandState(UNIT_STAND_STATE_STAND); - if (instance) - instance->HandleGameObject(instance->GetData64(DATA_GO_SKY_FLOOR), true); + instance->HandleGameObject(instance->GetData64(DATA_GO_SKY_FLOOR), true); if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) temp->DealDamage(temp, temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); bIsBattle = true; @@ -591,15 +573,13 @@ public: break; case 29: Talk(SAY_EVENT_END_02); - if (instance) - instance->SetBossState(DATA_BRANN_EVENT, DONE); + instance->SetBossState(DATA_BRANN_EVENT, DONE); me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true); JumpToNextStep(5500); break; case 30: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_END_03_ABED); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_END_03_ABED); JumpToNextStep(8500); break; case 31: @@ -607,29 +587,26 @@ public: JumpToNextStep(11500); break; case 32: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_END_05_ABED); - JumpToNextStep(11500); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_END_05_ABED); + JumpToNextStep(11500); break; case 33: Talk(SAY_EVENT_END_06); JumpToNextStep(4500); break; case 34: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_END_07_ABED); - JumpToNextStep(22500); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_END_07_ABED); + JumpToNextStep(22500); break; case 35: Talk(SAY_EVENT_END_08); JumpToNextStep(7500); break; case 36: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) - temp->AI()->Talk(SAY_EVENT_END_09_KADD); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) + temp->AI()->Talk(SAY_EVENT_END_09_KADD); JumpToNextStep(18500); break; case 37: @@ -637,19 +614,17 @@ public: JumpToNextStep(5500); break; case 38: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) - temp->AI()->Talk(SAY_EVENT_END_11_KADD); - JumpToNextStep(20500); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) + temp->AI()->Talk(SAY_EVENT_END_11_KADD); + JumpToNextStep(20500); break; case 39: Talk(SAY_EVENT_END_12); JumpToNextStep(2500); break; case 40: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) - temp->AI()->Talk(SAY_EVENT_END_13_KADD); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) + temp->AI()->Talk(SAY_EVENT_END_13_KADD); JumpToNextStep(19500); break; case 41: @@ -657,50 +632,43 @@ public: JumpToNextStep(10500); break; case 42: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) - temp->AI()->Talk(SAY_EVENT_END_15_MARN); - JumpToNextStep(6500); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) + temp->AI()->Talk(SAY_EVENT_END_15_MARN); + JumpToNextStep(6500); break; case 43: Talk(SAY_EVENT_END_16); JumpToNextStep(6500); break; case 44: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) - temp->AI()->Talk(SAY_EVENT_END_17_MARN); - JumpToNextStep(25500); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) + temp->AI()->Talk(SAY_EVENT_END_17_MARN); + JumpToNextStep(25500); break; case 45: Talk(SAY_EVENT_END_18); JumpToNextStep(23500); break; case 46: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) - temp->AI()->Talk(SAY_EVENT_END_19_MARN); - JumpToNextStep(3500); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) + temp->AI()->Talk(SAY_EVENT_END_19_MARN); + JumpToNextStep(3500); break; case 47: Talk(SAY_EVENT_END_20); JumpToNextStep(8500); break; case 48: - if (instance) - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_END_21_ABED); - JumpToNextStep(5500); + if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_END_21_ABED); + JumpToNextStep(5500); break; case 49: { - if (instance) - { - instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), false); - instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), false); - instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), false); - instance->HandleGameObject(instance->GetData64(DATA_GO_SKY_FLOOR), false); - } + instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), false); + instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), false); + instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), false); + instance->HandleGameObject(instance->GetData64(DATA_GO_SKY_FLOOR), false); Player* player = GetPlayerForEscort(); if (player) player->GroupEventHappens(QUEST_HALLS_OF_STONE, me); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index 2905a71406..4e1f701a0b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -315,7 +315,7 @@ class npc_auriaya_seeping_trigger : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_auriaya_seeping_triggerAI(creature); + return GetInstanceAI(creature); } }; @@ -390,7 +390,7 @@ class npc_sanctum_sentry : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_sanctum_sentryAI(creature); + return GetInstanceAI(creature); } }; @@ -466,7 +466,7 @@ class npc_feral_defender : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_feral_defenderAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 4bcbe855c2..eed34f0229 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -619,7 +619,7 @@ class boss_flame_leviathan_seat : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_flame_leviathan_seatAI(creature); + return GetInstanceAI(creature); } }; @@ -898,7 +898,7 @@ class npc_colossus : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_colossusAI(creature); + return GetInstanceAI(creature); } }; @@ -1179,7 +1179,7 @@ class npc_lorekeeper : public CreatureScript if (Creature* Branz = creature->FindNearestCreature(NPC_BRANZ_BRONZBEARD, 1000, true)) { Delorah->GetMotionMaster()->MovePoint(0, Branz->GetPositionX()-4, Branz->GetPositionY(), Branz->GetPositionZ()); - /// @todo Delorah->AI()->Talk(xxxx, Branz->GetGUID()); when reached at branz + /// @todo Delorah->AI()->Talk(xxxx, Branz); when reached at branz } } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 549d496f19..19f22947b7 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -433,7 +433,7 @@ class boss_freya : public CreatureScript case EVENT_STRENGTHENED_IRON_ROOTS: Talk(EMOTE_IRON_ROOTS); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_ROOTS_FREYA)) - target->CastSpell(target, SPELL_ROOTS_FREYA, true); // This must be casted by Target self + target->CastSpell(target, SPELL_ROOTS_FREYA, true); // This must be cast by Target self events.ScheduleEvent(EVENT_STRENGTHENED_IRON_ROOTS, urand(12000, 20000)); break; case EVENT_GROUND_TREMOR: @@ -1146,7 +1146,7 @@ class npc_ancient_water_spirit : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ancient_water_spiritAI(creature); + return GetInstanceAI(creature); } }; @@ -1213,7 +1213,7 @@ class npc_storm_lasher : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_storm_lasherAI(creature); + return GetInstanceAI(creature); } }; @@ -1258,7 +1258,7 @@ class npc_snaplasher : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_snaplasherAI(creature); + return GetInstanceAI(creature); } }; @@ -1522,7 +1522,7 @@ class npc_unstable_sun_beam : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_unstable_sun_beamAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index 46776ae9b9..d4ef496dba 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -369,7 +369,7 @@ class boss_saronite_animus : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_saronite_animusAI(creature); + return GetInstanceAI(creature); } }; @@ -439,7 +439,7 @@ class npc_saronite_vapors : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_saronite_vaporsAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 2fb165b935..344fd7d3e8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -235,7 +235,7 @@ class npc_flash_freeze : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_flash_freezeAI(creature); + return GetInstanceAI(creature); } }; @@ -296,7 +296,7 @@ class npc_ice_block : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ice_blockAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 31c635c7de..30b0e41f52 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -300,7 +300,7 @@ class boss_razorscale_controller : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_razorscale_controllerAI(creature); + return GetInstanceAI(creature); } }; @@ -735,7 +735,7 @@ class npc_expedition_commander : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_expedition_commanderAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 12925f1c6e..74fc83653d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -218,9 +218,6 @@ class boss_xt002 : public CreatureScript _phase = 1; _heartExposed = 0; - if (!instance) - return; - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER); } @@ -232,12 +229,9 @@ class boss_xt002 : public CreatureScript events.ScheduleEvent(EVENT_ENRAGE, TIMER_ENRAGE); events.ScheduleEvent(EVENT_GRAVITY_BOMB, TIMER_GRAVITY_BOMB); events.ScheduleEvent(EVENT_SEARING_LIGHT, TIMER_SEARING_LIGHT); - //Tantrum is casted a bit slower the first time. + //Tantrum is cast a bit slower the first time. events.ScheduleEvent(EVENT_TYMPANIC_TANTRUM, urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX) * 2); - if (!instance) - return; - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER); } @@ -477,7 +471,7 @@ class npc_xt002_heart : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_xt002_heartAI(creature); + return GetInstanceAI(creature); } }; @@ -493,7 +487,7 @@ class npc_scrapbot : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_scrapbotAI(creature); + return GetInstanceAI(creature); } struct npc_scrapbotAI : public ScriptedAI @@ -550,7 +544,7 @@ class npc_pummeller : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_pummellerAI(creature); + return GetInstanceAI(creature); } struct npc_pummellerAI : public ScriptedAI @@ -652,7 +646,7 @@ class npc_boombot : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_boombotAI(creature); + return GetInstanceAI(creature); } struct npc_boombotAI : public ScriptedAI diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 575ab57414..96a2a52714 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -108,7 +108,7 @@ enum Spells SPELL_SANITY = 63050, SPELL_INSANE_PERIODIC = 64554, SPELL_INSANE = 63120, - //SPELL_CLEAR_INSANE = 63122, // when it should be casted? + //SPELL_CLEAR_INSANE = 63122, // when should it be cast? SPELL_CONSTRICTOR_TENTACLE = 64132, SPELL_CRUSHER_TENTACLE_SUMMON = 64139, SPELL_CORRUPTOR_TENTACLE_SUMMON = 64143, @@ -799,7 +799,7 @@ class boss_sara : public CreatureScript DoCast(yogg, SPELL_RIDE_YOGG_SARON_VEHICLE); DoCast(me, SPELL_SHADOWY_BARRIER_SARA); _events.SetPhase(PHASE_TWO); - _events.ScheduleEvent(EVENT_DEATH_RAY, 20000, 0, PHASE_TWO); // almost never casted at scheduled time, why? + _events.ScheduleEvent(EVENT_DEATH_RAY, 20000, 0, PHASE_TWO); // almost never cast at scheduled time, why? _events.ScheduleEvent(EVENT_MALADY_OF_THE_MIND, 18000, 0, PHASE_TWO); _events.ScheduleEvent(EVENT_PSYCHOSIS, 1, 0, PHASE_TWO); _events.ScheduleEvent(EVENT_BRAIN_LINK, 23000, 0, PHASE_TWO); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index 126185215e..d21b597eb2 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -212,7 +212,7 @@ class boss_keleseth : public CreatureScript void SummonSkeletons() { - // I could not found any spell casted for this + // I could not found any spell cast for this for (uint8 i = 0; i < 4; ++i) me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp index 5247f9019d..42fa0242df 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp @@ -358,7 +358,7 @@ class boss_dalronn_the_controller : public CreatureScript if (ShadowBolt_Timer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) DoCast(target, SPELL_SHADOW_BOLT); @@ -370,7 +370,7 @@ class boss_dalronn_the_controller : public CreatureScript if (Debilitate_Timer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) DoCast(target, SPELL_DEBILITATE); @@ -384,7 +384,7 @@ class boss_dalronn_the_controller : public CreatureScript { if (Summon_Timer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { DoCast(me, H_SPELL_SUMMON_SKELETONS); Summon_Timer = (rand()%10000) + 20000; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index 77c19422da..e02ceb4866 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -193,9 +193,10 @@ public: //Talk(SAY_DEATH); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } void DoAction(int32 actionId) OVERRIDE @@ -255,7 +256,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ravenous_furbolgAI(creature); + return GetInstanceAI(creature); } struct npc_ravenous_furbolgAI : public ScriptedAI @@ -363,7 +364,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_frenzied_worgenAI(creature); + return GetInstanceAI(creature); } struct npc_frenzied_worgenAI : public ScriptedAI @@ -437,8 +438,7 @@ public: who->SetInCombatWith(me); DoStartMovement(who); } - if (instance) - instance->SetBossState(DATA_GORTOK_PALEHOOF, IN_PROGRESS); + instance->SetBossState(DATA_GORTOK_PALEHOOF, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE @@ -474,7 +474,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ferocious_rhinoAI(creature); + return GetInstanceAI(creature); } struct npc_ferocious_rhinoAI : public ScriptedAI @@ -589,7 +589,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_massive_jormungarAI(creature); + return GetInstanceAI(creature); } struct npc_massive_jormungarAI : public ScriptedAI @@ -690,7 +690,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_palehoof_orbAI(creature); + return GetInstanceAI(creature); } struct npc_palehoof_orbAI : public ScriptedAI diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index 01fcd9a665..aa955f6957 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -133,7 +133,7 @@ enum Spells { // Skadi Spells SPELL_CRUSH = 50234, - SPELL_POISONED_SPEAR = 50225, //isn't being casted =/ + SPELL_POISONED_SPEAR = 50225, //isn't being cast SPELL_WHIRLWIND = 50228, //random target, but not the tank approx. every 20s SPELL_RAPID_FIRE = 56570, SPELL_HARPOON_DAMAGE = 56578, @@ -162,7 +162,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_skadiAI(creature); + return GetInstanceAI(creature); } struct boss_skadiAI : public ScriptedAI @@ -208,11 +208,8 @@ public: me->SetSpeed(MOVE_FLIGHT, 3.0f); if ((Unit::GetCreature(*me, m_uiGraufGUID) == NULL) && !me->IsMounted()) me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f); - if (instance) - { - instance->SetBossState(DATA_SKADI_THE_RUTHLESS, NOT_STARTED); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - } + instance->SetBossState(DATA_SKADI_THE_RUTHLESS, NOT_STARTED); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void JustReachedHome() OVERRIDE @@ -235,15 +232,12 @@ public: m_uiMovementTimer = 1000; m_uiSummonTimer = 10000; me->SetInCombatWithZone(); - if (instance) - { - instance->SetBossState(DATA_SKADI_THE_RUTHLESS, IN_PROGRESS); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - me->GetMotionMaster()->MoveJump(Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 5.0f, 10.0f); - me->SetWalk(false); - m_uiMountTimer = 1000; - Summons.DespawnEntry(NPC_GRAUF); - } + instance->SetBossState(DATA_SKADI_THE_RUTHLESS, IN_PROGRESS); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + me->GetMotionMaster()->MoveJump(Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 5.0f, 10.0f); + me->SetWalk(false); + m_uiMountTimer = 1000; + Summons.DespawnEntry(NPC_GRAUF); } void JustSummoned(Creature* summoned) OVERRIDE @@ -411,13 +405,13 @@ public: { Talk(SAY_DEATH); Summons.DespawnAll(); - if (instance) - instance->SetBossState(DATA_SKADI_THE_RUTHLESS, DONE); + instance->SetBossState(DATA_SKADI_THE_RUTHLESS, DONE); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_KILL); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void SpawnMobs() diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index 1ceddd4bd6..6fc0ffa2d4 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -268,7 +268,7 @@ class npc_tempest_minion : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_tempest_minionAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp index e8e54184cb..7a42983d4e 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp @@ -277,7 +277,7 @@ class npc_frozen_orb_stalker : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_frozen_orb_stalkerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index 80ebc01deb..524ca946e2 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -50,7 +50,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_cyanigosaAI(creature); + return GetInstanceAI(creature); } struct boss_cyanigosaAI : public ScriptedAI @@ -75,16 +75,14 @@ public: uiManaDestructionTimer = 30000; uiTailSweepTimer = 20000; uiUncontrollableEnergyTimer = 25000; - if (instance) - instance->SetData(DATA_CYANIGOSA_EVENT, NOT_STARTED); + instance->SetData(DATA_CYANIGOSA_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_CYANIGOSA_EVENT, IN_PROGRESS); + instance->SetData(DATA_CYANIGOSA_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { } @@ -144,8 +142,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_CYANIGOSA_EVENT, DONE); + instance->SetData(DATA_CYANIGOSA_EVENT, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index 883ea8fa0c..fb6ca01a3d 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -49,7 +49,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_erekemAI(creature); + return GetInstanceAI(creature); } struct boss_erekemAI : public ScriptedAI @@ -74,13 +74,10 @@ public: uiEarthShockTimer = urand(2000, 8000); uiLightningBoltTimer = urand(5000, 10000); uiEarthShieldTimer = 20000; - if (instance) - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); if (Creature* pGuard1 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_1) : 0)) { @@ -126,20 +123,17 @@ public: Talk(SAY_AGGRO); DoCast(me, SPELL_EARTH_SHIELD); - if (instance) - { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_EREKEM_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); - return; - } + if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_EREKEM_CELL))) + if (pDoor->GetGoState() == GO_STATE_READY) + { + EnterEvadeMode(); + return; + } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { } @@ -210,18 +204,15 @@ public: { Talk(SAY_DEATH); - if (instance) + if (instance->GetData(DATA_WAVE_COUNT) == 6) { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } + instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 7); + } + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + { + instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 13); } } @@ -266,7 +257,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_erekem_guardAI(creature); + return GetInstanceAI(creature); } struct npc_erekem_guardAI : public ScriptedAI diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index 4852b6cea0..d6a434669c 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -78,7 +78,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_ichoronAI(creature); + return GetInstanceAI(creature); } struct boss_ichoronAI : public ScriptedAI @@ -110,13 +110,10 @@ public: me->SetVisible(true); DespawnWaterElements(); - if (instance) - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -125,19 +122,16 @@ public: DoCast(me, SPELL_PROTECTIVE_BUBBLE); - if (instance) - { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_ICHORON_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); - return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } + if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_ICHORON_CELL))) + if (pDoor->GetGoState() == GO_STATE_READY) + { + EnterEvadeMode(); + return; + } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void AttackStart(Unit* who) OVERRIDE @@ -289,18 +283,15 @@ public: DespawnWaterElements(); - if (instance) + if (instance->GetData(DATA_WAVE_COUNT) == 6) { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } + instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 7); + } + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + { + instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 13); } } @@ -342,7 +333,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ichor_globuleAI(creature); + return GetInstanceAI(creature); } struct npc_ichor_globuleAI : public ScriptedAI @@ -371,16 +362,13 @@ public: { if (uiRangeCheck_Timer < uiDiff) { - if (instance) + if (Creature* pIchoron = Unit::GetCreature(*me, instance->GetData64(DATA_ICHORON))) { - if (Creature* pIchoron = Unit::GetCreature(*me, instance->GetData64(DATA_ICHORON))) + if (me->IsWithinDist(pIchoron, 2.0f, false)) { - if (me->IsWithinDist(pIchoron, 2.0f, false)) - { - if (pIchoron->AI()) - pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_HIT); - me->DespawnOrUnsummon(); - } + if (pIchoron->AI()) + pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_HIT); + me->DespawnOrUnsummon(); } } uiRangeCheck_Timer = 1000; diff --git a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp index 964f6b75e7..c4985962bd 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp @@ -37,7 +37,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lavanthorAI(creature); + return GetInstanceAI(creature); } struct boss_lavanthorAI : public ScriptedAI @@ -60,19 +60,14 @@ public: uiFlameBreathTimer = 5000; uiLavaBurnTimer = 10000; uiCauterizingFlamesTimer = 3000; - if (instance) - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - { if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_LAVANTHOR_CELL))) if (pDoor->GetGoState() == GO_STATE_READY) { @@ -83,7 +78,6 @@ public: instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } } void AttackStart(Unit* who) OVERRIDE @@ -141,18 +135,15 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) + if (instance->GetData(DATA_WAVE_COUNT) == 6) { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } + instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 7); + } + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + { + instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 13); } } }; diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index d5dd41e7a9..0807fb826f 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -33,7 +33,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_moraggAI(creature); + return GetInstanceAI(creature); } struct boss_moraggAI : public ScriptedAI @@ -53,30 +53,24 @@ public: uiOpticLinkTimer = 10000; uiCorrosiveSalivaTimer = 5000; - if (instance) - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_MORAGG_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); - return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } + if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_MORAGG_CELL))) + if (pDoor->GetGoState() == GO_STATE_READY) + { + EnterEvadeMode(); + return; + } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void AttackStart(Unit* who) OVERRIDE @@ -119,18 +113,15 @@ public: } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) + if (instance->GetData(DATA_WAVE_COUNT) == 6) { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } + instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 7); + } + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + { + instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 13); } } }; diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index 8b39c48fb9..40dcac4169 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -63,7 +63,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_xevozzAI(creature); + return GetInstanceAI(creature); } struct boss_xevozzAI : public ScriptedAI @@ -81,13 +81,10 @@ public: void Reset() OVERRIDE { - if (instance) - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); uiSummonEtherealSphere_Timer = urand(10000, 12000); uiArcaneBarrageVolley_Timer = urand(20000, 22000); @@ -137,19 +134,16 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_XEVOZZ_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); - return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } + if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_XEVOZZ_CELL))) + if (pDoor->GetGoState() == GO_STATE_READY) + { + EnterEvadeMode(); + return; + } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { } @@ -199,18 +193,15 @@ public: DespawnSphere(); - if (instance) + if (instance->GetData(DATA_WAVE_COUNT) == 6) { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - instance->SetData(DATA_WAVE_COUNT, 13); - } + instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 7); + } + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + { + instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetData(DATA_WAVE_COUNT, 13); } } void KilledUnit(Unit* victim) OVERRIDE @@ -231,7 +222,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ethereal_sphereAI(creature); + return GetInstanceAI(creature); } struct npc_ethereal_sphereAI : public ScriptedAI @@ -263,16 +254,13 @@ public: if (uiRangeCheck_Timer < uiDiff) { - if (instance) + if (Creature* pXevozz = Unit::GetCreature(*me, instance->GetData64(DATA_XEVOZZ))) { - if (Creature* pXevozz = Unit::GetCreature(*me, instance->GetData64(DATA_XEVOZZ))) - { - float fDistance = me->GetDistance2d(pXevozz); - if (fDistance <= 3) - DoCast(pXevozz, SPELL_ARCANE_POWER); - else - DoCast(me, 35845); //Is it blizzlike? - } + float fDistance = me->GetDistance2d(pXevozz); + if (fDistance <= 3) + DoCast(pXevozz, SPELL_ARCANE_POWER); + else + DoCast(me, 35845); //Is it blizzlike? } uiRangeCheck_Timer = 1000; } diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index 3db389ac70..420f3d2836 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -58,7 +58,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_zuramatAI(creature); + return GetInstanceAI(creature); } struct boss_zuramatAI : public ScriptedAI @@ -77,13 +77,10 @@ public: void Reset() OVERRIDE { - if (instance) - { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); SpellShroudOfDarknessTimer = 22000; SpellVoidShiftTimer = 15000; @@ -108,19 +105,16 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_ZURAMAT_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); - return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } + if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_ZURAMAT_CELL))) + if (pDoor->GetGoState() == GO_STATE_READY) + { + EnterEvadeMode(); + return; + } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { } @@ -172,18 +166,15 @@ public: { Talk(SAY_DEATH); - if (instance) + if (instance->GetData(DATA_WAVE_COUNT) == 6) { - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); - } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); - } + instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 7); + } + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + { + instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 13); } } diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 4ff0f2d36e..3e16f38001 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -160,7 +160,7 @@ public: bool bActive; bool bWiped; - bool bIsDoorSpellCasted; + bool bIsDoorSpellCast; bool bCrystalActivated; bool defenseless; @@ -210,7 +210,7 @@ public: uiCyanigosaEventTimer = 3*IN_MILLISECONDS; bActive = false; - bIsDoorSpellCasted = false; + bIsDoorSpellCast = false; bCrystalActivated = false; defenseless = true; uiMainEventPhase = NOT_STARTED; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index c78a1ee174..af833f3d4c 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -307,7 +307,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_sinclariAI(creature); + return GetInstanceAI(creature); } struct npc_sinclariAI : public ScriptedAI @@ -401,8 +401,7 @@ public: uiPhase = 5; break; case 5: - if (instance) - instance->SetData(DATA_MAIN_EVENT_PHASE, IN_PROGRESS); + instance->SetData(DATA_MAIN_EVENT_PHASE, IN_PROGRESS); me->SetReactState(REACT_PASSIVE); uiTimer = 0; uiPhase = 0; @@ -428,7 +427,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_saboteurAI(creature); + return GetInstanceAI(creature); } struct npc_azure_saboteurAI : public npc_escortAI @@ -552,7 +551,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_teleportation_portalAI(creature); + return GetInstanceAI(creature); } struct npc_teleportation_portalAI : public ScriptedAI @@ -585,9 +584,6 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!instance) //Massive usage of instance, global check - return; - if (instance->GetData(DATA_REMOVE_NPC) == 1) { me->DespawnOrUnsummon(); @@ -649,7 +645,7 @@ public: uiSpawnTimer = SPAWN_TIME; } else uiSpawnTimer -= diff; - if (bPortalGuardianOrKeeperOrEliteSpawn && !me->IsNonMeleeSpellCasted(false)) + if (bPortalGuardianOrKeeperOrEliteSpawn && !me->IsNonMeleeSpellCast(false)) { me->Kill(me, false); me->RemoveCorpse(); @@ -660,22 +656,19 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_WAVE_COUNT, instance->GetData(DATA_WAVE_COUNT)+1); + instance->SetData(DATA_WAVE_COUNT, instance->GetData(DATA_WAVE_COUNT)+1); } void JustSummoned(Creature* summoned) OVERRIDE { listOfMobs.Summon(summoned); - if (instance) - instance->SetData64(DATA_ADD_TRASH_MOB, summoned->GetGUID()); + instance->SetData64(DATA_ADD_TRASH_MOB, summoned->GetGUID()); } void SummonedCreatureDies(Creature* summoned, Unit* /*killer*/) OVERRIDE { listOfMobs.Despawn(summoned); - if (instance) - instance->SetData64(DATA_DEL_TRASH_MOB, summoned->GetGUID()); + instance->SetData64(DATA_DEL_TRASH_MOB, summoned->GetGUID()); } }; @@ -687,8 +680,7 @@ struct violet_hold_trashAI : public npc_escortAI { instance = creature->GetInstanceScript(); bHasGotMovingPoints = false; - if (instance) - portalLocationID = instance->GetData(DATA_PORTAL_LOCATION); + portalLocationID = instance->GetData(DATA_PORTAL_LOCATION); Reset(); } @@ -788,16 +780,14 @@ struct violet_hold_trashAI : public npc_escortAI void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_NPC_PRESENCE_AT_DOOR_REMOVE, 1); + instance->SetData(DATA_NPC_PRESENCE_AT_DOOR_REMOVE, 1); } void CreatureStartAttackDoor() { me->SetReactState(REACT_PASSIVE); DoCast(SPELL_DESTROY_DOOR_SEAL); - if (instance) - instance->SetData(DATA_NPC_PRESENCE_AT_DOOR_ADD, 1); + instance->SetData(DATA_NPC_PRESENCE_AT_DOOR_ADD, 1); } }; @@ -809,7 +799,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_invaderAI(creature); + return GetInstanceAI(creature); } struct npc_azure_invaderAI : public violet_hold_trashAI @@ -887,7 +877,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_binderAI(creature); + return GetInstanceAI(creature); } struct npc_azure_binderAI : public violet_hold_trashAI @@ -965,7 +955,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_mage_slayerAI(creature); + return GetInstanceAI(creature); } struct npc_azure_mage_slayerAI : public violet_hold_trashAI @@ -1025,7 +1015,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_raiderAI(creature); + return GetInstanceAI(creature); } struct npc_azure_raiderAI : public violet_hold_trashAI @@ -1131,7 +1121,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_stalkerAI(creature); + return GetInstanceAI(creature); } }; @@ -1210,7 +1200,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_spellbreakerAI(creature); + return GetInstanceAI(creature); } }; @@ -1221,7 +1211,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_captainAI(creature); + return GetInstanceAI(creature); } struct npc_azure_captainAI : public violet_hold_trashAI @@ -1273,7 +1263,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_azure_sorcerorAI(creature); + return GetInstanceAI(creature); } struct npc_azure_sorcerorAI : public violet_hold_trashAI diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index ccb18df7f0..420b01d356 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -51,6 +51,9 @@ EndContentData */ enum Sinkhole { + GO_EXPLOSIVES_CART = 188160, + NPC_SCOURGED_BURROWER = 26250, + QUEST_PLUG_THE_SINKHOLES = 11897, SPELL_SET_CART = 46797, SPELL_EXPLODE_CART = 46799, SPELL_SUMMON_CART = 46798, @@ -83,7 +86,7 @@ public: return; Player* player = caster->ToPlayer(); - if (player && player->GetQuestStatus(11897) == QUEST_STATUS_INCOMPLETE) + if (player && player->GetQuestStatus(QUEST_PLUG_THE_SINKHOLES) == QUEST_STATUS_INCOMPLETE) { phase = 1; casterGuid = caster->GetGUID(); @@ -104,13 +107,13 @@ public: case 1: DoCast(me, SPELL_EXPLODE_CART, true); DoCast(me, SPELL_SUMMON_CART, true); - if (GameObject* cart = me->FindNearestGameObject(188160, 3)) + if (GameObject* cart = me->FindNearestGameObject(GO_EXPLOSIVES_CART, 3.0f)) cart->SetUInt32Value(GAMEOBJECT_FACTION, 14); phaseTimer = 3000; phase = 2; break; case 2: - if (GameObject* cart = me->FindNearestGameObject(188160, 3)) + if (GameObject* cart = me->FindNearestGameObject(GO_EXPLOSIVES_CART, 3.0f)) cart->UseDoorOrButton(); DoCast(me, SPELL_EXPLODE_CART, true); phaseTimer = 3000; @@ -123,7 +126,7 @@ public: break; case 5: DoCast(me, SPELL_SUMMON_WORM, true); - if (Unit* worm = me->FindNearestCreature(26250, 3)) + if (Unit* worm = me->FindNearestCreature(NPC_SCOURGED_BURROWER, 3.0f)) { worm->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); worm->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); @@ -133,7 +136,7 @@ public: break; case 6: DoCast(me, SPELL_EXPLODE_CART, true); - if (Unit* worm = me->FindNearestCreature(26250, 3)) + if (Unit* worm = me->FindNearestCreature(NPC_SCOURGED_BURROWER, 3.0f)) { me->Kill(worm); worm->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); @@ -168,6 +171,12 @@ public: ## npc_khunok_the_behemoth ######*/ +enum Khunok +{ + NPC_ORPHANED_MAMMOTH_CALF = 25861, + SPELL_MAMMOTH_CALF_ESCORT_CREDIT = 46231 +}; + class npc_khunok_the_behemoth : public CreatureScript { public: @@ -185,13 +194,13 @@ public: if (who->GetTypeId() != TYPEID_UNIT) return; - if (who->GetEntry() == 25861 && me->IsWithinDistInMap(who, 10.0f)) + if (who->GetEntry() == NPC_ORPHANED_MAMMOTH_CALF && me->IsWithinDistInMap(who, 10.0f)) { if (Unit* owner = who->GetOwner()) { if (owner->GetTypeId() == TYPEID_PLAYER) { - owner->CastSpell(owner, 46231, true); + owner->CastSpell(owner, SPELL_MAMMOTH_CALF_ESCORT_CREDIT, true); who->ToCreature()->DespawnOrUnsummon(); } } @@ -341,11 +350,19 @@ public: ## npc_nerubar_victim ######*/ -#define WARSONG_PEON 25270 +enum Nerubar +{ + NPC_WARSONG_PEON = 25270, + QUEST_TAKEN_BY_THE_SCOURGE = 11611, + SPELL_FREED_WARSONG_MAGE = 45526, + SPELL_FREED_WARSONG_SHAMAN = 45527, + SPELL_FREED_WARSONG_WARRIOR = 45514, + SPELL_FREED_WARSONG_PEON = 45532 +}; const uint32 nerubarVictims[3] = { - 45526, 45527, 45514 + SPELL_FREED_WARSONG_MAGE, SPELL_FREED_WARSONG_SHAMAN, SPELL_FREED_WARSONG_WARRIOR }; class npc_nerubar_victim : public CreatureScript @@ -368,13 +385,13 @@ public: if (!player) return; - if (player->GetQuestStatus(11611) == QUEST_STATUS_INCOMPLETE) + if (player->GetQuestStatus(QUEST_TAKEN_BY_THE_SCOURGE) == QUEST_STATUS_INCOMPLETE) { uint8 uiRand = urand(0, 99); if (uiRand < 25) { - player->CastSpell(me, 45532, true); - player->KilledMonsterCredit(WARSONG_PEON, 0); + player->CastSpell(me, SPELL_FREED_WARSONG_PEON, true); + player->KilledMonsterCredit(NPC_WARSONG_PEON, 0); } else if (uiRand < 75) player->CastSpell(me, nerubarVictims[urand(0, 2)], true); @@ -411,7 +428,10 @@ public: struct npc_jennyAI : public ScriptedAI { - npc_jennyAI(Creature* creature) : ScriptedAI(creature) { } + npc_jennyAI(Creature* creature) : ScriptedAI(creature) + { + setCrateNumber = false; + } bool setCrateNumber; @@ -422,6 +442,9 @@ public: me->SetReactState(REACT_PASSIVE); + if (!me->GetOwner()) + return; + switch (me->GetOwner()->ToPlayer()->GetTeamId()) { case TEAM_ALLIANCE: @@ -1026,9 +1049,9 @@ public: } } - void UpdateAI(uint32 uiDiff) OVERRIDE + void UpdateAI(uint32 diff) OVERRIDE { - npc_escortAI::UpdateAI(uiDiff); + npc_escortAI::UpdateAI(diff); if (arthasInPosition && talbotInPosition) { @@ -1045,7 +1068,7 @@ public: SetEscortPaused(false); } - if (phaseTimer <= uiDiff) + if (phaseTimer <= diff) { Creature* talbot = me->GetCreature(*me, talbotGUID); Creature* arthas = me->GetCreature(*me, arthasGUID); @@ -1196,7 +1219,7 @@ public: phaseTimer = 0; phase = 0; } - } else phaseTimer -= uiDiff; + } else phaseTimer -= diff; if (!UpdateVictim()) return; @@ -1369,7 +1392,7 @@ public: CAST_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->talbotInPosition = true; } - void UpdateAI(uint32 uiDiff) OVERRIDE + void UpdateAI(uint32 diff) OVERRIDE { if (bCheck) { @@ -1385,23 +1408,23 @@ public: if (me->GetAreaId() == 4125) { - if (shadowBoltTimer <= uiDiff) + if (shadowBoltTimer <= diff) { DoCastVictim(SPELL_SHADOW_BOLT); shadowBoltTimer = urand(5000, 12000); - } else shadowBoltTimer -= uiDiff; + } else shadowBoltTimer -= diff; - if (deflectionTimer <= uiDiff) + if (deflectionTimer <= diff) { DoCastVictim(SPELL_DEFLECTION); deflectionTimer = urand(20000, 25000); - } else deflectionTimer -= uiDiff; + } else deflectionTimer -= diff; - if (soulBlastTimer <= uiDiff) + if (soulBlastTimer <= diff) { DoCastVictim(SPELL_SOUL_BLAST); soulBlastTimer = urand(12000, 18000); - } else soulBlastTimer -= uiDiff; + } else soulBlastTimer -= diff; } DoMeleeAttackIfReady(); @@ -1491,11 +1514,11 @@ public: } } - void UpdateAI(uint32 uiDiff) OVERRIDE + void UpdateAI(uint32 diff) OVERRIDE { - ScriptedAI::UpdateAI(uiDiff); + ScriptedAI::UpdateAI(diff); - if (phaseTimer <= uiDiff) + if (phaseTimer <= diff) { switch (phase) { @@ -1551,7 +1574,7 @@ public: phase = 0; break; } - } else phaseTimer -= uiDiff; + } else phaseTimer -= diff; if (!UpdateVictim()) return; @@ -1632,7 +1655,7 @@ public: } } - void UpdateAI(uint32 /*uiDiff*/) OVERRIDE + void UpdateAI(uint32 /*diff*/) OVERRIDE { if (!UpdateVictim()) return; diff --git a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp index 34a217b641..4c45bed1af 100644 --- a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp +++ b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp @@ -56,21 +56,21 @@ public: SetCombatMovement(false); } - uint64 uiTargetGUID; + uint64 targetGUID; void Reset() OVERRIDE { - uiTargetGUID = 0; + targetGUID = 0; } - void UpdateAI(uint32 /*uiDiff*/) OVERRIDE + void UpdateAI(uint32 /*diff*/) OVERRIDE { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; if (me->GetEntry() == NPC_WARMAGE_SARINA) { - if (!uiTargetGUID) + if (!targetGUID) { std::list orbList; GetCreatureListWithEntryInGrid(orbList, me, NPC_TRANSITUS_SHIELD_DUMMY, 32.0f); @@ -82,7 +82,7 @@ public: { if (pOrb->GetPositionY() < 1000) { - uiTargetGUID = pOrb->GetGUID(); + targetGUID = pOrb->GetGUID(); break; } } @@ -91,13 +91,13 @@ public: } }else { - if (!uiTargetGUID) + if (!targetGUID) if (Creature* pOrb = GetClosestCreatureWithEntry(me, NPC_TRANSITUS_SHIELD_DUMMY, 32.0f)) - uiTargetGUID = pOrb->GetGUID(); + targetGUID = pOrb->GetGUID(); } - if (Creature* pOrb = me->GetCreature(*me, uiTargetGUID)) + if (Creature* pOrb = me->GetCreature(*me, targetGUID)) DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM); } diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index 3a0984e4c4..146276e757 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -35,8 +35,8 @@ Script Data End */ enum Spells { - SPELL_TRESPASSER_A = 54028, - SPELL_TRESPASSER_H = 54029, + SPELL_TRESPASSER_A = 54028, + SPELL_TRESPASSER_H = 54029, SPELL_SUNREAVER_DISGUISE_FEMALE = 70973, SPELL_SUNREAVER_DISGUISE_MALE = 70974, @@ -46,8 +46,10 @@ enum Spells enum NPCs // All outdoor guards are within 35.0f of these NPCs { - NPC_APPLEBOUGH_A = 29547, - NPC_SWEETBERRY_H = 29715, + NPC_APPLEBOUGH_A = 29547, + NPC_SWEETBERRY_H = 29715, + NPC_SILVER_COVENANT_GUARDIAN_MAGE = 29254, + NPC_SUNREAVER_GUARDIAN_MAGE = 29255, }; class npc_mageguard_dalaran : public CreatureScript @@ -89,7 +91,7 @@ public: switch (me->GetEntry()) { - case 29254: + case NPC_SILVER_COVENANT_GUARDIAN_MAGE: if (player->GetTeam() == HORDE) // Horde unit found in Alliance area { if (GetClosestCreatureWithEntry(me, NPC_APPLEBOUGH_A, 32.0f)) @@ -101,7 +103,7 @@ public: DoCast(who, SPELL_TRESPASSER_A); // Teleport the Horde unit out } break; - case 29255: + case NPC_SUNREAVER_GUARDIAN_MAGE: if (player->GetTeam() == ALLIANCE) // Alliance unit found in Horde area { if (GetClosestCreatureWithEntry(me, NPC_SWEETBERRY_H, 32.0f)) diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 5f3442c1ba..9673fef0a1 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -517,7 +517,7 @@ enum WyrmDefenderEnum // Spells data SPELL_CHARACTER_SCRIPT = 49213, SPELL_DEFENDER_ON_LOW_HEALTH_EMOTE = 52421, // ID - 52421 Wyrmrest Defender: On Low Health Boss Emote to Controller - Random /self/ - SPELL_RENEW = 49263, // casted to heal drakes + SPELL_RENEW = 49263, // cast to heal drakes SPELL_WYRMREST_DEFENDER_MOUNT = 49256, // Texts data 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 783e7b9f09..9b96255fde 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp @@ -250,7 +250,7 @@ public: if (!Avatar_summoned && HealthBelowPct(25)) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); Talk(SAY_SUMMON); @@ -266,7 +266,7 @@ public: { if (target->GetTypeId() == TYPEID_PLAYER) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); Talk(SAY_ROAR); diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp index 862fe76dec..db69ca6c89 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp @@ -170,7 +170,7 @@ public: if (FrostNova_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); DoCast(me, SPELL_FROSTNOVA); @@ -194,7 +194,7 @@ public: { if (Blink_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); //expire movement, will prevent from running right back to victim after cast @@ -210,7 +210,7 @@ public: if (Beacon_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); if (!urand(0, 3)) @@ -301,7 +301,7 @@ public: if (Apprentice_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); DoCast(me, SPELL_ETHEREAL_APPRENTICE, true); diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp index 9b959a7fdd..e04ef216d9 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp @@ -106,7 +106,7 @@ public: { if (DarkShell_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); Talk(EMOTE_DARK_SHELL); 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 c077cec3c0..6adfdf7c88 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp @@ -115,7 +115,7 @@ public: { Talk(SAY_SUMMON); - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_SUMMON_SYTH_ARCANE, true); //front diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp index 022ac3e9e4..217eb2ea00 100644 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp @@ -167,7 +167,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); //Spell doesn't work, but we use for visual effect at least diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.cpp b/src/server/scripts/Outland/BlackTemple/black_temple.cpp index 57c494756e..0f13a03f56 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/black_temple.cpp @@ -207,7 +207,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_wrathbone_flayerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp index 3a33885144..080960c27c 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp @@ -64,7 +64,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_gurtogg_bloodboilAI(creature); + return GetInstanceAI(creature); } struct boss_gurtogg_bloodboilAI : public ScriptedAI @@ -95,8 +95,7 @@ public: void Reset() OVERRIDE { - if (instance) - instance->SetBossState(DATA_GURTOGG_BLOODBOIL, NOT_STARTED); + instance->SetBossState(DATA_GURTOGG_BLOODBOIL, NOT_STARTED); TargetGUID = 0; @@ -123,8 +122,7 @@ public: { DoZoneInCombat(); Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_GURTOGG_BLOODBOIL, IN_PROGRESS); + instance->SetBossState(DATA_GURTOGG_BLOODBOIL, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -134,8 +132,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_GURTOGG_BLOODBOIL, DONE); + instance->SetBossState(DATA_GURTOGG_BLOODBOIL, DONE); Talk(SAY_DEATH); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index c9ccbb79ad..88a549e124 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -541,9 +541,6 @@ public: { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if (!instance) - return; - instance->SetBossState(DATA_ILLIDAN_STORMRAGE, DONE); for (uint8 i = DATA_GO_ILLIDAN_DOOR_R; i < DATA_GO_ILLIDAN_DOOR_L + 1; ++i) @@ -974,7 +971,7 @@ public: break; } - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; if (Phase == PHASE_NORMAL || Phase == PHASE_NORMAL_2 || (Phase == PHASE_NORMAL_MAIEV && !me->HasAura(SPELL_CAGED))) @@ -1126,7 +1123,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_illidan_stormrageAI(creature); + return GetInstanceAI(creature); } }; @@ -1368,37 +1365,27 @@ public: void Reset() OVERRIDE { WalkCount = 0; - if (instance) + instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED); + + IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE); + GateGUID = instance->GetData64(DATA_GO_ILLIDAN_GATE); + DoorGUID[0] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_R); + DoorGUID[1] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_L); + + if (JustCreated) // close all doors at create { - instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED); + instance->HandleGameObject(GateGUID, false); - IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE); - GateGUID = instance->GetData64(DATA_GO_ILLIDAN_GATE); - DoorGUID[0] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_R); - DoorGUID[1] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_L); - - if (JustCreated) // close all doors at create - { - instance->HandleGameObject(GateGUID, false); - - for (uint8 i = 0; i < 2; ++i) - instance->HandleGameObject(DoorGUID[i], false); - } - else // open all doors, raid wiped - { - instance->HandleGameObject(GateGUID, true); - WalkCount = 1; // skip first wp - - for (uint8 i = 0; i < 2; ++i) - instance->HandleGameObject(DoorGUID[i], true); - } + for (uint8 i = 0; i < 2; ++i) + instance->HandleGameObject(DoorGUID[i], false); } - else + else // open all doors, raid wiped { - IllidanGUID = 0; - GateGUID = 0; - DoorGUID[0] = 0; - DoorGUID[1] = 0; + instance->HandleGameObject(GateGUID, true); + WalkCount = 1; // skip first wp + + for (uint8 i = 0; i < 2; ++i) + instance->HandleGameObject(DoorGUID[i], true); } ChannelGUID = 0; @@ -1461,9 +1448,6 @@ public: void BeginTalk() { - if (!instance) - return; - instance->SetBossState(DATA_ILLIDAN_STORMRAGE, IN_PROGRESS); for (uint8 i = 0; i < 2; ++i) instance->HandleGameObject(DoorGUID[i], false); @@ -1515,8 +1499,6 @@ public: void EnterPhase(PhaseAkama NextPhase) { - if (!instance) - return; switch (NextPhase) { case PHASE_CHANNEL: @@ -1634,8 +1616,7 @@ public: me->InterruptNonMeleeSpells(true); Spirit[0]->InterruptNonMeleeSpells(true); Spirit[1]->InterruptNonMeleeSpells(true); - if (instance) - instance->HandleGameObject(GateGUID, true); + instance->HandleGameObject(GateGUID, true); Timer = 2000; break; case 4: @@ -1664,8 +1645,7 @@ public: { case 6: for (uint8 i = 0; i < 2; ++i) - if (instance) - instance->HandleGameObject(DoorGUID[i], true); + instance->HandleGameObject(DoorGUID[i], true); break; case 8: if (Phase == PHASE_WALK) @@ -1794,14 +1774,13 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_akama_illidanAI(creature); + return GetInstanceAI(creature); } }; void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset() { - if (instance) - instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED); + instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED); if (Creature* akama = ObjectAccessor::GetCreature(*me, AkamaGUID)) { @@ -2160,10 +2139,7 @@ public: void Reset() OVERRIDE { - if (instance) - IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE); - else - IllidanGUID = 0; + IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE); CheckTimer = 5000; DoCast(me, SPELL_SHADOWFIEND_PASSIVE, true); @@ -2228,7 +2204,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_parasitic_shadowfiendAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index aafe5f365b..f33c316d27 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -84,7 +84,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_shahrazAI(creature); + return GetInstanceAI(creature); } struct boss_shahrazAI : public ScriptedAI @@ -113,8 +113,7 @@ public: void Reset() OVERRIDE { - if (instance) - instance->SetBossState(DATA_MOTHER_SHAHRAZ, NOT_STARTED); + instance->SetBossState(DATA_MOTHER_SHAHRAZ, NOT_STARTED); for (uint8 i = 0; i<3; ++i) TargetGUID[i] = 0; @@ -136,8 +135,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_MOTHER_SHAHRAZ, IN_PROGRESS); + instance->SetBossState(DATA_MOTHER_SHAHRAZ, IN_PROGRESS); DoZoneInCombat(); Talk(SAY_AGGRO); @@ -150,8 +148,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_MOTHER_SHAHRAZ, DONE); + instance->SetBossState(DATA_MOTHER_SHAHRAZ, DONE); Talk(SAY_DEATH); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index ad913a4507..da238c3ec4 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -134,7 +134,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_reliquary_of_soulsAI(creature); + return GetInstanceAI(creature); } struct boss_reliquary_of_soulsAI : public ScriptedAI @@ -158,8 +158,7 @@ public: void Reset() OVERRIDE { - if (instance) - instance->SetBossState(DATA_RELIQUARY_OF_SOULS, NOT_STARTED); + instance->SetBossState(DATA_RELIQUARY_OF_SOULS, NOT_STARTED); if (EssenceGUID) { @@ -197,8 +196,7 @@ public: { me->AddThreat(who, 10000.0f); DoZoneInCombat(); - if (instance) - instance->SetBossState(DATA_RELIQUARY_OF_SOULS, IN_PROGRESS); + instance->SetBossState(DATA_RELIQUARY_OF_SOULS, IN_PROGRESS); Phase = 1; Counter = 0; @@ -243,8 +241,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_RELIQUARY_OF_SOULS, DONE); + instance->SetBossState(DATA_RELIQUARY_OF_SOULS, DONE); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index 1a2a55e6d0..be3c5b35ea 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -198,8 +198,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_SHADE_OF_AKAMA, DONE); + instance->SetBossState(DATA_SHADE_OF_AKAMA, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE { } @@ -405,7 +404,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_shade_of_akamaAI(creature); + return GetInstanceAI(creature); } }; @@ -475,16 +474,13 @@ public: switch (eventId) { case EVENT_SHADE_START: - if (instance) - { - instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - me->RemoveAura(SPELL_STEALTH); - me->SetWalk(true); - me->GetMotionMaster()->MovePoint(0, AkamaWP[0].x, AkamaWP[0].y, AkamaWP[0].z, false); - events.ScheduleEvent(EVENT_SHADE_CHANNEL, 10000); - break; - } + instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->RemoveAura(SPELL_STEALTH); + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, AkamaWP[0].x, AkamaWP[0].y, AkamaWP[0].z, false); + events.ScheduleEvent(EVENT_SHADE_CHANNEL, 10000); + break; case EVENT_SHADE_CHANNEL: me->AddUnitState(UNIT_STATE_ROOT); me->SetFacingTo(3.118662f); @@ -550,7 +546,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_akamaAI(creature); + return GetInstanceAI(creature); } }; @@ -622,7 +618,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ashtongue_channelerAI(creature); + return GetInstanceAI(creature); } }; @@ -730,7 +726,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_creature_generator_akamaAI(creature); + return GetInstanceAI(creature); } }; @@ -748,6 +744,7 @@ public: npc_ashtongue_sorcererAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); + startedBanishing = false; } void Reset() OVERRIDE @@ -851,7 +848,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ashtongue_sorcererAI(creature); + return GetInstanceAI(creature); } }; @@ -941,7 +938,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ashtongue_defenderAI(creature); + return GetInstanceAI(creature); } }; @@ -1021,7 +1018,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ashtongue_rogueAI(creature); + return GetInstanceAI(creature); } }; @@ -1101,7 +1098,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ashtongue_elementalistAI(creature); + return GetInstanceAI(creature); } }; @@ -1198,7 +1195,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ashtongue_spiritbinderAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index b62e7b35a3..7c9d88e8db 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -90,7 +90,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_supremusAI(creature); + return GetInstanceAI(creature); } struct boss_supremusAI : public ScriptedAI @@ -107,11 +107,8 @@ public: void Reset() OVERRIDE { - if (instance) - { - if (me->IsAlive()) - instance->SetBossState(DATA_SUPREMUS, NOT_STARTED); - } + if (me->IsAlive()) + instance->SetBossState(DATA_SUPREMUS, NOT_STARTED); phase = 0; @@ -121,8 +118,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_SUPREMUS, IN_PROGRESS); + instance->SetBossState(DATA_SUPREMUS, IN_PROGRESS); ChangePhase(); events.ScheduleEvent(EVENT_BERSERK, 900000, GCD_CAST); @@ -158,8 +154,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_SUPREMUS, DONE); + instance->SetBossState(DATA_SUPREMUS, DONE); summons.DespawnAll(); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index 7d445e2305..acdc6819ef 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -217,7 +217,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_teron_gorefiendAI(creature); + return GetInstanceAI(creature); } struct boss_teron_gorefiendAI : public ScriptedAI @@ -246,8 +246,7 @@ public: void Reset() OVERRIDE { - if (instance) - instance->SetBossState(DATA_TERON_GOREFIEND, NOT_STARTED); + instance->SetBossState(DATA_TERON_GOREFIEND, NOT_STARTED); IncinerateTimer = urand(20000, 31000); SummonDoomBlossomTimer = 12000; @@ -275,8 +274,7 @@ public: { if (me->IsWithinDistInMap(who, VISIBLE_RANGE) && me->IsWithinLOSInMap(who)) { - if (instance) - instance->SetBossState(DATA_TERON_GOREFIEND, IN_PROGRESS); + instance->SetBossState(DATA_TERON_GOREFIEND, IN_PROGRESS); me->GetMotionMaster()->Clear(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -297,8 +295,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_TERON_GOREFIEND, DONE); + instance->SetBossState(DATA_TERON_GOREFIEND, DONE); Talk(SAY_DEATH); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index 1f4a36afad..882c334cb6 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -78,7 +78,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_najentusAI(creature); + return GetInstanceAI(creature); } struct boss_najentusAI : public ScriptedAI @@ -99,8 +99,7 @@ public: SpineTargetGUID = 0; - if (instance) - instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, NOT_STARTED); + instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, NOT_STARTED); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -111,8 +110,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, DONE); + instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, DONE); Talk(SAY_DEATH); } @@ -129,8 +127,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, IN_PROGRESS); + instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, IN_PROGRESS); Talk(SAY_AGGRO); DoZoneInCombat(); diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index 057bb725c3..bb77e10d72 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -218,7 +218,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_illidari_councilAI(creature); + return GetInstanceAI(creature); } struct npc_illidari_councilAI : public ScriptedAI @@ -263,12 +263,9 @@ public: pMember->AI()->EnterEvadeMode(); } - if (instance) - { - instance->SetBossState(DATA_ILLIDARI_COUNCIL, NOT_STARTED); - if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))) - VoiceTrigger->AI()->EnterEvadeMode(); - } + instance->SetBossState(DATA_ILLIDARI_COUNCIL, NOT_STARTED); + if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))) + VoiceTrigger->AI()->EnterEvadeMode(); EventBegun = false; @@ -284,9 +281,6 @@ public: void StartEvent(Unit* target) { - if (!instance) - return; - if (target && target->IsAlive()) { Council[0] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER); @@ -328,13 +322,10 @@ public: { if (DeathCount > 3) { - if (instance) - { - if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))) - VoiceTrigger->DealDamage(VoiceTrigger, VoiceTrigger->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - instance->SetBossState(DATA_ILLIDARI_COUNCIL, DONE); - //me->SummonCreature(AKAMAID, 746.466980f, 304.394989f, 311.90208f, 6.272870f, TEMPSUMMON_DEAD_DESPAWN, 0); - } + if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))) + VoiceTrigger->DealDamage(VoiceTrigger, VoiceTrigger->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + instance->SetBossState(DATA_ILLIDARI_COUNCIL, DONE); + //me->SummonCreature(AKAMAID, 746.466980f, 304.394989f, 311.90208f, 6.272870f, TEMPSUMMON_DEAD_DESPAWN, 0); me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return; } @@ -401,17 +392,8 @@ struct boss_illidari_councilAI : public ScriptedAI void EnterCombat(Unit* who) OVERRIDE { - if (instance) - { - if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ILLIDARI_COUNCIL))) - CAST_AI(npc_illidari_council::npc_illidari_councilAI, controller->AI())->StartEvent(who); - } - else - { - TC_LOG_ERROR("scripts", ERROR_INST_DATA); - EnterEvadeMode(); - return; - } + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ILLIDARI_COUNCIL))) + CAST_AI(npc_illidari_council::npc_illidari_councilAI, controller->AI())->StartEvent(who); DoZoneInCombat(); // Load GUIDs on first aggro because the Creature guids are only set as the creatures are created in world- // this means that for each creature, it will attempt to LoadGUIDs even though some of the other creatures are @@ -454,12 +436,6 @@ struct boss_illidari_councilAI : public ScriptedAI void LoadGUIDs() { - if (!instance) - { - TC_LOG_ERROR("scripts", ERROR_INST_DATA); - return; - } - Council[0] = instance->GetData64(DATA_LADY_MALANDE); Council[1] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR); Council[2] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER); @@ -476,7 +452,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_gathios_the_shattererAI(creature); + return GetInstanceAI(creature); } struct boss_gathios_the_shattererAI : public boss_illidari_councilAI @@ -608,7 +584,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_high_nethermancer_zerevorAI(creature); + return GetInstanceAI(creature); } struct boss_high_nethermancer_zerevorAI : public boss_illidari_councilAI @@ -712,7 +688,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lady_malandeAI(creature); + return GetInstanceAI(creature); } struct boss_lady_malandeAI : public boss_illidari_councilAI @@ -790,7 +766,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_veras_darkshadowAI(creature); + return GetInstanceAI(creature); } struct boss_veras_darkshadowAI : public boss_illidari_councilAI diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp index 6ccf69ae39..1552c4ffe4 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -104,7 +104,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_fathomlord_karathressAI(creature); + return GetInstanceAI(creature); } struct boss_fathomlord_karathressAI : public ScriptedAI @@ -135,27 +135,24 @@ public: BlessingOfTides = false; - if (instance) - { - uint64 RAdvisors[MAX_ADVISORS]; - RAdvisors[0] = instance->GetData64(DATA_SHARKKIS); - RAdvisors[1] = instance->GetData64(DATA_TIDALVESS); - RAdvisors[2] = instance->GetData64(DATA_CARIBDIS); - //Respawn of the 3 Advisors - Creature* pAdvisor = NULL; - for (int i=0; iGetData64(DATA_SHARKKIS); + RAdvisors[1] = instance->GetData64(DATA_TIDALVESS); + RAdvisors[2] = instance->GetData64(DATA_CARIBDIS); + //Respawn of the 3 Advisors + Creature* pAdvisor = NULL; + for (int i=0; iIsAlive()) { - pAdvisor = (Unit::GetCreature((*me), RAdvisors[i])); - if (pAdvisor && !pAdvisor->IsAlive()) - { - pAdvisor->Respawn(); - pAdvisor->AI()->EnterEvadeMode(); - pAdvisor->GetMotionMaster()->MoveTargetedHome(); - } + pAdvisor->Respawn(); + pAdvisor->AI()->EnterEvadeMode(); + pAdvisor->GetMotionMaster()->MoveTargetedHome(); } - instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); - } + } + instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); } @@ -179,9 +176,6 @@ public: void GetAdvisors() { - if (!instance) - return; - Advisors[0] = instance->GetData64(DATA_SHARKKIS); Advisors[1] = instance->GetData64(DATA_TIDALVESS); Advisors[2] = instance->GetData64(DATA_CARIBDIS); @@ -189,9 +183,6 @@ public: void StartEvent(Unit* who) { - if (!instance) - return; - GetAdvisors(); Talk(SAY_AGGRO); @@ -210,8 +201,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_FATHOMLORDKARATHRESSEVENT, DONE); + instance->SetData(DATA_FATHOMLORDKARATHRESSEVENT, DONE); //support for quest 10944 me->SummonCreature(SEER_OLUM, OLUM_X, OLUM_Y, OLUM_Z, OLUM_O, TEMPSUMMON_TIMED_DESPAWN, 3600000); @@ -312,7 +302,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_fathomguard_sharkkisAI(creature); + return GetInstanceAI(creature); } struct boss_fathomguard_sharkkisAI : public ScriptedAI @@ -320,6 +310,7 @@ public: boss_fathomguard_sharkkisAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); + SummonedPet = 0; } InstanceScript* instance; @@ -350,26 +341,19 @@ public: SummonedPet = 0; - if (instance) - instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); + instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - if (Creature* Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)))) - CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath(); - } + if (Creature* Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)))) + CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath(); } void EnterCombat(Unit* who) OVERRIDE { - if (instance) - { - instance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID()); - instance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS); - } + instance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID()); + instance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -459,7 +443,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_fathomguard_tidalvessAI(creature); + return GetInstanceAI(creature); } struct boss_fathomguard_tidalvessAI : public ScriptedAI @@ -483,26 +467,19 @@ public: PoisonCleansing_Timer = 30000; Earthbind_Timer = 45000; - if (instance) - instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); + instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS))) - CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath(); - } + if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS))) + CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath(); } void EnterCombat(Unit* who) OVERRIDE { - if (instance) - { - instance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID()); - instance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS); - } + instance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID()); + instance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS); DoCast(me, SPELL_WINDFURY_WEAPON); } @@ -582,7 +559,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_fathomguard_caribdisAI(creature); + return GetInstanceAI(creature); } struct boss_fathomguard_caribdisAI : public ScriptedAI @@ -606,26 +583,19 @@ public: Heal_Timer = 55000; Cyclone_Timer = 30000+rand()%10000; - if (instance) - instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); + instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS))) - CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath(); - } + if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS))) + CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath(); } void EnterCombat(Unit* who) OVERRIDE { - if (instance) - { - instance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID()); - instance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS); - } + instance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID()); + instance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -705,24 +675,21 @@ public: Unit* selectAdvisorUnit() { Unit* unit = NULL; - if (instance) + switch (rand()%4) { - switch (rand()%4) - { - case 0: - unit = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESS)); - break; - case 1: - unit = Unit::GetUnit(*me, instance->GetData64(DATA_SHARKKIS)); - break; - case 2: - unit = Unit::GetUnit(*me, instance->GetData64(DATA_TIDALVESS)); - break; - case 3: - unit = me; - break; - } - } else unit = me; + case 0: + unit = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESS)); + break; + case 1: + unit = Unit::GetUnit(*me, instance->GetData64(DATA_SHARKKIS)); + break; + case 2: + unit = Unit::GetUnit(*me, instance->GetData64(DATA_TIDALVESS)); + break; + case 3: + unit = me; + break; + } return unit; } }; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp index d6205cb3ec..e3b9006527 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp @@ -86,7 +86,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_hydross_the_unstableAI(creature); + return GetInstanceAI(creature); } struct boss_hydross_the_unstableAI : public ScriptedAI @@ -134,8 +134,7 @@ public: me->SetDisplayId(MODEL_CLEAN); - if (instance) - instance->SetData(DATA_HYDROSSTHEUNSTABLEEVENT, NOT_STARTED); + instance->SetData(DATA_HYDROSSTHEUNSTABLEEVENT, NOT_STARTED); beam = false; Summons.DespawnAll(); } @@ -174,8 +173,7 @@ public: { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_HYDROSSTHEUNSTABLEEVENT, IN_PROGRESS); + instance->SetData(DATA_HYDROSSTHEUNSTABLEEVENT, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -208,8 +206,7 @@ public: { Talk(CorruptedForm ? SAY_CORRUPT_DEATH : SAY_CLEAN_DEATH); - if (instance) - instance->SetData(DATA_HYDROSSTHEUNSTABLEEVENT, DONE); + instance->SetData(DATA_HYDROSSTHEUNSTABLEEVENT, DONE); Summons.DespawnAll(); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index 1d233aa6da..f13c64235c 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -140,7 +140,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lady_vashjAI(creature); + return GetInstanceAI(creature); } struct boss_lady_vashjAI : public ScriptedAI @@ -215,8 +215,7 @@ public: } } - if (instance) - instance->SetData(DATA_LADYVASHJEVENT, NOT_STARTED); + instance->SetData(DATA_LADYVASHJEVENT, NOT_STARTED); me->SetCorpseDelay(1000*60*60); } @@ -237,8 +236,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_LADYVASHJEVENT, DONE); + instance->SetData(DATA_LADYVASHJEVENT, DONE); } void StartEvent() @@ -247,21 +245,17 @@ public: Phase = 1; - if (instance) - instance->SetData(DATA_LADYVASHJEVENT, IN_PROGRESS); + instance->SetData(DATA_LADYVASHJEVENT, IN_PROGRESS); } void EnterCombat(Unit* who) OVERRIDE { - if (instance) - { - // remove old tainted cores to prevent cheating in phase 2 - Map* map = me->GetMap(); - Map::PlayerList const &PlayerList = map->GetPlayers(); - for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr) - if (Player* player = itr->GetSource()) - player->DestroyItemCount(31088, 1, true); - } + // remove old tainted cores to prevent cheating in phase 2 + Map* map = me->GetMap(); + Map::PlayerList const &PlayerList = map->GetPlayers(); + for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr) + if (Player* player = itr->GetSource()) + player->DestroyItemCount(31088, 1, true); StartEvent(); // this is EnterCombat(), so were are 100% in combat, start the event if (Phase != 2) @@ -556,7 +550,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_enchanted_elementalAI(creature); + return GetInstanceAI(creature); } struct npc_enchanted_elementalAI : public ScriptedAI @@ -580,8 +574,6 @@ public: Move = 0; Phase = 1; - VashjGUID = 0; - X = ElementWPPos[0][0]; Y = ElementWPPos[0][1]; Z = ElementWPPos[0][2]; @@ -597,8 +589,7 @@ public: } } - if (instance) - VashjGUID = instance->GetData64(DATA_LADYVASHJ); + VashjGUID = instance->GetData64(DATA_LADYVASHJ); } void EnterCombat(Unit* /*who*/) OVERRIDE { } @@ -608,9 +599,6 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!instance) - return; - if (!VashjGUID) return; @@ -651,7 +639,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_tainted_elementalAI(creature); + return GetInstanceAI(creature); } struct npc_tainted_elementalAI : public ScriptedAI @@ -674,9 +662,8 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - if (Creature* vashj = Unit::GetCreature((*me), instance->GetData64(DATA_LADYVASHJ))) - CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->EventTaintedElementalDeath(); + if (Creature* vashj = Unit::GetCreature((*me), instance->GetData64(DATA_LADYVASHJ))) + CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->EventTaintedElementalDeath(); } void EnterCombat(Unit* who) OVERRIDE @@ -720,7 +707,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_toxic_sporebatAI(creature); + return GetInstanceAI(creature); } struct npc_toxic_sporebatAI : public ScriptedAI @@ -790,17 +777,14 @@ public: // CheckTimer if (CheckTimer <= diff) { - if (instance) + // check if vashj is death + Unit* Vashj = Unit::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); + if (!Vashj || !Vashj->IsAlive() || CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->ToCreature()->AI())->Phase != 3) { - // check if vashj is death - Unit* Vashj = Unit::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); - if (!Vashj || !Vashj->IsAlive() || CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->ToCreature()->AI())->Phase != 3) - { - // remove - me->setDeathState(DEAD); - me->RemoveCorpse(); - me->setFaction(35); - } + // remove + me->setDeathState(DEAD); + me->RemoveCorpse(); + me->setFaction(35); } CheckTimer = 1000; @@ -819,7 +803,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_shield_generator_channelAI(creature); + return GetInstanceAI(creature); } struct npc_shield_generator_channelAI : public ScriptedAI @@ -831,12 +815,12 @@ public: InstanceScript* instance; uint32 CheckTimer; - bool Casted; + bool Cast; void Reset() OVERRIDE { CheckTimer = 0; - Casted = false; + Cast = false; me->SetDisplayId(11686); // invisible me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -847,9 +831,6 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!instance) - return; - if (CheckTimer <= diff) { Unit* vashj = Unit::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); @@ -857,10 +838,10 @@ public: if (vashj && vashj->IsAlive()) { // start visual channel - if (!Casted || !vashj->HasAura(SPELL_MAGIC_BARRIER)) + if (!Cast || !vashj->HasAura(SPELL_MAGIC_BARRIER)) { DoCast(vashj, SPELL_MAGIC_BARRIER, true); - Casted = true; + Cast = true; } } CheckTimer = 1000; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index 83ec5e053c..069b4a4593 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -181,7 +181,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_leotheras_the_blindAI(creature); + return GetInstanceAI(creature); } struct boss_leotheras_the_blindAI : public ScriptedAI @@ -242,8 +242,7 @@ public: me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0); DoCast(me, SPELL_DUAL_WIELD, true); me->SetCorpseDelay(1000*60*60); - if (instance) - instance->SetData(DATA_LEOTHERASTHEBLINDEVENT, NOT_STARTED); + instance->SetData(DATA_LEOTHERASTHEBLINDEVENT, NOT_STARTED); } void CheckChannelers(/*bool DoEvade = true*/) @@ -290,8 +289,7 @@ public: void StartEvent() { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_LEOTHERASTHEBLINDEVENT, IN_PROGRESS); + instance->SetData(DATA_LEOTHERASTHEBLINDEVENT, IN_PROGRESS); } void CheckBanish() @@ -402,8 +400,7 @@ public: if (Creature* pDemon = Unit::GetCreature(*me, Demon)) pDemon->DespawnOrUnsummon(); } - if (instance) - instance->SetData(DATA_LEOTHERASTHEBLINDEVENT, DONE); + instance->SetData(DATA_LEOTHERASTHEBLINDEVENT, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -677,7 +674,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_greyheart_spellbinderAI(creature); + return GetInstanceAI(creature); } struct npc_greyheart_spellbinderAI : public ScriptedAI @@ -703,20 +700,16 @@ public: Mindblast_Timer = urand(3000, 8000); Earthshock_Timer = urand(5000, 10000); - if (instance) - { - instance->SetData64(DATA_LEOTHERAS_EVENT_STARTER, 0); - Creature* leotheras = Unit::GetCreature(*me, leotherasGUID); - if (leotheras && leotheras->IsAlive()) - CAST_AI(boss_leotheras_the_blind::boss_leotheras_the_blindAI, leotheras->AI())->CheckChannelers(/*false*/); - } + instance->SetData64(DATA_LEOTHERAS_EVENT_STARTER, 0); + Creature* leotheras = Unit::GetCreature(*me, leotherasGUID); + if (leotheras && leotheras->IsAlive()) + CAST_AI(boss_leotheras_the_blind::boss_leotheras_the_blindAI, leotheras->AI())->CheckChannelers(/*false*/); } void EnterCombat(Unit* who) OVERRIDE { me->InterruptNonMeleeSpells(false); - if (instance) - instance->SetData64(DATA_LEOTHERAS_EVENT_STARTER, who->GetGUID()); + instance->SetData64(DATA_LEOTHERAS_EVENT_STARTER, who->GetGUID()); } void JustRespawned() OVERRIDE @@ -740,18 +733,15 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (instance) - { - if (!leotherasGUID) - leotherasGUID = instance->GetData64(DATA_LEOTHERAS); + if (!leotherasGUID) + leotherasGUID = instance->GetData64(DATA_LEOTHERAS); - if (!me->IsInCombat() && instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)) - { - Unit* victim = NULL; - victim = Unit::GetUnit(*me, instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)); - if (victim) - AttackStart(victim); - } + if (!me->IsInCombat() && instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)) + { + Unit* victim = NULL; + victim = Unit::GetUnit(*me, instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)); + if (victim) + AttackStart(victim); } if (!UpdateVictim()) diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp index c4a55065f2..8ea9337537 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -81,7 +81,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_the_lurker_belowAI(creature); + return GetInstanceAI(creature); } struct boss_the_lurker_belowAI : public ScriptedAI @@ -138,11 +138,8 @@ public: Summons.DespawnAll(); - if (instance) - { - instance->SetData(DATA_THELURKERBELOWEVENT, NOT_STARTED); - instance->SetData(DATA_STRANGE_POOL, NOT_STARTED); - } + instance->SetData(DATA_THELURKERBELOWEVENT, NOT_STARTED); + instance->SetData(DATA_STRANGE_POOL, NOT_STARTED); DoCast(me, SPELL_SUBMERGE); // submerge anim me->SetVisible(false); // we start invis under water, submerged me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -151,19 +148,15 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - instance->SetData(DATA_THELURKERBELOWEVENT, DONE); - instance->SetData(DATA_STRANGE_POOL, IN_PROGRESS); - } + instance->SetData(DATA_THELURKERBELOWEVENT, DONE); + instance->SetData(DATA_STRANGE_POOL, IN_PROGRESS); Summons.DespawnAll(); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS); + instance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* who) OVERRIDE diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp index 48a4a1e5ec..1a0b06d25d 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp @@ -91,7 +91,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_morogrim_tidewalkerAI(creature); + return GetInstanceAI(creature); } struct boss_morogrim_tidewalkerAI : public ScriptedAI @@ -130,16 +130,14 @@ public: Earthquake = false; Phase2 = false; - if (instance) - instance->SetData(DATA_MOROGRIMTIDEWALKEREVENT, NOT_STARTED); + instance->SetData(DATA_MOROGRIMTIDEWALKEREVENT, NOT_STARTED); } void StartEvent() { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_MOROGRIMTIDEWALKEREVENT, IN_PROGRESS); + instance->SetData(DATA_MOROGRIMTIDEWALKEREVENT, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -151,8 +149,7 @@ public: { Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_MOROGRIMTIDEWALKEREVENT, DONE); + instance->SetData(DATA_MOROGRIMTIDEWALKEREVENT, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE 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 d6162fd1ea..0dd83a1adf 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp @@ -41,7 +41,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_thespiaAI(creature); + return GetInstanceAI(creature); } struct boss_thespiaAI : public ScriptedAI @@ -63,16 +63,14 @@ public: LungBurst_Timer = 7000; EnvelopingWinds_Timer = 9000; - if (instance) - instance->SetBossState(DATA_HYDROMANCER_THESPIA, NOT_STARTED); + instance->SetBossState(DATA_HYDROMANCER_THESPIA, NOT_STARTED); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEAD); - if (instance) - instance->SetBossState(DATA_HYDROMANCER_THESPIA, DONE); + instance->SetBossState(DATA_HYDROMANCER_THESPIA, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -84,8 +82,7 @@ public: { Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_HYDROMANCER_THESPIA, IN_PROGRESS); + instance->SetBossState(DATA_HYDROMANCER_THESPIA, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE 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 241d0f8fec..2cc3d45ccf 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp @@ -57,7 +57,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_mekgineer_steamriggerAI(creature); + return GetInstanceAI(creature); } struct boss_mekgineer_steamriggerAI : public ScriptedAI @@ -86,16 +86,14 @@ public: Summon50 = false; Summon25 = false; - if (instance) - instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, NOT_STARTED); + instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, NOT_STARTED); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, DONE); + instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -107,8 +105,7 @@ public: { Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, IN_PROGRESS); + instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, IN_PROGRESS); } //no known summon spells exist @@ -197,7 +194,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_steamrigger_mechanicAI(creature); + return GetInstanceAI(creature); } struct npc_steamrigger_mechanicAI : public ScriptedAI diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp index 887d51a43b..1b496c086b 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp @@ -50,7 +50,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_naga_distillerAI(creature); + return GetInstanceAI(creature); } struct npc_naga_distillerAI : public ScriptedAI @@ -68,13 +68,10 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //hack, due to really weird spell behaviour :( - if (instance) + if (instance->GetData(DATA_DISTILLER) == IN_PROGRESS) { - if (instance->GetData(DATA_DISTILLER) == IN_PROGRESS) - { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } } @@ -87,15 +84,13 @@ public: DoCast(me, SPELL_WARLORDS_RAGE_NAGA, true); - if (instance) - instance->SetData(DATA_DISTILLER, IN_PROGRESS); + instance->SetData(DATA_DISTILLER, IN_PROGRESS); } void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE { if (me->GetHealth() <= damage) - if (instance) - instance->SetData(DATA_DISTILLER, DONE); + instance->SetData(DATA_DISTILLER, DONE); } }; @@ -108,7 +103,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_warlord_kalithreshAI(creature); + return GetInstanceAI(creature); } struct boss_warlord_kalithreshAI : public ScriptedAI @@ -132,16 +127,14 @@ public: Rage_Timer = 45000; CanRage = false; - if (instance) - instance->SetBossState(DATA_WARLORD_KALITHRESH, NOT_STARTED); + instance->SetBossState(DATA_WARLORD_KALITHRESH, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetBossState(DATA_WARLORD_KALITHRESH, IN_PROGRESS); + instance->SetBossState(DATA_WARLORD_KALITHRESH, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -153,17 +146,15 @@ public: { //hack :( if (spell->Id == SPELL_WARLORDS_RAGE_PROC) - if (instance) - if (instance->GetData(DATA_DISTILLER) == DONE) - me->RemoveAurasDueToSpell(SPELL_WARLORDS_RAGE_PROC); + if (instance->GetData(DATA_DISTILLER) == DONE) + me->RemoveAurasDueToSpell(SPELL_WARLORDS_RAGE_PROC); } void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - instance->SetBossState(DATA_WARLORD_KALITHRESH, DONE); + instance->SetBossState(DATA_WARLORD_KALITHRESH, DONE); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index be4cac80ad..0788fdb379 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -122,12 +122,9 @@ class boss_broggok : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - instance->HandleGameObject(instance->GetData64(DATA_DOOR4), true); - instance->HandleGameObject(instance->GetData64(DATA_DOOR5), true); - instance->SetData(TYPE_BROGGOK_EVENT, DONE); - } + instance->HandleGameObject(instance->GetData64(DATA_DOOR4), true); + instance->HandleGameObject(instance->GetData64(DATA_DOOR5), true); + instance->SetData(TYPE_BROGGOK_EVENT, DONE); } void DoAction(int32 action) OVERRIDE @@ -154,7 +151,7 @@ class boss_broggok : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_broggokAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index f6bceb78a1..f4bc5a99a0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -108,18 +108,16 @@ class boss_kelidan_the_breaker : public CreatureScript SummonChannelers(); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); - if (instance) - instance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, NOT_STARTED); + instance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, NOT_STARTED); } void EnterCombat(Unit* who) OVERRIDE { Talk(SAY_WAKE); - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); DoStartMovement(who); - if (instance) - instance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, IN_PROGRESS); + instance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -193,9 +191,6 @@ class boss_kelidan_the_breaker : public CreatureScript { Talk(SAY_DIE); - if (!instance) - return; - instance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, DONE); instance->HandleGameObject(instance->GetData64(DATA_DOOR1), true); instance->HandleGameObject(instance->GetData64(DATA_DOOR6), true); @@ -207,7 +202,7 @@ class boss_kelidan_the_breaker : public CreatureScript { if (check_Timer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) DoCast(me, SPELL_EVOCATION); check_Timer = 5000; } @@ -248,7 +243,7 @@ class boss_kelidan_the_breaker : public CreatureScript if (BurningNova_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); Talk(SAY_NOVA); @@ -275,7 +270,7 @@ class boss_kelidan_the_breaker : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kelidan_the_breakerAI(creature); + return GetInstanceAI(creature); } }; @@ -311,7 +306,7 @@ class npc_shadowmoon_channeler : public CreatureScript ShadowBolt_Timer = 1000+rand()%1000; MarkOfShadow_Timer = 5000+rand()%2000; check_Timer = 0; - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); } @@ -319,7 +314,7 @@ class npc_shadowmoon_channeler : public CreatureScript { if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerEngaged(who); - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); DoStartMovement(who); } @@ -336,7 +331,7 @@ class npc_shadowmoon_channeler : public CreatureScript { if (check_Timer <= diff) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) { uint64 channeler = CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me); @@ -373,7 +368,7 @@ class npc_shadowmoon_channeler : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_shadowmoon_channelerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp index 33e23c12d1..fb5cfa272a 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp @@ -72,9 +72,6 @@ class boss_the_maker : public CreatureScript Domination_Timer = 120000; Knockdown_Timer = 10000; - if (!instance) - return; - instance->SetData(TYPE_THE_MAKER_EVENT, NOT_STARTED); instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true); } @@ -83,9 +80,6 @@ class boss_the_maker : public CreatureScript { Talk(SAY_AGGRO); - if (!instance) - return; - instance->SetData(TYPE_THE_MAKER_EVENT, IN_PROGRESS); instance->HandleGameObject(instance->GetData64(DATA_DOOR2), false); } @@ -99,9 +93,6 @@ class boss_the_maker : public CreatureScript { Talk(SAY_DIE); - if (!instance) - return; - instance->SetData(TYPE_THE_MAKER_EVENT, DONE); instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true); instance->HandleGameObject(instance->GetData64(DATA_DOOR3), true); @@ -156,7 +147,7 @@ class boss_the_maker : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_the_makerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp index 7e80182f1e..6f8eac88c6 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp @@ -224,7 +224,7 @@ class boss_omor_the_unscarred : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_omor_the_unscarredAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index f4ee716dc6..f52ae3a894 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -71,7 +71,7 @@ enum Spells SPELL_SHADOW_CAGE = 30168, SPELL_SHADOW_GRASP = 30410, SPELL_SHADOW_GRASP_VISUAL = 30166, - SPELL_MIND_EXHAUSTION = 44032, //Casted by the cubes when channeling ends + SPELL_MIND_EXHAUSTION = 44032, //Cast by the cubes when channeling ends SPELL_SHADOW_CAGE_C = 30205, SPELL_SHADOW_GRASP_C = 30207, SPELL_SHADOW_BOLT_VOLLEY = 30510, @@ -249,11 +249,8 @@ class boss_magtheridon : public CreatureScript void JustReachedHome() OVERRIDE { - if (instance) - { - instance->SetData(DATA_MAGTHERIDON_EVENT, NOT_STARTED); - instance->SetData(DATA_COLLAPSE, false); - } + instance->SetData(DATA_MAGTHERIDON_EVENT, NOT_STARTED); + instance->SetData(DATA_COLLAPSE, false); } void SetClicker(uint64 cubeGUID, uint64 clickerGUID) @@ -314,8 +311,7 @@ class boss_magtheridon : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_MAGTHERIDON_EVENT, DONE); + instance->SetData(DATA_MAGTHERIDON_EVENT, DONE); Talk(SAY_DEATH); } @@ -331,8 +327,7 @@ class boss_magtheridon : public CreatureScript void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetData(DATA_MAGTHERIDON_EVENT, IN_PROGRESS); + instance->SetData(DATA_MAGTHERIDON_EVENT, IN_PROGRESS); DoZoneInCombat(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -392,7 +387,7 @@ class boss_magtheridon : public CreatureScript if (Quake_Timer <= diff) { // to avoid blastnova interruption - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { DoCast(me, SPELL_QUAKE_TRIGGER, true); Quake_Timer = 50000; @@ -421,7 +416,7 @@ class boss_magtheridon : public CreatureScript Blaze_Timer -= diff; if (!Phase3 && HealthBelowPct(30) - && !me->IsNonMeleeSpellCasted(false) // blast nova + && !me->IsNonMeleeSpellCast(false) // blast nova && !me->HasUnitState(UNIT_STATE_STUNNED)) // shadow cage and earthquake { Phase3 = true; @@ -429,8 +424,7 @@ class boss_magtheridon : public CreatureScript DoCast(me, SPELL_CAMERA_SHAKE, true); DoCast(me, SPELL_DEBRIS_KNOCKDOWN, true); - if (instance) - instance->SetData(DATA_COLLAPSE, true); + instance->SetData(DATA_COLLAPSE, true); } if (Phase3) @@ -457,7 +451,7 @@ class boss_magtheridon : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_magtheridonAI(creature); + return GetInstanceAI(creature); } }; @@ -498,8 +492,7 @@ class npc_hellfire_channeler : public CreatureScript void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetData(DATA_CHANNELER_EVENT, IN_PROGRESS); + instance->SetData(DATA_CHANNELER_EVENT, IN_PROGRESS); me->InterruptNonMeleeSpells(false); DoZoneInCombat(); @@ -507,8 +500,7 @@ class npc_hellfire_channeler : public CreatureScript void JustReachedHome() OVERRIDE { - if (instance) - instance->SetData(DATA_CHANNELER_EVENT, NOT_STARTED); + instance->SetData(DATA_CHANNELER_EVENT, NOT_STARTED); DoCast(me, SPELL_SHADOW_GRASP_C, false); } @@ -526,8 +518,7 @@ class npc_hellfire_channeler : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_CHANNELER_EVENT, DONE); + instance->SetData(DATA_CHANNELER_EVENT, DONE); } void UpdateAI(uint32 diff) OVERRIDE @@ -576,7 +567,7 @@ class npc_hellfire_channeler : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_hellfire_channelerAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp index 981774a677..404680a909 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp @@ -109,8 +109,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript { Talk(SAY_DIE); - if (instance) - instance->SetBossState(DATA_NETHEKURSE, DONE); + instance->SetBossState(DATA_NETHEKURSE, DONE); } void SetData(uint32 data, uint32 value) OVERRIDE @@ -184,8 +183,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript IntroOnce = true; IsIntroEvent = true; - if (instance) - instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); + instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); } if (IsIntroEvent || !IsMainEvent) @@ -219,9 +217,6 @@ class boss_grand_warlock_nethekurse : public CreatureScript { if (IsIntroEvent) { - if (!instance) - return; - if (instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS) { if (IntroEvent_Timer <= diff) @@ -297,7 +292,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_grand_warlock_nethekurseAI(creature); + return GetInstanceAI(creature); } }; @@ -328,22 +323,18 @@ class npc_fel_orc_convert : public CreatureScript { events.ScheduleEvent(EVENT_HEMORRHAGE, 3000); - if (instance) - if (Creature* Kurse = Unit::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))) - if (Kurse && me->IsWithinDist(Kurse, 45.0f)) - Kurse->AI()->SetData(SETDATA_DATA, SETDATA_PEON_AGGRO); + if (Creature* Kurse = Unit::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))) + if (me->IsWithinDist(Kurse, 45.0f)) + Kurse->AI()->SetData(SETDATA_DATA, SETDATA_PEON_AGGRO); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - if (instance->GetBossState(DATA_NETHEKURSE) != IN_PROGRESS) - return; + if (instance->GetBossState(DATA_NETHEKURSE) != IN_PROGRESS) + return; - if (Creature* Kurse = Unit::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))) - Kurse->AI()->SetData(SETDATA_DATA, SETDATA_PEON_DEATH); - } + if (Creature* Kurse = Unit::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))) + Kurse->AI()->SetData(SETDATA_DATA, SETDATA_PEON_DEATH); } void UpdateAI(uint32 diff) OVERRIDE @@ -369,7 +360,7 @@ class npc_fel_orc_convert : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_fel_orc_convertAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp index 9c4be7c0b1..e647947c13 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp @@ -167,8 +167,7 @@ class boss_warbringer_omrogg : public CreatureScript ThunderClap_Timer = 15000; ResetThreat_Timer = 30000; - if (instance) - instance->SetData(DATA_OMROGG, NOT_STARTED); //End boss can use this later. O'mrogg must be defeated(DONE) or he will come to aid. + instance->SetData(DATA_OMROGG, NOT_STARTED); //End boss can use this later. O'mrogg must be defeated(DONE) or he will come to aid. } void DoYellForThreat() @@ -204,8 +203,7 @@ class boss_warbringer_omrogg : public CreatureScript AggroYell = true; } - if (instance) - instance->SetBossState(DATA_OMROGG, IN_PROGRESS); + instance->SetBossState(DATA_OMROGG, IN_PROGRESS); } void JustSummoned(Creature* summoned) OVERRIDE @@ -259,8 +257,7 @@ class boss_warbringer_omrogg : public CreatureScript RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL); - if (instance) - instance->SetBossState(DATA_OMROGG, DONE); + instance->SetBossState(DATA_OMROGG, DONE); } void UpdateAI(uint32 diff) OVERRIDE @@ -388,7 +385,7 @@ class boss_warbringer_omrogg : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_warbringer_omroggAI(creature); + return GetInstanceAI(creature); } }; @@ -438,7 +435,7 @@ class npc_omrogg_heads : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_omrogg_headsAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp index f9ec3edb36..553c1cbdb3 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp @@ -90,8 +90,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript Talk(SAY_DEATH); removeAdds(); - if (instance) - instance->SetBossState(DATA_KARGATH, DONE); + instance->SetBossState(DATA_KARGATH, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -311,7 +310,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_warchief_kargath_bladefistAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index 5d78935986..ef01fd3a2e 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -109,8 +109,7 @@ class boss_alar : public CreatureScript void Reset() OVERRIDE { - if (instance) - instance->SetData(DATA_ALAREVENT, NOT_STARTED); + instance->SetData(DATA_ALAREVENT, NOT_STARTED); Berserk_Timer = 1200000; Platforms_Move_Timer = 0; @@ -136,8 +135,7 @@ class boss_alar : public CreatureScript void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - instance->SetData(DATA_ALAREVENT, IN_PROGRESS); + instance->SetData(DATA_ALAREVENT, IN_PROGRESS); me->SetDisableGravity(true); // after enterevademode will be set walk movement DoZoneInCombat(); @@ -146,8 +144,7 @@ class boss_alar : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - instance->SetData(DATA_ALAREVENT, DONE); + instance->SetData(DATA_ALAREVENT, DONE); } void JustSummoned(Creature* summon) OVERRIDE @@ -426,7 +423,7 @@ class boss_alar : public CreatureScript void DoMeleeAttackIfReady() { - if (me->isAttackReady() && !me->IsNonMeleeSpellCasted(false)) + if (me->isAttackReady() && !me->IsNonMeleeSpellCast(false)) { if (me->IsWithinMeleeRange(me->GetVictim())) { @@ -451,7 +448,7 @@ class boss_alar : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_alarAI(creature); + return GetInstanceAI(creature); } }; @@ -528,7 +525,7 @@ class npc_ember_of_alar : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ember_of_alarAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp index c5c3f6deb1..241438d611 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp @@ -146,8 +146,7 @@ class boss_high_astromancer_solarian : public CreatureScript Wrath_Timer = 20000+rand()%5000;//twice in phase one Phase = 1; - if (instance) - instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED); + instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED); me->SetArmor(defaultarmor); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -168,8 +167,7 @@ class boss_high_astromancer_solarian : public CreatureScript me->SetObjectScale(defaultsize); me->SetDisplayId(MODEL_HUMAN); Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, DONE); + instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -177,8 +175,7 @@ class boss_high_astromancer_solarian : public CreatureScript Talk(SAY_AGGRO); DoZoneInCombat(); - if (instance) - instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, IN_PROGRESS); + instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, IN_PROGRESS); } void SummonMinion(uint32 entry, float x, float y, float z) @@ -419,7 +416,7 @@ class boss_high_astromancer_solarian : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_high_astromancer_solarianAI(creature); + return GetInstanceAI(creature); } }; @@ -467,8 +464,7 @@ class npc_solarium_priest : public CreatureScript switch (urand(0, 1)) { case 0: - if (instance) - target = Unit::GetUnit(*me, instance->GetData64(DATA_ASTROMANCER)); + target = Unit::GetUnit(*me, instance->GetData64(DATA_ASTROMANCER)); break; case 1: target = me; @@ -506,7 +502,7 @@ class npc_solarium_priest : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_solarium_priestAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index e85c8781dd..11b4ad1398 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -308,7 +308,7 @@ class boss_kaelthas : public CreatureScript uint32 Phase; uint32 PhaseSubphase; //generic uint32 Phase_Timer; //generic timer - uint32 PyrosCasted; + uint32 PyrosCast; bool InGravityLapse; bool IsCastingFireball; @@ -330,7 +330,7 @@ class boss_kaelthas : public CreatureScript GravityLapse_Phase = 0; NetherBeam_Timer = 8000; NetherVapor_Timer = 10000; - PyrosCasted = 0; + PyrosCast = 0; Phase = 0; InGravityLapse = false; IsCastingFireball = false; @@ -344,8 +344,7 @@ class boss_kaelthas : public CreatureScript me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (instance) - instance->SetData(DATA_KAELTHASEVENT, 0); + instance->SetData(DATA_KAELTHASEVENT, 0); } void PrepareAdvisors() @@ -364,9 +363,6 @@ class boss_kaelthas : public CreatureScript void StartEvent() { - if (!instance) - return; - m_auiAdvisorGuid[0] = instance->GetData64(DATA_THALADREDTHEDARKENER); m_auiAdvisorGuid[1] = instance->GetData64(DATA_LORDSANGUINAR); m_auiAdvisorGuid[2] = instance->GetData64(DATA_GRANDASTROMANCERCAPERNIAN); @@ -468,8 +464,7 @@ class boss_kaelthas : public CreatureScript summons.DespawnAll(); - if (instance) - instance->SetData(DATA_KAELTHASEVENT, 0); + instance->SetData(DATA_KAELTHASEVENT, 0); for (uint8 i = 0; i < MAX_ADVISORS; ++i) { @@ -633,8 +628,7 @@ class boss_kaelthas : public CreatureScript if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) { Phase = 2; - if (instance) - instance->SetData(DATA_KAELTHASEVENT, 2); + instance->SetData(DATA_KAELTHASEVENT, 2); Talk(SAY_PHASE2_WEAPON); @@ -678,8 +672,7 @@ class boss_kaelthas : public CreatureScript if (Phase_Timer <= diff) { Talk(SAY_PHASE3_ADVANCE); - if (instance) - instance->SetData(DATA_KAELTHASEVENT, 3); + instance->SetData(DATA_KAELTHASEVENT, 3); Phase = 3; PhaseSubphase = 0; } @@ -716,8 +709,7 @@ class boss_kaelthas : public CreatureScript Talk(SAY_PHASE4_INTRO2); Phase = 4; - if (instance) - instance->SetData(DATA_KAELTHASEVENT, 4); + instance->SetData(DATA_KAELTHASEVENT, 4); // Sometimes people can collect Aggro in Phase 1-3. Reset threat before releasing Kael. DoResetThreat(); @@ -750,7 +742,7 @@ class boss_kaelthas : public CreatureScript { if (!IsCastingFireball) { - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { //interruptable me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); @@ -821,8 +813,7 @@ class boss_kaelthas : public CreatureScript { if (HealthBelowPct(50)) { - if (instance) - instance->SetData(DATA_KAELTHASEVENT, 4); + instance->SetData(DATA_KAELTHASEVENT, 4); Phase = 5; Phase_Timer = 10000; @@ -844,19 +835,19 @@ class boss_kaelthas : public CreatureScript { DoCast(me, SPELL_SHOCK_BARRIER); ChainPyros = true; - PyrosCasted = 0; + PyrosCast = 0; ShockBarrier_Timer = 60000; } else ShockBarrier_Timer -= diff; //Chain Pyros (3 of them max) - if (ChainPyros && !me->IsNonMeleeSpellCasted(false)) + if (ChainPyros && !me->IsNonMeleeSpellCast(false)) { - if (PyrosCasted < 3) + if (PyrosCast < 3) { DoCastVictim(SPELL_PYROBLAST); - ++PyrosCasted; + ++PyrosCast; } else { @@ -1011,7 +1002,7 @@ class boss_kaelthas : public CreatureScript }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_kaelthasAI(creature); + return GetInstanceAI(creature); } }; @@ -1109,7 +1100,7 @@ class boss_thaladred_the_darkener : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_thaladred_the_darkenerAI(creature); + return GetInstanceAI(creature); } }; @@ -1177,7 +1168,7 @@ class boss_lord_sanguinar : public CreatureScript }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_lord_sanguinarAI(creature); + return GetInstanceAI(creature); } }; //Grand Astromancer Capernian AI @@ -1321,7 +1312,7 @@ class boss_grand_astromancer_capernian : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_grand_astromancer_capernianAI(creature); + return GetInstanceAI(creature); } }; @@ -1404,7 +1395,7 @@ class boss_master_engineer_telonicus : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_master_engineer_telonicusAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index f842ed19f3..db6bd772a8 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -91,16 +91,14 @@ class boss_void_reaver : public CreatureScript Talk(SAY_DEATH); DoZoneInCombat(); - if (instance) - instance->SetData(DATA_VOIDREAVEREVENT, DONE); + instance->SetData(DATA_VOIDREAVEREVENT, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_VOIDREAVEREVENT, IN_PROGRESS); + instance->SetData(DATA_VOIDREAVEREVENT, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -172,7 +170,7 @@ class boss_void_reaver : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_void_reaverAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp index b5172245b4..37a6886cda 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp @@ -182,14 +182,11 @@ class npc_ragin_flames : public CreatureScript //Check_Timer if (Check_Timer <= diff) { - if (instance) + if (instance->GetData(DATA_NETHERMANCER_SEPRETHREA) != IN_PROGRESS) { - if (instance->GetData(DATA_NETHERMANCER_SEPRETHREA) != IN_PROGRESS) - { - //remove - me->setDeathState(JUST_DIED); - me->RemoveCorpse(); - } + //remove + me->setDeathState(JUST_DIED); + me->RemoveCorpse(); } Check_Timer = 1000; } else Check_Timer -= diff; @@ -223,7 +220,7 @@ class npc_ragin_flames : public CreatureScript }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_ragin_flamesAI(creature); + return GetInstanceAI(creature); } }; diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index ff3145c5c7..741b1378e4 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -116,11 +116,10 @@ class npc_millhouse_manastorm : public CreatureScript } } - void EnterCombat(Unit* /*who*/) OVERRIDE { } - - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_KILL); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void JustDied(Unit* /*killer*/) OVERRIDE @@ -191,7 +190,7 @@ class npc_millhouse_manastorm : public CreatureScript if (Pyroblast_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; Talk(SAY_PYRO); diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h index 1ebfad4dfe..c3b7d754a0 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h @@ -32,11 +32,11 @@ enum DataTypes // Additional Data DATA_CONVERSATION = 4, - DATA_WARDEN_1 = 5, // used by EventAI - DATA_WARDEN_2 = 6, // used by EventAI - DATA_WARDEN_3 = 7, // used by EventAI - DATA_WARDEN_4 = 8, // used by EventAI - DATA_WARDEN_5 = 9, // used by EventAI + DATA_WARDEN_1 = 5, // used by SmartAI + DATA_WARDEN_2 = 6, // used by SmartAI + DATA_WARDEN_3 = 7, // used by SmartAI + DATA_WARDEN_4 = 8, // used by SmartAI + DATA_WARDEN_5 = 9, // used by SmartAI DATA_MELLICHAR = 10, DATA_WARDENS_SHIELD = 11 }; 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 48d955acbc..d590093de5 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -137,7 +137,7 @@ class boss_harbinger_skyriss : public CreatureScript void DoSplit(uint32 val) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); Talk(SAY_IMAGE); @@ -211,7 +211,7 @@ class boss_harbinger_skyriss : public CreatureScript if (Fear_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; Talk(SAY_FEAR); @@ -228,7 +228,7 @@ class boss_harbinger_skyriss : public CreatureScript if (Domination_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; Talk(SAY_MIND); @@ -247,7 +247,7 @@ class boss_harbinger_skyriss : public CreatureScript { if (ManaBurn_Timer <= diff) { - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) return; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp index 1b362fe8a5..fe072b437e 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp @@ -126,7 +126,7 @@ class boss_high_botanist_freywinn : public CreatureScript { Talk(SAY_TREE); - if (me->IsNonMeleeSpellCasted(false)) + if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index dcb9f71615..39a97bd4d8 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Blades_Edge_Mountains SD%Complete: 90 -SDComment: Quest support: 10503, 10504, 10556, 10594, 10609, 10682, 10821, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete) +SDComment: Quest support: 10503, 10504, 10556, 10594, 10609, 10821. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete) SDCategory: Blade's Edge Mountains EndScriptData */ @@ -28,8 +28,6 @@ npc_bloodmaul_brutebane npc_bloodmaul_brute npc_nether_drake npc_daranelle -npc_overseer_nuaar -npc_saikkal_the_elder go_legion_obelisk go_thunderspike EndContentData */ @@ -134,8 +132,9 @@ public: void JustDied(Unit* killer) OVERRIDE { - if (killer->ToPlayer()->GetQuestRewardStatus(QUEST_INTO_THE_SOULGRINDER)) - Talk(SAY_DEATH); + if (killer->GetTypeId() == TYPEID_PLAYER) + if (killer->ToPlayer()->GetQuestRewardStatus(QUEST_INTO_THE_SOULGRINDER)) + Talk(SAY_DEATH); } void MoveInLineOfSight(Unit* who) OVERRIDE @@ -401,8 +400,9 @@ public: enum Daranelle { - SAY_SPELL_INFLUENCE = 0, - SPELL_LASHHAN_CHANNEL = 36904 + SAY_SPELL_INFLUENCE = 0, + SPELL_LASHHAN_CHANNEL = 36904, + SPELL_DISPELLING_ANALYSIS = 37028 }; class npc_daranelle : public CreatureScript @@ -427,7 +427,7 @@ public: { Talk(SAY_SPELL_INFLUENCE, who); /// @todo Move the below to updateAI and run if this statement == true - DoCast(who, 37028, true); + DoCast(who, SPELL_DISPELLING_ANALYSIS, true); } } @@ -441,79 +441,6 @@ public: } }; -/*###### -## npc_overseer_nuaar -######*/ - -#define GOSSIP_HELLO_ON "Overseer, I am here to negotiate on behalf of the Cenarion Expedition." - -class npc_overseer_nuaar : public CreatureScript -{ -public: - npc_overseer_nuaar() : CreatureScript("npc_overseer_nuaar") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - player->SEND_GOSSIP_MENU(10533, creature->GetGUID()); - player->AreaExploredOrEventHappens(10682); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (player->GetQuestStatus(10682) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(10532, creature->GetGUID()); - - return true; - } -}; - -/*###### -## npc_saikkal_the_elder -######*/ - -#define GOSSIP_HELLO_STE "Yes... yes, it's me." -#define GOSSIP_SELECT_STE "Yes elder. Tell me more of the book." - -class npc_saikkal_the_elder : public CreatureScript -{ -public: - npc_saikkal_the_elder() : CreatureScript("npc_saikkal_the_elder") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_STE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(10795, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); - player->SEND_GOSSIP_MENU(10796, creature->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (player->GetQuestStatus(10980) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_STE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(10794, creature->GetGUID()); - - return true; - } -}; - //Support for quest: You're Fired! (10821) bool obelisk_one, obelisk_two, obelisk_three, obelisk_four, obelisk_five; @@ -955,7 +882,7 @@ class npc_simon_bunny : public CreatureScript /* Called when AI is playing the sequence for player. We cast the visual spell and then remove the - casted color from the casting sequence. + cast color from the casting sequence. */ void PlayNextColor() { @@ -1198,7 +1125,10 @@ public: struct npc_oscillating_frequency_scanner_master_bunnyAI : public ScriptedAI { - npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) { } + npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) + { + playerGuid = 0; + } void Reset() OVERRIDE { @@ -1279,8 +1209,6 @@ void AddSC_blades_edge_mountains() new npc_bloodmaul_brute(); new npc_nether_drake(); new npc_daranelle(); - new npc_overseer_nuaar(); - new npc_saikkal_the_elder(); new go_legion_obelisk(); new go_thunderspike(); new npc_simon_bunny(); diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp index 672cf51bdb..5e70b7f9fc 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -19,18 +19,15 @@ /* ScriptData SDName: Hellfire_Peninsula SD%Complete: 100 -SDComment: Quest support: 9375, 9410, 9418, 10129, 10146, 10162, 10163, 10340, 10346, 10347, 10382 (Special flight paths) +SDComment: Quest support: 9375, 9410, 9418, 10129, 10146, 10162, 10163, 10340, 10346, 10347, 10382 (Special flight paths) "Needs update" SDCategory: Hellfire Peninsula EndScriptData */ /* ContentData npc_aeranas npc_ancestral_wolf -go_haaleshi_altar -npc_naladu -npc_tracy_proudwell -npc_trollbane npc_wounded_blood_elf +npc_fel_guard_hound EndContentData */ #include "ScriptMgr.h" @@ -46,14 +43,12 @@ EndContentData */ enum Aeranas { - SAY_SUMMON = 0, - SAY_FREE = 1, - - FACTION_HOSTILE = 16, - FACTION_FRIENDLY = 35, - - SPELL_ENVELOPING_WINDS = 15535, - SPELL_SHOCK = 12553 + SAY_SUMMON = 0, + SAY_FREE = 1, + FACTION_HOSTILE = 16, + FACTION_FRIENDLY = 35, + SPELL_ENVELOPING_WINDS = 15535, + SPELL_SHOCK = 12553 }; class npc_aeranas : public CreatureScript @@ -61,24 +56,15 @@ class npc_aeranas : public CreatureScript public: npc_aeranas() : CreatureScript("npc_aeranas") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_aeranasAI(creature); - } - struct npc_aeranasAI : public ScriptedAI { npc_aeranasAI(Creature* creature) : ScriptedAI(creature) { } - uint32 Faction_Timer; - uint32 EnvelopingWinds_Timer; - uint32 Shock_Timer; - void Reset() OVERRIDE { - Faction_Timer = 8000; - EnvelopingWinds_Timer = 9000; - Shock_Timer = 5000; + faction_Timer = 8000; + envelopingWinds_Timer = 9000; + shock_Timer = 5000; me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); me->setFaction(FACTION_FRIENDLY); @@ -88,13 +74,13 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (Faction_Timer) + if (faction_Timer) { - if (Faction_Timer <= diff) + if (faction_Timer <= diff) { me->setFaction(FACTION_HOSTILE); - Faction_Timer = 0; - } else Faction_Timer -= diff; + faction_Timer = 0; + } else faction_Timer -= diff; } if (!UpdateVictim()) @@ -111,21 +97,31 @@ public: return; } - if (Shock_Timer <= diff) + if (shock_Timer <= diff) { DoCastVictim(SPELL_SHOCK); - Shock_Timer = 10000; - } else Shock_Timer -= diff; + shock_Timer = 10000; + } else shock_Timer -= diff; - if (EnvelopingWinds_Timer <= diff) + if (envelopingWinds_Timer <= diff) { DoCastVictim(SPELL_ENVELOPING_WINDS); - EnvelopingWinds_Timer = 25000; - } else EnvelopingWinds_Timer -= diff; + envelopingWinds_Timer = 25000; + } else envelopingWinds_Timer -= diff; DoMeleeAttackIfReady(); } + + private: + uint32 faction_Timer; + uint32 envelopingWinds_Timer; + uint32 shock_Timer; }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_aeranasAI(creature); + } }; /*###### @@ -134,13 +130,11 @@ public: enum AncestralWolf { - EMOTE_WOLF_LIFT_HEAD = 0, - EMOTE_WOLF_HOWL = 1, - SAY_WOLF_WELCOME = 2, - - SPELL_ANCESTRAL_WOLF_BUFF = 29981, - - NPC_RYGA = 17123 + EMOTE_WOLF_LIFT_HEAD = 0, + EMOTE_WOLF_HOWL = 1, + SAY_WOLF_WELCOME = 2, + SPELL_ANCESTRAL_WOLF_BUFF = 29981, + NPC_RYGA = 17123 }; class npc_ancestral_wolf : public CreatureScript @@ -148,11 +142,6 @@ class npc_ancestral_wolf : public CreatureScript public: npc_ancestral_wolf() : CreatureScript("npc_ancestral_wolf") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_ancestral_wolfAI(creature); - } - struct npc_ancestral_wolfAI : public npc_escortAI { npc_ancestral_wolfAI(Creature* creature) : npc_escortAI(creature) @@ -166,20 +155,18 @@ public: Reset(); } - Creature* pRyga; - void Reset() OVERRIDE { - pRyga = NULL; + ryga = NULL; DoCast(me, SPELL_ANCESTRAL_WOLF_BUFF, true); } void MoveInLineOfSight(Unit* who) OVERRIDE { - if (!pRyga && who->GetEntry() == NPC_RYGA && me->IsWithinDistInMap(who, 15.0f)) + if (!ryga && who->GetEntry() == NPC_RYGA && me->IsWithinDistInMap(who, 15.0f)) if (Creature* temp = who->ToCreature()) - pRyga = temp; + ryga = temp; npc_escortAI::MoveInLineOfSight(who); } @@ -195,154 +182,19 @@ public: Talk(EMOTE_WOLF_HOWL); break; case 50: - if (pRyga && pRyga->IsAlive() && !pRyga->IsInCombat()) - pRyga->AI()->Talk(SAY_WOLF_WELCOME); + if (ryga && ryga->IsAlive() && !ryga->IsInCombat()) + ryga->AI()->Talk(SAY_WOLF_WELCOME); break; } } + + private: + Creature* ryga; }; -}; -/*###### -## npc_naladu -######*/ - -#define GOSSIP_NALADU_ITEM1 "Why don't you escape?" - -enum Naladu -{ - GOSSIP_TEXTID_NALADU1 = 9788 -}; - -class npc_naladu : public CreatureScript -{ -public: - npc_naladu() : CreatureScript("npc_naladu") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF+1) - player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_NALADU1, creature->GetGUID()); - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_NALADU_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } -}; - -/*###### -## npc_tracy_proudwell -######*/ - -#define GOSSIP_TEXT_REDEEM_MARKS "I have marks to redeem!" -#define GOSSIP_TRACY_PROUDWELL_ITEM1 "I heard that your dog Fei Fei took Klatu's prayer beads..." -#define GOSSIP_TRACY_PROUDWELL_ITEM2 "" - -enum Tracy -{ - GOSSIP_TEXTID_TRACY_PROUDWELL1 = 10689, - QUEST_DIGGING_FOR_PRAYER_BEADS = 10916 -}; - -class npc_tracy_proudwell : public CreatureScript -{ -public: - npc_tracy_proudwell() : CreatureScript("npc_tracy_proudwell") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TRACY_PROUDWELL_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_TRACY_PROUDWELL1, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - break; - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsVendor()) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_REDEEM_MARKS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - if (player->GetQuestStatus(QUEST_DIGGING_FOR_PRAYER_BEADS) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TRACY_PROUDWELL_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } -}; - -/*###### -## npc_trollbane -######*/ - -#define GOSSIP_TROLLBANE_ITEM1 "Tell me of the Sons of Lothar." -#define GOSSIP_TROLLBANE_ITEM2 "" -#define GOSSIP_TROLLBANE_ITEM3 "Tell me of your homeland." - -enum Trollbane -{ - GOSSIP_TEXTID_TROLLBANE1 = 9932, - GOSSIP_TEXTID_TROLLBANE2 = 9933, - GOSSIP_TEXTID_TROLLBANE3 = 8772 -}; - -class npc_trollbane : public CreatureScript -{ -public: - npc_trollbane() : CreatureScript("npc_trollbane") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TROLLBANE_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_TROLLBANE1, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_TROLLBANE2, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_TROLLBANE3, creature->GetGUID()); - break; - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TROLLBANE_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TROLLBANE_ITEM3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; + return new npc_ancestral_wolfAI(creature); } }; @@ -358,8 +210,10 @@ enum WoundedBloodElf SAY_ELF_SUMMON2 = 3, SAY_ELF_COMPLETE = 4, SAY_ELF_AGGRO = 5, - - QUEST_ROAD_TO_FALCON_WATCH = 9375 + QUEST_ROAD_TO_FALCON_WATCH = 9375, + NPC_HAALESHI_WINDWALKER = 16966, + NPC_HAALESHI_TALONGUARD = 16967, + FACTION_FALCON_WATCH_QUEST = 775 }; class npc_wounded_blood_elf : public CreatureScript @@ -367,29 +221,32 @@ class npc_wounded_blood_elf : public CreatureScript public: npc_wounded_blood_elf() : CreatureScript("npc_wounded_blood_elf") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE - { - if (quest->GetQuestId() == QUEST_ROAD_TO_FALCON_WATCH) - { - if (npc_escortAI* pEscortAI = CAST_AI(npc_wounded_blood_elf::npc_wounded_blood_elfAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); - - // Change faction so mobs attack - creature->setFaction(775); - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_wounded_blood_elfAI(creature); - } - struct npc_wounded_blood_elfAI : public npc_escortAI { npc_wounded_blood_elfAI(Creature* creature) : npc_escortAI(creature) { } + void Reset() OVERRIDE { } + + void EnterCombat(Unit* /*who*/) OVERRIDE + { + if (HasEscortState(STATE_ESCORT_ESCORTING)) + Talk(SAY_ELF_AGGRO); + } + + void JustSummoned(Creature* summoned) OVERRIDE + { + summoned->AI()->AttackStart(me); + } + + void sQuestAccept(Player* player, Quest const* quest) + { + if (quest->GetQuestId() == QUEST_ROAD_TO_FALCON_WATCH) + { + me->setFaction(FACTION_FALCON_WATCH_QUEST); + npc_escortAI::Start(true, false, player->GetGUID()); + } + } + void WaypointReached(uint32 waypointId) OVERRIDE { Player* player = GetPlayerForEscort(); @@ -404,8 +261,8 @@ public: case 9: Talk(SAY_ELF_SUMMON1, player); // Spawn two Haal'eshi Talonguard - DoSpawnCreature(16967, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - DoSpawnCreature(16967, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + DoSpawnCreature(NPC_HAALESHI_TALONGUARD, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + DoSpawnCreature(NPC_HAALESHI_TALONGUARD, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 13: Talk(SAY_ELF_RESTING, player); @@ -413,8 +270,8 @@ public: case 14: Talk(SAY_ELF_SUMMON2, player); // Spawn two Haal'eshi Windwalker - DoSpawnCreature(16966, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); - DoSpawnCreature(16966, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + DoSpawnCreature(NPC_HAALESHI_WINDWALKER, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + DoSpawnCreature(NPC_HAALESHI_WINDWALKER, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 27: Talk(SAY_ELF_COMPLETE, player); @@ -423,20 +280,12 @@ public: break; } } - - void Reset() OVERRIDE { } - - void EnterCombat(Unit* /*who*/) OVERRIDE - { - if (HasEscortState(STATE_ESCORT_ESCORTING)) - Talk(SAY_ELF_AGGRO); - } - - void JustSummoned(Creature* summoned) OVERRIDE - { - summoned->AI()->AttackStart(me); - } }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_wounded_blood_elfAI(creature); + } }; /*###### @@ -445,9 +294,8 @@ public: enum FelGuard { - SPELL_SUMMON_POO = 37688, - - NPC_DERANGED_HELBOAR = 16863 + SPELL_SUMMON_POO = 37688, + NPC_DERANGED_HELBOAR = 16863 }; class npc_fel_guard_hound : public CreatureScript @@ -455,32 +303,24 @@ class npc_fel_guard_hound : public CreatureScript public: npc_fel_guard_hound() : CreatureScript("npc_fel_guard_hound") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_fel_guard_houndAI(creature); - } - struct npc_fel_guard_houndAI : public ScriptedAI { npc_fel_guard_houndAI(Creature* creature) : ScriptedAI(creature) { } - uint32 uiCheckTimer; - uint64 uiHelboarGUID; - void Reset() OVERRIDE { - uiCheckTimer = 5000; //check for creature every 5 sec - uiHelboarGUID = 0; + checkTimer = 5000; //check for creature every 5 sec + helboarGUID = 0; } - void MovementInform(uint32 uiType, uint32 uiId) OVERRIDE + void MovementInform(uint32 type, uint32 id) OVERRIDE { - if (uiType != POINT_MOTION_TYPE || uiId != 1) + if (type != POINT_MOTION_TYPE || id != 1) return; - if (Creature* pHelboar = me->GetCreature(*me, uiHelboarGUID)) + if (Creature* helboar = me->GetCreature(*me, helboarGUID)) { - pHelboar->RemoveCorpse(); + helboar->RemoveCorpse(); DoCast(SPELL_SUMMON_POO); if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) @@ -488,36 +328,43 @@ public: } } - void UpdateAI(uint32 uiDiff) OVERRIDE + void UpdateAI(uint32 diff) OVERRIDE { - if (uiCheckTimer <= uiDiff) + if (checkTimer <= diff) { - if (Creature* pHelboar = me->FindNearestCreature(NPC_DERANGED_HELBOAR, 10.0f, false)) + if (Creature* helboar = me->FindNearestCreature(NPC_DERANGED_HELBOAR, 10.0f, false)) { - if (pHelboar->GetGUID() != uiHelboarGUID && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && !me->FindCurrentSpellBySpellId(SPELL_SUMMON_POO)) + if (helboar->GetGUID() != helboarGUID && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && !me->FindCurrentSpellBySpellId(SPELL_SUMMON_POO)) { - uiHelboarGUID = pHelboar->GetGUID(); - me->GetMotionMaster()->MovePoint(1, pHelboar->GetPositionX(), pHelboar->GetPositionY(), pHelboar->GetPositionZ()); + helboarGUID = helboar->GetGUID(); + me->GetMotionMaster()->MovePoint(1, helboar->GetPositionX(), helboar->GetPositionY(), helboar->GetPositionZ()); } } - uiCheckTimer = 5000; - }else uiCheckTimer -= uiDiff; + checkTimer = 5000; + } + else checkTimer -= diff; if (!UpdateVictim()) return; DoMeleeAttackIfReady(); } + + private: + uint32 checkTimer; + uint64 helboarGUID; }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_fel_guard_houndAI(creature); + } }; void AddSC_hellfire_peninsula() { new npc_aeranas(); new npc_ancestral_wolf(); - new npc_naladu(); - new npc_tracy_proudwell(); - new npc_trollbane(); new npc_wounded_blood_elf(); new npc_fel_guard_hound(); } diff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp index 31a6af2fc1..799aaf5d0a 100644 --- a/src/server/scripts/Pet/pet_dk.cpp +++ b/src/server/scripts/Pet/pet_dk.cpp @@ -47,13 +47,14 @@ class npc_pet_dk_ebon_gargoyle : public CreatureScript void InitializeAI() OVERRIDE { + // Not needed to be despawned now + _despawnTimer = 0; + CasterAI::InitializeAI(); uint64 ownerGuid = me->GetOwnerGUID(); if (!ownerGuid) return; - - // Not needed to be despawned now - _despawnTimer = 0; + // Find victim of Summon Gargoyle spell std::list targets; Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30.0f); diff --git a/src/server/scripts/Pet/pet_mage.cpp b/src/server/scripts/Pet/pet_mage.cpp index 85247b29f8..7ac50f4313 100644 --- a/src/server/scripts/Pet/pet_mage.cpp +++ b/src/server/scripts/Pet/pet_mage.cpp @@ -49,7 +49,7 @@ class npc_pet_mage_mirror_image : public CreatureScript // Inherit Master's Threat List (not yet implemented) owner->CastSpell((Unit*)NULL, SPELL_MAGE_MASTERS_THREAT_LIST, true); // here mirror image casts on summoner spell (not present in client dbc) 49866 - // here should be auras (not present in client dbc): 35657, 35658, 35659, 35660 selfcasted by mirror images (stats related?) + // here should be auras (not present in client dbc): 35657, 35658, 35659, 35660 selfcast by mirror images (stats related?) // Clone Me! owner->CastSpell(me, SPELL_MAGE_CLONE_ME, false); } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 14746fbcb6..f418e98048 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -536,20 +536,20 @@ class spell_gen_bonked : public SpellScriptLoader + EFFECT_0: SCRIPT_EFFECT + EFFECT_1: NONE + EFFECT_2: NONE - - Spells casted by players triggered by script: + - Spells cast by players triggered by script: + EFFECT_0: SCHOOL_DAMAGE + EFFECT_1: SCRIPT_EFFECT + EFFECT_2: FORCE_CAST - - Spells casted by NPCs on players: + - Spells cast by NPCs on players: + EFFECT_0: SCHOOL_DAMAGE + EFFECT_1: SCRIPT_EFFECT + EFFECT_2: NONE In the following script we handle the SCRIPT_EFFECT for effIndex EFFECT_0 and EFFECT_1. - When handling EFFECT_0 we're in the "Spells on vehicle bar used by players" case - and we'll trigger "Spells casted by players triggered by script" - - When handling EFFECT_1 we're in the "Spells casted by players triggered by script" - or "Spells casted by NPCs on players" so we'll search for the first defend layer and drop it. + and we'll trigger "Spells cast by players triggered by script" + - When handling EFFECT_1 we're in the "Spells cast by players triggered by script" + or "Spells cast by NPCs on players" so we'll search for the first defend layer and drop it. */ enum BreakShieldSpells @@ -1210,7 +1210,7 @@ class spell_gen_defend : public SpellScriptLoader { SpellInfo const* spell = sSpellMgr->GetSpellInfo(m_scriptSpellId); - // Defend spells casted by NPCs (add visuals) + // Defend spells cast by NPCs (add visuals) if (spell->Effects[EFFECT_0].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) { AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); @@ -1221,7 +1221,7 @@ class spell_gen_defend : public SpellScriptLoader if (spell->Effects[EFFECT_2].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN) OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); - // Defend spells casted by players (add/remove visuals) + // Defend spells cast by players (add/remove visuals) if (spell->Effects[EFFECT_1].ApplyAuraName == SPELL_AURA_DUMMY) { AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); @@ -1872,15 +1872,15 @@ class spell_gen_lifebloom : public SpellScriptLoader + EFFECT_0: SCRIPT_EFFECT + EFFECT_1: TRIGGER_SPELL + EFFECT_2: NONE - - Spells casted by player's mounts triggered by script: + - Spells cast by player's mounts triggered by script: + EFFECT_0: CHARGE + EFFECT_1: TRIGGER_SPELL + EFFECT_2: APPLY_AURA - - Spells casted by players on the target triggered by script: + - Spells cast by players on the target triggered by script: + EFFECT_0: SCHOOL_DAMAGE + EFFECT_1: SCRIPT_EFFECT + EFFECT_2: NONE - - Spells casted by NPCs on players: + - Spells cast by NPCs on players: + EFFECT_0: SCHOOL_DAMAGE + EFFECT_1: CHARGE + EFFECT_2: SCRIPT_EFFECT @@ -1888,12 +1888,12 @@ class spell_gen_lifebloom : public SpellScriptLoader In the following script we handle the SCRIPT_EFFECT and CHARGE - When handling SCRIPT_EFFECT: + EFFECT_0: Corresponds to "Spells on vehicle bar used by players" and we make player's mount cast - the charge effect on the current target ("Spells casted by player's mounts triggered by script"). - + EFFECT_1 and EFFECT_2: Triggered when "Spells casted by player's mounts triggered by script" hits target, - corresponding to "Spells casted by players on the target triggered by script" and "Spells casted by + the charge effect on the current target ("Spells cast by player's mounts triggered by script"). + + EFFECT_1 and EFFECT_2: Triggered when "Spells cast by player's mounts triggered by script" hits target, + corresponding to "Spells cast by players on the target triggered by script" and "Spells cast by NPCs on players" and we check Defend layers and drop a charge of the first found. - When handling CHARGE: - + Only launched for "Spells casted by player's mounts triggered by script", makes the player cast the + + Only launched for "Spells cast by player's mounts triggered by script", makes the player cast the damaging spell on target with a small chance of failing it. */ diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 92a18a654d..cfb43e8a3f 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -1367,7 +1367,7 @@ class spell_q12372_destabilize_azure_dragonshrine_dummy : public SpellScriptLoad } }; -// ID - 50287 Azure Dragon: On Death Force Cast Wyrmrest Defender to Whisper to Controller - Random (casted from Azure Dragons and Azure Drakes on death) +// ID - 50287 Azure Dragon: On Death Force Cast Wyrmrest Defender to Whisper to Controller - Random (cast from Azure Dragons and Azure Drakes on death) class spell_q12372_azure_on_death_force_whisper : public SpellScriptLoader { public: diff --git a/src/server/scripts/World/guards.cpp b/src/server/scripts/World/guards.cpp index 5ba95dca19..b629fd06b3 100644 --- a/src/server/scripts/World/guards.cpp +++ b/src/server/scripts/World/guards.cpp @@ -106,7 +106,7 @@ public: return; // Make sure our attack is ready and we arn't currently casting - if (me->isAttackReady() && !me->IsNonMeleeSpellCasted(false)) + if (me->isAttackReady() && !me->IsNonMeleeSpellCast(false)) { //If we are within range melee the target if (me->IsWithinMeleeRange(me->GetVictim())) @@ -145,7 +145,7 @@ public: else { //Only run this code if we arn't already casting - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { bool healing = false; SpellInfo const* info = NULL; diff --git a/src/server/scripts/World/mob_generic_creature.cpp b/src/server/scripts/World/mob_generic_creature.cpp index ed086712ca..5cc9e68eb9 100644 --- a/src/server/scripts/World/mob_generic_creature.cpp +++ b/src/server/scripts/World/mob_generic_creature.cpp @@ -93,7 +93,7 @@ public: if (me->IsWithinMeleeRange(me->GetVictim())) { //Make sure our attack is ready and we arn't currently casting - if (me->isAttackReady() && !me->IsNonMeleeSpellCasted(false)) + if (me->isAttackReady() && !me->IsNonMeleeSpellCast(false)) { bool Healing = false; SpellInfo const* info = NULL; @@ -124,7 +124,7 @@ public: else { //Only run this code if we arn't already casting - if (!me->IsNonMeleeSpellCasted(false)) + if (!me->IsNonMeleeSpellCast(false)) { bool Healing = false; SpellInfo const* info = NULL; diff --git a/src/server/shared/Database/Field.cpp b/src/server/shared/Database/Field.cpp index 51d918e716..87151f7a9b 100644 --- a/src/server/shared/Database/Field.cpp +++ b/src/server/shared/Database/Field.cpp @@ -35,7 +35,7 @@ void Field::SetByteValue(const void* newValue, const size_t newSize, enum_field_ if (data.value) CleanUp(); - // This value stores raw bytes that have to be explicitly casted later + // This value stores raw bytes that have to be explicitly cast later if (newValue) { data.value = new char[newSize]; diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp index 3fcd4c28f0..eebf46f383 100644 --- a/src/server/worldserver/Master.cpp +++ b/src/server/worldserver/Master.cpp @@ -251,7 +251,7 @@ int Master::Run() { CPU_ZERO(&mask); sched_getaffinity(0, sizeof(mask), &mask); - TC_LOG_INFO("server.worldserver", "Using processors (bitmask, hex): %x", *(uint32*)(&mask)); + TC_LOG_INFO("server.worldserver", "Using processors (bitmask, hex): %lx", *(__cpu_mask*)(&mask)); } } diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt index 09f23b844c..db338711d0 100644 --- a/src/tools/CMakeLists.txt +++ b/src/tools/CMakeLists.txt @@ -11,7 +11,8 @@ add_subdirectory(map_extractor) add_subdirectory(vmap4_assembler) add_subdirectory(vmap4_extractor) -add_subdirectory(mmaps_generator) #if (WITH_MESHEXTRACTOR) # add_subdirectory(mesh_extractor) +#else() +# add_subdirectory(mmaps_generator) #endif() diff --git a/src/tools/mesh_extractor/ADT.cpp b/src/tools/mesh_extractor/ADT.cpp index a32276f985..ee7e1b12b4 100644 --- a/src/tools/mesh_extractor/ADT.cpp +++ b/src/tools/mesh_extractor/ADT.cpp @@ -25,7 +25,7 @@ ADT::ADT( std::string file, int x, int y ) : ObjectData(NULL), Data(NULL), HasOb { Data = new ChunkedData(file); ObjectData = new ChunkedData(file); - if (ObjectData->Stream) + if (ObjectData->_Stream) HasObjectData = true; else ObjectData = NULL; @@ -33,6 +33,11 @@ ADT::ADT( std::string file, int x, int y ) : ObjectData(NULL), Data(NULL), HasOb ADT::~ADT() { + // Temporarily delete the underlying streams, they are guaranteed to be different + // @TODO: Remove this code once the ChunkedData destructor properly releases _Stream + delete ObjectData->_Stream; + delete Data->_Stream; + delete ObjectData; delete Data; diff --git a/src/tools/mesh_extractor/CMakeLists.txt b/src/tools/mesh_extractor/CMakeLists.txt index 9ed8472051..f5dbb0fd7f 100644 --- a/src/tools/mesh_extractor/CMakeLists.txt +++ b/src/tools/mesh_extractor/CMakeLists.txt @@ -47,4 +47,4 @@ if( UNIX ) install(TARGETS MeshExtractor DESTINATION bin) elseif( WIN32 ) install(TARGETS MeshExtractor DESTINATION "${CMAKE_INSTALL_PREFIX}") -endif() +endif() \ No newline at end of file diff --git a/src/tools/mesh_extractor/Cache.h b/src/tools/mesh_extractor/Cache.h index 017b4c53f7..75496b5364 100644 --- a/src/tools/mesh_extractor/Cache.h +++ b/src/tools/mesh_extractor/Cache.h @@ -31,24 +31,18 @@ class GenericCache public: GenericCache() {} - static const uint32 FlushLimit = 300; // We can't get too close to filling up all the memory, and we have to be wary of the maximum number of open streams. - - void Insert(K key, T* val) - { - ACE_GUARD(ACE_Thread_Mutex, g, mutex); - - if (_items.size() > FlushLimit) - Clear(); - _items[key] = val; - } - - T* Get(K key) + T const* Get(K key) { ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL); typename std::map::iterator itr = _items.find(key); if (itr != _items.end()) return itr->second; - return NULL; + else + { + T* t = new T(key); // Create the object + _items[key] = t; + return t; + } } void Clear() diff --git a/src/tools/mesh_extractor/Chunk.cpp b/src/tools/mesh_extractor/Chunk.cpp index 42eb9e1488..bc6d9b66b9 100644 --- a/src/tools/mesh_extractor/Chunk.cpp +++ b/src/tools/mesh_extractor/Chunk.cpp @@ -25,24 +25,24 @@ int32 Chunk::FindSubChunkOffset(std::string name) if (name.size() != 4) return -1; - FILE* stream = GetStream(); + Stream* stream = GetStream(); uint32 matched = 0; - while (uint32(ftell(stream)) < Utils::Size(stream)) + while (stream->GetPos() < stream->GetSize()) { - char b = 0; - if (fread(&b, sizeof(char), 1, stream) != 1 || b != name[matched]) + char b = stream->Read(); + if (b != name[matched]) matched = 0; else ++matched; if (matched == 4) - return ftell(stream) - 4; + return stream->GetPos() - 4; } return -1; } -FILE* Chunk::GetStream() +Stream* Chunk::GetStream() { - fseek(Stream, Offset, SEEK_SET); - return Stream; + _Stream->Seek(Offset, SEEK_SET); + return _Stream; } diff --git a/src/tools/mesh_extractor/Chunk.h b/src/tools/mesh_extractor/Chunk.h index 0641eb1dc3..95d06efe20 100644 --- a/src/tools/mesh_extractor/Chunk.h +++ b/src/tools/mesh_extractor/Chunk.h @@ -19,19 +19,21 @@ #define CHUNK_H #include "Define.h" #include +#include "Stream.h" + class ChunkedData; class Chunk { public: - Chunk(const char* name, uint32 length, uint32 offset, FILE* stream) : Name(name), Length(length), Offset(offset), Stream(stream) {} + Chunk(const char* name, uint32 length, uint32 offset, Stream* stream) : Name(name), Length(length), Offset(offset), _Stream(stream) {} int32 FindSubChunkOffset(std::string name); - FILE* GetStream(); + Stream* GetStream(); std::string Name; uint32 Length; uint32 Offset; - FILE* Stream; + Stream* _Stream; }; #endif \ No newline at end of file diff --git a/src/tools/mesh_extractor/ChunkedData.cpp b/src/tools/mesh_extractor/ChunkedData.cpp index 1330e4b47f..b288b5712c 100644 --- a/src/tools/mesh_extractor/ChunkedData.cpp +++ b/src/tools/mesh_extractor/ChunkedData.cpp @@ -21,18 +21,18 @@ #include -ChunkedData::ChunkedData( FILE* stream, uint32 maxLength, uint32 chunksHint /*= 300*/ ) : -Stream(stream) +ChunkedData::ChunkedData(Stream* stream, uint32 maxLength, uint32 chunksHint /*= 300*/ ) : +_Stream(stream) { - if (!Stream) + if (!_Stream) return; Load(maxLength, chunksHint); } ChunkedData::ChunkedData( const std::string& file, uint32 chunksHint /*= 300*/ ) { - Stream = MPQHandler->GetFile(file); - if (!Stream) + _Stream = MPQHandler->GetFile(file); + if (!_Stream) return; Load(0, chunksHint); } @@ -40,31 +40,30 @@ ChunkedData::ChunkedData( const std::string& file, uint32 chunksHint /*= 300*/ ) void ChunkedData::Load( uint32 maxLength, uint32 chunksHint ) { if (!maxLength) - maxLength = Utils::Size(Stream); + maxLength = _Stream->GetSize(); Chunks.reserve(chunksHint); - uint32 baseOffset = ftell(Stream); + uint32 baseOffset = _Stream->GetPos(); uint32 calcOffset = 0; - while ((calcOffset + baseOffset) < Utils::Size(Stream) && (calcOffset < maxLength)) + while ((calcOffset + baseOffset) < _Stream->GetSize() && (calcOffset < maxLength)) { char nameBytes[5]; - uint32 read = fread(&nameBytes, sizeof(char), 4, Stream); - nameBytes[read] = '\0'; + _Stream->Read(nameBytes, sizeof(char) * 4); + nameBytes[4] = '\0'; std::string name = std::string(nameBytes); - // Utils::Reverse(nameBytes); name = std::string(name.rbegin(), name.rend()); - uint32 length; - if (fread(&length, sizeof(uint32), 1, Stream) != 1) - continue; + + uint32 length = _Stream->Read(); calcOffset += 8; - Chunks.push_back(new Chunk(name.c_str(), length, calcOffset + baseOffset, Stream)); + + Chunks.push_back(new Chunk(name.c_str(), length, calcOffset + baseOffset, _Stream)); calcOffset += length; // save an extra seek at the end - if ((calcOffset + baseOffset) < Utils::Size(Stream) && calcOffset < maxLength) - fseek(Stream, length, SEEK_CUR); + if ((calcOffset + baseOffset) < _Stream->GetSize() && calcOffset < maxLength) + _Stream->Seek(length, SEEK_CUR); } } -int ChunkedData::GetFirstIndex( const std::string& name ) +int ChunkedData::GetFirstIndex( const std::string& name ) const { for (uint32 i = 0; i < Chunks.size(); ++i) if (Chunks[i]->Name == name) @@ -86,6 +85,7 @@ ChunkedData::~ChunkedData() delete *itr; Chunks.clear(); - if (Stream) - fclose(Stream); + /* WorldModelGroup Data and SubData share the same _Stream so it's deleted twice and it crashes + if (_Stream) + delete _Stream;*/ } diff --git a/src/tools/mesh_extractor/ChunkedData.h b/src/tools/mesh_extractor/ChunkedData.h index 5befdf30dd..112bdb4719 100644 --- a/src/tools/mesh_extractor/ChunkedData.h +++ b/src/tools/mesh_extractor/ChunkedData.h @@ -20,19 +20,20 @@ #include #include "Chunk.h" +#include "Stream.h" class ChunkedData { public: - ChunkedData(FILE* stream, uint32 maxLength, uint32 chunksHint = 300); + ChunkedData(Stream* stream, uint32 maxLength, uint32 chunksHint = 300); ChunkedData(const std::string &file, uint32 chunksHint = 300); ~ChunkedData(); - int GetFirstIndex(const std::string& name); + int GetFirstIndex(const std::string& name) const; Chunk* GetChunkByName(const std::string& name); void Load(uint32 maxLength, uint32 chunksHint); std::vector Chunks; - FILE* Stream; + Stream* _Stream; }; #endif \ No newline at end of file diff --git a/src/tools/mesh_extractor/Constants.h b/src/tools/mesh_extractor/Constants.h index 5a89be9fe9..7d9d6f92b9 100644 --- a/src/tools/mesh_extractor/Constants.h +++ b/src/tools/mesh_extractor/Constants.h @@ -26,6 +26,8 @@ public: TRIANGLE_TYPE_UNKNOWN, TRIANGLE_TYPE_TERRAIN, TRIANGLE_TYPE_WATER, + TRIANGLE_TYPE_MAGMA, + TRIANGLE_TYPE_SLIME, TRIANGLE_TYPE_DOODAD, TRIANGLE_TYPE_WMO }; diff --git a/src/tools/mesh_extractor/ContinentBuilder.cpp b/src/tools/mesh_extractor/ContinentBuilder.cpp index 841d7a608e..9e64e7a1b0 100644 --- a/src/tools/mesh_extractor/ContinentBuilder.cpp +++ b/src/tools/mesh_extractor/ContinentBuilder.cpp @@ -16,80 +16,21 @@ */ #include "ContinentBuilder.h" -#include "TileBuilder.h" #include "WDT.h" #include "Utils.h" #include "DetourNavMesh.h" #include "Cache.h" -#include "ace/Task.h" #include "Recast.h" #include "DetourCommon.h" -class BuilderThread : public ACE_Task_Base -{ -private: - int X, Y, MapId; - std::string Continent; - dtNavMeshParams Params; - ContinentBuilder* cBuilder; -public: - BuilderThread(ContinentBuilder* _cBuilder, dtNavMeshParams& params) : Params(params), cBuilder(_cBuilder), Free(true) {} - - void SetData(int x, int y, int map, const std::string& cont) - { - X = x; - Y = y; - MapId = map; - Continent = cont; - } - - int svc() - { - Free = false; - printf("[%02i,%02i] Building tile\n", X, Y); - TileBuilder builder(cBuilder, Continent, X, Y, MapId); - char buff[100]; - sprintf(buff, "mmaps/%03u%02i%02i.mmtile", MapId, Y, X); - FILE* f = fopen(buff, "r"); - if (f) // Check if file already exists. - { - printf("[%02i,%02i] Tile skipped, file already exists\n", X, Y); - fclose(f); - Free = true; - return 0; - } - uint8* nav = builder.BuildTiled(Params); - if (nav) - { - f = fopen(buff, "wb"); - if (!f) - { - printf("Could not create file %s. Check that you have write permissions to the destination folder and try again\n", buff); - return 0; - } - MmapTileHeader header; - header.size = builder.DataSize; - fwrite(&header, sizeof(MmapTileHeader), 1, f); - fwrite(nav, sizeof(unsigned char), builder.DataSize, f); - fclose(f); - } - dtFree(nav); - printf("[%02i,%02i] Tile Built!\n", X, Y); - Free = true; - return 0; - } - - bool Free; -}; - -void ContinentBuilder::getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax) +void ContinentBuilder::getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax) const { // this is for elevation if (verts && vertCount) rcCalcBounds(verts, vertCount, bmin, bmax); else { - bmin[1] = FLT_MIN; + bmin[1] = -FLT_MAX; bmax[1] = FLT_MAX; } @@ -128,8 +69,6 @@ void ContinentBuilder::Build() dtNavMeshParams params; - std::vector Threads; - if (TileMap->IsGlobalModel) { printf("Map %s ( %u ) is a WMO. Building with 1 thread.\n", Continent.c_str(), MapId); @@ -159,6 +98,7 @@ void ContinentBuilder::Build() } MmapTileHeader mheader; + Utils::InitializeMmapTileHeader(mheader); mheader.size = builder->DataSize; fwrite(&mheader, sizeof(MmapTileHeader), 1, f); fwrite(nav, sizeof(unsigned char), builder->DataSize, f); @@ -170,44 +110,70 @@ void ContinentBuilder::Build() } else { - params.maxPolys = 32768; - params.maxTiles = 4096; + params.maxPolys = 1024; + params.maxTiles = TileMap->TileTable.size(); rcVcopy(params.orig, Constants::Origin); params.tileHeight = Constants::TileSize; params.tileWidth = Constants::TileSize; fwrite(¶ms, sizeof(dtNavMeshParams), 1, mmap); fclose(mmap); - for (uint32 i = 0; i < NumberOfThreads; ++i) - Threads.push_back(new BuilderThread(this, params)); + std::vector _threads; + BuilderThreadPool* pool = NumberOfThreads > 0 ? new BuilderThreadPool() : NULL; + printf("Map %s ( %u ) has %u tiles. Building them with %u threads\n", Continent.c_str(), MapId, uint32(TileMap->TileTable.size()), NumberOfThreads); + for (std::vector::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr) + pool->Enqueue(new TileBuildRequest(this, Continent, itr->X, itr->Y, MapId, params)); + + for (uint32 i = 0; i < NumberOfThreads; ++i) + _threads.push_back(new BuilderThread(this, pool->Queue())); + + // Free memory + for (std::vector::iterator _th = _threads.begin(); _th != _threads.end(); ++_th) { - bool next = false; - while (!next) - { - for (std::vector::iterator _th = Threads.begin(); _th != Threads.end(); ++_th) - { - if ((*_th)->Free) - { - (*_th)->SetData(itr->X, itr->Y, MapId, Continent); - (*_th)->activate(); - next = true; - break; - } - } - // Wait for 20 seconds - ACE_OS::sleep(ACE_Time_Value (0, 20000)); - } + (*_th)->wait(); + delete *_th; } + + delete pool; } Cache->Clear(); - - // Free memory - for (std::vector::iterator _th = Threads.begin(); _th != Threads.end(); ++_th) - { - (*_th)->wait(); - delete *_th; - } +} + +int TileBuildRequest::call() +{ + printf("[%02i,%02i] Building tile\n", X, Y); + // Build the tile and return negative on error + TileBuilder tile(_builder, _continent, X, Y, _mapId); + char buff[100]; + sprintf(buff, "mmaps/%03u%02i%02i.mmtile", _mapId, Y, X); + FILE* f = fopen(buff, "r"); + if (f) // Check if file already exists. + { + printf("[%02i,%02i] Tile skipped, file already exists\n", X, Y); + fclose(f); + return 0; + } + uint8* nav = tile.BuildTiled(_params); + if (nav) + { + f = fopen(buff, "wb"); + if (!f) + { + printf("Could not create file %s. Check that you have write permissions to the destination folder and try again\n", buff); + dtFree(nav); + return -1; + } + MmapTileHeader header; + Utils::InitializeMmapTileHeader(header); + header.size = tile.DataSize; + fwrite(&header, sizeof(MmapTileHeader), 1, f); + fwrite(nav, sizeof(unsigned char), tile.DataSize, f); + fclose(f); + } + dtFree(nav); + printf("[%02i,%02i] Tile Built!\n", X, Y); + return 0; } diff --git a/src/tools/mesh_extractor/ContinentBuilder.h b/src/tools/mesh_extractor/ContinentBuilder.h index 5349b8e1ba..249fad05eb 100644 --- a/src/tools/mesh_extractor/ContinentBuilder.h +++ b/src/tools/mesh_extractor/ContinentBuilder.h @@ -17,9 +17,15 @@ #ifndef CONT_BUILDER_H #define CONT_BUILDER_H + #include #include "WDT.h" #include "Define.h" +#include "TileBuilder.h" + +#include +#include +#include class ContinentBuilder { @@ -30,7 +36,7 @@ public: {} void Build(); - void getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax); + void getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax) const; void CalculateTileBounds(); float bmin[3]; float bmax[3]; @@ -44,4 +50,61 @@ private: int tileXMax; int tileYMax; }; + +class TileBuildRequest : public ACE_Method_Request +{ +public: + TileBuildRequest(ContinentBuilder* builder, std::string& continent, uint32 x, uint32 y, uint32 mapId, dtNavMeshParams& params) : _mapId(mapId), _builder(builder), _continent(continent), X(x), Y(y), _params(params) { } + + virtual int call(); + +private: + uint32 _mapId; + ContinentBuilder* _builder; + std::string& _continent; + uint32 X; + uint32 Y; + dtNavMeshParams& _params; +}; + +class BuilderThreadPool +{ +public: + BuilderThreadPool() : _queue(new ACE_Activation_Queue()) {} + ~BuilderThreadPool() { _queue->queue()->close(); delete _queue; } + + void Enqueue(TileBuildRequest* request) + { + _queue->enqueue(request); + } + + ACE_Activation_Queue* Queue() { return _queue; } + +private: + ACE_Activation_Queue* _queue; +}; + +class BuilderThread : public ACE_Task_Base +{ +private: + ContinentBuilder* _builder; + ACE_Activation_Queue* _queue; +public: + BuilderThread(ContinentBuilder* builder, ACE_Activation_Queue* queue) : _builder(builder), _queue(queue) { activate(); } + + int svc() + { + /// @ Set a timeout for dequeue attempts (only used when the queue is empty) as it will never get populated after thread starts + ACE_Time_Value timeout(5); + ACE_Method_Request* request = NULL; + while ((request = _queue->dequeue(&timeout)) != NULL) + { + request->call(); + delete request; + request = NULL; + } + return 0; + } +}; + #endif diff --git a/src/tools/mesh_extractor/DBC.cpp b/src/tools/mesh_extractor/DBC.cpp index 9249e32056..5bebc34a38 100644 --- a/src/tools/mesh_extractor/DBC.cpp +++ b/src/tools/mesh_extractor/DBC.cpp @@ -19,19 +19,15 @@ #include "DBC.h" #include "Define.h" -DBC::DBC( FILE* stream ) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true) +DBC::DBC(Stream* stream) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true) { - char magic[5]; - uint32 count = 0; - count += fread(&magic, sizeof(char), 4, stream); - magic[4] = '\0'; - count += fread(&RecordCount, sizeof(uint32), 1, stream); + delete[] stream->Read(4); // Read the magic "WDBC" + + RecordCount = stream->Read(); Records.reserve(RecordCount); - count += fread(&Fields, sizeof(uint32), 1, stream); - count += fread(&RecordSize, sizeof(uint32), 1, stream); - count += fread(&StringBlockSize, sizeof(uint32), 1, stream); - if (count != 8) - printf("DBC::DBC: Failed to read some data expected 8, read %u\n", count); + Fields = stream->Read(); + RecordSize = stream->Read(); + StringBlockSize = stream->Read(); for (int i = 0; i < RecordCount; i++) { @@ -45,20 +41,21 @@ DBC::DBC( FILE* stream ) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true) IsFaulty = true; break; } - uint32 tmp; - if (fread(&tmp, sizeof(uint32), 1, stream) != 1) - printf("DBC::DBC: Failed to read some data expected 1, read 0\n"); - rec->Values.push_back(tmp); + rec->Values.push_back(stream->Read()); size += 4; } } - StringBlock = new uint8[StringBlockSize]; - count = fread(StringBlock, sizeof(uint8), StringBlockSize, stream); - if (count != StringBlockSize) - printf("DBC::DBC: Failed to read some data expected %u, read %u\n", StringBlockSize, count); + StringBlock = (uint8*)stream->Read(StringBlockSize); } -std::string DBC::GetStringByOffset( int offset ) +DBC::~DBC() +{ + delete[] StringBlock; + for (std::vector::iterator itr = Records.begin(); itr != Records.end(); ++itr) + delete *itr; +} + +std::string DBC::GetStringByOffset( int offset ) const { int len = 0; for (uint32 i = offset; i < StringBlockSize; i++) @@ -73,14 +70,14 @@ std::string DBC::GetStringByOffset( int offset ) strcpy(d, (const char*)(StringBlock + offset)); d[len] = '\0'; std::string val = std::string(d); - delete [] d; + delete[] d; return val; } -Record* DBC::GetRecordById( int id ) +Record const* DBC::GetRecordById( int id ) const { // we assume Id is index 0 - for (std::vector::iterator itr = Records.begin(); itr != Records.end(); ++itr) + for (std::vector::const_iterator itr = Records.begin(); itr != Records.end(); ++itr) if ((*itr)->Values[0] == id) return *itr; return NULL; diff --git a/src/tools/mesh_extractor/DBC.h b/src/tools/mesh_extractor/DBC.h index 0d3b85d8c7..33f5437ebe 100644 --- a/src/tools/mesh_extractor/DBC.h +++ b/src/tools/mesh_extractor/DBC.h @@ -20,17 +20,19 @@ #include #include #include "Define.h" +#include "Stream.h" class Record; class DBC { public: - DBC(FILE* stream); + DBC(Stream* stream); + ~DBC(); - std::string GetStringByOffset(int offset); + std::string GetStringByOffset(int offset) const; - Record* GetRecordById(int id); + Record const* GetRecordById(int id) const; std::string Name; std::vector Records; @@ -50,18 +52,18 @@ public: DBC* Source; std::vector Values; - int operator[](int index) + int operator[](int index) const { return Values[index]; } template - T GetValue(int index) + T GetValue(int index) const { return *(T*)(&Values[index]); } - std::string GetString(int index) + const std::string GetString(int index) const { return Source->GetStringByOffset(Values[index]); } diff --git a/src/tools/mesh_extractor/DoodadHandler.cpp b/src/tools/mesh_extractor/DoodadHandler.cpp index 2e0743134d..5363855740 100644 --- a/src/tools/mesh_extractor/DoodadHandler.cpp +++ b/src/tools/mesh_extractor/DoodadHandler.cpp @@ -34,20 +34,18 @@ DoodadHandler::DoodadHandler( ADT* adt ) : ReadDoodadPaths(mmid, mmdx); } -void DoodadHandler::ProcessInternal( MapChunk* mcnk ) +void DoodadHandler::ProcessInternal(MapChunk* mcnk) { if (!IsSane()) return; uint32 refCount = mcnk->Header.DoodadRefs; - FILE* stream = mcnk->Source->GetStream(); - fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET); + Stream* stream = mcnk->Source->GetStream(); + stream->Seek(mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET); + for (uint32 i = 0; i < refCount; i++) { - int32 index; - int32 count; - if ((count = fread(&index, sizeof(int32), 1, stream)) != 1) - printf("DoodadHandler::ProcessInternal: Failed to read some data expected 1, read %d\n", count); + int32 index = stream->Read(); if (index < 0 || uint32(index) >= _definitions->size()) continue; DoodadDefinition doodad = (*_definitions)[index]; @@ -58,12 +56,7 @@ void DoodadHandler::ProcessInternal( MapChunk* mcnk ) continue; std::string path = (*_paths)[doodad.MmidIndex]; - Model* model = Cache->ModelCache.Get(path); - if (!model) - { - model = new Model(path); - Cache->ModelCache.Insert(path, model); - } + Model const* model = Cache->ModelCache.Get(path); if (!model->IsCollidable) continue; @@ -73,7 +66,7 @@ void DoodadHandler::ProcessInternal( MapChunk* mcnk ) InsertModelGeometry(doodad, model); } // Restore the stream position - fseek(stream, mcnk->Source->Offset, SEEK_SET); + stream->Seek(mcnk->Source->Offset, SEEK_SET); } void DoodadHandler::ReadDoodadDefinitions( Chunk* chunk ) @@ -81,7 +74,7 @@ void DoodadHandler::ReadDoodadDefinitions( Chunk* chunk ) int32 count = chunk->Length / 36; _definitions = new std::vector; _definitions->reserve(count); - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); for (int i = 0; i < count; i++) { DoodadDefinition def; @@ -97,25 +90,24 @@ void DoodadHandler::ReadDoodadPaths( Chunk* id, Chunk* data ) _paths->reserve(paths); for (int i = 0; i < paths; i++) { - FILE* idStream = id->GetStream(); - fseek(idStream, i * 4, SEEK_CUR); - uint32 offset; - if (fread(&offset, sizeof(uint32), 1, idStream) != 1) - printf("DoodadHandler::ReadDoodadPaths: Failed to read some data expected 1, read 0\n"); - FILE* dataStream = data->GetStream(); - fseek(dataStream, offset + data->Offset, SEEK_SET); - _paths->push_back(Utils::ReadString(dataStream)); + Stream* idStream = id->GetStream(); + idStream->Seek(i * 4, SEEK_CUR); + uint32 offset = idStream->Read(); + + Stream* dataStream = data->GetStream(); + dataStream->Seek(offset + data->Offset, SEEK_SET); + _paths->push_back(dataStream->ReadString()); } } -void DoodadHandler::InsertModelGeometry(const DoodadDefinition& def, Model* model) +void DoodadHandler::InsertModelGeometry(const DoodadDefinition& def, Model const* model) { uint32 vertOffset = Vertices.size(); - for (std::vector::iterator itr = model->Vertices.begin(); itr != model->Vertices.end(); ++itr) + for (std::vector::const_iterator itr = model->Vertices.begin(); itr != model->Vertices.end(); ++itr) Vertices.push_back(Utils::TransformDoodadVertex(def, *itr)); // Vertices have to be converted based on the information from the DoodadDefinition struct - for (std::vector >::iterator itr = model->Triangles.begin(); itr != model->Triangles.end(); ++itr) + for (std::vector >::const_iterator itr = model->Triangles.begin(); itr != model->Triangles.end(); ++itr) Triangles.push_back(Triangle(Constants::TRIANGLE_TYPE_DOODAD, itr->V0 + vertOffset, itr->V1 + vertOffset, itr->V2 + vertOffset)); } diff --git a/src/tools/mesh_extractor/DoodadHandler.h b/src/tools/mesh_extractor/DoodadHandler.h index c3a8d64501..d7d3e0917b 100644 --- a/src/tools/mesh_extractor/DoodadHandler.h +++ b/src/tools/mesh_extractor/DoodadHandler.h @@ -21,6 +21,7 @@ #include "Utils.h" #include "Chunk.h" #include "Model.h" +#include "Stream.h" #include #include @@ -39,18 +40,14 @@ public: return Vector3(vec.z, vec.x, vec.y); } - void Read(FILE* stream) + void Read(Stream* stream) { - int count = 0; - - count += fread(&MmidIndex, sizeof(uint32), 1, stream); - count += fread(&UniqueId, sizeof(uint32), 1, stream); - Position = (Vector3::Read(stream)); + MmidIndex = stream->Read(); + UniqueId = stream->Read(); + Position = Vector3::Read(stream); Rotation = Vector3::Read(stream); - count += fread(&DecimalScale, sizeof(uint16), 1, stream); - count += fread(&Flags, sizeof(uint16), 1, stream); - if (count != 4) - printf("DoodadDefinition::Read: Failed to read some data expected 4, read %d\n", count); + DecimalScale = stream->Read(); + Flags = stream->Read(); } }; @@ -62,7 +59,7 @@ public: std::vector Vertices; std::vector > Triangles; - bool IsSane() { return _definitions && _paths; } + bool IsSane() const { return _definitions && _paths; } protected: @@ -71,7 +68,7 @@ protected: private: void ReadDoodadDefinitions(Chunk* chunk); void ReadDoodadPaths(Chunk* id, Chunk* data); - void InsertModelGeometry(const DoodadDefinition& def, Model* model); + void InsertModelGeometry(const DoodadDefinition& def, Model const* model); std::set _drawn; std::vector* _definitions; std::vector* _paths; diff --git a/src/tools/mesh_extractor/Geometry.cpp b/src/tools/mesh_extractor/Geometry.cpp index 0c7b7a492c..2ae05c0b73 100644 --- a/src/tools/mesh_extractor/Geometry.cpp +++ b/src/tools/mesh_extractor/Geometry.cpp @@ -20,6 +20,7 @@ #include "ADT.h" #include "WorldModelHandler.h" #include "DoodadHandler.h" +#include "LiquidHandler.h" #include Geometry::Geometry() : Transform(false) @@ -34,7 +35,7 @@ void Geometry::CalculateBoundingBox( float*& min, float*& max ) max = new float[3]; for (int i = 0; i < 3; ++i) { - max[i] = std::numeric_limits::lowest(); + max[i] = -FLT_MAX; min[i] = std::numeric_limits::max(); } @@ -60,7 +61,7 @@ void Geometry::CalculateBoundingBox( float*& min, float*& max ) void Geometry::CalculateMinMaxHeight( float& min, float& max ) { min = std::numeric_limits::max(); - max = std::numeric_limits::lowest(); + max = -FLT_MAX; for (std::vector::iterator itr = Vertices.begin(); itr != Vertices.end(); ++itr) { @@ -91,12 +92,12 @@ void Geometry::AddData( std::vector& verts, std::vector(itr->Type, itr->V0 + vertOffset, itr->V1 + vertOffset, itr->V2 + vertOffset)); } -void Geometry::GetRawData( float*& verts, int*& tris, uint8*& areas ) +void Geometry::GetRawData( float*& verts, int*& tris, uint8*& areas ) const { verts = new float[Vertices.size() * 3]; for (uint32 i = 0; i < Vertices.size(); ++i) { - Vector3& vert = Vertices[i]; + const Vector3& vert = Vertices[i]; verts[(i * 3) + 0] = vert.x; verts[(i * 3) + 1] = vert.y; verts[(i * 3) + 2] = vert.z; @@ -105,7 +106,7 @@ void Geometry::GetRawData( float*& verts, int*& tris, uint8*& areas ) tris = new int[Triangles.size() * 3]; for (uint32 i = 0; i < Triangles.size(); ++i) { - Triangle& tri = Triangles[i]; + const Triangle& tri = Triangles[i]; tris[(i * 3) + 0] = (int)tri.V0; tris[(i * 3) + 1] = (int)tri.V1; tris[(i * 3) + 2] = (int)tri.V2; @@ -142,5 +143,8 @@ void Geometry::AddAdt( ADT* adt ) if (!adt->_WorldModelHandler->Triangles.empty()) AddData(adt->_WorldModelHandler->Vertices, adt->_WorldModelHandler->Triangles); + + if (!adt->_LiquidHandler->Triangles.empty()) + AddData(adt->_LiquidHandler->Vertices, adt->_LiquidHandler->Triangles); } diff --git a/src/tools/mesh_extractor/Geometry.h b/src/tools/mesh_extractor/Geometry.h index f2ea43e381..cd71ac5a82 100644 --- a/src/tools/mesh_extractor/Geometry.h +++ b/src/tools/mesh_extractor/Geometry.h @@ -31,7 +31,7 @@ public: void CalculateMinMaxHeight(float& min, float& max); void AddData(std::vector& verts, std::vector >& tris); void AddAdt(ADT* adt); - void GetRawData(float*& verts, int*& tris, uint8*& areas); + void GetRawData(float*& verts, int*& tris, uint8*& areas) const; std::vector Vertices; std::vector > Triangles; diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp index eef36d8ea9..1b6f5ce944 100644 --- a/src/tools/mesh_extractor/LiquidHandler.cpp +++ b/src/tools/mesh_extractor/LiquidHandler.cpp @@ -17,10 +17,20 @@ #include "LiquidHandler.h" #include "Utils.h" +#include "DBC.h" +#include "MPQManager.h" LiquidHandler::LiquidHandler( ADT* adt ) : Source(adt) { HandleNewLiquid(); + HandleOldLiquid(); +} + +LiquidHandler::~LiquidHandler() +{ + for (std::vector::iterator itr = MCNKData.begin(); itr != MCNKData.end(); ++itr) + delete *itr; + MCNKData.clear(); } void LiquidHandler::HandleNewLiquid() @@ -32,7 +42,7 @@ void LiquidHandler::HandleNewLiquid() Vertices.reserve(1000); Triangles.reserve(1000); - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); H2OHeader header[256]; MCNKData.reserve(256); for (int i = 0; i < 256; i++) @@ -44,40 +54,44 @@ void LiquidHandler::HandleNewLiquid() if (h.LayerCount == 0) { // Need to fill in missing data with dummies. - MCNKData.push_back(MCNKLiquidData(NULL, H2ORenderMask())); + MCNKData.push_back(new MCNKLiquidData(NULL, H2ORenderMask())); continue; } - fseek(stream, chunk->Offset + h.OffsetInformation, SEEK_SET); + stream->Seek(chunk->Offset + h.OffsetInformation, SEEK_SET); H2OInformation information = H2OInformation::Read(stream); + // Load the LiquidTypes DBC + DBC const* liquidTypes = MPQHandler->GetDBC("LiquidTypes"); + Record const* liquid = liquidTypes->GetRecordById(information.LiquidType); + ASSERT(liquid); + + // This pointer will be passed to the MCNKLiquidData constructor, from that point on, it is the job of MCNKLiquidData's destructor to release it. float** heights = new float*[9]; for (int j = 0; j < 9; ++j) { heights[j] = new float[9]; memset(heights[j], 0, sizeof(float) * 9); } - + H2ORenderMask renderMask; - if (information.LiquidType != 2) + if (liquid->GetValue(3) != 1) // Read the liquid type and skip Ocean, Slow Ocean and Fast Ocean { - fseek(stream, chunk->Offset + h.OffsetRender, SEEK_SET); + stream->Seek(chunk->Offset + h.OffsetRender, SEEK_SET); renderMask = H2ORenderMask::Read(stream); if ((Utils::IsAllZero(renderMask.Mask, 8) || (information.Width == 8 && information.Height == 8)) && information.OffsetMask2) { - fseek(stream, chunk->Offset + information.OffsetMask2, SEEK_SET); + stream->Seek(chunk->Offset + information.OffsetMask2, SEEK_SET); uint32 size = ceil(information.Width * information.Height / 8.0f); - uint8* altMask = new uint8[size]; - if (fread(altMask, sizeof(uint8), size, stream) == size) - for (uint32 mi = 0; mi < size; mi++) - renderMask.Mask[mi + information.OffsetY] |= altMask[mi]; + uint8* altMask = (uint8*)stream->Read(size); + for (uint32 mi = 0; mi < size; mi++) + renderMask.Mask[mi + information.OffsetY] |= altMask[mi]; delete[] altMask; } - fseek(stream, chunk->Offset + information.OffsetHeightmap, SEEK_SET); + stream->Seek(chunk->Offset + information.OffsetHeightmap, SEEK_SET); for (int y = information.OffsetY; y < (information.OffsetY + information.Height); y++) for (int x = information.OffsetX; x < (information.OffsetX + information.Width); x++) - if (fread(&heights[x][y], sizeof(float), 1, stream) != 1) - return; + heights[x][y] = stream->Read(); } else { @@ -90,7 +104,7 @@ void LiquidHandler::HandleNewLiquid() heights[x][y] = information.HeightLevel1; } - MCNKData.push_back(MCNKLiquidData(heights, renderMask)); + MCNKData.push_back(new MCNKLiquidData(heights, renderMask)); for (int y = information.OffsetY; y < (information.OffsetY + information.Height); y++) { @@ -110,10 +124,37 @@ void LiquidHandler::HandleNewLiquid() Vertices.push_back(Vector3(location.x - Constants::UnitSize, location.y, location.z)); Vertices.push_back(Vector3(location.x, location.y - Constants::UnitSize, location.z)); Vertices.push_back(Vector3(location.x - Constants::UnitSize, location.y - Constants::UnitSize, location.z)); + + // Define the liquid type + Constants::TriangleType type = Constants::TRIANGLE_TYPE_UNKNOWN; + switch (liquid->GetValue(3)) + { + case 0: // Water + case 1: // Ocean + type = Constants::TRIANGLE_TYPE_WATER; + break; + case 2: // Magma + type = Constants::TRIANGLE_TYPE_MAGMA; + break; + case 3: // Slime + type = Constants::TRIANGLE_TYPE_SLIME; + break; + } - Triangles.push_back(Triangle(Constants::TRIANGLE_TYPE_WATER, vertOffset, vertOffset+2, vertOffset + 1)); - Triangles.push_back(Triangle(Constants::TRIANGLE_TYPE_WATER, vertOffset + 2, vertOffset + 3, vertOffset + 1)); + Triangles.push_back(Triangle(type, vertOffset, vertOffset+2, vertOffset + 1)); + Triangles.push_back(Triangle(type, vertOffset + 2, vertOffset + 3, vertOffset + 1)); } } } } + +void LiquidHandler::HandleOldLiquid() +{ + for (uint32 i = 0; i < 256; ++i) + { + MapChunk* mapChunk = Source->MapChunks[i]; + if (!mapChunk->Header.OffsetMCLQ || mapChunk->Header.SizeMCLQ <= 8) + continue; + printf("Found old liquid"); + } +} diff --git a/src/tools/mesh_extractor/LiquidHandler.h b/src/tools/mesh_extractor/LiquidHandler.h index c053b62108..d7f493e271 100644 --- a/src/tools/mesh_extractor/LiquidHandler.h +++ b/src/tools/mesh_extractor/LiquidHandler.h @@ -27,12 +27,14 @@ class LiquidHandler { public: LiquidHandler(ADT* adt); + ~LiquidHandler(); ADT* Source; std::vector Vertices; std::vector > Triangles; - std::vector MCNKData; + std::vector MCNKData; private: void HandleNewLiquid(); + void HandleOldLiquid(); }; #endif \ No newline at end of file diff --git a/src/tools/mesh_extractor/MPQ.cpp b/src/tools/mesh_extractor/MPQ.cpp index 5a2957cac0..4a86ab0b4d 100644 --- a/src/tools/mesh_extractor/MPQ.cpp +++ b/src/tools/mesh_extractor/MPQ.cpp @@ -17,6 +17,7 @@ #include "MPQ.h" #include "MPQManager.h" +#include "Stream.h" #include #include @@ -125,15 +126,8 @@ void MPQFile::close() eof = true; } -FILE* MPQFile::GetFileStream() +Stream* MPQFile::GetFileStream() { - FILE* file = tmpfile(); - if (!file) - { - printf("Could not create temporary file. Please run as Administrator or root\n"); - exit(1); - } - fwrite(buffer, sizeof(char), size, file); - fseek(file, 0, SEEK_SET); - return file; + Stream* stream = new Stream(buffer, size); + return stream; } diff --git a/src/tools/mesh_extractor/MPQ.h b/src/tools/mesh_extractor/MPQ.h index 17dbe74dca..df39e901d5 100644 --- a/src/tools/mesh_extractor/MPQ.h +++ b/src/tools/mesh_extractor/MPQ.h @@ -20,6 +20,7 @@ #include "libmpq/mpq.h" #include "Define.h" +#include "Stream.h" #include #include #include @@ -30,7 +31,7 @@ class MPQArchive { public: - mpq_archive_s *mpq_a; + mpq_archive_s* mpq_a; std::vector Files; @@ -70,8 +71,8 @@ class MPQFile { //MPQHANDLE handle; bool eof; - char *buffer; - libmpq__off_t pointer,size; + char* buffer; + libmpq__off_t pointer, size; // disable copying MPQFile(const MPQFile& /*f*/) {} @@ -81,18 +82,18 @@ public: MPQFile(const char* filename); // filenames are not case sensitive ~MPQFile() { close(); } size_t Read(void* dest, size_t bytes); - FILE* GetFileStream(); - size_t getSize() { return size; } - size_t getPos() { return pointer; } + Stream* GetFileStream(); + size_t getSize() const { return size; } + size_t getPos() const { return pointer; } char* getBuffer() { return buffer; } char* getPointer() { return buffer + pointer; } - bool isEof() { return eof; } + bool isEof() const { return eof; } void seek(int offset); void seekRelative(int offset); void close(); }; -inline void flipcc(char *fcc) +inline void flipcc(char* fcc) { char t; t=fcc[0]; diff --git a/src/tools/mesh_extractor/MPQManager.cpp b/src/tools/mesh_extractor/MPQManager.cpp index 8954da6c15..4834ca368c 100644 --- a/src/tools/mesh_extractor/MPQManager.cpp +++ b/src/tools/mesh_extractor/MPQManager.cpp @@ -19,6 +19,7 @@ #include "MPQ.h" #include "DBC.h" #include "Utils.h" +#include "Stream.h" #include char const* MPQManager::Files[] = { @@ -31,6 +32,12 @@ char const* MPQManager::Files[] = { "patch-3.MPQ" }; +char const* MPQManager::LocalePatchFiles[] = { + "Data/%s/patch-%s.MPQ", + "Data/%s/patch-%s-2.MPQ", + "Data/%s/patch-%s-3.MPQ" +}; + char const* MPQManager::Languages[] = { "enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; void MPQManager::Initialize() @@ -48,9 +55,7 @@ void MPQManager::Initialize() void MPQManager::InitializeDBC() { BaseLocale = -1; - std::string fileName; uint32 size = sizeof(Languages) / sizeof(char*); - MPQArchive* _baseLocale = NULL; for (uint32 i = 0; i < size; ++i) { std::string _fileName = "Data/" + std::string(Languages[i]) + "/locale-" + std::string(Languages[i]) + ".MPQ"; @@ -58,20 +63,34 @@ void MPQManager::InitializeDBC() if (file) { if (BaseLocale == -1) - { BaseLocale = i; - _baseLocale = new MPQArchive(_fileName.c_str()); - fileName = _fileName; - LocaleFiles[i] = _baseLocale; + + // Load the base locale file + MPQArchive* arch = new MPQArchive(_fileName.c_str()); + LocaleFiles[i].push_front(arch); + + Archives.push_front(arch); // For lookup in GetFile + + // Load the locale patches + for (uint32 j = 0; j < sizeof(LocalePatchFiles) / sizeof(char*); ++j) + { + char patchName[100]; + sprintf(patchName, LocalePatchFiles[j], Languages[i], Languages[i]); + FILE* patch = fopen(patchName, "rb"); + if (file) + { + MPQArchive* archP = new MPQArchive(patchName); + LocaleFiles[i].push_front(archP); + Archives.push_front(archP); // For lookup in GetFile + fclose(patch); + } } - else - LocaleFiles[i] = new MPQArchive(_fileName.c_str()); AvailableLocales.insert(i); printf("Detected locale: %s\n", Languages[i]); } } - Archives.push_front(_baseLocale); + if (BaseLocale == -1) { printf("No locale data detected. Please make sure that the executable is in the same folder as your WoW installation.\n"); @@ -81,7 +100,7 @@ void MPQManager::InitializeDBC() printf("Using default locale: %s\n", Languages[BaseLocale]); } -FILE* MPQManager::GetFile(const std::string& path ) +Stream* MPQManager::GetFile(const std::string& path ) { ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL); MPQFile file(path.c_str()); @@ -90,13 +109,54 @@ FILE* MPQManager::GetFile(const std::string& path ) return file.GetFileStream(); } -DBC* MPQManager::GetDBC(const std::string& name ) +DBC const* MPQManager::GetDBC(const std::string& name ) { + std::map::const_iterator itr = LoadedDBCs.find(name); + if (itr != LoadedDBCs.end()) + return itr->second; + std::string path = "DBFilesClient\\" + name + ".dbc"; - return new DBC(GetFile(path)); + DBC* dbc = new DBC(GetFile(path)); + + LoadedDBCs[name] = dbc; + + return dbc; } -FILE* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file ) +Stream* MPQManager::GetFileFromLocale( const std::string& path, uint32 locale ) +{ + ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL); + std::deque files = LocaleFiles[locale]; + Stream* ret = NULL; + for (std::deque::iterator itr = files.begin(); itr != files.end(); ++itr) + { + mpq_archive* mpq_a = (*itr)->mpq_a; + + uint32_t filenum; + if(libmpq__file_number(mpq_a, path.c_str(), &filenum)) + continue; + libmpq__off_t transferred; + libmpq__off_t size = 0; + libmpq__file_unpacked_size(mpq_a, filenum, &size); + + // HACK: in patch.mpq some files don't want to open and give 1 for filesize + if (size <= 1) + continue; + + char* buffer = new char[size]; + + //libmpq_file_getdata + libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred); + + ret = new Stream(buffer, size); + + delete[] buffer; + break; + } + return ret; +} + +Stream* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file ) { ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL); mpq_archive* mpq_a = file->mpq_a; @@ -119,14 +179,7 @@ FILE* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file ) libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred); // Pack the return into a FILE stream - FILE* ret = tmpfile(); - if (!ret) - { - printf("Could not create temporary file. Please run as Administrator or root\n"); - exit(1); - } - fwrite(buffer, sizeof(uint8), size, ret); - fseek(ret, 0, SEEK_SET); + Stream* ret = new Stream((char*)buffer, size); delete[] buffer; return ret; } diff --git a/src/tools/mesh_extractor/MPQManager.h b/src/tools/mesh_extractor/MPQManager.h index 6172237df4..d44030319c 100644 --- a/src/tools/mesh_extractor/MPQManager.h +++ b/src/tools/mesh_extractor/MPQManager.h @@ -19,6 +19,7 @@ #define MPQ_MANAGER_H #include "MPQ.h" +#include "Stream.h" #include #include #include @@ -31,22 +32,26 @@ public: ~MPQManager() {} void Initialize(); - FILE* GetFile(const std::string& path); - FILE* GetFileFrom(const std::string& path, MPQArchive* file); - DBC* GetDBC(const std::string& name); + Stream* GetFile(const std::string& path); + Stream* GetFileFrom(const std::string& path, MPQArchive* file); + Stream* GetFileFromLocale(const std::string& path, uint32 locale); + + DBC const* GetDBC(const std::string& name); std::vector GetAllFiles(std::string extension); std::deque Archives; int32 BaseLocale; std::set AvailableLocales; - std::map LocaleFiles; + std::map > LocaleFiles; static char const* Files[]; + static char const* LocalePatchFiles[]; static char const* Languages[]; protected: void InitializeDBC(); private: ACE_Thread_Mutex mutex; + std::map LoadedDBCs; }; extern MPQManager* MPQHandler; diff --git a/src/tools/mesh_extractor/MapChunk.cpp b/src/tools/mesh_extractor/MapChunk.cpp index 4cd5afad3f..ee6b458439 100644 --- a/src/tools/mesh_extractor/MapChunk.cpp +++ b/src/tools/mesh_extractor/MapChunk.cpp @@ -21,9 +21,9 @@ MapChunk::MapChunk( ADT* _adt, Chunk* chunk ) : Adt(_adt), Source(chunk) { - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); Header.Read(stream); - fseek(stream, chunk->Offset, SEEK_SET); + stream->Seek(chunk->Offset, SEEK_SET); Index = Header.IndexX + Header.IndexY * 16; GenerateVertices(stream); } @@ -47,12 +47,12 @@ void MapChunk::GenerateTriangles() Constants::TriangleType triangleType = Constants::TRIANGLE_TYPE_TERRAIN; if (Adt->_LiquidHandler && !Adt->_LiquidHandler->MCNKData.empty()) { - MCNKLiquidData& data = Adt->_LiquidHandler->MCNKData[Index]; + MCNKLiquidData* data = Adt->_LiquidHandler->MCNKData[Index]; float maxHeight = std::max( std::max( std::max(std::max(Vertices[topLeft].z, Vertices[topRight].z), Vertices[bottomLeft].z), Vertices[bottomRight].z), Vertices[center].z); - if (data.IsWater(x, y, maxHeight)) + if (data->IsWater(x, y, maxHeight)) triangleType = Constants::TRIANGLE_TYPE_WATER; } @@ -64,9 +64,9 @@ void MapChunk::GenerateTriangles() } } -void MapChunk::GenerateVertices( FILE* stream ) +void MapChunk::GenerateVertices(Stream* stream) { - fseek(stream, Header.OffsetMCVT, SEEK_CUR); + stream->Seek(Header.OffsetMCVT, SEEK_CUR); Vertices.reserve(125); for (int j = 0; j < 17; j++) @@ -74,9 +74,7 @@ void MapChunk::GenerateVertices( FILE* stream ) int values = j % 2 ? 8 : 9; for (int i = 0; i < values; i++) { - float tmp; - if (fread(&tmp, sizeof(float), 1, stream) != 1) - printf("MapChunk::GenerateVertices: Failed to read some data expected 1, read 0\n"); + float tmp = stream->Read(); Vector3 vert(Header.Position.x - (j * (Constants::UnitSize * 0.5f)), Header.Position.y - (i * Constants::UnitSize), Header.Position.z + tmp); if (values == 8) vert.y -= Constants::UnitSize * 0.5f; @@ -84,7 +82,7 @@ void MapChunk::GenerateVertices( FILE* stream ) } } // Restore stream position. - fseek(stream, Source->Offset, SEEK_SET); + stream->Seek(Source->Offset, SEEK_SET); } bool MapChunk::HasHole( uint32 map, int x, int y ) diff --git a/src/tools/mesh_extractor/MapChunk.h b/src/tools/mesh_extractor/MapChunk.h index 95bce9ffcd..c5127b0800 100644 --- a/src/tools/mesh_extractor/MapChunk.h +++ b/src/tools/mesh_extractor/MapChunk.h @@ -29,7 +29,7 @@ public: MapChunk(ADT* _adt, Chunk* chunk); void GenerateTriangles(); - void GenerateVertices(FILE* stream); + void GenerateVertices(Stream* stream); static bool HasHole(uint32 map, int x, int y); ADT* Adt; Chunk* Source; diff --git a/src/tools/mesh_extractor/MeshExtractor.cpp b/src/tools/mesh_extractor/MeshExtractor.cpp index e60e11b1db..de791b04d3 100644 --- a/src/tools/mesh_extractor/MeshExtractor.cpp +++ b/src/tools/mesh_extractor/MeshExtractor.cpp @@ -34,16 +34,41 @@ MPQManager* MPQHandler; CacheClass* Cache; +bool IgnoreMap(uint32 id) +{ + switch (id) + { + case 13: // test.wdt + case 25: // ScottTest.wdt + case 29: // Test.wdt + case 42: // Colin.wdt + case 169: // EmeraldDream.wdt (unused, and very large) + case 451: // development.wdt + case 573: // ExteriorTest.wdt + case 597: // CraigTest.wdt + case 605: // development_nonweighted.wdt + case 606: // QA_DVD.wdt + return true; + default: + break; + } + + return false; +} + void ExtractMMaps(std::set& mapIds, uint32 threads) { - DBC* dbc = MPQHandler->GetDBC("Map"); - printf("Map.dbc contains %u rows.\n", dbc->Records.size()); - for (std::vector::iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr) + std::string basePath = "mmaps/"; + Utils::CreateDir(basePath); + + DBC const* dbc = MPQHandler->GetDBC("Map"); + printf("Map.dbc contains " SIZEFMTD " rows.\n", dbc->Records.size()); + for (std::vector::const_iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr) { uint32 mapId = (*itr)->Values[0]; - // Skip this map if a list of specific maps was provided and this one is not contained in it. - if (!mapIds.empty() && mapIds.find(mapId) == mapIds.end()) + // Skip this map if a list of specific maps was provided and this one is not contained in it, or if the map is in the ignore list. + if ((!mapIds.empty() && mapIds.find(mapId) == mapIds.end()) || IgnoreMap(mapId)) { if (Constants::Debug) printf("Map %u will not be built.\n", mapId); @@ -75,9 +100,12 @@ void ExtractDBCs() // Populate list of DBC files // We get the DBC names by going over the (guaranteed to exist) default locale files // Then we look in other locale files in case that they are available. - for (std::vector::iterator itr = MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.begin(); itr != MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.end(); ++itr) - if (itr->rfind(".dbc") == itr->length() - extLen) // Check if the extension is ".dbc" - DBCFiles.insert(*itr); + for (std::map >::iterator itr = MPQHandler->LocaleFiles.begin(); itr != MPQHandler->LocaleFiles.end(); ++itr) + for (std::deque::iterator itr2 = itr->second.begin(); itr2 != itr->second.end(); ++itr2) + for (std::vector::iterator itr3 = (*itr2)->Files.begin(); itr3 != (*itr2)->Files.end(); ++itr3) + if (itr3->rfind(".dbc") == itr3->length() - extLen) // Check if the extension is ".dbc" + if (DBCFiles.find(*itr3) == DBCFiles.end()) + DBCFiles.insert(*itr3); const size_t folderLen = strlen("DBFilesClient\\"); // Iterate over all available locales @@ -93,10 +121,10 @@ void ExtractDBCs() std::string component = "component.wow-" + std::string(MPQManager::Languages[*itr]) + ".txt"; // Extract the component file - Utils::SaveToDisk(MPQHandler->GetFileFrom(component, MPQHandler->LocaleFiles[*itr]), path + component); + Utils::SaveToDisk(MPQHandler->GetFileFromLocale(component, *itr), path + component); // Extract the DBC files for the given locale for (std::set::iterator itr2 = DBCFiles.begin(); itr2 != DBCFiles.end(); ++itr2) - Utils::SaveToDisk(MPQHandler->GetFileFrom(*itr2, MPQHandler->LocaleFiles[*itr]), path + (itr2->c_str() + folderLen)); + Utils::SaveToDisk(MPQHandler->GetFileFromLocale(*itr2, *itr), path + (itr2->c_str() + folderLen)); } printf("DBC extraction finished!\n"); } @@ -118,8 +146,8 @@ void ExtractGameobjectModels() return; } - DBC* dbc = MPQHandler->GetDBC("GameObjectDisplayInfo"); - for (std::vector::iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr) + DBC const* dbc = MPQHandler->GetDBC("GameObjectDisplayInfo"); + for (std::vector::const_iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr) { std::string path = (*itr)->GetString(1); std::string fileName = Utils::GetPlainName(path.c_str()); @@ -225,8 +253,9 @@ void ExtractGameobjectModels() fwrite(&model.Header.WmoId, sizeof(uint32), 1, output); const char grp[] = { 'G' , 'R' , 'P', ' ' }; - for (std::vector::iterator itr2 = model.Groups.begin(); itr2 != model.Groups.end(); ++itr2) + for (std::vector::iterator groupItr = model.Groups.begin(); groupItr != model.Groups.end(); ++groupItr) { + WorldModelGroup* itr2 = *groupItr; const WMOGroupHeader& header = itr2->Header; fwrite(&header.Flags, sizeof(uint32), 1, output); fwrite(&header.WmoId, sizeof(uint32), 1, output); @@ -363,7 +392,6 @@ void LoadTile(dtNavMesh*& navMesh, const char* tile) int main(int argc, char* argv[]) { - _setmaxstdio(2048); uint32 threads = 4, extractFlags = 0; std::set mapIds; @@ -395,8 +423,8 @@ int main(int argc, char* argv[]) if (extractFlags & Constants::EXTRACT_FLAG_TEST) { - float start[] = { 16226.200195f, 16257.000000f, 13.202200f }; - float end[] = { 16245.725586f, 16382.465820f, 47.384956f }; + float start[] = { -45.4745407f, -29.5000954f, -21.4456501f }; + float end[] = { -107.686218f, -32.3544769f, -30.3459435f }; // float m_spos[3]; @@ -425,7 +453,7 @@ int main(int argc, char* argv[]) dtPolyRef m_startRef; dtPolyRef m_endRef; - FILE* mmap = fopen("mmaps/001.mmap", "rb"); + FILE* mmap = fopen("mmaps/631.mmap", "rb"); dtNavMeshParams params; int count = fread(¶ms, sizeof(dtNavMeshParams), 1, mmap); fclose(mmap); @@ -444,7 +472,7 @@ int main(int argc, char* argv[]) for (int j = 0; j <= 32; ++j) { char buff[100]; - sprintf(buff, "mmaps/001%02i%02i.mmtile", i, j); + sprintf(buff, "mmaps/631%02i%02i.mmtile", i, j); LoadTile(navMesh, buff); } } @@ -462,24 +490,38 @@ int main(int argc, char* argv[]) return 0; } - int hops; - dtPolyRef* hopBuffer = new dtPolyRef[8192]; - dtStatus status = navMeshQuery->findPath(m_startRef, m_endRef, m_spos, m_epos, &m_filter, hopBuffer, &hops, 8192); + dtStatus status; + status = navMeshQuery->initSlicedFindPath(m_startRef, m_endRef, m_spos, m_epos, &m_filter); + while (status != DT_SUCCESS) + status = navMeshQuery->updateSlicedFindPath(1, 0); - int resultHopCount; - float* straightPath = new float[2048*3]; - unsigned char* pathFlags = new unsigned char[2048]; dtPolyRef* pathRefs = new dtPolyRef[2048]; + int pcount = 0; + int resultHopCount = 0; + float* straightPath = new float[2048 * 3]; + unsigned char* pathFlags = new unsigned char[2048]; + dtPolyRef* hopBuffer = new dtPolyRef[8192]; - status = navMeshQuery->findStraightPath(m_spos, m_epos, hopBuffer, hops, straightPath, pathFlags, pathRefs, &resultHopCount, 2048); + navMeshQuery->finalizeSlicedFindPath(pathRefs, &pcount, 200); std::vector FinalPath; + + for (int i = 0; i < pcount; ++i) + { + navMeshQuery->findStraightPath(m_spos, m_epos, &pathRefs[i], 1, + straightPath, pathFlags, + hopBuffer, &resultHopCount, 200); + Vector3 finalV = Utils::ToWoWCoords(Vector3(straightPath[0 * 3 + 0], straightPath[0 * 3 + 1], straightPath[0 * 3 + 2])); + FinalPath.push_back(finalV); + printf("Point %f %f %f\n", finalV.x, finalV.y, finalV.z); + } + /* FinalPath.reserve(resultHopCount); - for (uint32 i = 0; i < resultHopCount; ++i) + for (int i = 0; i < resultHopCount; ++i) { Vector3 finalV = Utils::ToWoWCoords(Vector3(straightPath[i * 3 + 0], straightPath[i * 3 + 1], straightPath[i * 3 + 2])); FinalPath.push_back(finalV); printf("Point %f %f %f\n", finalV.x, finalV.y, finalV.z); - } + }*/ } return 0; diff --git a/src/tools/mesh_extractor/Model.cpp b/src/tools/mesh_extractor/Model.cpp index 2a1a80f41e..f88f620720 100644 --- a/src/tools/mesh_extractor/Model.cpp +++ b/src/tools/mesh_extractor/Model.cpp @@ -19,15 +19,15 @@ #include "MPQManager.h" #include "Utils.h" -Model::Model( std::string path ) : IsCollidable(false), IsBad(false) +Model::Model(std::string path) : IsCollidable(false), IsBad(false) { - Stream = MPQHandler->GetFile(Utils::FixModelPath(path)); - if (!Stream) + _Stream = MPQHandler->GetFile(Utils::FixModelPath(path)); + if (!_Stream) { IsBad = true; return; } - Header.Read(Stream); + Header.Read(_Stream); if (Header.OffsetBoundingNormals > 0 && Header.OffsetBoundingVertices > 0 && Header.OffsetBoundingTriangles > 0 && Header.BoundingRadius > 0.0f) { @@ -40,17 +40,17 @@ Model::Model( std::string path ) : IsCollidable(false), IsBad(false) Model::~Model() { - if (Stream) - fclose(Stream); + if (_Stream) + delete _Stream; } void Model::ReadVertices() { - fseek(Stream, Header.OffsetBoundingVertices, SEEK_SET); + _Stream->Seek(Header.OffsetBoundingVertices, SEEK_SET); Vertices.reserve(Header.CountBoundingVertices); for (uint32 i = 0; i < Header.CountBoundingVertices; ++i) { - Vertices.push_back(Vector3::Read(Stream)); + Vertices.push_back(Vector3::Read(_Stream)); if (Constants::ToWoWCoords) Vertices[i] = Utils::ToWoWCoords(Vertices[i]); } @@ -58,27 +58,24 @@ void Model::ReadVertices() void Model::ReadBoundingTriangles() { - fseek(Stream, Header.OffsetBoundingTriangles, SEEK_SET); + _Stream->Seek(Header.OffsetBoundingTriangles, SEEK_SET); Triangles.reserve(Header.CountBoundingTriangles / 3); for (uint32 i = 0; i < Header.CountBoundingTriangles / 3; i++) { Triangle tri; tri.Type = Constants::TRIANGLE_TYPE_DOODAD; - int count = 0; - count += fread(&tri.V0, sizeof(uint16), 1, Stream); - count += fread(&tri.V1, sizeof(uint16), 1, Stream); - count += fread(&tri.V2, sizeof(uint16), 1, Stream); - if (count != 3) - printf("Model::ReadBoundingTriangles: Error reading data, expected 3, read %d\n", count); + tri.V0 = _Stream->Read(); + tri.V1 = _Stream->Read(); + tri.V2 = _Stream->Read(); Triangles.push_back(tri); } } void Model::ReadBoundingNormals() { - fseek(Stream, Header.OffsetBoundingNormals, SEEK_SET); + _Stream->Seek(Header.OffsetBoundingNormals, SEEK_SET); Normals.reserve(Header.CountBoundingNormals); for (uint32 i = 0; i < Header.CountBoundingNormals; i++) - Normals.push_back(Vector3::Read(Stream)); + Normals.push_back(Vector3::Read(_Stream)); } diff --git a/src/tools/mesh_extractor/Model.h b/src/tools/mesh_extractor/Model.h index a1f224729d..9b460b1e2b 100644 --- a/src/tools/mesh_extractor/Model.h +++ b/src/tools/mesh_extractor/Model.h @@ -19,6 +19,7 @@ #define MODEL_H #include #include "Utils.h" +#include "Stream.h" class Model { @@ -34,7 +35,7 @@ public: std::vector Normals; std::vector > Triangles; bool IsCollidable; - FILE* Stream; + Stream* _Stream; bool IsBad; }; #endif \ No newline at end of file diff --git a/src/tools/mesh_extractor/ObjectDataHandler.h b/src/tools/mesh_extractor/ObjectDataHandler.h index 3b18427db4..346241f9ae 100644 --- a/src/tools/mesh_extractor/ObjectDataHandler.h +++ b/src/tools/mesh_extractor/ObjectDataHandler.h @@ -24,6 +24,7 @@ class ObjectDataHandler { public: ObjectDataHandler(ADT* _adt) : Source(_adt) {} + virtual ~ObjectDataHandler() {} void ProcessMapChunk(MapChunk* chunk); virtual void ProcessInternal(MapChunk* data) = 0; diff --git a/src/tools/mesh_extractor/Stream.cpp b/src/tools/mesh_extractor/Stream.cpp new file mode 100644 index 0000000000..f775d97d11 --- /dev/null +++ b/src/tools/mesh_extractor/Stream.cpp @@ -0,0 +1,47 @@ +#include "Stream.h" +#include + +Stream::Stream(char* buffer, uint32 size) : _size(size), _position(0) +{ + _buffer = new char[size]; + memcpy(_buffer, buffer, size); // Initialize the buffer +} + +Stream::~Stream() +{ + delete[] _buffer; +} + +char* Stream::Read(uint32 size) +{ + char* buff = new char[size]; + memcpy(buff, &_buffer[_position], size); + _position += size; + return buff; +} + +void Stream::Seek(uint32 position, uint32 type) +{ + switch (type) + { + case SEEK_SET: + _position = position; + break; + case SEEK_CUR: + _position += position; + break; + } +} + +std::string Stream::ReadString() +{ + std::string str; + while (true) + { + char b = Read(); + if (b == 0) + break; + str.push_back(b); + } + return str; +} \ No newline at end of file diff --git a/src/tools/mesh_extractor/Stream.h b/src/tools/mesh_extractor/Stream.h new file mode 100644 index 0000000000..647ff9d535 --- /dev/null +++ b/src/tools/mesh_extractor/Stream.h @@ -0,0 +1,59 @@ +#ifndef STREAM_H +#define STREAM_H + +#include "Define.h" +#include + +class Stream +{ +public: + Stream(char* buffer, uint32 size); + ~Stream(); + + template + T Read() + { + T ret = *((T*)(&_buffer[_position])); + _position += sizeof(T); + return ret; + } + + template + void Read(T* dest, uint32 size) + { + memcpy(dest, &_buffer[_position], size); + _position += size; + } + + template + void Skip() + { + _position += sizeof(T); + } + + char* Read(uint32 size); + std::string ReadString(); + + void Reset() + { + _position = 0; + } + + void Seek(uint32 position, uint32 type); + + uint32 GetSize() const + { + return _size; + } + + uint32 GetPos() const + { + return _position; + } + +private: + char* _buffer; + uint32 _size; + uint32 _position; +}; +#endif \ No newline at end of file diff --git a/src/tools/mesh_extractor/TileBuilder.cpp b/src/tools/mesh_extractor/TileBuilder.cpp index 7b70ccca44..faee5b767c 100644 --- a/src/tools/mesh_extractor/TileBuilder.cpp +++ b/src/tools/mesh_extractor/TileBuilder.cpp @@ -43,8 +43,8 @@ TileBuilder::TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, Config.detailSampleDist = 3.0f; Config.detailSampleMaxError = 1.25f; Config.walkableClimb = 1.0f / Config.ch; - Config.walkableHeight = 2.1 / Config.ch; - Config.walkableRadius = 0.6f / Config.cs; + Config.walkableHeight = 2.1; + Config.walkableRadius = 0.6f; Config.maxEdgeLen = Config.walkableRadius * 8; Config.borderSize = Config.walkableRadius + 8; Config.tileSize = 1800; @@ -59,19 +59,19 @@ TileBuilder::TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, InstanceConfig.mergeRegionArea = 100; InstanceConfig.walkableSlopeAngle = 50.0f; InstanceConfig.detailSampleDist = 3.0f; - InstanceConfig.detailSampleMaxError = 1.5f; + InstanceConfig.detailSampleMaxError = 1.25f; InstanceConfig.walkableClimb = 1.0f / InstanceConfig.ch; - InstanceConfig.walkableHeight = 2.1f / InstanceConfig.ch; - InstanceConfig.walkableRadius = 0.6f / InstanceConfig.cs; + InstanceConfig.walkableHeight = 2.1f; + InstanceConfig.walkableRadius = 0.6f; InstanceConfig.maxEdgeLen = 8 * InstanceConfig.walkableRadius; InstanceConfig.maxVertsPerPoly = 6; - InstanceConfig.maxSimplificationError = 1.25f; + InstanceConfig.maxSimplificationError = 1.3f; InstanceConfig.borderSize = 0; Context = new rcContext; } -void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax, dtNavMeshParams& /*navMeshParams*/ ) +void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax, dtNavMeshParams& /*navMeshParams*/ ) const { bmin = new float[3]; bmax = new float[3]; @@ -81,7 +81,7 @@ void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax, dtNavMeshPara bmax[2] = Constants::Origin[2] /*navMeshParams.orig[2]*/ + (Constants::TileSize * (Y + 1)); } -void TileBuilder::AddGeometry(WorldModelRoot* root, const WorldModelDefinition& def) +void TileBuilder::AddGeometry(WorldModelRoot const* root, const WorldModelDefinition& def) { _Geometry = new Geometry(); _Geometry->Transform = true; @@ -91,7 +91,7 @@ void TileBuilder::AddGeometry(WorldModelRoot* root, const WorldModelDefinition& OutputDebugVertices(); } -uint8* TileBuilder::BuildInstance( dtNavMeshParams& navMeshParams ) +uint8* TileBuilder::BuildInstance( dtNavMeshParams& /*navMeshParams*/ ) { float* bmin = NULL, *bmax = NULL; @@ -183,11 +183,11 @@ uint8* TileBuilder::BuildInstance( dtNavMeshParams& navMeshParams ) rcFreeHeightField(hf); rcFreeCompactHeightfield(chf); rcFreeContourSet(contours); - delete vertices; - delete triangles; - delete areas; - delete bmin; - delete bmax; + delete[] vertices; + delete[] triangles; + delete[] areas; + delete[] bmin; + delete[] bmax; if (!params.polyCount || !params.polys || Constants::TilesPerMap * Constants::TilesPerMap == params.polyCount) { @@ -226,7 +226,7 @@ uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams) adt->Read(); _Geometry->AddAdt(adt); delete adt; - + if (_Geometry->Vertices.empty() && _Geometry->Triangles.empty()) return NULL; @@ -234,7 +234,8 @@ uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams) CalculateTileBounds(bmin, bmax, navMeshParams); _Geometry->CalculateMinMaxHeight(bmin[1], bmax[1]); - // again, we load everything - wasteful but who cares + // This is commented out to reduce the size of the resulting files (and the time it takes to generate them), we shouldn't need to load 4 more ADTs each time. + /*// again, we load everything - wasteful but who cares for (int ty = Y - 1; ty <= Y + 1; ty++) { for (int tx = X - 1; tx <= X + 1; tx++) @@ -245,7 +246,7 @@ uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams) ADT* _adt = new ADT(Utils::GetAdtPath(World, tx, ty), tx, ty); // If this condition is met, it means that this WDT does not contain the ADT - if (!_adt->Data->Stream) + if (!_adt->Data->_Stream) { delete _adt; continue; @@ -254,7 +255,7 @@ uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams) _Geometry->AddAdt(_adt); delete _adt; } - } + }*/ OutputDebugVertices(); @@ -351,11 +352,11 @@ uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams) rcFreeHeightField(hf); rcFreeCompactHeightfield(chf); rcFreeContourSet(contours); - delete vertices; - delete triangles; - delete areas; - delete bmin; - delete bmax; + delete[] vertices; + delete[] triangles; + delete[] areas; + delete[] bmin; + delete[] bmax; if (!params.polyCount || !params.polys || Constants::TilesPerMap * Constants::TilesPerMap == params.polyCount) { @@ -386,7 +387,7 @@ uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams) return NULL; } -void TileBuilder::OutputDebugVertices() +void TileBuilder::OutputDebugVertices() const { if (Constants::Debug) { diff --git a/src/tools/mesh_extractor/TileBuilder.h b/src/tools/mesh_extractor/TileBuilder.h index fb8950c552..6171d40721 100644 --- a/src/tools/mesh_extractor/TileBuilder.h +++ b/src/tools/mesh_extractor/TileBuilder.h @@ -32,11 +32,11 @@ public: TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, int y, uint32 mapId); ~TileBuilder(); - void CalculateTileBounds(float*& bmin, float*& bmax, dtNavMeshParams& navMeshParams); + void CalculateTileBounds(float*& bmin, float*& bmax, dtNavMeshParams& navMeshParams) const; uint8* BuildTiled(dtNavMeshParams& navMeshParams); uint8* BuildInstance(dtNavMeshParams& navMeshParams); - void AddGeometry(WorldModelRoot* root, const WorldModelDefinition& def); - void OutputDebugVertices(); + void AddGeometry(WorldModelRoot const* root, const WorldModelDefinition& def); + void OutputDebugVertices() const; std::string World; int X; int Y; diff --git a/src/tools/mesh_extractor/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp index f82eb6ed1c..b8ebc0b8fd 100644 --- a/src/tools/mesh_extractor/Utils.cpp +++ b/src/tools/mesh_extractor/Utils.cpp @@ -18,6 +18,7 @@ #include "Utils.h" #include "WorldModelHandler.h" #include "Constants.h" +#include "Stream.h" #include #include "G3D/Matrix4.h" #include "G3D/Quat.h" @@ -53,40 +54,9 @@ void Utils::CreateDir( const std::string& Path ) #endif } -void Utils::Reverse(char word[]) +void Utils::Reverse(std::string& str) { - int len = strlen(word); - for (int i = 0;i < len / 2; i++) - { - word[i] ^= word[len-i-1]; - word[len-i-1] ^= word[i]; - word[i] ^= word[len-i-1]; - } -} - -std::string Utils::ReadString( FILE* file ) -{ - std::string ret; - while (true) - { - char b; - if (fread(&b, sizeof(char), 1, file) != 1 || b == 0) - break; - ret.push_back(b); - } - return ret; -} - -uint32 Utils::Size( FILE* file ) -{ - // store the old position - uint32 offset = ftell(file); - // Get file size - fseek(file, 0, SEEK_END); - uint32 size = ftell(file); - // reset back to the old position - fseek(file, offset, SEEK_SET); - return size; + std::reverse(str.begin(), str.end()); } Vector3 Utils::ToRecast(const Vector3& val ) @@ -104,7 +74,7 @@ std::string Utils::FixModelPath(const std::string& path ) return Utils::GetPathBase(path) + ".M2"; } -Vector3 Utils::TransformDoodadVertex(const IDefinition& def, Vector3& vec, bool translate) +Vector3 Utils::TransformDoodadVertex(const IDefinition& def, Vector3 vec, bool translate) { // Sources of information: /// http://www.pxr.dk/wowdev/wiki/index.php?title=ADT/v18&oldid=3715 @@ -122,7 +92,7 @@ Vector3 Utils::TransformDoodadVertex(const IDefinition& def, Vector3& vec, bool return ret; } -Vector3 Utils::TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, Vector3& vec, bool translate ) +Vector3 Utils::TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& /*root*/, const Vector3& vec, bool translate) { G3D::Quat quat = G3D::Quat(-inst.QuatY, inst.QuatZ, -inst.QuatX, inst.QuatW); @@ -153,12 +123,9 @@ std::string Utils::GetPathBase(const std::string& path ) return path; } -Vector3 Vector3::Read( FILE* file ) +Vector3 Vector3::Read(Stream* file) { - Vector3 ret; - if (fread(&ret, sizeof(Vector3), 1, file) != 1) - printf("Vector3::Read: Failed to read some data expected 1, read 0\n"); - return ret; + return file->Read(); } Vector3 Utils::GetLiquidVert(const IDefinition& def, Vector3 basePosition, float height, int x, int y, bool translate) @@ -184,41 +151,36 @@ std::string Utils::Replace( std::string str, const std::string& oldStr, const st return str; } -void Utils::SaveToDisk( FILE* stream, const std::string& path ) +void Utils::SaveToDisk(Stream* stream, const std::string& path) { FILE* disk = fopen(path.c_str(), "wb"); if (!disk) { printf("SaveToDisk: Could not save file %s to disk, please verify that you have write permissions on that directory\n", path.c_str()); - fclose(stream); + delete stream; return; } - uint32 size = Utils::Size(stream); - uint8* data = new uint8[size]; - // Read the data to an array - size_t read = fread(data, size, 1, stream); - if (read != 1) - { - printf("SaveToDisk: Error reading from Stream while trying to save file %s to disk.\n", path.c_str()); - fclose(disk); - fclose(stream); - return; - } + uint32 size = stream->GetSize(); + stream->Reset(); // Reset the stream just in case + // Read the data to an array + char* data = stream->Read(size); + // And write it in the file size_t wrote = fwrite(data, size, 1, disk); if (wrote != 1) { printf("SaveToDisk: Error writing to the file while trying to save %s to disk.\n", path.c_str()); - fclose(stream); + delete[] data; + delete stream; fclose(disk); return; } // Close the filestream fclose(disk); - fclose(stream); + delete stream; // Free the used memory delete[] data; @@ -239,249 +201,193 @@ std::string Utils::GetExtension( std::string path ) return extension; } -void MapChunkHeader::Read(FILE* stream) +void MapChunkHeader::Read(Stream* stream) { - int count = 0; - - count += fread(&Flags, sizeof(uint32), 1, stream); - count += fread(&IndexX, sizeof(uint32), 1, stream); - count += fread(&IndexY, sizeof(uint32), 1, stream); - count += fread(&Layers, sizeof(uint32), 1, stream); - count += fread(&DoodadRefs, sizeof(uint32), 1, stream); - count += fread(&OffsetMCVT, sizeof(uint32), 1, stream); - count += fread(&OffsetMCNR, sizeof(uint32), 1, stream); - count += fread(&OffsetMCLY, sizeof(uint32), 1, stream); - count += fread(&OffsetMCRF, sizeof(uint32), 1, stream); - count += fread(&OffsetMCAL, sizeof(uint32), 1, stream); - count += fread(&SizeMCAL, sizeof(uint32), 1, stream); - count += fread(&OffsetMCSH, sizeof(uint32), 1, stream); - count += fread(&SizeMCSH, sizeof(uint32), 1, stream); - count += fread(&AreaId, sizeof(uint32), 1, stream); - count += fread(&MapObjectRefs, sizeof(uint32), 1, stream); - count += fread(&Holes, sizeof(uint32), 1, stream); - LowQualityTextureMap = new uint32[4]; - count += fread(LowQualityTextureMap, sizeof(uint32), 4, stream); - count += fread(&PredTex, sizeof(uint32), 1, stream); - count += fread(&NumberEffectDoodad, sizeof(uint32), 1, stream); - count += fread(&OffsetMCSE, sizeof(uint32), 1, stream); - count += fread(&SoundEmitters, sizeof(uint32), 1, stream); - count += fread(&OffsetMCLQ, sizeof(uint32), 1, stream); - count += fread(&SizeMCLQ, sizeof(uint32), 1, stream); + Flags = stream->Read(); + IndexX = stream->Read(); + IndexY = stream->Read(); + Layers = stream->Read(); + DoodadRefs = stream->Read(); + OffsetMCVT = stream->Read(); + OffsetMCNR = stream->Read(); + OffsetMCLY = stream->Read(); + OffsetMCRF = stream->Read(); + OffsetMCAL = stream->Read(); + SizeMCAL = stream->Read(); + OffsetMCSH = stream->Read(); + SizeMCSH = stream->Read(); + AreaId = stream->Read(); + MapObjectRefs = stream->Read(); + Holes = stream->Read(); + stream->Read(LowQualityTextureMap, sizeof(uint32) * 4); + PredTex = stream->Read(); + NumberEffectDoodad = stream->Read(); + OffsetMCSE = stream->Read(); + SoundEmitters = stream->Read(); + OffsetMCLQ = stream->Read(); + SizeMCLQ = stream->Read(); Position = Vector3::Read(stream); - count += fread(&OffsetMCCV, sizeof(uint32), 1, stream); - - if (count != 27) - printf("MapChunkHeader::Read: Failed to read some data expected 27, read %d\n", count); + OffsetMCCV = stream->Read(); } -void MHDR::Read(FILE* stream) +void MHDR::Read(Stream* stream) { - int count = 0; - - count += fread(&Flags, sizeof(uint32), 1, stream); - count += fread(&OffsetMCIN, sizeof(uint32), 1, stream); - count += fread(&OffsetMTEX, sizeof(uint32), 1, stream); - count += fread(&OffsetMMDX, sizeof(uint32), 1, stream); - count += fread(&OffsetMMID, sizeof(uint32), 1, stream); - count += fread(&OffsetMWMO, sizeof(uint32), 1, stream); - count += fread(&OffsetMWID, sizeof(uint32), 1, stream); - count += fread(&OffsetMDDF, sizeof(uint32), 1, stream); - count += fread(&OffsetMODF, sizeof(uint32), 1, stream); - count += fread(&OffsetMFBO, sizeof(uint32), 1, stream); - count += fread(&OffsetMH2O, sizeof(uint32), 1, stream); - count += fread(&OffsetMTFX, sizeof(uint32), 1, stream); - - if (count != 12) - printf("MHDR::Read: Failed to read some data expected 12, read %d\n", count); + Flags = stream->Read(); + OffsetMCIN = stream->Read(); + OffsetMTEX = stream->Read(); + OffsetMMDX = stream->Read(); + OffsetMMID = stream->Read(); + OffsetMWMO = stream->Read(); + OffsetMWID = stream->Read(); + OffsetMDDF = stream->Read(); + OffsetMODF = stream->Read(); + OffsetMFBO = stream->Read(); + OffsetMH2O = stream->Read(); + OffsetMTFX = stream->Read(); } -void ModelHeader::Read(FILE* stream) +void ModelHeader::Read(Stream* stream) { - int count = 0; - - count += fread(&Magic, sizeof(char), 4, stream); + stream->Read(Magic, 4); Magic[4] = '\0'; // null-terminate it. - count += fread(&Version, sizeof(uint32), 1, stream); - count += fread(&LengthModelName, sizeof(uint32), 1, stream); - count += fread(&OffsetName, sizeof(uint32), 1, stream); - count += fread(&ModelFlags, sizeof(uint32), 1, stream); - count += fread(&CountGlobalSequences, sizeof(uint32), 1, stream); - count += fread(&OffsetGlobalSequences, sizeof(uint32), 1, stream); - count += fread(&CountAnimations, sizeof(uint32), 1, stream); - count += fread(&OffsetAnimations, sizeof(uint32), 1, stream); - count += fread(&CountAnimationLookup, sizeof(uint32), 1, stream); - count += fread(&OffsetAnimationLookup, sizeof(uint32), 1, stream); - count += fread(&CountBones, sizeof(uint32), 1, stream); - count += fread(&OffsetBones, sizeof(uint32), 1, stream); - count += fread(&CountKeyBoneLookup, sizeof(uint32), 1, stream); - count += fread(&OffsetKeyBoneLookup, sizeof(uint32), 1, stream); - count += fread(&CountVertices, sizeof(uint32), 1, stream); - count += fread(&OffsetVertices, sizeof(uint32), 1, stream); - count += fread(&CountViews, sizeof(uint32), 1, stream); - count += fread(&CountColors, sizeof(uint32), 1, stream); - count += fread(&OffsetColors, sizeof(uint32), 1, stream); - count += fread(&CountTextures, sizeof(uint32), 1, stream); - count += fread(&OffsetTextures, sizeof(uint32), 1, stream); - count += fread(&CountTransparency, sizeof(uint32), 1, stream); - count += fread(&OffsetTransparency, sizeof(uint32), 1, stream); - count += fread(&CountUvAnimation, sizeof(uint32), 1, stream); - count += fread(&OffsetUvAnimation, sizeof(uint32), 1, stream); - count += fread(&CountTexReplace, sizeof(uint32), 1, stream); - count += fread(&OffsetTexReplace, sizeof(uint32), 1, stream); - count += fread(&CountRenderFlags, sizeof(uint32), 1, stream); - count += fread(&OffsetRenderFlags, sizeof(uint32), 1, stream); - count += fread(&CountBoneLookup, sizeof(uint32), 1, stream); - count += fread(&OffsetBoneLookup, sizeof(uint32), 1, stream); - count += fread(&CountTexLookup, sizeof(uint32), 1, stream); - count += fread(&OffsetTexLookup, sizeof(uint32), 1, stream); - count += fread(&CountTexUnits, sizeof(uint32), 1, stream); - count += fread(&OffsetTexUnits, sizeof(uint32), 1, stream); - count += fread(&CountTransLookup, sizeof(uint32), 1, stream); - count += fread(&OffsetTransLookup, sizeof(uint32), 1, stream); - count += fread(&CountUvAnimLookup, sizeof(uint32), 1, stream); - count += fread(&OffsetUvAnimLookup, sizeof(uint32), 1, stream); + Version = stream->Read(); + LengthModelName = stream->Read(); + OffsetName = stream->Read(); + ModelFlags = stream->Read(); + CountGlobalSequences = stream->Read(); + OffsetGlobalSequences = stream->Read(); + CountAnimations = stream->Read(); + OffsetAnimations = stream->Read(); + CountAnimationLookup = stream->Read(); + OffsetAnimationLookup = stream->Read(); + CountBones = stream->Read(); + OffsetBones = stream->Read(); + CountKeyBoneLookup = stream->Read(); + OffsetKeyBoneLookup = stream->Read(); + CountVertices = stream->Read(); + OffsetVertices = stream->Read(); + CountViews = stream->Read(); + CountColors = stream->Read(); + OffsetColors = stream->Read(); + CountTextures = stream->Read(); + OffsetTextures = stream->Read(); + CountTransparency = stream->Read(); + OffsetTransparency = stream->Read(); + CountUvAnimation = stream->Read(); + OffsetUvAnimation = stream->Read(); + CountTexReplace = stream->Read(); + OffsetTexReplace = stream->Read(); + CountRenderFlags = stream->Read(); + OffsetRenderFlags = stream->Read(); + CountBoneLookup = stream->Read(); + OffsetBoneLookup = stream->Read(); + CountTexLookup = stream->Read(); + OffsetTexLookup = stream->Read(); + CountTexUnits = stream->Read(); + OffsetTexUnits = stream->Read(); + CountTransLookup = stream->Read(); + OffsetTransLookup = stream->Read(); + CountUvAnimLookup = stream->Read(); + OffsetUvAnimLookup = stream->Read(); VertexBox[0] = Vector3::Read(stream); VertexBox[1] = Vector3::Read(stream); - count += fread(&VertexRadius, sizeof(float), 1, stream); + VertexRadius = stream->Read(); BoundingBox[0] = Vector3::Read(stream); BoundingBox[1] = Vector3::Read(stream); - count += fread(&BoundingRadius, sizeof(float), 1, stream); - count += fread(&CountBoundingTriangles, sizeof(uint32), 1, stream); - count += fread(&OffsetBoundingTriangles, sizeof(uint32), 1, stream); - count += fread(&CountBoundingVertices, sizeof(uint32), 1, stream); - count += fread(&OffsetBoundingVertices, sizeof(uint32), 1, stream); - count += fread(&CountBoundingNormals, sizeof(uint32), 1, stream); - count += fread(&OffsetBoundingNormals, sizeof(uint32), 1, stream); - - if (count != 51) - printf("ModelHeader::Read: Failed to read some data expected 51, read %d\n", count); - + BoundingRadius = stream->Read(); + CountBoundingTriangles = stream->Read(); + OffsetBoundingTriangles = stream->Read(); + CountBoundingVertices = stream->Read(); + OffsetBoundingVertices = stream->Read(); + CountBoundingNormals = stream->Read(); + OffsetBoundingNormals = stream->Read(); } -WorldModelHeader WorldModelHeader::Read(FILE* stream) +void WorldModelHeader::Read(Stream* stream) { - WorldModelHeader ret; - int count = 0; - - count += fread(&ret.CountMaterials, sizeof(uint32), 1, stream); - count += fread(&ret.CountGroups, sizeof(uint32), 1, stream); - count += fread(&ret.CountPortals, sizeof(uint32), 1, stream); - count += fread(&ret.CountLights, sizeof(uint32), 1, stream); - count += fread(&ret.CountModels, sizeof(uint32), 1, stream); - count += fread(&ret.CountDoodads, sizeof(uint32), 1, stream); - count += fread(&ret.CountSets, sizeof(uint32), 1, stream); - count += fread(&ret.AmbientColorUnk, sizeof(uint32), 1, stream); - count += fread(&ret.WmoId, sizeof(uint32), 1, stream); - ret.BoundingBox[0] = Vector3::Read(stream); - ret.BoundingBox[1] = Vector3::Read(stream); - count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream); - - if (count != 10) - printf("WorldModelHeader::Read: Failed to read some data expected 10, read %d\n", count); - - return ret; + CountMaterials = stream->Read(); + CountGroups = stream->Read(); + CountPortals = stream->Read(); + CountLights = stream->Read(); + CountModels = stream->Read(); + CountDoodads = stream->Read(); + CountSets = stream->Read(); + AmbientColorUnk = stream->Read(); + WmoId = stream->Read(); + BoundingBox[0] = Vector3::Read(stream); + BoundingBox[1] = Vector3::Read(stream); + LiquidTypeRelated = stream->Read(); } -DoodadInstance DoodadInstance::Read(FILE* stream) +DoodadInstance DoodadInstance::Read(Stream* stream) { DoodadInstance ret; - int count = 0; - count += fread(&ret.FileOffset, sizeof(uint32), 1, stream); + ret.FileOffset = stream->Read(); ret.Position = Vector3::Read(stream); - count += fread(&ret.QuatW, sizeof(float), 1, stream); - count += fread(&ret.QuatX, sizeof(float), 1, stream); - count += fread(&ret.QuatY, sizeof(float), 1, stream); - count += fread(&ret.QuatZ, sizeof(float), 1, stream); - count += fread(&ret.Scale, sizeof(float), 1, stream); - count += fread(&ret.LightColor, sizeof(uint32), 1, stream); - - if (count != 7) - printf("DoodadInstance::Read: Failed to read some data expected 7, read %d\n", count); - + ret.QuatW = stream->Read(); + ret.QuatX = stream->Read(); + ret.QuatY = stream->Read(); + ret.QuatZ = stream->Read(); + ret.Scale = stream->Read(); + ret.LightColor = stream->Read(); return ret; } -DoodadSet DoodadSet::Read(FILE* stream) +DoodadSet DoodadSet::Read(Stream* stream) { DoodadSet ret; - char name[21]; - int count = 0; - - count += fread(&name, sizeof(char), 20, stream); - name[20] = '\0'; - ret.Name = name; - count += fread(&ret.FirstInstanceIndex, sizeof(uint32), 1, stream); - count += fread(&ret.CountInstances, sizeof(uint32), 1, stream); - count += fread(&ret.UnknownZero, sizeof(uint32), 1, stream); - - if (count != 23) - printf("DoodadSet::Read: Failed to read some data expected 23, read %d\n", count); - + char* name = stream->Read(20); + ret.Name = std::string(name, 20); + delete[] name; + ret.FirstInstanceIndex = stream->Read(); + ret.CountInstances = stream->Read(); + ret.UnknownZero = stream->Read(); + return ret; } -LiquidHeader LiquidHeader::Read(FILE* stream) +void LiquidHeader::Read(Stream* stream) { - LiquidHeader ret; - int count = 0; - count += fread(&ret.CountXVertices, sizeof(uint32), 1, stream); - count += fread(&ret.CountYVertices, sizeof(uint32), 1, stream); - count += fread(&ret.Width, sizeof(uint32), 1, stream); - count += fread(&ret.Height, sizeof(uint32), 1, stream); - ret.BaseLocation = Vector3::Read(stream); - count += fread(&ret.MaterialId, sizeof(uint16), 1, stream); - - if (count != 5) - printf("LiquidHeader::Read: Failed to read some data expected 5, read %d\n", count); - - return ret; + CountXVertices = stream->Read(); + CountYVertices = stream->Read(); + Width = stream->Read(); + Height = stream->Read(); + BaseLocation = Vector3::Read(stream); + MaterialId = stream->Read(); } -LiquidData LiquidData::Read(FILE* stream, LiquidHeader& header) +void LiquidData::Read(Stream* stream, LiquidHeader& header) { - LiquidData ret; - ret.HeightMap = new float*[header.CountXVertices]; + CountXVertices = header.CountXVertices; + Width = header.Width; + + HeightMap = new float*[header.CountXVertices]; for (uint32 i = 0; i < header.CountXVertices; ++i) - ret.HeightMap[i] = new float[header.CountYVertices]; + HeightMap[i] = new float[header.CountYVertices]; - ret.RenderFlags = new uint8*[header.Width]; + RenderFlags = new uint8*[header.Width]; for (uint32 i = 0; i < header.Width; ++i) - ret.RenderFlags[i] = new uint8[header.Height]; + RenderFlags[i] = new uint8[header.Height]; for (uint32 y = 0; y < header.CountYVertices; y++) { for (uint32 x = 0; x < header.CountXVertices; x++) { - uint32 discard; - float tmp; - if (fread(&discard, sizeof(uint32), 1, stream) == 1 && - fread(&tmp, sizeof(float), 1, stream) == 1) - { - ret.HeightMap[x][y] = tmp; - } + stream->Skip(); + HeightMap[x][y] = stream->Read(); } } for (uint32 y = 0; y < header.Height; y++) - { for (uint32 x = 0; x < header.Width; x++) - { - uint8 tmp = 0; - if (fread(&tmp, sizeof(uint8), 1, stream) == 1) - ret.RenderFlags[x][y] = tmp; - } - } - - return ret; + RenderFlags[x][y] = stream->Read(); } -H2ORenderMask H2ORenderMask::Read(FILE* stream) +H2ORenderMask H2ORenderMask::Read(Stream* stream) { H2ORenderMask ret; - int32 count; - if ((count = fread(&ret.Mask, sizeof(uint8), 8, stream)) != 8) - printf("H2OHeader::Read: Failed to read some data expected 8, read %d\n", count); + stream->Read(ret.Mask, sizeof(uint8) * 8); return ret; } @@ -497,38 +403,42 @@ bool MCNKLiquidData::IsWater(int x, int y, float height) return false; } -H2OHeader H2OHeader::Read(FILE* stream) +MCNKLiquidData::~MCNKLiquidData() +{ + if (!Heights) + return; + + for (uint32 i = 0; i < 9; ++i) + delete[] Heights[i]; + delete[] Heights; + Heights = NULL; +} + +H2OHeader H2OHeader::Read(Stream* stream) { H2OHeader ret; - int count = 0; - count += fread(&ret.OffsetInformation, sizeof(uint32), 1, stream); - count += fread(&ret.LayerCount, sizeof(uint32), 1, stream); - count += fread(&ret.OffsetRender, sizeof(uint32), 1, stream); - - if (count != 3) - printf("H2OHeader::Read: Failed to read some data expected 3, read %d\n", count); - + + ret.OffsetInformation = stream->Read(); + ret.LayerCount = stream->Read(); + ret.OffsetRender = stream->Read(); + return ret; } -H2OInformation H2OInformation::Read(FILE* stream) +H2OInformation H2OInformation::Read(Stream* stream) { H2OInformation ret; - int count = 0; - count += fread(&ret.LiquidType, sizeof(uint16), 1, stream); - count += fread(&ret.Flags, sizeof(uint16), 1, stream); - count += fread(&ret.HeightLevel1, sizeof(float), 1, stream); - count += fread(&ret.HeightLevel2, sizeof(float), 1, stream); - count += fread(&ret.OffsetX, sizeof(uint8), 1, stream); - count += fread(&ret.OffsetY, sizeof(uint8), 1, stream); - count += fread(&ret.Width, sizeof(uint8), 1, stream); - count += fread(&ret.Height, sizeof(uint8), 1, stream); - count += fread(&ret.OffsetMask2, sizeof(uint32), 1, stream); - count += fread(&ret.OffsetHeightmap, sizeof(uint32), 1, stream); - - if (count != 10) - printf("H2OInformation::Read: Failed to read some data expected 10, read %d\n", count); - + ret.LiquidType = stream->Read(); + ret.Flags = stream->Read(); + ret.HeightLevel1 = stream->Read(); + ret.HeightLevel2 = stream->Read(); + ret.OffsetX = stream->Read(); + ret.OffsetY = stream->Read(); + ret.Width = stream->Read(); + ret.Height = stream->Read(); + ret.OffsetMask2 = stream->Read(); + ret.OffsetHeightmap = stream->Read(); + return ret; } @@ -541,24 +451,30 @@ char* Utils::GetPlainName(const char* FileName) return (char*)FileName; } -WMOGroupHeader WMOGroupHeader::Read( FILE* stream ) +WMOGroupHeader WMOGroupHeader::Read(Stream* stream) { WMOGroupHeader ret; - int count = 0; - count += fread(&ret.OffsetGroupName, sizeof(uint32), 1, stream); - count += fread(&ret.OffsetDescriptiveName, sizeof(uint32), 1, stream); - count += fread(&ret.Flags, sizeof(uint32), 1, stream); + ret.OffsetGroupName = stream->Read(); + ret.OffsetDescriptiveName = stream->Read(); + ret.Flags = stream->Read(); ret.BoundingBox[0] = Vector3::Read(stream); ret.BoundingBox[1] = Vector3::Read(stream); - count += fread(&ret.OffsetPortals, sizeof(uint32), 1, stream); - count += fread(&ret.CountPortals, sizeof(uint32), 1, stream); - count += fread(&ret.CountBatches, sizeof(uint16), 4, stream); - count += fread(&ret.Fogs, sizeof(uint8), 4, stream); - count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream); - count += fread(&ret.WmoId, sizeof(uint32), 1, stream); - - if (count != 15) - printf("WMOGroupHeader::Read: Failed to read some data expected 15, read %d\n", count); - + ret.OffsetPortals = stream->Read(); + ret.CountPortals = stream->Read(); + stream->Read(ret.CountBatches, sizeof(uint16) * 4); + stream->Read(ret.Fogs, sizeof(uint8) * 4); + ret.LiquidTypeRelated = stream->Read(); + ret.WmoId = stream->Read(); + return ret; } + +void Utils::InitializeMmapTileHeader(MmapTileHeader& header) +{ + memset(&header, 0, sizeof(MmapTileHeader)); + header.mmapMagic = MMAP_MAGIC; + header.dtVersion = DT_NAVMESH_VERSION; + header.mmapVersion = MMAP_VERSION; + header.size = 0; + header.usesLiquids = true; +} diff --git a/src/tools/mesh_extractor/Utils.h b/src/tools/mesh_extractor/Utils.h index 612282f3e8..8424d92baa 100644 --- a/src/tools/mesh_extractor/Utils.h +++ b/src/tools/mesh_extractor/Utils.h @@ -27,6 +27,8 @@ #include "Define.h" #include "Constants.h" +#include "Stream.h" + #include struct WorldModelDefinition; @@ -59,7 +61,7 @@ struct Vector3 return Vector3(x * s, y * s, z * s); } - static Vector3 Read(FILE* file); + static Vector3 Read(Stream* file); }; struct TilePos @@ -100,7 +102,7 @@ public: uint32 AreaId; uint32 MapObjectRefs; uint32 Holes; - uint32* LowQualityTextureMap; + uint32 LowQualityTextureMap[4]; uint32 PredTex; uint32 NumberEffectDoodad; uint32 OffsetMCSE; @@ -110,7 +112,7 @@ public: Vector3 Position; uint32 OffsetMCCV; - void Read(FILE* stream); + void Read(Stream* stream); }; class MHDR @@ -130,7 +132,7 @@ public: uint32 OffsetMH2O; uint32 OffsetMTFX; - void Read(FILE* stream); + void Read(Stream* stream); }; class ModelHeader @@ -187,7 +189,7 @@ public: uint32 CountBoundingNormals; uint32 OffsetBoundingNormals; - void Read(FILE* stream); + void Read(Stream* stream); }; class WorldModelHeader @@ -206,7 +208,7 @@ public: Vector3 BoundingBox[2]; uint32 LiquidTypeRelated; - static WorldModelHeader Read(FILE* stream); + void Read(Stream* stream); }; class DoodadInstance @@ -223,7 +225,7 @@ public: float Scale; uint32 LightColor; - static DoodadInstance Read(FILE* stream); + static DoodadInstance Read(Stream* stream); }; class DoodadSet @@ -235,13 +237,13 @@ public: uint32 CountInstances; uint32 UnknownZero; - static DoodadSet Read(FILE* stream); + static DoodadSet Read(Stream* stream); }; class LiquidHeader { public: - LiquidHeader() {} + LiquidHeader() : CountXVertices(0), CountYVertices(0), Width(0), Height(0), BaseLocation(0,0,0), MaterialId(0) {} uint32 CountXVertices; uint32 CountYVertices; uint32 Width; @@ -249,22 +251,36 @@ public: Vector3 BaseLocation; uint16 MaterialId; - static LiquidHeader Read(FILE* stream); + void Read(Stream* stream); }; class LiquidData { public: - LiquidData() {} + LiquidData() : HeightMap(NULL), RenderFlags(NULL), CountXVertices(0), Width(0) {} + + ~LiquidData() + { + for (uint32 i = 0; i < CountXVertices; ++i) + delete[] HeightMap[i]; + delete[] HeightMap; + + for (uint32 i = 0; i < Width; ++i) + delete[] RenderFlags[i]; + delete[] RenderFlags; + } + float** HeightMap; uint8** RenderFlags; + uint32 CountXVertices; + uint32 Width; - bool ShouldRender(int x, int y) + bool ShouldRender(int x, int y) const { return RenderFlags[x][y] != 0x0F; } - static LiquidData Read(FILE* stream, LiquidHeader& header); + void Read(Stream* stream, LiquidHeader& header); }; class H2ORenderMask @@ -278,14 +294,15 @@ public: return (Mask[y] >> x & 1) != 0; } - static H2ORenderMask Read(FILE* stream); + static H2ORenderMask Read(Stream* stream); }; class MCNKLiquidData { public: - MCNKLiquidData() {} + MCNKLiquidData() : Heights(NULL) {} MCNKLiquidData(float** heights, H2ORenderMask mask) : Heights(heights), Mask(mask) {} + ~MCNKLiquidData(); float** Heights; H2ORenderMask Mask; @@ -301,7 +318,7 @@ public: uint32 LayerCount; uint32 OffsetRender; - static H2OHeader Read(FILE* stream); + static H2OHeader Read(Stream* stream); }; class H2OInformation @@ -319,7 +336,7 @@ public: uint32 OffsetMask2; uint32 OffsetHeightmap; - static H2OInformation Read(FILE* stream); + static H2OInformation Read(Stream* stream); }; class WMOGroupHeader @@ -338,7 +355,7 @@ public: uint32 LiquidTypeRelated; uint32 WmoId; - static WMOGroupHeader Read(FILE* stream); + static WMOGroupHeader Read(Stream* stream); }; // Dummy class to act as an interface. @@ -351,7 +368,7 @@ public: }; #define MMAP_MAGIC 0x4d4d4150 // 'MMAP' -#define MMAP_VERSION 3 +#define MMAP_VERSION 5 struct MmapTileHeader { @@ -359,18 +376,13 @@ struct MmapTileHeader uint32 dtVersion; uint32 mmapVersion; uint32 size; - bool usesLiquids; - - MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION), - mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) {} + bool usesLiquids : 1; }; class Utils { public: - static void Reverse(char word[]); - static std::string ReadString(FILE* file); - static uint32 Size(FILE* file); + static void Reverse(std::string& str); static Vector3 ToRecast(const Vector3& val ); static std::string GetAdtPath(const std::string& world, int x, int y); static std::string FixModelPath(const std::string& path); @@ -394,14 +406,15 @@ public: return false; return true; } - static std::string Replace( std::string str, const std::string& oldStr, const std::string& newStr ); - static void CreateDir( const std::string& Path ); - static void SaveToDisk(FILE* stream, const std::string& path); - static Vector3 ToWoWCoords(const Vector3& vec ); - static std::string GetExtension( std::string path ); + static std::string Replace(std::string str, const std::string& oldStr, const std::string& newStr); + static void CreateDir(const std::string& Path); + static void SaveToDisk(Stream* stream, const std::string& path); + static Vector3 ToWoWCoords(const Vector3& vec); + static std::string GetExtension( std::string path); static char* GetPlainName(const char* FileName); - static Vector3 TransformDoodadVertex(const IDefinition& def, Vector3& vec, bool translate = true); - static Vector3 VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix, bool normal = false ); - static Vector3 TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, Vector3& vec, bool translate = true ); + static Vector3 TransformDoodadVertex(const IDefinition& def, Vector3 vec, bool translate = true); + static Vector3 VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix, bool normal = false); + static Vector3 TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, const Vector3& vec, bool translate = true); + static void InitializeMmapTileHeader(MmapTileHeader& header); }; #endif diff --git a/src/tools/mesh_extractor/WDT.cpp b/src/tools/mesh_extractor/WDT.cpp index 07aec95365..c4afec32a6 100644 --- a/src/tools/mesh_extractor/WDT.cpp +++ b/src/tools/mesh_extractor/WDT.cpp @@ -20,6 +20,7 @@ #include "ChunkedData.h" #include "Utils.h" #include "WorldModelHandler.h" +#include "Cache.h" WDT::WDT(std::string file) : IsGlobalModel(false), IsValid(false), Model(NULL) { @@ -37,8 +38,8 @@ void WDT::ReadGlobalModel() IsGlobalModel = true; ModelDefinition = WorldModelDefinition::Read(defChunk->GetStream()); - ModelFile = Utils::ReadString(fileChunk->GetStream()); - Model = new WorldModelRoot(ModelFile); + ModelFile = fileChunk->GetStream()->ReadString(); + Model = Cache->WorldModelCache.Get(ModelFile); } void WDT::ReadTileTable() @@ -47,20 +48,14 @@ void WDT::ReadTileTable() if (!chunk) return; IsValid = true; - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); for (int y = 0; y < 64; ++y) { for (int x = 0; x < 64; ++x) { const uint32 hasTileFlag = 0x1; - uint32 flags; - uint32 discard; - int count = 0; - count += fread(&flags, sizeof(uint32), 1, stream); - count += fread(&discard, sizeof(uint32), 1, stream); - - if (count != 2) - printf("WDT::ReadTileTable: Failed to read some data expected 2, read %d\n", count); + uint32 flags = stream->Read(); + stream->Skip(); if (flags & hasTileFlag) TileTable.push_back(TilePos(x, y)); @@ -69,9 +64,9 @@ void WDT::ReadTileTable() } } -bool WDT::HasTile( int x, int y ) +bool WDT::HasTile( int x, int y ) const { - for (std::vector::iterator itr = TileTable.begin(); itr != TileTable.end(); ++itr) + for (std::vector::const_iterator itr = TileTable.begin(); itr != TileTable.end(); ++itr) if (itr->X == x && itr->Y == y) return true; return false; diff --git a/src/tools/mesh_extractor/WDT.h b/src/tools/mesh_extractor/WDT.h index d1e8e30918..0deb5830e7 100644 --- a/src/tools/mesh_extractor/WDT.h +++ b/src/tools/mesh_extractor/WDT.h @@ -36,8 +36,8 @@ public: bool IsValid; std::string ModelFile; WorldModelDefinition ModelDefinition; - WorldModelRoot* Model; - bool HasTile(int x, int y); + WorldModelRoot const* Model; + bool HasTile(int x, int y) const; private: void ReadGlobalModel(); void ReadTileTable(); diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp index 6ea72d6edb..3e16894ced 100644 --- a/src/tools/mesh_extractor/WorldModelGroup.cpp +++ b/src/tools/mesh_extractor/WorldModelGroup.cpp @@ -20,14 +20,37 @@ #include "Chunk.h" #include "Utils.h" -WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupIndex(groupIndex), MOBA(NULL), IsBad(false), HasLiquidData(false) +WorldModelGroup::WorldModelGroup(std::string path, int groupIndex) : SubData(NULL), GroupIndex(groupIndex), MOBA(NULL), MOBALength(0), HasLiquidData(false), IsBad(false) { Data = new ChunkedData(path); - if (!Data->Stream) + if (!Data->_Stream) { IsBad = true; return; } + Load(path); +} + +WorldModelGroup::WorldModelGroup(Stream* stream, std::string path, int groupIndex) : SubData(NULL), GroupIndex(groupIndex), MOBA(NULL), MOBALength(0), HasLiquidData(false), IsBad(false) +{ + Data = new ChunkedData(stream, stream->GetSize()); + Load(path); +} + +WorldModelGroup::~WorldModelGroup() +{ + // Temporarily delete the underlying stream, it is the same pointer for both Data and SubData. + // @TODO: Remove this code once the ChunkedData destructor properly releases _Stream + delete Data->_Stream; + + delete Data; + delete SubData; + delete[] MOBA; + +} + +void WorldModelGroup::Load(std::string& path) +{ Chunk* mainChunk = Data->GetChunkByName("MOGP"); int32 firstSub = mainChunk->FindSubChunkOffset("MOPY"); if (firstSub == -1) @@ -35,8 +58,8 @@ WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupInde Name = Utils::GetPlainName(path.c_str()); - FILE* stream = mainChunk->GetStream(); - fseek(stream, firstSub, SEEK_SET); + Stream* stream = mainChunk->GetStream(); + stream->Seek(firstSub, SEEK_SET); SubData = new ChunkedData(stream, mainChunk->Length - firstSub); ReadHeader(); @@ -57,7 +80,7 @@ void WorldModelGroup::ReadNormals() uint32 normalCount = chunk->Length / 12; ASSERT(normalCount == Vertices.size() && "normalCount is different than the Vertices count"); Normals.reserve(normalCount); - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); for (uint32 i = 0; i < normalCount; i++) Normals.push_back(Vector3::Read(stream)); } @@ -69,9 +92,9 @@ void WorldModelGroup::ReadLiquid() return; HasLiquidData = true; - FILE* stream = chunk->GetStream(); - LiquidDataHeader = LiquidHeader::Read(stream); - LiquidDataGeometry = LiquidData::Read(stream, LiquidDataHeader); + Stream* stream = chunk->GetStream(); + LiquidDataHeader.Read(stream); + LiquidDataGeometry.Read(stream, LiquidDataHeader); } void WorldModelGroup::ReadVertices() @@ -82,7 +105,7 @@ void WorldModelGroup::ReadVertices() uint32 verticeCount = chunk->Length / 12; Vertices.reserve(verticeCount); - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); for (uint32 i = 0; i < verticeCount; i++) Vertices.push_back(Vector3::Read(stream)); } @@ -95,19 +118,13 @@ void WorldModelGroup::ReadTriangles() uint32 triangleCount = chunk->Length / 6; ASSERT(triangleCount == TriangleFlags.size() && "triangleCount != TriangleFlags.size()"); - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); Triangles.reserve(triangleCount); for (uint32 i = 0; i < triangleCount; i++) { - uint16 v0; - uint16 v1; - uint16 v2; - int count = 0; - count += fread(&v0, sizeof(uint16), 1, stream); - count += fread(&v1, sizeof(uint16), 1, stream); - count += fread(&v2, sizeof(uint16), 1, stream); - if (count != 3) - printf("WorldModelGroup::ReadMaterials: Error reading data, expected 3, read %d\n", count); + uint16 v0 = stream->Read(); + uint16 v1 = stream->Read(); + uint16 v2 = stream->Read(); Triangles.push_back(Triangle(Constants::TRIANGLE_TYPE_WMO, v0, v1, v2)); } @@ -119,20 +136,15 @@ void WorldModelGroup::ReadMaterials() if (!chunk) return; - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); uint32 triangleCount = chunk->Length / 2; TriangleFlags.reserve(triangleCount); TriangleMaterials.reserve(triangleCount); for (uint32 i = 0; i < triangleCount; i++) { - uint8 tmp; - if (fread(&tmp, sizeof(uint8), 1, stream) != 1) - printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n"); - TriangleFlags.push_back(tmp); + TriangleFlags.push_back(stream->Read()); // Read again for material. - if (fread(&tmp, sizeof(uint8), 1, stream) != 1) - printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n"); - TriangleMaterials.push_back(tmp); + TriangleMaterials.push_back(stream->Read()); } } @@ -142,7 +154,7 @@ void WorldModelGroup::ReadHeader() if (!chunk) return; - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); Header = WMOGroupHeader::Read(stream); } @@ -154,7 +166,5 @@ void WorldModelGroup::ReadBatches() MOBALength = chunk->Length / 2; MOBA = new uint16[MOBALength]; - uint32 count = (uint32)fread(MOBA, sizeof(uint16), MOBALength, chunk->GetStream()); - if (count != MOBALength) - printf("WorldModelGroup::ReadBatches: Error reading data, expected %u, read %u\n", MOBALength, count); + chunk->GetStream()->Read(MOBA, sizeof(uint16) * MOBALength); } diff --git a/src/tools/mesh_extractor/WorldModelGroup.h b/src/tools/mesh_extractor/WorldModelGroup.h index b3c2c2bd94..20d453ee02 100644 --- a/src/tools/mesh_extractor/WorldModelGroup.h +++ b/src/tools/mesh_extractor/WorldModelGroup.h @@ -24,6 +24,10 @@ class WorldModelGroup { public: WorldModelGroup(std::string path, int groupIndex); + WorldModelGroup(Stream* stream, std::string path, int groupIndex); + ~WorldModelGroup(); + void Load(std::string& path); + ChunkedData* Data; ChunkedData* SubData; int GroupIndex; diff --git a/src/tools/mesh_extractor/WorldModelHandler.cpp b/src/tools/mesh_extractor/WorldModelHandler.cpp index 7c0acbc38e..18a90365c5 100644 --- a/src/tools/mesh_extractor/WorldModelHandler.cpp +++ b/src/tools/mesh_extractor/WorldModelHandler.cpp @@ -21,27 +21,24 @@ #include "Cache.h" #include "Model.h" #include "Define.h" +#include "Stream.h" #include "G3D/Matrix4.h" #include "G3D/Quat.h" #include -WorldModelDefinition WorldModelDefinition::Read( FILE* file ) +WorldModelDefinition WorldModelDefinition::Read(Stream* file) { WorldModelDefinition ret; - int count = 0; - count += fread(&ret.MwidIndex, sizeof(uint32), 1, file); - count += fread(&ret.UniqueId, sizeof(uint32), 1, file); + ret.MwidIndex = file->Read(); + ret.UniqueId = file->Read(); ret.Position = Vector3::Read(file); ret.Rotation = Vector3::Read(file); ret.UpperExtents = Vector3::Read(file); ret.LowerExtents = Vector3::Read(file); - count += fread(&ret.Flags, sizeof(uint16), 1, file); - count += fread(&ret.DoodadSet, sizeof(uint16), 1, file); - uint32 discard; - count += fread(&discard, sizeof(uint32), 1, file); - - if (count != 5) - printf("WorldModelDefinition::Read: Error reading data, expected 5, read %d\n", count); + ret.Flags = file->Read(); + ret.DoodadSet = file->Read(); + file->Read(); // Discarded + return ret; } @@ -58,14 +55,12 @@ void WorldModelHandler::ProcessInternal( MapChunk* mcnk ) return; uint32 refCount = mcnk->Header.MapObjectRefs; - FILE* stream = mcnk->Source->GetStream(); - fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET); + Stream* stream = mcnk->Source->GetStream(); + stream->Seek(mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET); // Start looping at the last Doodad Ref index for (uint32 i = mcnk->Header.DoodadRefs; i < refCount; i++) { - int32 index; - if (fread(&index, sizeof(int32), 1, stream) != 1) - printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n"); + int32 index = stream->Read(); if (index < 0 || uint32(index) >= _definitions->size()) continue; @@ -80,12 +75,7 @@ void WorldModelHandler::ProcessInternal( MapChunk* mcnk ) continue; std::string path = (*_paths)[wmo.MwidIndex]; - WorldModelRoot* model = Cache->WorldModelCache.Get(path); - if (!model) - { - model = new WorldModelRoot(path); - Cache->WorldModelCache.Insert(path, model); - } + WorldModelRoot const* model = Cache->WorldModelCache.Get(path); Vertices.reserve(1000); Triangles.reserve(1000); @@ -93,15 +83,16 @@ void WorldModelHandler::ProcessInternal( MapChunk* mcnk ) InsertModelGeometry(Vertices, Triangles, wmo, model); } // Restore the stream position - fseek(stream, mcnk->Source->Offset, SEEK_SET); + stream->Seek(mcnk->Source->Offset, SEEK_SET); } -void WorldModelHandler::InsertModelGeometry( std::vector& verts, std::vector >& tris, const WorldModelDefinition& def, WorldModelRoot* root, bool translate ) +void WorldModelHandler::InsertModelGeometry( std::vector& verts, std::vector >& tris, const WorldModelDefinition& def, WorldModelRoot const* root, bool translate ) { - for (std::vector::iterator group = root->Groups.begin(); group != root->Groups.end(); ++group) + for (std::vector::const_iterator groupItr = root->Groups.begin(); groupItr != root->Groups.end(); ++groupItr) { + WorldModelGroup const* group = *groupItr; uint32 vertOffset = verts.size(); - for (std::vector::iterator itr2 = group->Vertices.begin(); itr2 != group->Vertices.end(); ++itr2) + for (std::vector::const_iterator itr2 = group->Vertices.begin(); itr2 != group->Vertices.end(); ++itr2) { Vector3 v = Utils::TransformDoodadVertex(def, *itr2, translate); // If translate is false, then we were called directly from the TileBuilder to add data to it's _Geometry member, hence, we have to manually convert the vertices to Recast format. @@ -111,8 +102,9 @@ void WorldModelHandler::InsertModelGeometry( std::vector& verts, std::v for (uint32 i = 0; i < group->Triangles.size(); ++i) { // only include colliding tris - if ((group->TriangleFlags[i] & 0x04) != 0 && group->TriangleMaterials[i] != 0xFF) + if ((group->TriangleFlags[i] & 0x04) != 0 || group->TriangleMaterials[i] == 0xFF) continue; + Triangle tri = group->Triangles[i]; tris.push_back(Triangle(Constants::TRIANGLE_TYPE_WMO, tri.V0 + vertOffset, tri.V1 + vertOffset, tri.V2 + vertOffset)); } @@ -132,38 +124,33 @@ void WorldModelHandler::InsertModelGeometry( std::vector& verts, std::v for (std::vector::iterator instance = instances.begin(); instance != instances.end(); ++instance) { - Model* model = Cache->ModelCache.Get(instance->File); - if (!model) - { - model = new Model(instance->File); - Cache->ModelCache.Insert(instance->File, model); - } + Model const* model = Cache->ModelCache.Get(instance->File); if (!model->IsCollidable) continue; int vertOffset = verts.size(); - for (std::vector::iterator itr2 = model->Vertices.begin(); itr2 != model->Vertices.end(); ++itr2) + for (std::vector::const_iterator itr2 = model->Vertices.begin(); itr2 != model->Vertices.end(); ++itr2) { Vector3 v = Utils::TransformDoodadVertex(def, Utils::TransformWmoDoodad(*instance, def, *itr2, false), translate); verts.push_back(translate ? v : Utils::ToRecast(v)); } - for (std::vector >::iterator itr2 = model->Triangles.begin(); itr2 != model->Triangles.end(); ++itr2) + for (std::vector >::const_iterator itr2 = model->Triangles.begin(); itr2 != model->Triangles.end(); ++itr2) tris.push_back(Triangle(Constants::TRIANGLE_TYPE_WMO, itr2->V0 + vertOffset, itr2->V1 + vertOffset, itr2->V2 + vertOffset)); } - for (std::vector::iterator group = root->Groups.begin(); group != root->Groups.end(); ++group) + for (std::vector::const_iterator groupItr = root->Groups.begin(); groupItr != root->Groups.end(); ++groupItr) { + WorldModelGroup const* group = *groupItr; if (!group->HasLiquidData) continue; const LiquidHeader& liquidHeader = group->LiquidDataHeader; - LiquidData& liquidDataGeometry = group->LiquidDataGeometry; + const LiquidData& liquidDataGeometry = group->LiquidDataGeometry; for (uint32 y = 0; y < liquidHeader.Height; y++) { for (uint32 x = 0; x < liquidHeader.Width; x++) { - if (!liquidDataGeometry.ShouldRender(x, y)) continue; @@ -202,7 +189,7 @@ void WorldModelHandler::ReadDefinitions() uint32 definitionCount = chunk->Length / definitionSize; _definitions = new std::vector; _definitions->reserve(definitionCount); - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); for (uint32 i = 0; i < definitionCount; i++) _definitions->push_back(WorldModelDefinition::Read(stream)); } @@ -219,14 +206,13 @@ void WorldModelHandler::ReadModelPaths() _paths->reserve(paths); for (uint32 i = 0; i < paths; i++) { - FILE* stream = mwid->GetStream(); - fseek(stream, i * 4, SEEK_CUR); - uint32 offset; - if (fread(&offset, sizeof(uint32), 1, stream) != 1) - printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n"); - FILE* dataStream = mwmo->GetStream(); - fseek(dataStream, offset + mwmo->Offset, SEEK_SET); - _paths->push_back(Utils::ReadString(dataStream)); + Stream* stream = mwid->GetStream(); + stream->Seek(i * 4, SEEK_CUR); + uint32 offset = stream->Read(); + + Stream* dataStream = mwmo->GetStream(); + dataStream->Seek(offset + mwmo->Offset, SEEK_SET); + _paths->push_back(dataStream->ReadString()); } } diff --git a/src/tools/mesh_extractor/WorldModelHandler.h b/src/tools/mesh_extractor/WorldModelHandler.h index dd030e4521..ddc6f58914 100644 --- a/src/tools/mesh_extractor/WorldModelHandler.h +++ b/src/tools/mesh_extractor/WorldModelHandler.h @@ -39,7 +39,7 @@ public: uint16 Flags; uint16 DoodadSet; - static WorldModelDefinition Read(FILE* file); + static WorldModelDefinition Read(Stream* file); }; class WorldModelHandler : public ObjectDataHandler @@ -50,8 +50,8 @@ public: std::vector Vertices; std::vector > Triangles; - bool IsSane() { return _definitions && _paths; } - static void InsertModelGeometry(std::vector& verts, std::vector >& tris, const WorldModelDefinition& def, WorldModelRoot* root, bool translate = true); + bool IsSane() const { return _definitions && _paths; } + static void InsertModelGeometry(std::vector& verts, std::vector >& tris, const WorldModelDefinition& def, WorldModelRoot const* root, bool translate = true); protected: void ProcessInternal(MapChunk* data); private: diff --git a/src/tools/mesh_extractor/WorldModelRoot.cpp b/src/tools/mesh_extractor/WorldModelRoot.cpp index 4b6e4e189a..cdeeec5ad2 100644 --- a/src/tools/mesh_extractor/WorldModelRoot.cpp +++ b/src/tools/mesh_extractor/WorldModelRoot.cpp @@ -18,6 +18,7 @@ #include "WorldModelRoot.h" #include "ChunkedData.h" #include "Utils.h" +#include "MPQManager.h" WorldModelRoot::WorldModelRoot( std::string path ) { @@ -32,6 +33,10 @@ WorldModelRoot::WorldModelRoot( std::string path ) WorldModelRoot::~WorldModelRoot() { delete Data; + for (std::vector::iterator group = Groups.begin(); group != Groups.end(); ++group) + delete *group; + + Groups.clear(); } void WorldModelRoot::ReadGroups() @@ -42,9 +47,10 @@ void WorldModelRoot::ReadGroups() { char name[200]; sprintf(name, "%s_%03u.wmo", pathBase.c_str(), i); - WorldModelGroup group(name, i); - if (!group.IsBad) - Groups.push_back(group); + Stream* stream = MPQHandler->GetFile(name); + if (!stream) + continue; + Groups.push_back(new WorldModelGroup(stream, name, i)); } } @@ -54,7 +60,7 @@ void WorldModelRoot::ReadDoodadSets() if (!chunk) return; - FILE* stream = chunk->GetStream(); + Stream* stream = chunk->GetStream(); ASSERT(chunk->Length / 32 == Header.CountSets && "chunk.Length / 32 == Header.CountSets"); DoodadSets.reserve(Header.CountSets); for (uint32 i = 0; i < Header.CountSets; i++) @@ -73,14 +79,14 @@ void WorldModelRoot::ReadDoodadInstances() DoodadInstances.reserve(countInstances); for (uint32 i = 0; i < countInstances; i++) { - FILE* stream = chunk->GetStream(); - fseek(stream, instanceSize * i, SEEK_CUR); + Stream* stream = chunk->GetStream(); + stream->Seek(instanceSize * i, SEEK_CUR); DoodadInstance instance = DoodadInstance::Read(stream); - FILE* nameStream = nameChunk->GetStream(); + Stream* nameStream = nameChunk->GetStream(); if (instance.FileOffset >= nameChunk->Length) continue; - fseek(nameStream, instance.FileOffset, SEEK_CUR); - instance.File = Utils::ReadString(nameStream); + nameStream->Seek(instance.FileOffset, SEEK_CUR); + instance.File = nameStream->ReadString(); DoodadInstances.push_back(instance); } } @@ -91,6 +97,6 @@ void WorldModelRoot::ReadHeader() if (!chunk) return; - FILE* stream = chunk->GetStream(); - Header = WorldModelHeader::Read(stream); + Stream* stream = chunk->GetStream(); + Header.Read(stream); } diff --git a/src/tools/mesh_extractor/WorldModelRoot.h b/src/tools/mesh_extractor/WorldModelRoot.h index c2303ceafe..7b1248246c 100644 --- a/src/tools/mesh_extractor/WorldModelRoot.h +++ b/src/tools/mesh_extractor/WorldModelRoot.h @@ -34,7 +34,7 @@ public: WorldModelHeader Header; std::vector DoodadInstances; std::vector DoodadSets; - std::vector Groups; + std::vector Groups; private: void ReadGroups(); void ReadDoodadSets();