From e831e6f0f4a804d85eb9e35aefb0c14a766c2c29 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Tue, 29 Jun 2010 10:55:19 +0400 Subject: [PATCH 1/4] [10118] Check gameobject scale at loading (strict DB error filter) This let avoid check scale value at it --- src/game/Object.cpp | 3 --- src/game/ObjectMgr.cpp | 8 ++++++++ src/shared/revision_nr.h | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 2c318cce28f..8386721ea33 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -124,9 +124,6 @@ void Object::_Create( uint32 guidlow, uint32 entry, HighGuid guidhigh ) void Object::SetObjectScale(float newScale) { - if (newScale <= 0.0f) - newScale = DEFAULT_OBJECT_SCALE; - SetFloatValue(OBJECT_FIELD_SCALE_X, newScale); } diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 0dd4cd59d1c..e6f9a016862 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -6000,6 +6000,14 @@ void ObjectMgr::LoadGameobjectInfo() if (!goInfo) continue; + + if (goInfo->size <= 0.0f) // prevent use too small scales + { + ERROR_DB_STRICT_LOG("Gameobject (Entry: %u GoType: %u) have too small size=%f", + goInfo->id, goInfo->type, goInfo->size); + const_cast(goInfo)->size = DEFAULT_OBJECT_SCALE; + } + // some GO types have unused go template, check goInfo->displayId at GO spawn data loading or ignore switch(goInfo->type) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 36d31d2f3c4..b3a11ffc3dd 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 "10117" + #define REVISION_NR "10118" #endif // __REVISION_NR_H__ From 686af1b2da2b66cc567a2bb8067288d8455451fd Mon Sep 17 00:00:00 2001 From: NoFantasy Date: Tue, 29 Jun 2010 09:54:14 +0200 Subject: [PATCH 2/4] [10119] Add model data for undead player that got lost for rev 10109 Signed-off-by: NoFantasy --- sql/mangos.sql | 4 +++- sql/updates/10119_01_mangos_creature_model_info.sql | 6 ++++++ sql/updates/Makefile.am | 2 ++ src/shared/revision_nr.h | 2 +- src/shared/revision_sql.h | 2 +- 5 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 sql/updates/10119_01_mangos_creature_model_info.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index c6c36ae146f..ff417e3d313 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_10109_01_mangos_creature_model_info` bit(1) default NULL + `required_10119_01_mangos_creature_model_info` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -978,6 +978,8 @@ INSERT INTO `creature_model_info` VALUES (54, 0.3470, 1.5, 1, 53), (55, 0.3890, 1.5, 0, 56), (56, 0.3060, 1.5, 1, 55), +(57, 0.3830, 1.5, 0, 58), +(58, 0.3830, 1.5, 1, 57), (59, 0.9747, 1.5, 0, 60), (60, 0.8725, 1.5, 1, 59), (1478, 0.3060, 1.5, 0, 1479), diff --git a/sql/updates/10119_01_mangos_creature_model_info.sql b/sql/updates/10119_01_mangos_creature_model_info.sql new file mode 100644 index 00000000000..a23a0447cd9 --- /dev/null +++ b/sql/updates/10119_01_mangos_creature_model_info.sql @@ -0,0 +1,6 @@ +ALTER TABLE db_version CHANGE COLUMN required_10109_01_mangos_creature_model_info required_10119_01_mangos_creature_model_info bit; + +DELETE FROM creature_model_info WHERE modelid IN (57,58); +INSERT INTO creature_model_info (modelid, bounding_radius, combat_reach, gender, modelid_other_gender) VALUES +(57, 0.3830, 1.5, 0, 58), +(58, 0.3830, 1.5, 1, 57); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 02f418fb378..0be78c964d1 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -95,6 +95,7 @@ pkgdata_DATA = \ 10106_02_mangos_mangos_string.sql \ 10107_01_mangos_mangos_string.sql \ 10109_01_mangos_creature_model_info.sql \ + 10119_01_mangos_creature_model_info.sql \ README ## Additional files to include when running 'make dist' @@ -170,4 +171,5 @@ EXTRA_DIST = \ 10106_02_mangos_mangos_string.sql \ 10107_01_mangos_mangos_string.sql \ 10109_01_mangos_creature_model_info.sql \ + 10119_01_mangos_creature_model_info.sql \ README diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index b3a11ffc3dd..2c5cf35b24b 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 "10118" + #define REVISION_NR "10119" #endif // __REVISION_NR_H__ diff --git a/src/shared/revision_sql.h b/src/shared/revision_sql.h index c4393a84ee7..4f13fe8368f 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_10051_01_characters_character_aura" - #define REVISION_DB_MANGOS "required_10109_01_mangos_creature_model_info" + #define REVISION_DB_MANGOS "required_10119_01_mangos_creature_model_info" #define REVISION_DB_REALMD "required_10008_01_realmd_realmd_db_version" #endif // __REVISION_SQL_H__ From 972c48eab1affcbf2351f0a66aaae893c7106610 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Tue, 29 Jun 2010 11:53:20 +0400 Subject: [PATCH 3/4] [10120] Check expected `creature_model_info` data for player races --- src/game/ObjectMgr.cpp | 58 ++++++++++++++++++++++++++++++++++++++++ src/shared/revision_nr.h | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index e6f9a016862..b6c68766721 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -1030,6 +1030,64 @@ void ObjectMgr::LoadCreatureModelInfo() } } + // character races expected have model info data in table + for(uint32 race = 1; race < sChrRacesStore.GetNumRows(); ++race) + { + ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race); + if (!raceEntry) + continue; + + if (!((1 << (race-1)) & RACEMASK_ALL_PLAYABLE)) + continue; + + if (CreatureModelInfo const *minfo = GetCreatureModelInfo(raceEntry->model_f)) + { + if (minfo->gender != GENDER_FEMALE) + sLog.outErrorDb("Table `creature_model_info` have wrong gender %u for character race %u female model id %u", minfo->gender, race, raceEntry->model_f); + + if (minfo->modelid_other_gender != raceEntry->model_m) + sLog.outErrorDb("Table `creature_model_info` have wrong other gender model id %u for character race %u female model id %u", minfo->modelid_other_gender, race, raceEntry->model_f); + + if (minfo->bounding_radius <= 0.0f) + { + sLog.outErrorDb("Table `creature_model_info` have wrong bounding_radius %f for character race %u female model id %u, use %f instead", minfo->bounding_radius, race, raceEntry->model_f, DEFAULT_WORLD_OBJECT_SIZE); + const_cast(minfo)->bounding_radius = DEFAULT_WORLD_OBJECT_SIZE; + } + + if (minfo->combat_reach != 1.5f) + { + sLog.outErrorDb("Table `creature_model_info` have wrong combat_reach %f for character race %u female model id %u, expected always 1.5f", minfo->combat_reach, race, raceEntry->model_f); + const_cast(minfo)->combat_reach = 1.5f; + } + } + else + sLog.outErrorDb("Table `creature_model_info` expect have data for character race %u female model id %u", race, raceEntry->model_f); + + if (CreatureModelInfo const *minfo = GetCreatureModelInfo(raceEntry->model_m)) + { + if (minfo->gender != GENDER_MALE) + sLog.outErrorDb("Table `creature_model_info` have wrong gender %u for character race %u male model id %u", minfo->gender, race, raceEntry->model_m); + + if (minfo->modelid_other_gender != raceEntry->model_f) + sLog.outErrorDb("Table `creature_model_info` have wrong other gender model id %u for character race %u male model id %u", minfo->modelid_other_gender, race, raceEntry->model_m); + + if (minfo->bounding_radius <= 0.0f) + { + sLog.outErrorDb("Table `creature_model_info` have wrong bounding_radius %f for character race %u male model id %u, use %f instead", minfo->bounding_radius, race, raceEntry->model_f, DEFAULT_WORLD_OBJECT_SIZE); + const_cast(minfo)->bounding_radius = DEFAULT_WORLD_OBJECT_SIZE; + } + + if (minfo->combat_reach != 1.5f) + { + sLog.outErrorDb("Table `creature_model_info` have wrong combat_reach %f for character race %u male model id %u, expected always 1.5f", minfo->combat_reach, race, raceEntry->model_m); + const_cast(minfo)->combat_reach = 1.5f; + } + } + else + sLog.outErrorDb("Table `creature_model_info` expect have data for character race %u male model id %u", race, raceEntry->model_m); + + } + sLog.outString( ">> Loaded %u creature model based info", sCreatureModelStorage.RecordCount ); sLog.outString(); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 2c5cf35b24b..097eec9eb8a 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 "10119" + #define REVISION_NR "10120" #endif // __REVISION_NR_H__ From 198b26dfae644c0d19a83755f7ad924debfe5b9b Mon Sep 17 00:00:00 2001 From: NoFantasy Date: Tue, 29 Jun 2010 12:22:54 +0200 Subject: [PATCH 4/4] [10121] Add a few comments about DYNAMICOBJECT_BYTES + fix typo in one. --- src/game/DynamicObject.cpp | 13 +++++++++++++ src/game/SpellEffects.cpp | 2 +- src/shared/revision_nr.h | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index a95b0666acc..c9c39df8b45 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -74,7 +74,20 @@ bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, SpellE SetObjectScale(DEFAULT_OBJECT_SCALE); SetUInt64Value(DYNAMICOBJECT_CASTER, caster->GetGUID()); + + /* Bytes field, so it's really 4 bit fields. These flags are unknown, but we do know that 0x00000001 is set for most. + Farsight for example, does not have this flag, instead it has 0x80000002. + Flags are set dynamically with some conditions, so one spell may have different flags set, depending on those conditions. + The size of the visual may be controlled to some degree with these flags. + + uint32 bytes = 0x00000000; + bytes |= 0x01; + bytes |= 0x00 << 8; + bytes |= 0x00 << 16; + bytes |= 0x00 << 24; + */ SetUInt32Value(DYNAMICOBJECT_BYTES, 0x00000001); + SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId); SetFloatValue(DYNAMICOBJECT_RADIUS, radius); SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime()); // new 2.4.0 diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index b161f724285..a765308c5d6 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -4239,7 +4239,7 @@ void Spell::EffectAddFarsight(SpellEffectIndex eff_idx) return; } - // DYNAMICOBJECT_BYTES is appareltly different from the default bytes set in ::Create + // DYNAMICOBJECT_BYTES is apparently different from the default bytes set in ::Create dynObj->SetUInt32Value(DYNAMICOBJECT_BYTES, 0x80000002); m_caster->AddDynObject(dynObj); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 097eec9eb8a..c6508e84adb 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 "10120" + #define REVISION_NR "10121" #endif // __REVISION_NR_H__