diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/World/World.cpp | 50 | ||||
| -rw-r--r-- | src/server/game/World/World.h | 12 |
2 files changed, 17 insertions, 45 deletions
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index aa34b58a910..de4f97ee4a1 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2183,7 +2183,6 @@ void World::LoadAutobroadcasts() uint32 oldMSTime = getMSTime(); m_Autobroadcasts.clear(); - m_AutobroadcastsWeights.clear(); uint32 realmId = sConfigMgr->GetIntDefault("RealmID", 0); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST); @@ -2196,20 +2195,16 @@ void World::LoadAutobroadcasts() return; } - uint32 count = 0; - do { Field* fields = result->Fetch(); uint8 id = fields[0].GetUInt8(); - m_Autobroadcasts[id] = fields[2].GetString(); - m_AutobroadcastsWeights[id] = fields[1].GetUInt8(); + m_Autobroadcasts[id] = { fields[2].GetString(), fields[1].GetUInt8() }; - ++count; } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u autobroadcast definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " autobroadcast definitions in %u ms", m_Autobroadcasts.size(), GetMSTimeDiffToNow(oldMSTime)); } /// Update the World ! @@ -3012,49 +3007,24 @@ void World::SendAutoBroadcast() if (m_Autobroadcasts.empty()) return; - uint32 weight = 0; - AutobroadcastsWeightMap selectionWeights; - std::string msg; - - for (AutobroadcastsWeightMap::const_iterator it = m_AutobroadcastsWeights.begin(); it != m_AutobroadcastsWeights.end(); ++it) + auto itr = Trinity::Containers::SelectRandomWeightedContainerElement(m_Autobroadcasts, [](AutobroadcastContainer::value_type const& pair) { - if (it->second) - { - weight += it->second; - selectionWeights[it->first] = it->second; - } - } - - if (weight) - { - uint32 selectedWeight = urand(0, weight - 1); - weight = 0; - for (AutobroadcastsWeightMap::const_iterator it = selectionWeights.begin(); it != selectionWeights.end(); ++it) - { - weight += it->second; - if (selectedWeight < weight) - { - msg = m_Autobroadcasts[it->first]; - break; - } - } - } - else - msg = m_Autobroadcasts[urand(0, m_Autobroadcasts.size())]; + return pair.second.Weight; + }); uint32 abcenter = sWorld->getIntConfig(CONFIG_AUTOBROADCAST_CENTER); if (abcenter == 0) - sWorld->SendWorldText(LANG_AUTO_BROADCAST, msg.c_str()); + sWorld->SendWorldText(LANG_AUTO_BROADCAST, itr->second.Message.c_str()); else if (abcenter == 1) - sWorld->SendGlobalMessage(WorldPackets::Chat::PrintNotification(msg).Write()); + sWorld->SendGlobalMessage(WorldPackets::Chat::PrintNotification(itr->second.Message).Write()); else if (abcenter == 2) { - sWorld->SendWorldText(LANG_AUTO_BROADCAST, msg.c_str()); - sWorld->SendGlobalMessage(WorldPackets::Chat::PrintNotification(msg).Write()); + sWorld->SendWorldText(LANG_AUTO_BROADCAST, itr->second.Message.c_str()); + sWorld->SendGlobalMessage(WorldPackets::Chat::PrintNotification(itr->second.Message).Write()); } - TC_LOG_DEBUG("misc", "AutoBroadcast: '%s'", msg.c_str()); + TC_LOG_DEBUG("misc", "AutoBroadcast: '%s'", itr->second.Message.c_str()); } void World::UpdateRealmCharCount(uint32 accountId) diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 53378f5ff93..bc7e9e52171 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -902,11 +902,13 @@ class TC_GAME_API World // used versions std::string m_DBVersion; - typedef std::map<uint8, std::string> AutobroadcastsMap; - AutobroadcastsMap m_Autobroadcasts; - - typedef std::map<uint8, uint8> AutobroadcastsWeightMap; - AutobroadcastsWeightMap m_AutobroadcastsWeights; + struct Autobroadcast + { + std::string Message; + uint8 Weight; + }; + typedef std::unordered_map<uint8, Autobroadcast> AutobroadcastContainer; + AutobroadcastContainer m_Autobroadcasts; typedef std::map<ObjectGuid, CharacterInfo> CharacterInfoContainer; CharacterInfoContainer _characterInfoStore; |
