diff options
author | leak <leakzx@googlemail.com> | 2011-04-28 22:16:13 +0200 |
---|---|---|
committer | leak <leakzx@googlemail.com> | 2011-04-28 22:16:13 +0200 |
commit | 5aeb4fe794174c1269b4efcb43556a8b69d2b26a (patch) | |
tree | de6d43ceed0cb2a0242446d6c2388e8b97acb24d /src | |
parent | 19cab2c50857045788bd80e202ed661e49ed8bba (diff) |
Core/ObjectMgr: Refactor sInstanceTemplate
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Globals/ObjectMgr.cpp | 52 | ||||
-rwxr-xr-x | src/server/game/Globals/ObjectMgr.h | 12 | ||||
-rwxr-xr-x | src/server/game/Instances/InstanceSaveMgr.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Maps/Map.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/Maps/Map.h | 11 | ||||
-rwxr-xr-x | src/server/game/Maps/MapInstanced.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Maps/MapManager.cpp | 15 | ||||
-rwxr-xr-x | src/server/game/Maps/MapManager.h | 8 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/MovementHandler.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 6 | ||||
-rwxr-xr-x | src/server/shared/Database/SQLStorage.cpp | 3 |
12 files changed, 71 insertions, 50 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 280aef32352..5f2ac588e9b 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6922,7 +6922,7 @@ void Player::RewardReputation(Unit *pVictim, float rate) Map const *pMap = GetMap(); if (pMap && pMap->IsDungeon()) { - InstanceTemplate const *pInstance = ObjectMgr::GetInstanceTemplate(pMap->GetId()); + InstanceTemplate const *pInstance = sObjectMgr->GetInstanceTemplate(pMap->GetId()); if (pInstance) { AccessRequirement const *pAccessRequirement = sObjectMgr->GetAccessRequirement(pMap->GetId(), ((InstanceMap*)pMap)->GetDifficulty()); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ca9690c6775..a39d8665486 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -5600,29 +5600,53 @@ void ObjectMgr::LoadInstanceTemplate() { uint32 oldMSTime = getMSTime(); - SQLInstanceLoader loader; - loader.Load(sInstanceTemplate); + QueryResult result = WorldDatabase.Query("SELECT map, parent, script, allowMount FROM instance_template"); - for (uint32 i = 0; i < sInstanceTemplate.MaxEntry; i++) + if (!result) { - InstanceTemplate* temp = const_cast<InstanceTemplate*>(ObjectMgr::GetInstanceTemplate(i)); - if (!temp) - continue; + sLog->outString(">> Loaded 0 instance templates. DB table `page_text` is empty!"); + sLog->outString(); + return; + } + + uint32 count = 0; + do + { + Field* fields = result->Fetch(); - if (!MapManager::IsValidMAP(temp->map)) - sLog->outErrorDb("ObjectMgr::LoadInstanceTemplate: bad mapid %d for template!", temp->map); + uint16 mapID = fields[0].GetUInt16(); - if (!MapManager::IsValidMapCoord(temp->parent,temp->startLocX,temp->startLocY,temp->startLocZ,temp->startLocO)) + if (!MapManager::IsValidMAP(mapID, true)) { - sLog->outErrorDb("ObjectMgr::LoadInstanceTemplate: bad parent entrance coordinates for map id %d template!", temp->map); - temp->parent = 0; // will have wrong continent 0 parent, at least existed + sLog->outErrorDb("ObjectMgr::LoadInstanceTemplate: bad mapid %d for template!", mapID); + continue; } + + InstanceTemplate instanceTemplate; + + instanceTemplate.AllowMount = fields[3].GetBool(); + instanceTemplate.Parent = fields[1].GetUInt16(); + instanceTemplate.ScriptId = sObjectMgr->GetScriptId(fields[2].GetCString()); + + InstanceTemplateStore[mapID] = instanceTemplate; + + ++count; } + while (result->NextRow()); - sLog->outString(">> Loaded %u Instance Template definitions in %u ms", sInstanceTemplate.RecordCount, GetMSTimeDiffToNow(oldMSTime)); + sLog->outString(">> Loaded %u instance templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); } +InstanceTemplate const* ObjectMgr::GetInstanceTemplate(uint32 mapID) +{ + InstanceTemplateContainer::const_iterator itr = InstanceTemplateStore.find(uint16(mapID)); + if (itr != InstanceTemplateStore.end()) + return &(itr->second); + + return NULL; +} + void ObjectMgr::LoadInstanceEncounters() { uint32 oldMSTime = getMSTime(); @@ -6608,12 +6632,12 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 Map) const if (mapEntry->IsDungeon()) { - const InstanceTemplate *iTemplate = ObjectMgr::GetInstanceTemplate(Map); + const InstanceTemplate *iTemplate = sObjectMgr->GetInstanceTemplate(Map); if (!iTemplate) return NULL; - parentId = iTemplate->parent; + parentId = iTemplate->Parent; useParentDbValue = true; } diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 9c55933ec11..8350ae92abb 100755 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -49,7 +49,6 @@ extern SQLStorage sCreatureInfoAddonStorage; extern SQLStorage sEquipmentStorage; extern SQLStorage sGOStorage; extern SQLStorage sItemStorage; -extern SQLStorage sInstanceTemplate; class Group; class Guild; @@ -76,9 +75,12 @@ struct PageText #pragma pack(pop) #endif -// Faster (insert/find) than UNORDERED_MAP in this case +// Benchmarked: Faster than UNORDERED_MAP (insert/find) typedef std::map<uint32, PageText> PageTextContainer; +// Benchmarked: Faster than std::map (insert/find) +typedef UNORDERED_MAP<uint16, InstanceTemplate> InstanceTemplateContainer; + struct GameTele { float position_x; @@ -698,10 +700,7 @@ class ObjectMgr return NULL; } - static InstanceTemplate const* GetInstanceTemplate(uint32 map) - { - return sInstanceTemplate.LookupEntry<InstanceTemplate>(map); - } + InstanceTemplate const* GetInstanceTemplate(uint32 mapID); PetLevelInfo const* GetPetLevelInfo(uint32 creature_id, uint8 level) const; @@ -1367,6 +1366,7 @@ class ObjectMgr LocaleConstant DBCLocaleIndex; PageTextContainer PageTextStore; + InstanceTemplateContainer InstanceTemplateStore; private: void LoadScripts(ScriptsType type); diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 1617a2008bd..bf713b309ab 100755 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -201,7 +201,7 @@ time_t InstanceSave::GetResetTimeForDB() // to cache or not to cache, that is the question InstanceTemplate const* InstanceSave::GetTemplate() { - return ObjectMgr::GetInstanceTemplate(m_mapid); + return sObjectMgr->GetInstanceTemplate(m_mapid); } MapEntry const* InstanceSave::GetMapEntry() diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index a876903b7a1..a7c2cbda158 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2402,10 +2402,10 @@ void InstanceMap::CreateInstanceData(bool load) if (i_data != NULL) return; - InstanceTemplate const* mInstance = ObjectMgr::GetInstanceTemplate(GetId()); + InstanceTemplate const* mInstance = sObjectMgr->GetInstanceTemplate(GetId()); if (mInstance) { - i_script_id = mInstance->script_id; + i_script_id = mInstance->ScriptId; i_data = sScriptMgr->CreateInstanceData(this); } diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 98b9a4a0baa..0b245ecb347 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -216,14 +216,9 @@ struct CreatureMover struct InstanceTemplate { - uint32 map; - uint32 parent; - float startLocX; - float startLocY; - float startLocZ; - float startLocO; - uint32 script_id; - bool allowMount; + uint32 Parent; + uint32 ScriptId; + bool AllowMount; }; enum LevelRequirementVsMode diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index 7dc126ce237..12e484fbd11 100755 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -179,7 +179,7 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave *save, sLog->outError("CreateInstance: no entry for map %d", GetId()); ASSERT(false); } - const InstanceTemplate * iTemplate = ObjectMgr::GetInstanceTemplate(GetId()); + const InstanceTemplate * iTemplate = sObjectMgr->GetInstanceTemplate(GetId()); if (!iTemplate) { sLog->outError("CreateInstance: no instance template for map %d", GetId()); diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index 6759ca950ad..f34521aea46 100755 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -151,7 +151,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck) if (!entry->IsDungeon()) return true; - InstanceTemplate const* instance = ObjectMgr::GetInstanceTemplate(mapid); + InstanceTemplate const* instance = sObjectMgr->GetInstanceTemplate(mapid); if (!instance) return false; @@ -201,8 +201,8 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck) if (corpseMap == mapid) break; - InstanceTemplate const* instance = ObjectMgr::GetInstanceTemplate(corpseMap); - corpseMap = instance ? instance->parent : 0; + InstanceTemplate const* instance = sObjectMgr->GetInstanceTemplate(corpseMap); + corpseMap = instance ? instance->Parent : 0; } while (corpseMap); if (!corpseMap) @@ -298,10 +298,15 @@ bool MapManager::ExistMapAndVMap(uint32 mapid, float x,float y) return Map::ExistMap(mapid,gx,gy) && Map::ExistVMap(mapid,gx,gy); } -bool MapManager::IsValidMAP(uint32 mapid) +bool MapManager::IsValidMAP(uint32 mapid, bool startUp) { MapEntry const* mEntry = sMapStore.LookupEntry(mapid); - return mEntry && (!mEntry->IsDungeon() || ObjectMgr::GetInstanceTemplate(mapid)); + + if (startUp) + return mEntry ? true : false; + else + return mEntry && (!mEntry->IsDungeon() || sObjectMgr->GetInstanceTemplate(mapid)); + // TODO: add check for battleground template } diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h index 4362d305edd..610d2626eda 100755 --- a/src/server/game/Maps/MapManager.h +++ b/src/server/game/Maps/MapManager.h @@ -84,21 +84,21 @@ class MapManager void UnloadAll(); static bool ExistMapAndVMap(uint32 mapid, float x, float y); - static bool IsValidMAP(uint32 mapid); + static bool IsValidMAP(uint32 mapid, bool startUp); static bool IsValidMapCoord(uint32 mapid, float x,float y) { - return IsValidMAP(mapid) && Trinity::IsValidMapCoord(x,y); + return IsValidMAP(mapid, false) && Trinity::IsValidMapCoord(x,y); } static bool IsValidMapCoord(uint32 mapid, float x,float y,float z) { - return IsValidMAP(mapid) && Trinity::IsValidMapCoord(x,y,z); + return IsValidMAP(mapid, false) && Trinity::IsValidMapCoord(x,y,z); } static bool IsValidMapCoord(uint32 mapid, float x,float y,float z,float o) { - return IsValidMAP(mapid) && Trinity::IsValidMapCoord(x,y,z,o); + return IsValidMAP(mapid, false) && Trinity::IsValidMapCoord(x,y,z,o); } static bool IsValidMapCoord(WorldLocation const& loc) diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp index df7b8e5eee3..9d877441f94 100755 --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp @@ -57,7 +57,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() // get the destination map entry, not the current one, this will fix homebind and reset greeting MapEntry const* mEntry = sMapStore.LookupEntry(loc.GetMapId()); - InstanceTemplate const* mInstance = ObjectMgr::GetInstanceTemplate(loc.GetMapId()); + InstanceTemplate const* mInstance = sObjectMgr->GetInstanceTemplate(loc.GetMapId()); // reset instance validity, except if going to an instance inside an instance if (GetPlayer()->m_InstanceValid == false && !mInstance) @@ -161,7 +161,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() } } } - allowMount = mInstance->allowMount; + allowMount = mInstance->AllowMount; } // mount allow check diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 5356b4f98b3..f020ef72249 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5346,7 +5346,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (targetBind->perm && targetBind != m_caster->ToPlayer()->GetBoundInstance(mapId, difficulty)) return SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE; - InstanceTemplate const* instance = ObjectMgr::GetInstanceTemplate(mapId); + InstanceTemplate const* instance = sObjectMgr->GetInstanceTemplate(mapId); if (!instance) return SPELL_FAILED_TARGET_NOT_IN_INSTANCE; if (!target->Satisfy(sObjectMgr->GetAccessRequirement(mapId, difficulty), mapId)) @@ -5513,9 +5513,9 @@ SpellCastResult Spell::CheckCast(bool strict) // Ignore map check if spell have AreaId. AreaId already checked and this prevent special mount spells bool AllowMount = !m_caster->GetMap()->IsDungeon() || m_caster->GetMap()->IsBattlegroundOrArena(); - InstanceTemplate const *it = ObjectMgr::GetInstanceTemplate(m_caster->GetMapId()); + InstanceTemplate const *it = sObjectMgr->GetInstanceTemplate(m_caster->GetMapId()); if (it) - AllowMount = it->allowMount; + AllowMount = it->AllowMount; if (m_caster->GetTypeId() == TYPEID_PLAYER && !AllowMount && !m_IsTriggeredSpell && !m_spellInfo->AreaGroupId) return SPELL_FAILED_NO_MOUNTS_ALLOWED; diff --git a/src/server/shared/Database/SQLStorage.cpp b/src/server/shared/Database/SQLStorage.cpp index e9da15d9678..5fc850e6eda 100755 --- a/src/server/shared/Database/SQLStorage.cpp +++ b/src/server/shared/Database/SQLStorage.cpp @@ -28,8 +28,6 @@ const char GameObjectInfosrcfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiissi"; const char GameObjectInfodstfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisii"; const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiiii"; const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiiii"; -const char InstanceTemplatesrcfmt[]="iiffffsb"; -const char InstanceTemplatedstfmt[]="iiffffib"; SQLStorage sCreatureStorage(CreatureInfosrcfmt, CreatureInfodstfmt, "entry","creature_template"); SQLStorage sCreatureDataAddonStorage(CreatureDataAddonInfofmt,"guid","creature_addon"); @@ -37,7 +35,6 @@ SQLStorage sCreatureInfoAddonStorage(CreatureInfoAddonInfofmt,"entry","creature_ SQLStorage sEquipmentStorage(EquipmentInfofmt,"entry","creature_equip_template"); SQLStorage sGOStorage(GameObjectInfosrcfmt, GameObjectInfodstfmt, "entry","gameobject_template"); SQLStorage sItemStorage(ItemPrototypesrcfmt, ItemPrototypedstfmt, "entry","item_template"); -SQLStorage sInstanceTemplate(InstanceTemplatesrcfmt, InstanceTemplatedstfmt, "map","instance_template"); void SQLStorage::Free () { |