diff options
author | Vincent-Michael <vincent_michael@gmx.de> | 2016-08-23 16:57:07 +0200 |
---|---|---|
committer | Vincent-Michael <vincent_michael@gmx.de> | 2016-08-23 16:58:48 +0200 |
commit | 3c6c78da1ce1753bbd9f8ae32d6ddc4c87edb778 (patch) | |
tree | fedda909fed8c51267ebd6ae775c9a1f6515de1e /src | |
parent | 4a13ec2fcb82f3618f47843901efb8b75162b5ec (diff) |
Core/Objects: Added check (error log) for possible invalid position for creatures / game objects
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 33 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 4 | ||||
-rw-r--r-- | src/server/game/World/World.h | 2 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 14 |
4 files changed, 53 insertions, 0 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index a3a292c27e0..53e9b116317 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -46,6 +46,7 @@ #include "Util.h" #include "Vehicle.h" #include "World.h" +#include "VMapFactory.h" ScriptMapMap sSpellScripts; ScriptMapMap sEventScripts; @@ -1834,6 +1835,22 @@ void ObjectMgr::LoadCreatures() continue; } + if (sWorld->getBoolConfig(CONFIG_CREATURE_CHECK_INVALID_POSITION)) + if (VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager()) + { + if (vmgr->isMapLoadingEnabled() && !IsTransportMap(data.mapid)) + { + GridCoord gridCoord = Trinity::ComputeGridCoord(data.posX, data.posY); + int gx = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.x_coord; + int gy = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.y_coord; + + bool exists = vmgr->existsMap((sWorld->GetDataPath() + "vmaps").c_str(), data.mapid, gx, gy); + if (!exists) + TC_LOG_ERROR("sql.sql", "Table `creature` has creature (GUID: " UI64FMTD " Entry: %u MapID: %u) spawned on a possible invalid position (X: %f Y: %f Z: %f)", + guid, data.id, data.mapid, data.posX, data.posY, data.posZ); + } + } + // Skip spawnMask check for transport maps if (!IsTransportMap(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid]) TC_LOG_ERROR("sql.sql", "Table `creature` has creature (GUID: " UI64FMTD ") that have wrong spawn mask %u including unsupported difficulty modes for map (Id: %u).", guid, data.spawnMask, data.mapid); @@ -2154,6 +2171,22 @@ void ObjectMgr::LoadGameobjects() continue; } + if (sWorld->getBoolConfig(CONFIG_GAME_OBJECT_CHECK_INVALID_POSITION)) + if (VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager()) + { + if (vmgr->isMapLoadingEnabled() && !IsTransportMap(data.mapid)) + { + GridCoord gridCoord = Trinity::ComputeGridCoord(data.posX, data.posY); + int gx = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.x_coord; + int gy = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.y_coord; + + bool exists = vmgr->existsMap((sWorld->GetDataPath() + "vmaps").c_str(), data.mapid, gx, gy); + if (!exists) + TC_LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: " UI64FMTD " Entry: %u MapID: %u) spawned on a possible invalid position (X: %f Y: %f Z: %f)", + guid, data.id, data.mapid, data.posX, data.posY, data.posZ); + } + } + if (data.spawntimesecs == 0 && gInfo->IsDespawnAtAction()) { TC_LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: " UI64FMTD " Entry: %u) with `spawntimesecs` (0) value, but the gameobejct is marked as despawnable at action.", guid, data.id); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 68498d117bd..6da49d10c9f 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1484,6 +1484,10 @@ void World::LoadConfigSettings(bool reload) m_bool_configs[CONFIG_HOTSWAP_INSTALL_ENABLED] = sConfigMgr->GetBoolDefault("HotSwap.EnableInstall", true); m_bool_configs[CONFIG_HOTSWAP_PREFIX_CORRECTION_ENABLED] = sConfigMgr->GetBoolDefault("HotSwap.EnablePrefixCorrection", true); + // Check Invalid Position + m_bool_configs[CONFIG_CREATURE_CHECK_INVALID_POSITION] = sConfigMgr->GetBoolDefault("Creature.CheckInvalidPosition", false); + m_bool_configs[CONFIG_GAME_OBJECT_CHECK_INVALID_POSITION] = sConfigMgr->GetBoolDefault("GameObject.CheckInvalidPosition", false); + // call ScriptMgr if we're reloading the configuration if (reload) sScriptMgr->OnConfigLoad(reload); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 8cc75a6e669..37687f0eef0 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -189,6 +189,8 @@ enum WorldBoolConfigs CONFIG_HOTSWAP_BUILD_FILE_RECREATION_ENABLED, CONFIG_HOTSWAP_INSTALL_ENABLED, CONFIG_HOTSWAP_PREFIX_CORRECTION_ENABLED, + CONFIG_CREATURE_CHECK_INVALID_POSITION, + CONFIG_GAME_OBJECT_CHECK_INVALID_POSITION, BOOL_CONFIG_VALUE_COUNT }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index af8aeae4c91..69a88755d42 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -3138,6 +3138,20 @@ NoGrayAggro.Above = 0 NoGrayAggro.Below = 0 # +# Creature.CheckInvalidPosition +# Description: Check possible invalid position for creatures at startup (WARNING: SLOW WORLD SERVER STARTUP) +# Default: 0 - (Do not show) + +Creature.CheckInvalidPosition = 0 + +# +# GameObject.CheckInvalidPosition +# Description: Check possible invalid position for game objects at startup (WARNING: SLOW WORLD SERVER STARTUP) +# Default: 0 - (Do not show) + +GameObject.CheckInvalidPosition = 0 + +# ################################################################################################### ################################################################################################### |