diff options
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 91 |
1 files changed, 76 insertions, 15 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index a8c83c13578..e84d2d97939 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6695,8 +6695,6 @@ void ObjectMgr::LoadGameObjectTemplate() go.type = db2go->Type; go.displayId = db2go->DisplayID; go.name = db2go->Name->Str[sWorld->GetDefaultDbcLocale()]; - go.faction = 0; - go.flags = 0; go.size = db2go->Size; memset(go.raw.data, 0, sizeof(go.raw.data)); memcpy(go.raw.data, db2go->Data, std::min(sizeof(db2go->Data), sizeof(go.raw.data))); @@ -6704,13 +6702,13 @@ void ObjectMgr::LoadGameObjectTemplate() go.ScriptId = 0; } - // 0 1 2 3 4 5 6 7 8 9 - QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, faction, flags, size, " - // 10 11 12 13 14 15 16 17 18 19 20 21 22 + // 0 1 2 3 4 5 6 7 + QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, " + // 8 9 10 11 12 13 14 15 16 17 18 19 20 "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, " - // 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 + // 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, Data24, Data25, Data26, Data27, Data28, " - // 39 40 41 42 43 44 45 + // 37 38 39 40 41 42 43 "Data29, Data30, Data31, Data32, RequiredLevel, AIName, ScriptName " "FROM gameobject_template"); @@ -6729,7 +6727,6 @@ void ObjectMgr::LoadGameObjectTemplate() uint32 entry = fields[0].GetUInt32(); GameObjectTemplate& got = _gameObjectTemplateStore[entry]; - got.entry = entry; got.type = uint32(fields[1].GetUInt8()); got.displayId = fields[2].GetUInt32(); @@ -6737,16 +6734,14 @@ void ObjectMgr::LoadGameObjectTemplate() got.IconName = fields[4].GetString(); got.castBarCaption = fields[5].GetString(); got.unk1 = fields[6].GetString(); - got.faction = uint32(fields[7].GetUInt16()); - got.flags = fields[8].GetUInt32(); - got.size = fields[9].GetFloat(); + got.size = fields[7].GetFloat(); for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i) - got.raw.data[i] = fields[10 + i].GetUInt32(); + got.raw.data[i] = fields[8 + i].GetUInt32(); - got.RequiredLevel = fields[43].GetInt32(); - got.AIName = fields[44].GetString(); - got.ScriptId = GetScriptId(fields[45].GetString()); + got.RequiredLevel = fields[41].GetInt32(); + got.AIName = fields[42].GetString(); + got.ScriptId = GetScriptId(fields[43].GetString()); // Checks @@ -6899,6 +6894,63 @@ void ObjectMgr::LoadGameObjectTemplate() TC_LOG_INFO("server.loading", ">> Loaded %u game object templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +void ObjectMgr::LoadGameObjectTemplateAddons() +{ + uint32 oldMSTime = getMSTime(); + + // 0 1 2 3 4 + QueryResult result = WorldDatabase.Query("SELECT entry, faction, flags, mingold, maxgold FROM gameobject_template_addon"); + + if (!result) + { + TC_LOG_INFO("server.loading", ">> Loaded 0 gameobject template addon definitions. DB table `gameobject_template_addon` is empty."); + return; + } + + uint32 count = 0; + do + { + Field* fields = result->Fetch(); + + uint32 entry = fields[0].GetUInt32(); + + GameObjectTemplate const* got = sObjectMgr->GetGameObjectTemplate(entry); + if (!got) + { + TC_LOG_ERROR("sql.sql", "GameObject template (Entry: %u) does not exist but has a record in `gameobject_template_addon`", entry); + continue; + } + + GameObjectTemplateAddon& gameObjectAddon = _gameObjectTemplateAddonStore[entry]; + gameObjectAddon.faction = uint32(fields[1].GetUInt16()); + gameObjectAddon.flags = fields[2].GetUInt32(); + gameObjectAddon.mingold = fields[3].GetUInt32(); + gameObjectAddon.maxgold = fields[4].GetUInt32(); + + // checks + if (gameObjectAddon.faction && !sFactionTemplateStore.LookupEntry(gameObjectAddon.faction)) + TC_LOG_ERROR("sql.sql", "GameObject (Entry: %u) has invalid faction (%u) defined in `gameobject_template_addon`.", entry, gameObjectAddon.faction); + + if (gameObjectAddon.maxgold > 0) + { + switch (got->type) + { + case GAMEOBJECT_TYPE_CHEST: + case GAMEOBJECT_TYPE_FISHINGHOLE: + break; + default: + TC_LOG_ERROR("sql.sql", "GameObject (Entry %u GoType: %u) cannot be looted but has maxgold set in `gameobject_template_addon`.", entry, got->type); + break; + } + } + + ++count; + } + while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u game object template addons in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); +} + void ObjectMgr::LoadExplorationBaseXP() { uint32 oldMSTime = getMSTime(); @@ -9220,6 +9272,15 @@ GameObjectTemplate const* ObjectMgr::GetGameObjectTemplate(uint32 entry) const return nullptr; } +GameObjectTemplateAddon const* ObjectMgr::GetGameObjectTemplateAddon(uint32 entry) const +{ + auto itr = _gameObjectTemplateAddonStore.find(entry); + if (itr != _gameObjectTemplateAddonStore.end()) + return &itr->second; + + return nullptr; +} + CreatureTemplate const* ObjectMgr::GetCreatureTemplate(uint32 entry) const { CreatureTemplateContainer::const_iterator itr = _creatureTemplateStore.find(entry); |