diff options
| author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-02-23 01:46:38 +0100 |
|---|---|---|
| committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-02-23 01:46:38 +0100 |
| commit | c42939b99c8593e8b7c89e11f86acda857525275 (patch) | |
| tree | d22e1ca83ed25170fe9c2ff70b6b25c1d6fb6cbf | |
| parent | 0ec88a642c664da6b4d89fe48925bcde90390d12 (diff) | |
| parent | 4af76de1b9e86e39260ebf0027426df367445ae2 (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore
| -rwxr-xr-x | src/server/game/Globals/ObjectMgr.cpp | 57 | ||||
| -rwxr-xr-x | src/server/game/Globals/ObjectMgr.h | 10 | ||||
| -rwxr-xr-x | src/server/game/Groups/Group.cpp | 6 | ||||
| -rwxr-xr-x | src/server/game/Instances/InstanceSaveMgr.h | 1 | ||||
| -rwxr-xr-x | src/server/game/Maps/MapManager.h | 1 |
5 files changed, 59 insertions, 16 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index b7d7ba660a9..a0ef635eb5b 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -285,7 +285,7 @@ ObjectMgr::~ObjectMgr() delete[] playerInfo[race][class_].levelInfo; // free group and guild objects - for (GroupSet::iterator itr = mGroupSet.begin(); itr != mGroupSet.end(); ++itr) + for (GroupMap::iterator itr = mGroupMap.begin(); itr != mGroupMap.end(); ++itr) delete *itr; for (GuildMap::iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr) @@ -303,10 +303,9 @@ ObjectMgr::~ObjectMgr() Group * ObjectMgr::GetGroupByGUID(uint32 guid) const { - for (GroupSet::const_iterator itr = mGroupSet.begin(); itr != mGroupSet.end(); ++itr) - if ((*itr)->GetLowGUID() == guid) - return *itr; - + // Make sure given index exists in collection + if (guid < uint32(mGroupMap.size())) + return mGroupMap[guid]; return NULL; } @@ -3980,7 +3979,7 @@ void ObjectMgr::LoadGroups() // 0 1 2 3 4 5 6 7 8 9 QueryResult result = CharacterDatabase.PQuery("SELECT leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6" // 10 11 12 13 14 15 - ",icon7, icon8, groupType, difficulty, raiddifficulty, guid FROM groups"); + ",icon7, icon8, groupType, difficulty, raiddifficulty, guid FROM groups ORDER BY guid ASC"); if (!result) { sLog->outString(">> Loaded 0 group definitions. DB table `groups` is empty!"); @@ -3993,9 +3992,17 @@ void ObjectMgr::LoadGroups() do { Field *fields = result->Fetch(); + + uint32 guid = fields[15].GetUInt32(); + + // Groups are pulled in ascending order from db and m_hiGroupGuid is initialized with 1, + // so if the group slot is used increment until we find the first free one for a potential new group + if (sObjectMgr->GetNextGroupGuid() == guid) + sObjectMgr->SetNextGroupGuid(guid + 1); + ++count; Group *group = new Group; - group->LoadGroupFromDB(fields[15].GetUInt32(), result, false); + group->LoadGroupFromDB(guid, result, false); // group load will never be false (we have run consistency sql's before loading) AddGroup(group); } @@ -6643,9 +6650,10 @@ void ObjectMgr::SetHighestGuids() if (result) m_guildId = (*result)[0].GetUInt32()+1; + // The next free guid is determined during group loading, here we just preallocate the group holder result = CharacterDatabase.Query("SELECT MAX(guid) FROM groups"); if (result) - m_hiGroupGuid = (*result)[0].GetUInt32()+1; + mGroupMap.resize((*result)[0].GetUInt32()+1); } uint32 ObjectMgr::GenerateArenaTeamId() @@ -6759,12 +6767,26 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh) } return m_hiDoGuid++; case HIGHGUID_GROUP: - if (m_hiGroupGuid >= 0xFFFFFFFE) + { + uint32 newGuid = m_hiGroupGuid; + + for (uint32 i = ++m_hiGroupGuid; i < 0xFFFFFFFF; ++i) + { + if (!GetGroupByGUID(i)) + { + m_hiGroupGuid = i; + break; + } + } + + // If newGuid doesn't differ from m_hiGroupGuid after the loop there is no free guid available + if (newGuid == m_hiGroupGuid) { sLog->outError("Group guid overflow!! Can't continue, shutting down server. "); World::StopNow(ERROR_EXIT_CODE); } - return m_hiGroupGuid++; + return newGuid; + } case HIGHGUID_MO_TRANSPORT: if (m_hiMoTransGuid >= 0xFFFFFFFE) { @@ -9424,3 +9446,18 @@ void ObjectMgr::LoadFactionChangeReputations() sLog->outString(">> Loaded %u faction change reputation pairs in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); } + +void ObjectMgr::AddGroup(Group* group) +{ + uint32 groupGuid = group->GetLowGUID(); + // Allocate space if necessary. + if (groupGuid >= uint32(mGroupMap.size())) + mGroupMap.resize(groupGuid + 1); + + mGroupMap[groupGuid] = group; +} + +void ObjectMgr::RemoveGroup(Group* group) +{ + mGroupMap[group->GetLowGUID()] = NULL; +} diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 99e4d8d7464..085a6f901fd 100755 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -591,7 +591,7 @@ class ObjectMgr public: typedef UNORDERED_MAP<uint32, Item*> ItemMap; - typedef std::set<Group *> GroupSet; + typedef std::vector<Group *> GroupMap; typedef std::vector <Guild *> GuildMap; @@ -626,8 +626,10 @@ class ObjectMgr void AddGameobjectInfo(GameObjectInfo *goinfo); Group * GetGroupByGUID(uint32 guid) const; - void AddGroup(Group* group) { mGroupSet.insert(group); } - void RemoveGroup(Group* group) { mGroupSet.erase(group); } + void AddGroup(Group* group); + void RemoveGroup(Group* group); + uint32 GetNextGroupGuid() { return m_hiGroupGuid; }; + void SetNextGroupGuid(uint32 nextGuid) { m_hiGroupGuid = nextGuid; }; Guild* GetGuildByLeader(uint64 const&guid) const; Guild* GetGuildById(uint32 guildId) const; @@ -1269,7 +1271,7 @@ class ObjectMgr typedef std::set<uint32> TavernAreaTriggerSet; typedef std::set<uint32> GameObjectForQuestSet; - GroupSet mGroupSet; + GroupMap mGroupMap; GuildMap mGuildMap; ArenaTeamMap mArenaTeamMap; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 2f7ae3c4d5f..a118e1c1837 100755 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -635,6 +635,12 @@ void Group::Disband(bool hideDestroy /* = false */) CharacterDatabase.CommitTransaction(trans); ResetInstances(INSTANCE_RESET_GROUP_DISBAND, false, NULL); ResetInstances(INSTANCE_RESET_GROUP_DISBAND, true, NULL); + + // If the deleted group guid is lower than the one we have stored for the next group creation, + // use this one instead. + if (lowguid < sObjectMgr->GetNextGroupGuid()) + sObjectMgr->SetNextGroupGuid(lowguid); + } sObjectMgr->RemoveGroup(this); diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h index 0c5edc56715..ad4fa3b2b6a 100755 --- a/src/server/game/Instances/InstanceSaveMgr.h +++ b/src/server/game/Instances/InstanceSaveMgr.h @@ -123,7 +123,6 @@ class InstanceSaveManager ~InstanceSaveManager(); typedef UNORDERED_MAP<uint32 /*InstanceId*/, InstanceSave*> InstanceSaveHashMap; - typedef UNORDERED_MAP<uint32 /*mapId*/, InstanceSaveHashMap> InstanceSaveMapMap; /* resetTime is a global propery of each (raid/heroic) map all instances of that map reset at the same time */ diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h index 040b771af64..c0be8ed0909 100755 --- a/src/server/game/Maps/MapManager.h +++ b/src/server/game/Maps/MapManager.h @@ -34,7 +34,6 @@ class MapManager { friend class ACE_Singleton<MapManager, ACE_Thread_Mutex>; typedef UNORDERED_MAP<uint32, Map*> MapMapType; - typedef std::pair<UNORDERED_MAP<uint32, Map*>::iterator, bool> MapMapPair; public: |
