aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals/ObjectMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp91
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);