From 4d0088e7a96e494f4b05243739ff1d5dbf42227c Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Mon, 31 Aug 2009 22:54:30 +0400 Subject: [PATCH] [8444] Prevent spawn gameobjects with invalid displayid by command. Also fix mangos string for not existed gameobejct entry. --- sql/mangos.sql | 5 +++-- sql/updates/8444_01_mangos_mangos_string.sql | 6 ++++++ sql/updates/Makefile.am | 2 ++ src/game/Language.h | 3 ++- src/game/Level2.cpp | 19 ++++++++++++++----- src/game/ObjectMgr.cpp | 12 ++++++------ src/shared/revision_nr.h | 2 +- src/shared/revision_sql.h | 2 +- 8 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 sql/updates/8444_01_mangos_mangos_string.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index bd201fc65..c08b2eae6 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -24,7 +24,7 @@ CREATE TABLE `db_version` ( `version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL, `cache_id` int(10) default '0', - `required_8416_01_mangos_spell_learn_spell` bit(1) default NULL + `required_8444_01_mangos_mangos_string` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -2720,6 +2720,7 @@ INSERT INTO `mangos_string` VALUES (345,'Forced customize for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (346,'Forced customize for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (347,'TaxiNode ID %u not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(348,'Game Object (Entry: %u) have invalid data and can\'t be spawned',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (400,'|cffff0000[System Message]:|rScripts reloaded',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (401,'You change security level of account %s to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (402,'%s changed your security level to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), @@ -2841,7 +2842,7 @@ INSERT INTO `mangos_string` VALUES (519,'|cffffffff|Htele:%s|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (520,'%d - |cffffffff|Hspell:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (521,'%d - |cffffffff|Hskill:%d|h[%s %s]|h|r %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), -(522,'Game Object (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(522,'Game Object (Entry: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (523,'>> Game Object %s (GUID: %u) at %f %f %f. Orientation %f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (524,'Selected object:\n|cffffffff|Hgameobject:%d|h[%s]|h|r GUID: %u ID: %u\nX: %f Y: %f Z: %f MapId: %u\nOrientation: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (525,'>> Add Game Object \'%i\' (%s) (GUID: %i) added at \'%f %f %f\'.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), diff --git a/sql/updates/8444_01_mangos_mangos_string.sql b/sql/updates/8444_01_mangos_mangos_string.sql new file mode 100644 index 000000000..bf9f6eba4 --- /dev/null +++ b/sql/updates/8444_01_mangos_mangos_string.sql @@ -0,0 +1,6 @@ +ALTER TABLE db_version CHANGE COLUMN required_8416_01_mangos_spell_learn_spell required_8444_01_mangos_mangos_string bit; + +DELETE FROM mangos_string WHERE entry IN(348,522); +INSERT INTO mangos_string VALUES +(348,'Game Object (Entry: %u) have invalid data and can\'t be spawned',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(522,'Game Object (Entry: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index a287b2962..ee8110cb0 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -96,6 +96,7 @@ pkgdata_DATA = \ 8412_01_mangos_mangos_string.sql \ 8416_01_mangos_spell_learn_spell.sql \ 8433_01_characters_character_account_data.sql \ + 8444_01_mangos_mangos_string.sql \ README ## Additional files to include when running 'make dist' @@ -172,4 +173,5 @@ EXTRA_DIST = \ 8412_01_mangos_mangos_string.sql \ 8416_01_mangos_spell_learn_spell.sql \ 8433_01_characters_character_account_data.sql \ + 8444_01_mangos_mangos_string.sql \ README diff --git a/src/game/Language.h b/src/game/Language.h index e1c15fb01..1f2d24b73 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -331,7 +331,8 @@ enum MangosStrings LANG_CUSTOMIZE_PLAYER = 345, LANG_CUSTOMIZE_PLAYER_GUID = 346, LANG_COMMAND_GOTAXINODENOTFOUND = 347, - // Room for more level 2 348-399 not used + LANG_GAMEOBJECT_HAVE_INVALID_DATA = 348, + // Room for more level 2 349-399 not used // level 3 chat LANG_SCRIPTS_RELOADED = 400, diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index a69e94bdc..a188f65c5 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -700,15 +700,24 @@ bool ChatHandler::HandleGameObjectAddCommand(const char* args) char* spawntimeSecs = strtok(NULL, " "); - const GameObjectInfo *goI = objmgr.GetGameObjectInfo(id); + const GameObjectInfo *gInfo = objmgr.GetGameObjectInfo(id); - if (!goI) + if (!gInfo) { PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST,id); SetSentErrorMessage(true); return false; } + if (gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId)) + { + // report to DB errors log as in loading case + sLog.outErrorDb("Gameobject (Entry %u GoType: %u) have invalid displayId (%u), not spawned.",id, gInfo->type, gInfo->displayId); + PSendSysMessage(LANG_GAMEOBJECT_HAVE_INVALID_DATA,id); + SetSentErrorMessage(true); + return false; + } + Player *chr = m_session->GetPlayer(); float x = float(chr->GetPositionX()); float y = float(chr->GetPositionY()); @@ -719,7 +728,7 @@ bool ChatHandler::HandleGameObjectAddCommand(const char* args) GameObject* pGameObj = new GameObject; uint32 db_lowGUID = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT); - if(!pGameObj->Create(db_lowGUID, goI->id, map, chr->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY)) + if(!pGameObj->Create(db_lowGUID, gInfo->id, map, chr->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY)) { delete pGameObj; return false; @@ -742,14 +751,14 @@ bool ChatHandler::HandleGameObjectAddCommand(const char* args) return false; } - sLog.outDebug(GetMangosString(LANG_GAMEOBJECT_CURRENT), goI->name, db_lowGUID, x, y, z, o); + sLog.outDebug(GetMangosString(LANG_GAMEOBJECT_CURRENT), gInfo->name, db_lowGUID, x, y, z, o); map->Add(pGameObj); // TODO: is it really necessary to add both the real and DB table guid here ? objmgr.AddGameobjectToGrid(db_lowGUID, objmgr.GetGOData(db_lowGUID)); - PSendSysMessage(LANG_GAMEOBJECT_ADD,id,goI->name,db_lowGUID,x,y,z); + PSendSysMessage(LANG_GAMEOBJECT_ADD,id,gInfo->name,db_lowGUID,x,y,z); return true; } diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index f2435abcd..cd34c4338 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -1220,13 +1220,13 @@ void ObjectMgr::LoadGameobjects() uint32 entry = fields[ 1].GetUInt32(); GameObjectInfo const* gInfo = GetGameObjectInfo(entry); - if(!gInfo) + if (!gInfo) { sLog.outErrorDb("Table `gameobject` has gameobject (GUID: %u) with non existing gameobject entry %u, skipped.", guid, entry); continue; } - if(gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId)) + if (gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId)) { sLog.outErrorDb("Gameobject (GUID: %u Entry %u GoType: %u) have invalid displayId (%u), not loaded.",guid, entry, gInfo->type, gInfo->displayId); continue; @@ -1266,25 +1266,25 @@ void ObjectMgr::LoadGameobjects() int16 gameEvent = fields[16].GetInt16(); int16 PoolId = fields[17].GetInt16(); - if(data.rotation2 < -1.0f || data.rotation2 > 1.0f) + if (data.rotation2 < -1.0f || data.rotation2 > 1.0f) { sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with invalid rotation2 (%f) value, skip",guid,data.id,data.rotation2 ); continue; } - if(data.rotation3 < -1.0f || data.rotation3 > 1.0f) + if (data.rotation3 < -1.0f || data.rotation3 > 1.0f) { sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with invalid rotation3 (%f) value, skip",guid,data.id,data.rotation3 ); continue; } - if(!MapManager::IsValidMapCoord(data.mapid,data.posX,data.posY,data.posZ,data.orientation)) + if (!MapManager::IsValidMapCoord(data.mapid,data.posX,data.posY,data.posZ,data.orientation)) { sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with invalid coordinates, skip",guid,data.id ); continue; } - if(data.phaseMask==0) + if (data.phaseMask==0) { sLog.outErrorDb("Table `gameobject` have gameobject (GUID: %u Entry: %u) with `phaseMask`=0 (not visible for anyone), set to 1.",guid,data.id ); data.phaseMask = 1; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index f6451aee1..183b41309 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8443" + #define REVISION_NR "8444" #endif // __REVISION_NR_H__ diff --git a/src/shared/revision_sql.h b/src/shared/revision_sql.h index 6dfab5a59..fb9c91c29 100644 --- a/src/shared/revision_sql.h +++ b/src/shared/revision_sql.h @@ -1,6 +1,6 @@ #ifndef __REVISION_SQL_H__ #define __REVISION_SQL_H__ #define REVISION_DB_CHARACTERS "required_8433_01_characters_character_account_data" - #define REVISION_DB_MANGOS "required_8416_01_mangos_spell_learn_spell" + #define REVISION_DB_MANGOS "required_8444_01_mangos_mangos_string" #define REVISION_DB_REALMD "required_8332_01_realmd_realmcharacters" #endif // __REVISION_SQL_H__