diff options
author | Aokromes <jipr@hotmail.com> | 2013-04-27 05:02:48 -0700 |
---|---|---|
committer | Aokromes <jipr@hotmail.com> | 2013-04-27 05:02:48 -0700 |
commit | 1087e5f5c98c11a16b92e7f2efcac6dbe2129b25 (patch) | |
tree | f36fc979989fcd1172ee9df062a63300addb42c6 | |
parent | e486cd7623fb2a8f62db8520d0a242be3ff3baf0 (diff) | |
parent | d7e9d1bafb288596f0057fcd5517ba95981579e4 (diff) |
Merge pull request #9710 from xjose93/Autobroadcast
Core/World: Improvements in Autobroadcast system (dropped from world database and moved to auth database, added realmid and weight columns)
-rw-r--r-- | sql/updates/auth/2013_04_25_00_auth_misc.txt | 8 | ||||
-rw-r--r-- | sql/updates/world/2013_04_25_00_world_misc.sql | 1 | ||||
-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 |
6 files changed, 52 insertions, 6 deletions
diff --git a/sql/updates/auth/2013_04_25_00_auth_misc.txt b/sql/updates/auth/2013_04_25_00_auth_misc.txt new file mode 100644 index 00000000000..383b19ebd55 --- /dev/null +++ b/sql/updates/auth/2013_04_25_00_auth_misc.txt @@ -0,0 +1,8 @@ +DROP TABLE IF EXISTS `autobroadcast`; +CREATE TABLE `autobroadcast` ( + `realmid` int(10) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `weight` tinyint(3) DEFAULT 1, + `text` longtext NOT NULL, + PRIMARY KEY (`id`, `realmid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/sql/updates/world/2013_04_25_00_world_misc.sql b/sql/updates/world/2013_04_25_00_world_misc.sql new file mode 100644 index 00000000000..c07a3f76b5f --- /dev/null +++ b/sql/updates/world/2013_04_25_00_world_misc.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS `autobroadcast`; 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, |