diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/World/World.cpp | 41 | ||||
| -rw-r--r-- | src/server/game/World/World.h | 6 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/LoginDatabase.cpp | 1 | ||||
| -rw-r--r-- | src/server/shared/Database/Implementation/LoginDatabase.h | 1 | 
4 files changed, 43 insertions, 6 deletions
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index a786a218dc5..144d91485b5 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1866,12 +1866,16 @@ void World::LoadAutobroadcasts()      uint32 oldMSTime = getMSTime();      m_Autobroadcasts.clear(); +    m_AutobroadcastsWeights.clear(); -    QueryResult result = WorldDatabase.Query("SELECT text FROM autobroadcast"); +    uint32 realmId = ConfigMgr::GetIntDefault("RealmID", 0); +    PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_AUTOBROADCAST); +    stmt->setInt32(0, realmId); +    PreparedQueryResult result = LoginDatabase.Query(stmt);      if (!result)      { -        sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 autobroadcasts definitions. DB table `autobroadcast` is empty!"); +        sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 autobroadcasts definitions. DB table `autobroadcast` is empty for this realm!");          return;      } @@ -1880,9 +1884,10 @@ void World::LoadAutobroadcasts()      do      {          Field* fields = result->Fetch(); -        std::string message = fields[0].GetString(); +        uint8 id = fields[0].GetUInt8(); -        m_Autobroadcasts.push_back(message); +        m_Autobroadcasts[id] = fields[2].GetString(); +        m_AutobroadcastsWeights[id] = fields[1].GetUInt8();          ++count;      } while (result->NextRow()); @@ -2635,9 +2640,35 @@ void World::SendAutoBroadcast()      if (m_Autobroadcasts.empty())          return; +    uint32 weight = 0; +    AutobroadcastsWeightMap selectionWeights;      std::string msg; -    msg = Trinity::Containers::SelectRandomContainerElement(m_Autobroadcasts); +    for (AutobroadcastsWeightMap::const_iterator it = m_AutobroadcastsWeights.begin(); it != m_AutobroadcastsWeights.end(); ++it) +    { +        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())];      uint32 abcenter = sWorld->getIntConfig(CONFIG_AUTOBROADCAST_CENTER); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 00bb9e7ffb2..b303ca4bd4b 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -820,7 +820,11 @@ class World          // used versions          std::string m_DBVersion; -        std::list<std::string> m_Autobroadcasts; +        typedef std::map<uint8, std::string> AutobroadcastsMap; +        AutobroadcastsMap m_Autobroadcasts; + +        typedef std::map<uint8, uint8> AutobroadcastsWeightMap; +        AutobroadcastsWeightMap m_AutobroadcastsWeights;          std::map<uint32, CharacterNameData> _characterNameDataMap;          void LoadCharacterNameData(); diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp index 4b0ee041603..0118f637205 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.cpp +++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp @@ -91,6 +91,7 @@ void LoginDatabaseConnection::DoPrepareStatements()      PrepareStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?", CONNECTION_SYNCH);      PrepareStatement(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC);      PrepareStatement(LOGIN_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH); +    PrepareStatement(LOGIN_SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH);      PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_BY_ID, "SELECT gmlevel, RealmID FROM account_access WHERE id = ? and (RealmID = ? OR RealmID = -1) ORDER BY gmlevel desc", CONNECTION_SYNCH); diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h index 0f5a388a0b0..97cf91fc178 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.h +++ b/src/server/shared/Database/Implementation/LoginDatabase.h @@ -111,6 +111,7 @@ enum LoginDatabaseStatements      LOGIN_SEL_REALMLIST_SECURITY_LEVEL,      LOGIN_DEL_ACCOUNT,      LOGIN_SEL_IP2NATION_COUNTRY, +    LOGIN_SEL_AUTOBROADCAST,      LOGIN_SEL_ACCOUNT_ACCESS_BY_ID,      LOGIN_SEL_RBAC_ACCOUNT_GROUPS,  | 
