aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorleak <leakzx@googlemail.com>2011-04-28 22:16:13 +0200
committerleak <leakzx@googlemail.com>2011-04-28 22:16:13 +0200
commit5aeb4fe794174c1269b4efcb43556a8b69d2b26a (patch)
treede6d43ceed0cb2a0242446d6c2388e8b97acb24d /src
parent19cab2c50857045788bd80e202ed661e49ed8bba (diff)
Core/ObjectMgr: Refactor sInstanceTemplate
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp2
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp52
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h12
-rwxr-xr-xsrc/server/game/Instances/InstanceSaveMgr.cpp2
-rwxr-xr-xsrc/server/game/Maps/Map.cpp4
-rwxr-xr-xsrc/server/game/Maps/Map.h11
-rwxr-xr-xsrc/server/game/Maps/MapInstanced.cpp2
-rwxr-xr-xsrc/server/game/Maps/MapManager.cpp15
-rwxr-xr-xsrc/server/game/Maps/MapManager.h8
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MovementHandler.cpp4
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp6
-rwxr-xr-xsrc/server/shared/Database/SQLStorage.cpp3
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 ()
{