aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp74
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h10
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp2
3 files changed, 49 insertions, 37 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 66348e29dc6..f4396f68777 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -290,7 +290,8 @@ ObjectMgr::~ObjectMgr()
delete *itr;
for (GuildMap::iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
- delete itr->second;
+ if (*itr)
+ delete *itr;
for (ArenaTeamMap::iterator itr = mArenaTeamMap.begin(); itr != mArenaTeamMap.end(); ++itr)
delete itr->second;
@@ -311,12 +312,12 @@ Group * ObjectMgr::GetGroupByGUID(uint32 guid) const
return NULL;
}
-Guild* ObjectMgr::GetGuildById(uint32 GuildId) const
+// Guild collection
+Guild* ObjectMgr::GetGuildById(uint32 guildId) const
{
- GuildMap::const_iterator itr = mGuildMap.find(GuildId);
- if (itr != mGuildMap.end())
- return itr->second;
-
+ // Make sure given index exists in collection
+ if (guildId < uint32(mGuildMap.size()))
+ return mGuildMap[guildId];
return NULL;
}
@@ -326,42 +327,51 @@ Guild* ObjectMgr::GetGuildByName(const std::string& guildname) const
std::transform(search.begin(), search.end(), search.begin(), ::toupper);
for (GuildMap::const_iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
{
- std::string gname = itr->second->GetName();
- std::transform(gname.begin(), gname.end(), gname.begin(), ::toupper);
- if (search == gname)
- return itr->second;
+ if (*itr)
+ {
+ std::string gname = (*itr)->GetName();
+ std::transform(gname.begin(), gname.end(), gname.begin(), ::toupper);
+ if (search == gname)
+ return *itr;
+ }
}
return NULL;
}
-std::string ObjectMgr::GetGuildNameById(uint32 GuildId) const
+std::string ObjectMgr::GetGuildNameById(uint32 guildId) const
{
- GuildMap::const_iterator itr = mGuildMap.find(GuildId);
- if (itr != mGuildMap.end())
- return itr->second->GetName();
-
+ if (Guild* pGuild = GetGuildById(guildId))
+ return pGuild->GetName();
return "";
}
Guild* ObjectMgr::GetGuildByLeader(const uint64 &guid) const
{
for (GuildMap::const_iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
- if (itr->second->GetLeaderGUID() == guid)
- return itr->second;
+ if ((*itr) && (*itr)->GetLeaderGUID() == guid)
+ return *itr;
return NULL;
}
-void ObjectMgr::AddGuild(Guild* guild)
+void ObjectMgr::AddGuild(Guild* pGuild)
{
- mGuildMap[guild->GetId()] = guild;
+ uint32 guildId = pGuild->GetId();
+ // Allocate space if necessary
+ if (guildId >= uint32(mGuildMap.size()))
+ // Reserve a bit more space than necessary
+ mGuildMap.resize(guildId + 512, NULL);
+ mGuildMap[guildId] = pGuild;
}
-void ObjectMgr::RemoveGuild(uint32 Id)
+void ObjectMgr::RemoveGuild(uint32 guildId)
{
- mGuildMap.erase(Id);
+ // Make sure given index exists
+ if (guildId < uint32(mGuildMap.size()))
+ mGuildMap[guildId] = NULL;
}
+// Arena teams collection
ArenaTeam* ObjectMgr::GetArenaTeamById(uint32 arenateamid) const
{
ArenaTeamMap::const_iterator itr = mArenaTeamMap.find(arenateamid);
@@ -3504,7 +3514,9 @@ void ObjectMgr::LoadGuilds()
return;
}
// 1. Load all guilds
- barGoLink bar(result->GetRowCount());
+ uint64 rowCount = result->GetRowCount();
+ mGuildMap.resize(uint32(rowCount), NULL); // Reserve space and initialize storage for loading guilds
+ barGoLink bar(rowCount);
do
{
bar.step();
@@ -3520,10 +3532,9 @@ void ObjectMgr::LoadGuilds()
}
while (result->NextRow());
sLog.outString();
- sLog.outString(">> Loaded " UI64FMTD " guilds definitions", result->GetRowCount());
+ sLog.outString(">> Loaded " UI64FMTD " guilds definitions", rowCount);
sLog.outString();
- uint64 rowCount = 0;
// 2. Load all guild ranks
sLog.outString("Loading guild ranks...");
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_RANKS);
@@ -3545,6 +3556,7 @@ void ObjectMgr::LoadGuilds()
}
else
{
+ rowCount = 0;
barGoLink bar(1);
bar.step();
}
@@ -3720,20 +3732,20 @@ void ObjectMgr::LoadGuilds()
sLog.outString();
// 9. Validate loaded guild data
+ uint32 totalGuilds = 0;
sLog.outString("Validating data of loaded guilds...");
barGoLink barGuilds(mGuildMap.size());
- for (GuildMap::iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); )
+ for (GuildMap::iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
{
barGuilds.step();
- Guild* pGuild = itr->second;
- if (!pGuild->Validate())
+ Guild* pGuild = *itr;
+ if (pGuild && !pGuild->Validate())
{
- ++itr;
- mGuildMap.erase(pGuild->GetId());
+ RemoveGuild(pGuild->GetId());
delete pGuild;
}
else
- ++itr;
+ ++totalGuilds;
}
// Cleanup
// Delete orphan guild ranks
@@ -3763,7 +3775,7 @@ void ObjectMgr::LoadGuilds()
CharacterDatabase.Execute(stmt);
sLog.outString();
- sLog.outString(">> Successfully loaded %u guilds", uint32(mGuildMap.size()));
+ sLog.outString(">> Successfully loaded %u guilds", totalGuilds);
}
void ObjectMgr::LoadArenaTeams()
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index d75ab4c3e9a..ba719add25f 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -573,7 +573,7 @@ class ObjectMgr
typedef std::set<Group *> GroupSet;
- typedef UNORDERED_MAP<uint32, Guild *> GuildMap;
+ typedef std::vector <Guild *> GuildMap;
typedef UNORDERED_MAP<uint32, ArenaTeam*> ArenaTeamMap;
@@ -610,11 +610,11 @@ class ObjectMgr
void RemoveGroup(Group* group) { mGroupSet.erase(group); }
Guild* GetGuildByLeader(uint64 const&guid) const;
- Guild* GetGuildById(uint32 GuildId) const;
+ Guild* GetGuildById(uint32 guildId) const;
Guild* GetGuildByName(const std::string& guildname) const;
- std::string GetGuildNameById(uint32 GuildId) const;
- void AddGuild(Guild* guild);
- void RemoveGuild(uint32 Id);
+ std::string GetGuildNameById(uint32 guildId) const;
+ void AddGuild(Guild* pGuild);
+ void RemoveGuild(uint32 guildId);
ArenaTeam* GetArenaTeamById(uint32 arenateamid) const;
ArenaTeam* GetArenaTeamByName(const std::string& arenateamname) const;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index 6f42eedb0de..2bf5fed9e5e 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -1128,7 +1128,7 @@ class spell_putricide_mutated_plague : public SpellScriptLoader
multiplier = 3.0f;
damage *= int32(pow(multiplier, aurApp->GetBase()->GetStackAmount()));
- damage *= 1.5;
+ damage = int32(damage * 1.5f);
aurApp->GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, damage, aurApp->GetTarget(), true, NULL, aurEff, GetCasterGUID());
}