aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorleak <leakzx@googlemail.com>2011-04-28 22:54:30 +0200
committerleak <leakzx@googlemail.com>2011-04-28 22:54:30 +0200
commite2e9431ca3b4725f29e13350eb9ca0b46cc0aff1 (patch)
tree6b4ad21b0223031c16ac846a832d2ffd4d3c56d2 /src
parent3ab83417f5d6e18cf055195aa35beefdc4f98b9b (diff)
Core/ObjectMgr: Refactor sGOStorage
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp4
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h2
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundIC.cpp2
-rwxr-xr-xsrc/server/game/Chat/Commands/Level3.cpp30
-rwxr-xr-xsrc/server/game/Conditions/ConditionMgr.cpp4
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.cpp48
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.h23
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp2
-rwxr-xr-xsrc/server/game/Entities/Transport/Transport.cpp6
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp298
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h9
-rwxr-xr-xsrc/server/game/Grids/Notifiers/GridNotifiers.h2
-rwxr-xr-xsrc/server/game/Loot/LootMgr.cpp17
-rwxr-xr-xsrc/server/game/Miscellaneous/SharedDefines.h1
-rwxr-xr-xsrc/server/game/OutdoorPvP/OutdoorPvP.cpp2
-rwxr-xr-xsrc/server/game/Pools/PoolMgr.cpp2
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/QueryHandler.cpp16
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp4
-rwxr-xr-xsrc/server/game/World/World.cpp2
-rw-r--r--src/server/scripts/Commands/cs_gobject.cpp10
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp2
-rwxr-xr-xsrc/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp2
-rwxr-xr-xsrc/server/shared/Database/SQLStorage.cpp3
23 files changed, 269 insertions, 222 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index ac0f5d1a2be..cdd07afad52 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -137,7 +137,7 @@ void SmartAIMgr::LoadSmartAIFromDB()
}
case SMART_SCRIPT_TYPE_GAMEOBJECT:
{
- if (!sGOStorage.LookupEntry<GameObjectInfo>((uint32)temp.entryOrGuid))
+ if (!sObjectMgr->GetGameObjectTemplate((uint32)temp.entryOrGuid))
{
sLog->outErrorDb("SmartAIMgr::LoadSmartAIFromDB: GameObject entry (%u) does not exist, skipped loading.", uint32(temp.entryOrGuid));
continue;
@@ -241,7 +241,7 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder e)
case SMART_TARGET_GAMEOBJECT_DISTANCE:
case SMART_TARGET_GAMEOBJECT_RANGE:
{
- if (e.target.goDistance.entry && !sGOStorage.LookupEntry<GameObjectInfo>(e.target.goDistance.entry))
+ if (e.target.goDistance.entry && !sObjectMgr->GetGameObjectTemplate(e.target.goDistance.entry))
{
sLog->outErrorDb("SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent GameObject entry %u as target_param1, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.target.goDistance.entry);
return false;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 37aa5588125..c686d0bc51d 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -1282,7 +1282,7 @@ class SmartAIMgr
}
inline bool IsGameObjectValid(SmartScriptHolder e, uint32 entry)
{
- if (!sGOStorage.LookupEntry<GameObjectInfo>(uint32(entry)))
+ if (!sObjectMgr->GetGameObjectTemplate(entry))
{
sLog->outErrorDb("SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent GameObject entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), entry);
return false;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
index 03406a92a62..0487b0bce79 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
@@ -901,7 +901,7 @@ Transport* BattlegroundIC::CreateTransport(uint32 goEntry,uint32 period)
{
Transport* t = new Transport(period,0);
- const GameObjectInfo* goinfo = sObjectMgr->GetGameObjectInfo(goEntry);
+ const GameObjectTemplate* goinfo = sObjectMgr->GetGameObjectTemplate(goEntry);
if (!goinfo)
{
diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp
index abc8cfe7185..72db4e2c527 100755
--- a/src/server/game/Chat/Commands/Level3.cpp
+++ b/src/server/game/Chat/Commands/Level3.cpp
@@ -612,7 +612,7 @@ bool ChatHandler::HandleListObjectCommand(const char *args)
return false;
}
- GameObjectInfo const * gInfo = ObjectMgr::GetGameObjectInfo(go_id);
+ GameObjectTemplate const * gInfo = sObjectMgr->GetGameObjectTemplate(go_id);
if (!gInfo)
{
PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, go_id);
@@ -1307,21 +1307,17 @@ bool ChatHandler::HandleLookupObjectCommand(const char *args)
uint32 count = 0;
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
- for (uint32 id = 0; id< sGOStorage.MaxEntry; id++)
+ GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
+ for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
{
- GameObjectInfo const* gInfo = sGOStorage.LookupEntry<GameObjectInfo>(id);
- if (!gInfo)
- continue;
-
- int loc_idx = GetSessionDbLocaleIndex();
- if (loc_idx >= 0)
+ uint8 localeIndex = GetSessionDbLocaleIndex();
+ if (localeIndex >= 0)
{
- uint8 uloc_idx = uint8(loc_idx);
- if (GameObjectLocale const *gl = sObjectMgr->GetGameObjectLocale(id))
+ if (GameObjectLocale const *gl = sObjectMgr->GetGameObjectLocale(itr->second.entry))
{
- if (gl->Name.size() > uloc_idx && !gl->Name[uloc_idx].empty())
+ if (gl->Name.size() > localeIndex && !gl->Name[localeIndex].empty())
{
- std::string name = gl->Name[uloc_idx];
+ std::string name = gl->Name[localeIndex];
if (Utf8FitTo(name, wnamepart))
{
@@ -1332,9 +1328,9 @@ bool ChatHandler::HandleLookupObjectCommand(const char *args)
}
if (m_session)
- PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, id, id, name.c_str());
+ PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, itr->second.entry, itr->second.entry, name.c_str());
else
- PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, id, name.c_str());
+ PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, itr->second.entry, name.c_str());
if (!found)
found = true;
@@ -1345,7 +1341,7 @@ bool ChatHandler::HandleLookupObjectCommand(const char *args)
}
}
- std::string name = gInfo->name;
+ std::string name = itr->second.name;
if (name.empty())
continue;
@@ -1358,9 +1354,9 @@ bool ChatHandler::HandleLookupObjectCommand(const char *args)
}
if (m_session)
- PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, id, id, name.c_str());
+ PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, itr->second.entry, itr->second.entry, name.c_str());
else
- PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, id, name.c_str());
+ PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, itr->second.entry, name.c_str());
if (!found)
found = true;
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 398b9eb3211..4f19b7c826d 100755
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -1226,7 +1226,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
case SPELL_TARGET_TYPE_GAMEOBJECT:
{
- if (cond->mConditionValue2 && !sGOStorage.LookupEntry<GameObjectInfo>(cond->mConditionValue2))
+ if (cond->mConditionValue2 && !sObjectMgr->GetGameObjectTemplate(cond->mConditionValue2))
{
sLog->outErrorDb("SpellTarget condition has non existing gameobject (%u) as target, skipped", cond->mConditionValue2);
return false;
@@ -1369,7 +1369,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
}
case CONDITION_NEAR_GAMEOBJECT:
{
- if (!sGOStorage.LookupEntry<GameObjectInfo>(cond->mConditionValue1))
+ if (!sObjectMgr->GetGameObjectTemplate(cond->mConditionValue1))
{
sLog->outErrorDb("NearGameObject condition has non existing gameobject template entry (%u), skipped", cond->mConditionValue1);
return false;
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index ab6adf0fd53..003c693216d 100755
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -87,7 +87,7 @@ bool GameObject::AIM_Initialize()
std::string GameObject::GetAIName() const
{
- return ObjectMgr::GetGameObjectInfo(GetEntry())->AIName;
+ return sObjectMgr->GetGameObjectTemplate(GetEntry())->AIName;
}
void GameObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
@@ -113,7 +113,7 @@ void GameObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
ownerType = "pet";
sLog->outError("Delete GameObject (GUID: %u Entry: %u SpellId %u LinkedGO %u) that lost references to owner (GUID %u Type '%s') GO list. Crash possible later.",
- GetGUIDLow(), GetGOInfo()->id, m_spellId, GetGOInfo()->GetLinkedGameObjectEntry(), GUID_LOPART(owner_guid), ownerType);
+ GetGUIDLow(), GetGOInfo()->entry, m_spellId, GetGOInfo()->GetLinkedGameObjectEntry(), GUID_LOPART(owner_guid), ownerType);
}
}
}
@@ -146,7 +146,7 @@ void GameObject::RemoveFromWorld()
if (Unit * owner = GetOwner())
owner->RemoveGameObject(this,false);
else
- sLog->outError("Delete GameObject (GUID: %u Entry: %u) that have references in not found creature %u GO list. Crash possible later.",GetGUIDLow(),GetGOInfo()->id,GUID_LOPART(owner_guid));
+ sLog->outError("Delete GameObject (GUID: %u Entry: %u) that have references in not found creature %u GO list. Crash possible later.",GetGUIDLow(),GetGOInfo()->entry,GUID_LOPART(owner_guid));
}
WorldObject::RemoveFromWorld();
sObjectAccessor->RemoveObject(this);
@@ -175,14 +175,14 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
return false;
}
- GameObjectInfo const* goinfo = ObjectMgr::GetGameObjectInfo(name_id);
+ GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(name_id);
if (!goinfo)
{
sLog->outErrorDb("Gameobject (GUID: %u Entry: %u) not created: it have not exist entry in `gameobject_template`. Map: %u (X: %f Y: %f Z: %f) ang: %f rotation0: %f rotation1: %f rotation2: %f rotation3: %f",guidlow, name_id, map->GetId(), x, y, z, ang, rotation0, rotation1, rotation2, rotation3);
return false;
}
- Object::_Create(guidlow, goinfo->id, HIGHGUID_GAMEOBJECT);
+ Object::_Create(guidlow, goinfo->entry, HIGHGUID_GAMEOBJECT);
m_goInfo = goinfo;
@@ -202,7 +202,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
- SetEntry(goinfo->id);
+ SetEntry(goinfo->entry);
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
@@ -276,7 +276,7 @@ void GameObject::Update(uint32 diff)
case GAMEOBJECT_TYPE_TRAP:
{
// Arming Time for GAMEOBJECT_TYPE_TRAP (6)
- GameObjectInfo const* goInfo = GetGOInfo();
+ GameObjectTemplate const* goInfo = GetGOInfo();
// Bombs
if (goInfo->trap.type == 2)
m_cooldownTime = time(NULL) + 10; // Hardcoded tooltip value
@@ -386,7 +386,7 @@ void GameObject::Update(uint32 diff)
if (isSpawned())
{
// traps can have time and can not have
- GameObjectInfo const* goInfo = GetGOInfo();
+ GameObjectTemplate const* goInfo = GetGOInfo();
if (goInfo->type == GAMEOBJECT_TYPE_TRAP)
{
if (m_cooldownTime >= time(NULL))
@@ -653,7 +653,7 @@ void GameObject::SaveToDB()
void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
{
- const GameObjectInfo *goI = GetGOInfo();
+ const GameObjectTemplate *goI = GetGOInfo();
if (!goI)
return;
@@ -816,7 +816,7 @@ bool GameObject::hasInvolvedQuest(uint32 quest_id) const
bool GameObject::IsTransport() const
{
// If something is marked as a transport, don't transmit an out of range packet for it.
- GameObjectInfo const * gInfo = GetGOInfo();
+ GameObjectTemplate const * gInfo = GetGOInfo();
if (!gInfo) return false;
return gInfo->type == GAMEOBJECT_TYPE_TRANSPORT || gInfo->type == GAMEOBJECT_TYPE_MO_TRANSPORT;
}
@@ -825,7 +825,7 @@ bool GameObject::IsTransport() const
bool GameObject::IsDynTransport() const
{
// If something is marked as a transport, don't transmit an out of range packet for it.
- GameObjectInfo const * gInfo = GetGOInfo();
+ GameObjectTemplate const * gInfo = GetGOInfo();
if (!gInfo) return false;
return gInfo->type == GAMEOBJECT_TYPE_MO_TRANSPORT || (gInfo->type == GAMEOBJECT_TYPE_TRANSPORT && !gInfo->transport.pause);
}
@@ -919,7 +919,7 @@ bool GameObject::ActivateToQuest(Player *pTarget) const
void GameObject::TriggeringLinkedGameObject(uint32 trapEntry, Unit* target)
{
- GameObjectInfo const* trapInfo = sGOStorage.LookupEntry<GameObjectInfo>(trapEntry);
+ GameObjectTemplate const* trapInfo = sObjectMgr->GetGameObjectTemplate(trapEntry);
if (!trapInfo || trapInfo->type != GAMEOBJECT_TYPE_TRAP)
return;
@@ -1084,7 +1084,7 @@ void GameObject::Use(Unit* user)
//Sitting: Wooden bench, chairs enzz
case GAMEOBJECT_TYPE_CHAIR: //7
{
- GameObjectInfo const* info = GetGOInfo();
+ GameObjectTemplate const* info = GetGOInfo();
if (!info)
return;
@@ -1174,7 +1174,7 @@ void GameObject::Use(Unit* user)
//big gun, its a spell/aura
case GAMEOBJECT_TYPE_GOOBER: //10
{
- GameObjectInfo const* info = GetGOInfo();
+ GameObjectTemplate const* info = GetGOInfo();
if (user->GetTypeId() == TYPEID_PLAYER)
{
@@ -1210,7 +1210,7 @@ void GameObject::Use(Unit* user)
if (Battleground* bg = player->GetBattleground())
bg->EventPlayerUsedGO(player, this);
- player->CastedCreatureOrGO(info->id, GetGUID(), 0);
+ player->CastedCreatureOrGO(info->entry, GetGUID(), 0);
}
if (uint32 trapEntry = info->goober.linkedTrapId)
@@ -1237,7 +1237,7 @@ void GameObject::Use(Unit* user)
}
case GAMEOBJECT_TYPE_CAMERA: //13
{
- GameObjectInfo const* info = GetGOInfo();
+ GameObjectTemplate const* info = GetGOInfo();
if (!info)
return;
@@ -1343,7 +1343,7 @@ void GameObject::Use(Unit* user)
Unit* owner = GetOwner();
- GameObjectInfo const* info = GetGOInfo();
+ GameObjectTemplate const* info = GetGOInfo();
// ritual owner is set for GO's without owner (not summoned)
if (!m_ritualOwner && !owner)
@@ -1421,7 +1421,7 @@ void GameObject::Use(Unit* user)
}
case GAMEOBJECT_TYPE_SPELLCASTER: //22
{
- GameObjectInfo const* info = GetGOInfo();
+ GameObjectTemplate const* info = GetGOInfo();
if (!info)
return;
@@ -1443,7 +1443,7 @@ void GameObject::Use(Unit* user)
}
case GAMEOBJECT_TYPE_MEETINGSTONE: //23
{
- GameObjectInfo const* info = GetGOInfo();
+ GameObjectTemplate const* info = GetGOInfo();
if (user->GetTypeId() != TYPEID_PLAYER)
return;
@@ -1464,7 +1464,7 @@ void GameObject::Use(Unit* user)
if (level < info->meetingstone.minLevel)
return;
- if (info->id == 194097)
+ if (info->entry == 194097)
spellId = 61994; // Ritual of Summoning
else
spellId = 59782; // Summoning Stone Effect
@@ -1508,7 +1508,7 @@ void GameObject::Use(Unit* user)
Player* player = user->ToPlayer();
player->SendLoot(GetGUID(), LOOT_FISHINGHOLE);
- player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT, GetGOInfo()->id);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT, GetGOInfo()->entry);
return;
}
@@ -1533,10 +1533,10 @@ void GameObject::Use(Unit* user)
// 179786 - Warsong Flag
// EotS:
// 184142 - Netherstorm Flag
- GameObjectInfo const* info = GetGOInfo();
+ GameObjectTemplate const* info = GetGOInfo();
if (info)
{
- switch(info->id)
+ switch(info->entry)
{
case 179785: // Silverwing Flag
// check if it's correct bg
@@ -1561,7 +1561,7 @@ void GameObject::Use(Unit* user)
}
case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
{
- GameObjectInfo const* info = GetGOInfo();
+ GameObjectTemplate const* info = GetGOInfo();
if (!info)
return;
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index f01d7c673af..4231a373f35 100755
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -38,15 +38,15 @@ class GameObjectAI;
#define MAX_GAMEOBJECT_QUEST_ITEMS 6
// from `gameobject_template`
-struct GameObjectInfo
+struct GameObjectTemplate
{
- uint32 id;
+ uint32 entry;
uint32 type;
uint32 displayId;
- char *name;
- char *IconName;
- char *castBarCaption;
- char *unk1;
+ const char* name;
+ const char* IconName;
+ const char* castBarCaption;
+ const char* unk1;
uint32 faction;
uint32 flags;
float size;
@@ -398,9 +398,11 @@ struct GameObjectInfo
// not use for specific field access (only for output with loop by all filed), also this determinate max union size
struct
{
- uint32 data[24];
+ uint32 data[MAX_GAMEOBJECT_DATA];
} raw;
};
+
+
char const* AIName;
uint32 ScriptId;
@@ -528,6 +530,9 @@ struct GameObjectInfo
}
};
+// Benchmarked: Faster than std::map (insert/find)
+typedef UNORDERED_MAP<uint32, GameObjectTemplate> GameObjectTemplateContainer;
+
class OPvPCapturePoint;
union GameObjectValue
@@ -620,7 +625,7 @@ class GameObject : public WorldObject, public GridObject<GameObject>
bool Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, GOState go_state, uint32 artKit = 0);
void Update(uint32 p_time);
static GameObject* GetGameObject(WorldObject& object, uint64 guid);
- GameObjectInfo const* GetGOInfo() const { return m_goInfo; }
+ GameObjectTemplate const* GetGOInfo() const { return m_goInfo; }
GameObjectData const* GetGOData() const { return m_goData; }
GameObjectValue * GetGOValue() const { return m_goValue; }
@@ -791,7 +796,7 @@ class GameObject : public WorldObject, public GridObject<GameObject>
ChairSlotAndUser ChairListSlots;
uint32 m_DBTableGuid; ///< For new or temporary gameobjects is 0 for saved it is lowguid
- GameObjectInfo const* m_goInfo;
+ GameObjectTemplate const* m_goInfo;
GameObjectData const* m_goData;
GameObjectValue * const m_goValue;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index a8ca18a04b1..49e6cafba47 100755
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -2279,7 +2279,7 @@ GameObject* WorldObject::SummonGameObject(uint32 entry, float x, float y, float
if (!IsInWorld())
return NULL;
- GameObjectInfo const* goinfo = ObjectMgr::GetGameObjectInfo(entry);
+ GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
if (!goinfo)
{
sLog->outErrorDb("Gameobject template %u not found in database!", entry);
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index e60f415dc15..2c799ca13b4 100755
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -54,7 +54,7 @@ void MapManager::LoadTransports()
Transport *t = new Transport(period, scriptId);
- const GameObjectInfo *goinfo = ObjectMgr::GetGameObjectInfo(entry);
+ const GameObjectTemplate *goinfo = sObjectMgr->GetGameObjectTemplate(entry);
if (!goinfo)
{
@@ -207,7 +207,7 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa
Object::_Create(guidlow, 0, HIGHGUID_MO_TRANSPORT);
- GameObjectInfo const* goinfo = ObjectMgr::GetGameObjectInfo(entry);
+ GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
if (!goinfo)
{
@@ -223,7 +223,7 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa
//SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
SetUInt32Value(GAMEOBJECT_FLAGS, MAKE_PAIR32(0x28, 0x64));
SetUInt32Value(GAMEOBJECT_LEVEL, m_period);
- SetEntry(goinfo->id);
+ SetEntry(goinfo->entry);
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 8c08078cc4f..acbb5d9a154 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -1648,7 +1648,7 @@ void ObjectMgr::RemoveCreatureFromGrid(uint32 guid, CreatureData const* data)
uint32 ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay, float rotation0, float rotation1, float rotation2, float rotation3)
{
- GameObjectInfo const* goinfo = GetGameObjectInfo(entry);
+ GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
if (!goinfo)
return 0;
@@ -1821,7 +1821,7 @@ void ObjectMgr::LoadGameobjects()
uint32 guid = fields[ 0].GetUInt32();
uint32 entry = fields[ 1].GetUInt32();
- GameObjectInfo const* gInfo = GetGameObjectInfo(entry);
+ GameObjectTemplate const* gInfo = GetGameObjectTemplate(entry);
if (!gInfo)
{
sLog->outErrorDb("Table `gameobject` has gameobject (GUID: %u) with non existing gameobject entry %u, skipped.", guid, entry);
@@ -4726,7 +4726,7 @@ void ObjectMgr::LoadQuests()
for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
{
int32 id = qinfo->ReqCreatureOrGOId[j];
- if (id < 0 && !sGOStorage.LookupEntry<GameObjectInfo>(-id))
+ if (id < 0 && !sObjectMgr->GetGameObjectTemplate(-id))
{
sLog->outErrorDb("Quest %u has `ReqCreatureOrGOId%d` = %i but gameobject %u does not exist, quest can't be done.",
qinfo->GetQuestId(),j+1,id,uint32(-id));
@@ -5229,7 +5229,7 @@ void ObjectMgr::LoadScripts(ScriptsType type)
continue;
}
- GameObjectInfo const* info = GetGameObjectInfo(data->id);
+ GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
if (!info)
{
sLog->outErrorDb("Table `%s` has gameobject with invalid entry (GUID: %u Entry: %u) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id %u",
@@ -5244,7 +5244,7 @@ void ObjectMgr::LoadScripts(ScriptsType type)
info->type == GAMEOBJECT_TYPE_TRAP)
{
sLog->outErrorDb("Table `%s` have gameobject type (%u) unsupported by command SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id %u",
- tableName.c_str(), info->id, tmp.id);
+ tableName.c_str(), info->entry, tmp.id);
continue;
}
break;
@@ -5279,7 +5279,7 @@ void ObjectMgr::LoadScripts(ScriptsType type)
continue;
}
- GameObjectInfo const* info = GetGameObjectInfo(data->id);
+ GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
if (!info)
{
sLog->outErrorDb("Table `%s` has gameobject with invalid entry (GUID: %u Entry: %u) in %s for script id %u",
@@ -5290,7 +5290,7 @@ void ObjectMgr::LoadScripts(ScriptsType type)
if (info->type != GAMEOBJECT_TYPE_DOOR)
{
sLog->outErrorDb("Table `%s` has gameobject type (%u) non supported by command %s for script id %u",
- tableName.c_str(), info->id, GetScriptCommandName(tmp.command).c_str(), tmp.id);
+ tableName.c_str(), info->entry, GetScriptCommandName(tmp.command).c_str(), tmp.id);
continue;
}
@@ -5443,12 +5443,11 @@ void ObjectMgr::LoadEventScripts()
std::set<uint32> evt_scripts;
// Load all possible script entries from gameobjects
- for (uint32 i = 1; i < sGOStorage.MaxEntry; ++i)
- {
- if (GameObjectInfo const * goInfo = sGOStorage.LookupEntry<GameObjectInfo>(i))
- if (uint32 eventId = goInfo->GetEventScriptId())
- evt_scripts.insert(eventId);
- }
+ GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
+ for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
+ if (uint32 eventId = itr->second.GetEventScriptId())
+ evt_scripts.insert(eventId);
+
// Load all possible script entries from spells
for (uint32 i = 1; i < sSpellStore.GetNumRows(); ++i)
{
@@ -7050,213 +7049,256 @@ struct SQLGameObjectLoader : public SQLStorageLoaderBase<SQLGameObjectLoader>
}
};
-inline void CheckGOLockId(GameObjectInfo const* goInfo,uint32 dataN,uint32 N)
+inline void CheckGOLockId(GameObjectTemplate* goInfo,uint32 dataN,uint32 N)
{
if (sLockStore.LookupEntry(dataN))
return;
sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data%d=%u but lock (Id: %u) not found.",
- goInfo->id,goInfo->type,N,goInfo->door.lockId,goInfo->door.lockId);
+ goInfo->entry,goInfo->type,N,goInfo->door.lockId,goInfo->door.lockId);
}
-inline void CheckGOLinkedTrapId(GameObjectInfo const* goInfo,uint32 dataN,uint32 N)
+inline void CheckGOLinkedTrapId(GameObjectTemplate const* goInfo,uint32 dataN,uint32 N)
{
- if (GameObjectInfo const* trapInfo = sGOStorage.LookupEntry<GameObjectInfo>(dataN))
+ if (GameObjectTemplate const* trapInfo = sObjectMgr->GetGameObjectTemplate(dataN))
{
if (trapInfo->type != GAMEOBJECT_TYPE_TRAP)
sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data%d=%u but GO (Entry %u) have not GAMEOBJECT_TYPE_TRAP (%u) type.",
- goInfo->id,goInfo->type,N,dataN,dataN,GAMEOBJECT_TYPE_TRAP);
+ goInfo->entry,goInfo->type,N,dataN,dataN,GAMEOBJECT_TYPE_TRAP);
}
}
-inline void CheckGOSpellId(GameObjectInfo const* goInfo,uint32 dataN,uint32 N)
+inline void CheckGOSpellId(GameObjectTemplate const* goInfo,uint32 dataN,uint32 N)
{
if (sSpellStore.LookupEntry(dataN))
return;
sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data%d=%u but Spell (Entry %u) not exist.",
- goInfo->id,goInfo->type,N,dataN,dataN);
+ goInfo->entry,goInfo->type,N,dataN,dataN);
}
-inline void CheckAndFixGOChairHeightId(GameObjectInfo const* goInfo,uint32 const& dataN,uint32 N)
+inline void CheckAndFixGOChairHeightId(GameObjectTemplate const* goInfo,uint32 const& dataN,uint32 N)
{
if (dataN <= (UNIT_STAND_STATE_SIT_HIGH_CHAIR-UNIT_STAND_STATE_SIT_LOW_CHAIR))
return;
sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data%d=%u but correct chair height in range 0..%i.",
- goInfo->id,goInfo->type,N,dataN,UNIT_STAND_STATE_SIT_HIGH_CHAIR-UNIT_STAND_STATE_SIT_LOW_CHAIR);
+ goInfo->entry,goInfo->type,N,dataN,UNIT_STAND_STATE_SIT_HIGH_CHAIR-UNIT_STAND_STATE_SIT_LOW_CHAIR);
// prevent client and server unexpected work
const_cast<uint32&>(dataN) = 0;
}
-inline void CheckGONoDamageImmuneId(GameObjectInfo const* goInfo,uint32 dataN,uint32 N)
+inline void CheckGONoDamageImmuneId(GameObjectTemplate* goTemplate, uint32 dataN, uint32 N)
{
// 0/1 correct values
if (dataN <= 1)
return;
- sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data%d=%u but expected boolean (0/1) noDamageImmune field value.",
- goInfo->id,goInfo->type,N,dataN);
+ sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data%d=%u but expected boolean (0/1) noDamageImmune field value.", goTemplate->entry, goTemplate->type, N, dataN);
}
-inline void CheckGOConsumable(GameObjectInfo const* goInfo,uint32 dataN,uint32 N)
+inline void CheckGOConsumable(GameObjectTemplate const* goInfo,uint32 dataN,uint32 N)
{
// 0/1 correct values
if (dataN <= 1)
return;
sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data%d=%u but expected boolean (0/1) consumable field value.",
- goInfo->id,goInfo->type,N,dataN);
+ goInfo->entry,goInfo->type,N,dataN);
}
-void ObjectMgr::LoadGameobjectInfo()
+void ObjectMgr::LoadGameObjectTemplate()
{
uint32 oldMSTime = getMSTime();
- SQLGameObjectLoader loader;
- loader.Load(sGOStorage);
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12
+ QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, faction, flags, size, questItem1, questItem2, questItem3, "
+ // 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
+ "questItem4, questItem5, questItem6, data0, data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11, data12, "
+ // 29 30 31 32 33 34 35 36 37 38 39 40 41
+ "data13, data14, data15, data16, data17, data18, data19, data20, data21, data22, data23, AIName, ScriptName "
+ "FROM gameobject_template");
- // some checks
- for (uint32 id = 1; id < sGOStorage.MaxEntry; id++)
+ if (!result)
{
- GameObjectInfo const* goInfo = sGOStorage.LookupEntry<GameObjectInfo>(id);
- if (!goInfo)
- continue;
+ sLog->outString(">> Loaded 0 gameobject definitions. DB table `gameobject_template` is empty.");
+ sLog->outString();
+ return;
+ }
- // some GO types have unused go template, check goInfo->displayId at GO spawn data loading or ignore
+ uint32 count = 0;
+ do
+ {
+ Field *fields = result->Fetch();
+
+ uint32 entry = fields[0].GetUInt32();
- switch(goInfo->type)
+ GameObjectTemplate got;
+
+ got.entry = entry;
+ got.type = uint32(fields[1].GetUInt8());
+ got.displayId = fields[2].GetUInt32();
+ got.name = fields[3].GetCString();
+ got.IconName = fields[4].GetCString();
+ got.castBarCaption = fields[5].GetCString();
+ got.unk1 = fields[6].GetCString();
+ got.faction = uint32(fields[7].GetUInt16());
+ got.flags = fields[8].GetUInt32();
+ got.size = fields[9].GetFloat();
+
+ for (uint8 i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i)
{
- case GAMEOBJECT_TYPE_DOOR: //0
+ got.questItems[i] = fields[10 + i].GetUInt32();
+ }
+
+ for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
+ {
+ got.raw.data[i] = fields[16 + i].GetUInt32();
+ }
+
+ got.AIName = fields[40].GetCString();
+ got.ScriptId = GetScriptId(fields[41].GetCString());
+
+ // Checks
+
+ switch(got.type)
+ {
+ case GAMEOBJECT_TYPE_DOOR: //0
{
- if (goInfo->door.lockId)
- CheckGOLockId(goInfo,goInfo->door.lockId,1);
- CheckGONoDamageImmuneId(goInfo,goInfo->door.noDamageImmune,3);
+ if (got.door.lockId)
+ CheckGOLockId(&got, got.door.lockId, 1);
+ CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3);
break;
}
- case GAMEOBJECT_TYPE_BUTTON: //1
+ case GAMEOBJECT_TYPE_BUTTON: //1
{
- if (goInfo->button.lockId)
- CheckGOLockId(goInfo,goInfo->button.lockId,1);
- CheckGONoDamageImmuneId(goInfo,goInfo->button.noDamageImmune,4);
+ if (got.button.lockId)
+ CheckGOLockId(&got, got.button.lockId, 1);
+ CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4);
break;
}
- case GAMEOBJECT_TYPE_QUESTGIVER: //2
+ case GAMEOBJECT_TYPE_QUESTGIVER: //2
{
- if (goInfo->questgiver.lockId)
- CheckGOLockId(goInfo,goInfo->questgiver.lockId,0);
- CheckGONoDamageImmuneId(goInfo,goInfo->questgiver.noDamageImmune,5);
+ if (got.questgiver.lockId)
+ CheckGOLockId(&got, got.questgiver.lockId, 0);
+ CheckGONoDamageImmuneId(&got, got.questgiver.noDamageImmune, 5);
break;
}
- case GAMEOBJECT_TYPE_CHEST: //3
+ case GAMEOBJECT_TYPE_CHEST: //3
{
- if (goInfo->chest.lockId)
- CheckGOLockId(goInfo,goInfo->chest.lockId,0);
+ if (got.chest.lockId)
+ CheckGOLockId(&got, got.chest.lockId, 0);
- CheckGOConsumable(goInfo,goInfo->chest.consumable,3);
+ CheckGOConsumable(&got, got.chest.consumable, 3);
- if (goInfo->chest.linkedTrapId) // linked trap
- CheckGOLinkedTrapId(goInfo,goInfo->chest.linkedTrapId,7);
+ if (&got.chest.linkedTrapId) // linked trap
+ CheckGOLinkedTrapId(&got, got.chest.linkedTrapId, 7);
break;
}
- case GAMEOBJECT_TYPE_TRAP: //6
+ case GAMEOBJECT_TYPE_TRAP: //6
{
- if (goInfo->trap.lockId)
- CheckGOLockId(goInfo,goInfo->trap.lockId,0);
+ if (got.trap.lockId)
+ CheckGOLockId(&got, got.trap.lockId, 0);
break;
}
- case GAMEOBJECT_TYPE_CHAIR: //7
- CheckAndFixGOChairHeightId(goInfo,goInfo->chair.height,1);
- break;
- case GAMEOBJECT_TYPE_SPELL_FOCUS: //8
+ case GAMEOBJECT_TYPE_CHAIR: //7
+ CheckAndFixGOChairHeightId(&got, got.chair.height, 1);
+ break;
+ case GAMEOBJECT_TYPE_SPELL_FOCUS: //8
{
- if (goInfo->spellFocus.focusId)
+ if (got.spellFocus.focusId)
{
- if (!sSpellFocusObjectStore.LookupEntry(goInfo->spellFocus.focusId))
- sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data0=%u but SpellFocus (Id: %u) not exist.",
- id,goInfo->type,goInfo->spellFocus.focusId,goInfo->spellFocus.focusId);
+ if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.focusId))
+ sLog->outErrorDb("GameObject (Entry: %u GoType: %u) have data0=%u but SpellFocus (Id: %u) not exist.",
+ entry, got.type, got.spellFocus.focusId, got.spellFocus.focusId);
}
- if (goInfo->spellFocus.linkedTrapId) // linked trap
- CheckGOLinkedTrapId(goInfo,goInfo->spellFocus.linkedTrapId,2);
+ if (got.spellFocus.linkedTrapId) // linked trap
+ CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrapId, 2);
break;
}
- case GAMEOBJECT_TYPE_GOOBER: //10
+ case GAMEOBJECT_TYPE_GOOBER: //10
{
- if (goInfo->goober.lockId)
- CheckGOLockId(goInfo,goInfo->goober.lockId,0);
+ if (got.goober.lockId)
+ CheckGOLockId(&got, got.goober.lockId, 0);
- CheckGOConsumable(goInfo,goInfo->goober.consumable,3);
+ CheckGOConsumable(&got, got.goober.consumable, 3);
- if (goInfo->goober.pageId) // pageId
+ if (got.goober.pageId) // pageId
{
- if (!GetPageText(goInfo->goober.pageId))
- sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data7=%u but PageText (Entry %u) not exist.",
- id,goInfo->type,goInfo->goober.pageId,goInfo->goober.pageId);
+ if (!GetPageText(got.goober.pageId))
+ sLog->outErrorDb("GameObject (Entry: %u GoType: %u) have data7=%u but PageText (Entry %u) not exist.",
+ entry, got.type, got.goober.pageId, got.goober.pageId);
}
- CheckGONoDamageImmuneId(goInfo,goInfo->goober.noDamageImmune,11);
- if (goInfo->goober.linkedTrapId) // linked trap
- CheckGOLinkedTrapId(goInfo,goInfo->goober.linkedTrapId,12);
+ CheckGONoDamageImmuneId(&got, got.goober.noDamageImmune, 11);
+ if (got.goober.linkedTrapId) // linked trap
+ CheckGOLinkedTrapId(&got, got.goober.linkedTrapId, 12);
break;
}
- case GAMEOBJECT_TYPE_AREADAMAGE: //12
+ case GAMEOBJECT_TYPE_AREADAMAGE: //12
{
- if (goInfo->areadamage.lockId)
- CheckGOLockId(goInfo,goInfo->areadamage.lockId,0);
+ if (got.areadamage.lockId)
+ CheckGOLockId(&got, got.areadamage.lockId, 0);
break;
}
- case GAMEOBJECT_TYPE_CAMERA: //13
+ case GAMEOBJECT_TYPE_CAMERA: //13
{
- if (goInfo->camera.lockId)
- CheckGOLockId(goInfo,goInfo->camera.lockId,0);
+ if (got.camera.lockId)
+ CheckGOLockId(&got, got.camera.lockId, 0);
break;
}
- case GAMEOBJECT_TYPE_MO_TRANSPORT: //15
+ case GAMEOBJECT_TYPE_MO_TRANSPORT: //15
{
- if (goInfo->moTransport.taxiPathId)
+ if (got.moTransport.taxiPathId)
{
- if (goInfo->moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[goInfo->moTransport.taxiPathId].empty())
- sLog->outErrorDb("Gameobject (Entry: %u GoType: %u) have data0=%u but TaxiPath (Id: %u) not exist.",
- id,goInfo->type,goInfo->moTransport.taxiPathId,goInfo->moTransport.taxiPathId);
+ if (got.moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathId].empty())
+ sLog->outErrorDb("GameObject (Entry: %u GoType: %u) have data0=%u but TaxiPath (Id: %u) not exist.",
+ entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId);
}
break;
}
- case GAMEOBJECT_TYPE_SUMMONING_RITUAL: //18
- break;
- case GAMEOBJECT_TYPE_SPELLCASTER: //22
+ case GAMEOBJECT_TYPE_SUMMONING_RITUAL: //18
+ break;
+ case GAMEOBJECT_TYPE_SPELLCASTER: //22
{
// always must have spell
- CheckGOSpellId(goInfo,goInfo->spellcaster.spellId,0);
+ CheckGOSpellId(&got, got.spellcaster.spellId, 0);
break;
}
- case GAMEOBJECT_TYPE_FLAGSTAND: //24
+ case GAMEOBJECT_TYPE_FLAGSTAND: //24
{
- if (goInfo->flagstand.lockId)
- CheckGOLockId(goInfo,goInfo->flagstand.lockId,0);
- CheckGONoDamageImmuneId(goInfo,goInfo->flagstand.noDamageImmune,5);
+ if (got.flagstand.lockId)
+ CheckGOLockId(&got, got.flagstand.lockId, 0);
+ CheckGONoDamageImmuneId(&got, got.flagstand.noDamageImmune, 5);
break;
}
- case GAMEOBJECT_TYPE_FISHINGHOLE: //25
+ case GAMEOBJECT_TYPE_FISHINGHOLE: //25
{
- if (goInfo->fishinghole.lockId)
- CheckGOLockId(goInfo,goInfo->fishinghole.lockId,4);
+ if (got.fishinghole.lockId)
+ CheckGOLockId(&got, got.fishinghole.lockId, 4);
break;
}
- case GAMEOBJECT_TYPE_FLAGDROP: //26
+ case GAMEOBJECT_TYPE_FLAGDROP: //26
{
- if (goInfo->flagdrop.lockId)
- CheckGOLockId(goInfo,goInfo->flagdrop.lockId,0);
- CheckGONoDamageImmuneId(goInfo,goInfo->flagdrop.noDamageImmune,3);
+ if (got.flagdrop.lockId)
+ CheckGOLockId(&got, got.flagdrop.lockId, 0);
+ CheckGONoDamageImmuneId(&got, got.flagdrop.noDamageImmune, 3);
break;
}
- case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
- CheckAndFixGOChairHeightId(goInfo,goInfo->barberChair.chairheight,0);
- break;
+ case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
+ CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0);
+ break;
}
+
+ // Add to gameobject to map
+ GameObjectTemplateStore[entry] = got;
+
+ ++count;
}
+ while (result->NextRow());
- sLog->outString(">> Loaded %u game object templates in %u ms", sGOStorage.RecordCount, GetMSTimeDiffToNow(oldMSTime));
+ sLog->outString(">> Loaded %u game object templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
sLog->outString();
}
@@ -8099,7 +8141,7 @@ void ObjectMgr::LoadGameobjectQuestRelations()
for (QuestRelations::iterator itr = mGOQuestRelations.begin(); itr != mGOQuestRelations.end(); ++itr)
{
- GameObjectInfo const* goInfo = GetGameObjectInfo(itr->first);
+ GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
if (!goInfo)
sLog->outErrorDb("Table `gameobject_questrelation` have data for not existed gameobject entry (%u) and existed quest %u",itr->first,itr->second);
else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
@@ -8113,7 +8155,7 @@ void ObjectMgr::LoadGameobjectInvolvedRelations()
for (QuestRelations::iterator itr = mGOQuestInvolvedRelations.begin(); itr != mGOQuestInvolvedRelations.end(); ++itr)
{
- GameObjectInfo const* goInfo = GetGameObjectInfo(itr->first);
+ GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
if (!goInfo)
sLog->outErrorDb("Table `gameobject_involvedrelation` have data for not existed gameobject entry (%u) and existed quest %u",itr->first,itr->second);
else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
@@ -8338,7 +8380,7 @@ void ObjectMgr::LoadGameObjectForQuests()
mGameObjectForQuestSet.clear(); // need for reload case
- if (!sGOStorage.MaxEntry)
+ if (!sObjectMgr->GetGameObjectTemplates()->empty())
{
sLog->outString(">> Loaded 0 GameObjects for quests");
sLog->outString();
@@ -8348,41 +8390,38 @@ void ObjectMgr::LoadGameObjectForQuests()
uint32 count = 0;
// collect GO entries for GO that must activated
- for (uint32 go_entry = 1; go_entry < sGOStorage.MaxEntry; ++go_entry)
+ GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
+ for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
{
- GameObjectInfo const* goInfo = sGOStorage.LookupEntry<GameObjectInfo>(go_entry);
- if (!goInfo)
- continue;
-
- switch(goInfo->type)
+ switch(itr->second.type)
{
// scan GO chest with loot including quest items
case GAMEOBJECT_TYPE_CHEST:
{
- uint32 loot_id = goInfo->GetLootId();
+ uint32 loot_id = (itr->second.GetLootId());
// find quest loot for GO
- if (goInfo->chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
+ if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
{
- mGameObjectForQuestSet.insert(go_entry);
+ mGameObjectForQuestSet.insert(itr->second.entry);
++count;
}
break;
}
case GAMEOBJECT_TYPE_GENERIC:
{
- if (goInfo->_generic.questID > 0) //quests objects
+ if (itr->second._generic.questID > 0) //quests objects
{
- mGameObjectForQuestSet.insert(go_entry);
+ mGameObjectForQuestSet.insert(itr->second.entry);
count++;
}
break;
}
case GAMEOBJECT_TYPE_GOOBER:
{
- if (goInfo->goober.questId > 0) //quests objects
+ if (itr->second.goober.questId > 0) //quests objects
{
- mGameObjectForQuestSet.insert(go_entry);
+ mGameObjectForQuestSet.insert(itr->second.entry);
count++;
}
break;
@@ -9648,3 +9687,12 @@ void ObjectMgr::FreeGroupStorageId(Group* group)
mGroupStorage[storageId] = NULL;
}
+
+GameObjectTemplate const* ObjectMgr::GetGameObjectTemplate(uint32 entry)
+{
+ GameObjectTemplateContainer::const_iterator itr = GameObjectTemplateStore.find(entry);
+ if (itr != GameObjectTemplateStore.end())
+ return &(itr->second);
+
+ return NULL;
+}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 185a2f03b58..6510636ce85 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -45,7 +45,6 @@
#include <functional>
extern SQLStorage sCreatureStorage;
-extern SQLStorage sGOStorage;
class Group;
class Guild;
@@ -640,11 +639,12 @@ class ObjectMgr
Player* GetPlayer(uint64 guid) const { return ObjectAccessor::FindPlayer(guid); }
Player* GetPlayerByLowGUID(uint32 lowguid) const;
- static GameObjectInfo const *GetGameObjectInfo(uint32 id) { return sGOStorage.LookupEntry<GameObjectInfo>(id); }
+ GameObjectTemplate const* GetGameObjectTemplate(uint32 entry);
+ GameObjectTemplateContainer const* GetGameObjectTemplates() { return &GameObjectTemplateStore; }
int LoadReferenceVendor(int32 vendor, int32 item_id, std::set<uint32> *skip_vendors);
- void LoadGameobjectInfo();
- void AddGameobjectInfo(GameObjectInfo *goinfo);
+ void LoadGameObjectTemplate();
+ void AddGameobjectInfo(GameObjectTemplate *goinfo);
Group * GetGroupByGUID(uint32 guid) const;
void AddGroup(Group* group) { mGroupSet.insert(group); }
@@ -1405,6 +1405,7 @@ class ObjectMgr
CreatureLocaleMap mCreatureLocaleMap;
GameObjectDataMap mGameObjectDataMap;
GameObjectLocaleMap mGameObjectLocaleMap;
+ GameObjectTemplateContainer GameObjectTemplateStore;
ItemTemplateContainer ItemTemplateStore;
ItemLocaleMap mItemLocaleMap;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 1709f4dd03c..c71d9080b92 100755
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -1214,7 +1214,7 @@ namespace Trinity
x(_x), y(_y), z(_z), range(_range), entry(_entry) {}
bool operator() (GameObject* go)
{
- if (!entry || (go->GetGOInfo() && go->GetGOInfo()->id == entry))
+ if (!entry || (go->GetGOInfo() && go->GetGOInfo()->entry == entry))
return go->IsInRange(x, y, z, range);
else return false;
}
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index 895045aac24..a8e75de586e 100755
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -1522,19 +1522,18 @@ void LoadLootTemplates_Gameobject()
uint32 count = LootTemplates_Gameobject.LoadAndCollectLootIds(ids_set);
// remove real entries and check existence loot
- for (uint32 i = 1; i < sGOStorage.MaxEntry; ++i)
+ GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
+ for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
{
- if (GameObjectInfo const* gInfo = sGOStorage.LookupEntry<GameObjectInfo>(i))
+ if (uint32 lootid = itr->second.GetLootId())
{
- if (uint32 lootid = gInfo->GetLootId())
- {
- if (sObjectMgr->IsGoOfSpecificEntrySpawned(gInfo->id) && ids_set.find(lootid) == ids_set.end())
- LootTemplates_Gameobject.ReportNotExistedId(lootid);
- else
- ids_setUsed.insert(lootid);
- }
+ if (sObjectMgr->IsGoOfSpecificEntrySpawned(itr->second.entry) && ids_set.find(lootid) == ids_set.end())
+ LootTemplates_Gameobject.ReportNotExistedId(lootid);
+ else
+ ids_setUsed.insert(lootid);
}
}
+
for (LootIdSet::const_iterator itr = ids_setUsed.begin(); itr != ids_setUsed.end(); ++itr)
ids_set.erase(*itr);
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 2fd47e2d781..f9194b7b1d5 100755
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -1439,6 +1439,7 @@ enum GameobjectTypes
};
#define MAX_GAMEOBJECT_TYPE 36 // sending to client this or greater value can crash client.
+#define MAX_GAMEOBJECT_DATA 24 // Max number of uint32 vars in gameobject_template data field
enum GameObjectFlags
{
diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp
index d04266f7c29..8002c990281 100755
--- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp
+++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp
@@ -120,7 +120,7 @@ bool OPvPCapturePoint::SetCapturePointData(uint32 entry, uint32 map, float x, fl
sLog->outDebug(LOG_FILTER_OUTDOORPVP, "Creating capture point %u", entry);
// check info existence
- GameObjectInfo const* goinfo = ObjectMgr::GetGameObjectInfo(entry);
+ GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
if (!goinfo || goinfo->type != GAMEOBJECT_TYPE_CAPTURE_POINT)
{
sLog->outError("OutdoorPvP: GO %u is not capture point!", entry);
diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp
index fe79583ce52..9aead213ea4 100755
--- a/src/server/game/Pools/PoolMgr.cpp
+++ b/src/server/game/Pools/PoolMgr.cpp
@@ -683,7 +683,7 @@ void PoolMgr::LoadFromDB()
continue;
}
- GameObjectInfo const* goinfo = ObjectMgr::GetGameObjectInfo(data->id);
+ GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(data->id);
if (goinfo->type != GAMEOBJECT_TYPE_CHEST &&
goinfo->type != GAMEOBJECT_TYPE_GOOBER &&
goinfo->type != GAMEOBJECT_TYPE_FISHINGHOLE)
diff --git a/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp b/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp
index a19abb4534c..69e0cb38096 100755
--- a/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp
@@ -213,12 +213,12 @@ void WorldSession::HandleCreatureQueryOpcode(WorldPacket & recv_data)
/// Only _static_ data send in this packet !!!
void WorldSession::HandleGameObjectQueryOpcode(WorldPacket & recv_data)
{
- uint32 entryID;
- recv_data >> entryID;
+ uint32 entry;
+ recv_data >> entry;
uint64 guid;
recv_data >> guid;
- const GameObjectInfo *info = ObjectMgr::GetGameObjectInfo(entryID);
+ const GameObjectTemplate *info = sObjectMgr->GetGameObjectTemplate(entry);
if (info)
{
std::string Name;
@@ -232,15 +232,15 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPacket & recv_data)
int loc_idx = GetSessionDbLocaleIndex();
if (loc_idx >= 0)
{
- if (GameObjectLocale const *gl = sObjectMgr->GetGameObjectLocale(entryID))
+ if (GameObjectLocale const *gl = sObjectMgr->GetGameObjectLocale(entry))
{
sObjectMgr->GetLocaleString(gl->Name, loc_idx, Name);
sObjectMgr->GetLocaleString(gl->CastBarCaption, loc_idx, CastBarCaption);
}
}
- sLog->outDetail("WORLD: CMSG_GAMEOBJECT_QUERY '%s' - Entry: %u. ", info->name, entryID);
+ sLog->outDetail("WORLD: CMSG_GAMEOBJECT_QUERY '%s' - Entry: %u. ", info->name, entry);
WorldPacket data (SMSG_GAMEOBJECT_QUERY_RESPONSE, 150);
- data << uint32(entryID);
+ data << uint32(entry);
data << uint32(info->type);
data << uint32(info->displayId);
data << Name;
@@ -258,9 +258,9 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPacket & recv_data)
else
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_GAMEOBJECT_QUERY - Missing gameobject info for (GUID: %u, ENTRY: %u)",
- GUID_LOPART(guid), entryID);
+ GUID_LOPART(guid), entry);
WorldPacket data (SMSG_GAMEOBJECT_QUERY_RESPONSE, 4);
- data << uint32(entryID | 0x80000000);
+ data << uint32(entry | 0x80000000);
SendPacket(&data);
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE");
}
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 738e0956263..1fb33c8bb36 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2773,7 +2773,7 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex)
// Get lockId
if (gameObjTarget)
{
- GameObjectInfo const* goInfo = gameObjTarget->GetGOInfo();
+ GameObjectTemplate const* goInfo = gameObjTarget->GetGOInfo();
// Arathi Basin banner opening !
if ((goInfo->type == GAMEOBJECT_TYPE_BUTTON && goInfo->button.noDamageImmune) ||
(goInfo->type == GAMEOBJECT_TYPE_GOOBER && goInfo->goober.losOK))
@@ -6340,7 +6340,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex)
{
uint32 name_id = m_spellInfo->EffectMiscValue[effIndex];
- GameObjectInfo const* goinfo = ObjectMgr::GetGameObjectInfo(name_id);
+ GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(name_id);
if (!goinfo)
{
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index e0097b8627a..7af625facc7 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1284,7 +1284,7 @@ void World::SetInitialWorldSettings()
sObjectMgr->LoadPageTexts();
sLog->outString("Loading Game Object Templates..."); // must be after LoadPageTexts
- sObjectMgr->LoadGameobjectInfo();
+ sObjectMgr->LoadGameObjectTemplate();
sLog->outString("Loading Spell Rank Data...");
sSpellMgr->LoadSpellRanks();
diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp
index aef5e85bdd3..7475da88eae 100644
--- a/src/server/scripts/Commands/cs_gobject.cpp
+++ b/src/server/scripts/Commands/cs_gobject.cpp
@@ -121,7 +121,7 @@ public:
char* spawntimeSecs = strtok(NULL, " ");
- const GameObjectInfo *gInfo = ObjectMgr::GetGameObjectInfo(id);
+ const GameObjectTemplate *gInfo = sObjectMgr->GetGameObjectTemplate(id);
if (!gInfo)
{
@@ -149,7 +149,7 @@ public:
GameObject* pGameObj = new GameObject;
uint32 db_lowGUID = sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT);
- 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))
+ if (!pGameObj->Create(db_lowGUID, gInfo->entry, map, chr->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))
{
delete pGameObj;
return false;
@@ -303,7 +303,7 @@ public:
return false;
}
- GameObjectInfo const* goI = ObjectMgr::GetGameObjectInfo(id);
+ GameObjectTemplate const* goI = sObjectMgr->GetGameObjectTemplate(id);
if (!goI)
{
@@ -556,7 +556,7 @@ public:
float z = fields[4].GetFloat();
uint16 mapid = fields[5].GetUInt16();
- GameObjectInfo const * gInfo = ObjectMgr::GetGameObjectInfo(entry);
+ GameObjectTemplate const * gInfo = sObjectMgr->GetGameObjectTemplate(entry);
if (!gInfo)
continue;
@@ -588,7 +588,7 @@ public:
entry = atoi((char*)args);
}
- GameObjectInfo const* goinfo = ObjectMgr::GetGameObjectInfo(entry);
+ GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
if (!goinfo)
return false;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 31afa119143..92bdbe4ea16 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -1094,7 +1094,7 @@ class spell_sindragosa_ice_tomb : public SpellScriptLoader
{
if (!ObjectMgr::GetCreatureTemplate(NPC_ICE_TOMB))
return false;
- if (!ObjectMgr::GetGameObjectInfo(GO_ICE_BLOCK))
+ if (!sObjectMgr->GetGameObjectTemplate(GO_ICE_BLOCK))
return false;
return true;
}
diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp
index 14d80d59482..dd93db2aa76 100755
--- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp
@@ -216,7 +216,7 @@ bool OutdoorPvPSI::HandleCustomSpell(Player *plr, uint32 spellId, GameObject *go
if (!go || spellId != SI_SILITHYST_FLAG_GO_SPELL)
return false;
plr->CastSpell(plr,SI_SILITHYST_FLAG,true);
- if (go->GetGOInfo()->id == SI_SILITHYST_MOUND)
+ if (go->GetGOInfo()->entry == SI_SILITHYST_MOUND)
{
// despawn go
go->SetRespawnTime(0);
diff --git a/src/server/shared/Database/SQLStorage.cpp b/src/server/shared/Database/SQLStorage.cpp
index 019cfffea44..b62b80aeaab 100755
--- a/src/server/shared/Database/SQLStorage.cpp
+++ b/src/server/shared/Database/SQLStorage.cpp
@@ -21,11 +21,8 @@
const char CreatureInfosrcfmt[]="iiiiiiiiiisssiiiiiiifffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifffliiiiiiiliiisi";
const char CreatureInfodstfmt[]="iiiiiiiiiisssibbiiiifffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifffliiiiiiiliiiii";
-const char GameObjectInfosrcfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiissi";
-const char GameObjectInfodstfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisii";
SQLStorage sCreatureStorage(CreatureInfosrcfmt, CreatureInfodstfmt, "entry","creature_template");
-SQLStorage sGOStorage(GameObjectInfosrcfmt, GameObjectInfodstfmt, "entry","gameobject_template");
void SQLStorage::Free ()
{