Merge branch 'master' into 4.3.4
Conflicts: src/server/game/Entities/Creature/Creature.cpp src/server/game/Entities/Creature/Creature.h src/server/game/Entities/Creature/GossipDef.cpp src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Transport/Transport.cpp src/server/game/Entities/Unit/Unit.cpp src/server/game/Globals/ObjectMgr.cpp src/server/game/Globals/ObjectMgr.h src/server/game/Handlers/QuestHandler.cpp src/server/game/Handlers/SpellHandler.cpp src/server/game/Handlers/TradeHandler.cpp src/server/game/Quests/QuestDef.h src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp src/server/scripts/EasternKingdoms/zone_ghostlands.cpp src/server/scripts/EasternKingdoms/zone_hinterlands.cpp src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp src/server/scripts/Kalimdor/zone_azshara.cpp src/server/scripts/Kalimdor/zone_darkshore.cpp src/server/scripts/Kalimdor/zone_desolace.cpp src/server/scripts/Northrend/zone_dalaran.cpp src/tools/CMakeLists.txt
This commit is contained in:
commit
33c2bd5ce1
417 files changed
+6670
-6423
No files matched your search
@@ -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
|
||||
|
||||
@@ -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")
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
// 3. This notice may not be removed or altered from any source distribution.
|
||||
//
|
||||
|
||||
#include <math.h>
|
||||
#include "DetourCommon.h"
|
||||
#include "DetourMath.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
float dtSqrt(float x)
|
||||
{
|
||||
return sqrtf(x);
|
||||
return dtMathSqrtf(x);
|
||||
}
|
||||
|
||||
void dtClosestPtPointTriangle(float* closest, const float* p,
|
||||
|
||||
@@ -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<class T> void dtIgnoreUnused(const T&) { }
|
||||
|
||||
/// Swaps the values of the two parameters.
|
||||
/// @param[in,out] a Value A
|
||||
/// @param[in,out] b Value B
|
||||
|
||||
@@ -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 <math.h>
|
||||
|
||||
#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
|
||||
@@ -16,13 +16,13 @@
|
||||
// 3. This notice may not be removed or altered from any source distribution.
|
||||
//
|
||||
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "DetourNavMesh.h"
|
||||
#include "DetourNode.h"
|
||||
#include "DetourCommon.h"
|
||||
#include "DetourMath.h"
|
||||
#include "DetourAlloc.h"
|
||||
#include "DetourAssert.h"
|
||||
#include <new>
|
||||
@@ -193,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<<DT_SALT_BITS)-1);
|
||||
#else
|
||||
tile->salt = (tile->salt+1) & ((1<<m_saltBits)-1);
|
||||
#endif
|
||||
if (tile->salt == 0)
|
||||
tile->salt++;
|
||||
|
||||
|
||||
@@ -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 <stdint.h>
|
||||
#ifndef uint64_t
|
||||
#ifdef __linux__
|
||||
#include <linux/types.h>
|
||||
#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_SALT_BITS)-1;
|
||||
const dtPolyRef tileMask = ((dtPolyRef)1<<DT_TILE_BITS)-1;
|
||||
const dtPolyRef polyMask = ((dtPolyRef)1<<DT_POLY_BITS)-1;
|
||||
salt = (unsigned int)((ref >> (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_saltBits)-1;
|
||||
const dtPolyRef tileMask = ((dtPolyRef)1<<m_tileBits)-1;
|
||||
const dtPolyRef polyMask = ((dtPolyRef)1<<m_polyBits)-1;
|
||||
salt = (unsigned int)((ref >> (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_SALT_BITS)-1;
|
||||
return (unsigned int)((ref >> (DT_POLY_BITS+DT_TILE_BITS)) & saltMask);
|
||||
#else
|
||||
const dtPolyRef saltMask = ((dtPolyRef)1<<m_saltBits)-1;
|
||||
return (unsigned int)((ref >> (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_TILE_BITS)-1;
|
||||
return (unsigned int)((ref >> DT_POLY_BITS) & tileMask);
|
||||
#else
|
||||
const dtPolyRef tileMask = ((dtPolyRef)1<<m_tileBits)-1;
|
||||
return (unsigned int)((ref >> 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<<DT_POLY_BITS)-1;
|
||||
return (unsigned int)(ref & polyMask);
|
||||
#else
|
||||
const dtPolyRef polyMask = ((dtPolyRef)1<<m_polyBits)-1;
|
||||
return (unsigned int)(ref & polyMask);
|
||||
#endif
|
||||
}
|
||||
|
||||
/// @}
|
||||
@@ -597,9 +627,11 @@ private:
|
||||
dtMeshTile* m_nextFree; ///< Freelist of tiles.
|
||||
dtMeshTile* m_tiles; ///< List of tiles.
|
||||
|
||||
#ifndef DT_POLYREF64
|
||||
unsigned int m_saltBits; ///< Number of salt bits in the tile ID.
|
||||
unsigned int m_tileBits; ///< Number of tile bits in the tile ID.
|
||||
unsigned int m_polyBits; ///< Number of poly bits in the tile ID.
|
||||
#endif
|
||||
};
|
||||
|
||||
/// Allocates a navigation mesh object using the Detour allocator.
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
// 3. This notice may not be removed or altered from any source distribution.
|
||||
//
|
||||
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <float.h>
|
||||
#include "DetourNavMesh.h"
|
||||
#include "DetourCommon.h"
|
||||
#include "DetourMath.h"
|
||||
#include "DetourNavMeshBuilder.h"
|
||||
#include "DetourAlloc.h"
|
||||
#include "DetourAssert.h"
|
||||
@@ -202,8 +202,8 @@ static int createBVTree(const unsigned short* verts, const int /*nverts*/,
|
||||
if (z > it.bmax[2]) it.bmax[2] = z;
|
||||
}
|
||||
// Remap y
|
||||
it.bmin[1] = (unsigned short)floorf((float)it.bmin[1]*ch/cs);
|
||||
it.bmax[1] = (unsigned short)ceilf((float)it.bmax[1]*ch/cs);
|
||||
it.bmin[1] = (unsigned short)dtMathFloorf((float)it.bmin[1]*ch/cs);
|
||||
it.bmax[1] = (unsigned short)dtMathCeilf((float)it.bmax[1]*ch/cs);
|
||||
}
|
||||
|
||||
int curNode = 0;
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
// 3. This notice may not be removed or altered from any source distribution.
|
||||
//
|
||||
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
#include <string.h>
|
||||
#include "DetourNavMeshQuery.h"
|
||||
#include "DetourNavMesh.h"
|
||||
#include "DetourNode.h"
|
||||
#include "DetourCommon.h"
|
||||
#include "DetourMath.h"
|
||||
#include "DetourAlloc.h"
|
||||
#include "DetourAssert.h"
|
||||
#include <new>
|
||||
@@ -99,9 +99,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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -22,17 +22,30 @@
|
||||
#include "DetourCommon.h"
|
||||
#include <string.h>
|
||||
|
||||
#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) :
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<<RC_SPAN_HEIGHT_BITS)-1;
|
||||
|
||||
@@ -255,9 +255,9 @@ static const int RC_SPANS_PER_POOL = 2048;
|
||||
/// @see rcHeightfield
|
||||
struct rcSpan
|
||||
{
|
||||
unsigned int smin : 16; ///< The lower limit of the span. [Limit: < #smax]
|
||||
unsigned int smax : 16; ///< The upper limit of the span. [Limit: <= #RC_SPAN_MAX_HEIGHT]
|
||||
unsigned char area; ///< The area id assigned to the span.
|
||||
unsigned int smin : 13; ///< The lower limit of the span. [Limit: < #smax]
|
||||
unsigned int smax : 13; ///< The upper limit of the span. [Limit: <= #RC_SPAN_MAX_HEIGHT]
|
||||
unsigned int area : 6; ///< The area id assigned to the span.
|
||||
rcSpan* next; ///< The next span higher up in column.
|
||||
};
|
||||
|
||||
@@ -549,6 +549,11 @@ static const int RC_NOT_CONNECTED = 0x3f;
|
||||
/// @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<class T> void rcIgnoreUnused(const T&) { }
|
||||
|
||||
/// Swaps the values of the two parameters.
|
||||
/// @param[in,out] a Value A
|
||||
/// @param[in,out] b Value B
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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, '');
|
||||
@@ -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');
|
||||
@@ -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');
|
||||
@@ -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');
|
||||
@@ -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');
|
||||
@@ -0,0 +1 @@
|
||||
UPDATE `smart_scripts` SET `event_flags`=1 WHERE `entryorguid` IN (19994,22384) AND `source_type`=0 AND `id`=2;
|
||||
@@ -0,0 +1 @@
|
||||
UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=28487;
|
||||
@@ -0,0 +1 @@
|
||||
UPDATE `creature_text` SET `type`=41 WHERE `entry`=28860 AND `groupid`=9;
|
||||
@@ -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');
|
||||
@@ -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, '<back>',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, '<more>',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');
|
||||
@@ -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-
|
||||
@@ -0,0 +1 @@
|
||||
UPDATE `creature_template` SET `ScriptName`= 'npc_oox09hl' WHERE `ScriptName`= 'npc_00x09hl';
|
||||
@@ -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');
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
@@ -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, '');
|
||||
@@ -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'");
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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');
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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<uint32, MMapData*>(mapId, mmap_data));
|
||||
_loadedMaps.insert(std::pair<uint32, MMapData*>(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<uint32, dtTileRef>(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<uint32, dtTileRef>(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<uint32, dtNavMeshQuery*>(instanceId, query));
|
||||
mmap->_navMeshQueries.insert(std::pair<uint32, dtNavMeshQuery*>(instanceId, query));
|
||||
}
|
||||
|
||||
return mmap->navMeshQueries[instanceId];
|
||||
return mmap->_navMeshQueries[instanceId];
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "Define.h"
|
||||
#include <list>
|
||||
#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*/) { }
|
||||
|
||||
@@ -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<std::pair<Unit*, Spell*> > TargetSpellList;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -1149,7 +1149,7 @@ void AchievementMgr<T>::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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -175,6 +175,7 @@ struct CreatureTemplate
|
||||
// Benchmarked: Faster than std::map (insert/find)
|
||||
typedef UNORDERED_MAP<uint32, CreatureTemplate> 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<uint32, CreatureTemplate> 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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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<uint32> 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();
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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<Transport>(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<WorldObject*>::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<Transport>(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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<WorldObject*>& passengers);
|
||||
void DoEventIfAny(KeyFrame const& node, bool departure);
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -1408,7 +1408,9 @@ class ObjectMgr
|
||||
GO_TO_GO,
|
||||
GO_TO_CREATURE // GO is dependant on creature
|
||||
};
|
||||
|
||||
HotfixData _hotfixData;
|
||||
std::set<uint32> _transportMaps; // Helper container storing map ids that are for transports only, loaded from gameobject_template
|
||||
};
|
||||
|
||||
#define sObjectMgr ACE_Singleton<ObjectMgr, ACE_Null_Mutex>::instance()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<uint8>(); // 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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -249,6 +249,16 @@ AI* GetInstanceAI(T* obj, char const* scriptName)
|
||||
return new AI(obj);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
|
||||
template<class AI, class T>
|
||||
AI* GetInstanceAI(T* obj)
|
||||
{
|
||||
if (InstanceMap* instance = obj->GetMap()->ToInstanceMap())
|
||||
if (instance->GetInstanceScript())
|
||||
return new AI(obj);
|
||||
|
||||
return NULL;
|
||||
};
|
||||
|
||||
#endif // TRINITY_INSTANCE_DATA_H
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
// *****************************
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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<KeyFrame>& 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);
|
||||
|
||||
@@ -38,7 +38,7 @@ typedef UNORDERED_MAP<uint32, std::set<uint32> > 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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -86,7 +86,6 @@ bool ConfusedMovementGenerator<T>::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))
|
||||
{
|
||||
|
||||
@@ -44,7 +44,6 @@ void FleeingMovementGenerator<T>::_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))
|
||||
{
|
||||
|
||||
@@ -60,7 +60,7 @@ void HomeMovementGenerator<Creature>::_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<Creature>::DoUpdate(Creature* owner, const uint32 /*time_diff*/)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2005-2011 MaNGOS <http://getmangos.com/>
|
||||
*
|
||||
* 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();
|
||||
}
|
||||
@@ -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>(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
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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<class Init> inline void init_spline(Init& initializer)
|
||||
template<class Init> inline void init_spline_custom(Init& initializer)
|
||||
{
|
||||
initializer(m_mode, cyclic, points, index_lo, index_hi);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 <WorldObject*> (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
|
||||
{
|
||||
|
||||
Loaded 100 of 417 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user