From 16aa27c03add21819798b608519d1c921b6da709 Mon Sep 17 00:00:00 2001 From: H0zen Date: Thu, 12 Jan 2017 16:47:40 +0200 Subject: [PATCH] AutoBroadcast system. -This commit is paired with 1 database update --- src/game/ChatCommands/Level3.cpp | 9 +++ src/game/Tools/Language.h | 3 +- src/game/WorldHandlers/Chat.cpp | 1 + src/game/WorldHandlers/Chat.h | 4 +- src/game/WorldHandlers/World.cpp | 115 ++++++++++++++++++++++++++++++- src/game/WorldHandlers/World.h | 28 ++++++-- src/mangosd/mangosd.conf.dist.in | 8 ++- src/shared/SystemConfig.h.in | 2 +- src/shared/revision.h | 6 +- 9 files changed, 158 insertions(+), 18 deletions(-) diff --git a/src/game/ChatCommands/Level3.cpp b/src/game/ChatCommands/Level3.cpp index 679ec578..d8dc673c 100644 --- a/src/game/ChatCommands/Level3.cpp +++ b/src/game/ChatCommands/Level3.cpp @@ -235,6 +235,7 @@ bool ChatHandler::HandleReloadAllCommand(char* /*args*/) HandleReloadSkillFishingBaseLevelCommand((char*)""); HandleReloadAllAreaCommand((char*)""); + HandleReloadAutoBroadcastCommand((char*)""); HandleReloadAllEventAICommand((char*)""); HandleReloadAllLootCommand((char*)""); HandleReloadAllNpcCommand((char*)""); @@ -394,6 +395,14 @@ bool ChatHandler::HandleReloadAreaTriggerTeleportCommand(char* /*args*/) return true; } +bool ChatHandler::HandleReloadAutoBroadcastCommand(char* /*args*/) +{ + sLog.outString("Re-Loading broadcast strings..."); + sWorld.LoadBroadcastStrings(); + SendGlobalSysMessage("Broadcast strings reloaded.", SEC_MODERATOR); + return true; +} + bool ChatHandler::HandleReloadCommandCommand(char* /*args*/) { load_command_table = true; diff --git a/src/game/Tools/Language.h b/src/game/Tools/Language.h index 6a52ca11..2b4d95da 100644 --- a/src/game/Tools/Language.h +++ b/src/game/Tools/Language.h @@ -1051,8 +1051,9 @@ enum MangosStrings LANG_OPVP_SI_CAPTURE_H = 1635, LANG_OPVP_SI_CAPTURE_A = 1636, - // FREE IDS 1700-9999 + LANG_AUTOBROADCAST = 1700 + // FREE IDS 1701-9999 // Use for not-in-official-sources patches // 10000-10999 diff --git a/src/game/WorldHandlers/Chat.cpp b/src/game/WorldHandlers/Chat.cpp index ba10fba3..5fa4cb30 100644 --- a/src/game/WorldHandlers/Chat.cpp +++ b/src/game/WorldHandlers/Chat.cpp @@ -490,6 +490,7 @@ ChatCommand* ChatHandler::getCommandTable() { "areatrigger_quest_end", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL }, { "areatrigger_tavern", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL }, { "areatrigger_teleport", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL }, + { "autobroadcast", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAutoBroadcastCommand, "", NULL }, { "command", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommandCommand, "", NULL }, { "conditions", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadConditionsCommand, "", NULL }, { "creature_ai_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventAIScriptsCommand, "", NULL }, diff --git a/src/game/WorldHandlers/Chat.h b/src/game/WorldHandlers/Chat.h index 1997efcf..1eecc1dc 100644 --- a/src/game/WorldHandlers/Chat.h +++ b/src/game/WorldHandlers/Chat.h @@ -401,6 +401,7 @@ class ChatHandler bool HandleReloadAreaTriggerTavernCommand(char* args); bool HandleReloadAreaTriggerTeleportCommand(char* args); + bool HandleReloadAutoBroadcastCommand(char* args); bool HandleReloadBattleEventCommand(char* args); bool HandleReloadCommandCommand(char* args); bool HandleReloadConditionsCommand(char* args); @@ -739,7 +740,4 @@ class CliHandler : public ChatHandler Print* m_print; }; - - - #endif diff --git a/src/game/WorldHandlers/World.cpp b/src/game/WorldHandlers/World.cpp index f4c48a83..d23e04f4 100644 --- a/src/game/WorldHandlers/World.cpp +++ b/src/game/WorldHandlers/World.cpp @@ -71,6 +71,7 @@ #include "Weather.h" #include "LFGMgr.h" #include "DisableMgr.h" +#include "Language.h" #ifdef ENABLE_ELUNA #include "LuaEngine.h" @@ -118,6 +119,9 @@ World::World() m_startTime = m_gameTime; m_maxActiveSessionCount = 0; m_maxQueuedSessionCount = 0; + m_broadcastEnable = false; + m_broadcastList.clear(); + m_broadcastWeight = 0; m_defaultDbcLocale = LOCALE_enUS; m_availableDbcLocaleMask = 0; @@ -477,6 +481,17 @@ void World::LoadConfigSettings(bool reload) setConfig(CONFIG_BOOL_CLEAN_CHARACTER_DB, "CleanCharacterDB", true); setConfig(CONFIG_BOOL_GRID_UNLOAD, "GridUnload", true); + setConfig(CONFIG_UINT32_AUTOBROADCAST_INTERVAL, "AutoBroadcast", 600); + + if (getConfig(CONFIG_UINT32_AUTOBROADCAST_INTERVAL) > 0) + { m_broadcastEnable = true; } + else + { m_broadcastEnable = false; } + + if (reload && m_broadcastEnable) + { m_broadcastTimer.SetInterval(getConfig(CONFIG_UINT32_AUTOBROADCAST_INTERVAL) * IN_MILLISECONDS); } + + std::string forceLoadGridOnMaps = sConfig.GetStringDefault("LoadAllGridsOnMaps", ""); if (!forceLoadGridOnMaps.empty()) { @@ -559,7 +574,7 @@ void World::LoadConfigSettings(bool reload) setConfig(CONFIG_BOOL_ALL_TAXI_PATHS, "AllFlightPaths", false); setConfig(CONFIG_BOOL_INSTANT_TAXI, "InstantFlightPaths", false); - + setConfig(CONFIG_UINT32_MOUNT_COST, "MountCost", 100000); setConfigMin(CONFIG_UINT32_MIN_TRAIN_MOUNT_LEVEL, "MinTrainMountLevel", 40, 1); setConfig(CONFIG_UINT32_TRAIN_MOUNT_COST, "TrainMountCost", 900000); @@ -1316,7 +1331,7 @@ void World::SetInitialWorldSettings() realmID, uint64(m_startTime), isoDate); m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE * IN_MILLISECONDS); - m_timers[WUPDATE_UPTIME].SetInterval(getConfig(CONFIG_UINT32_UPTIME_UPDATE)*MINUTE * IN_MILLISECONDS); + m_timers[WUPDATE_UPTIME].SetInterval(getConfig(CONFIG_UINT32_UPTIME_UPDATE) * MINUTE * IN_MILLISECONDS); // Update "uptime" table based on configuration entry in minutes. m_timers[WUPDATE_CORPSES].SetInterval(20 * MINUTE * IN_MILLISECONDS); m_timers[WUPDATE_DELETECHARS].SetInterval(DAY * IN_MILLISECONDS); // check for chars to delete every day @@ -1324,6 +1339,17 @@ void World::SetInitialWorldSettings() // for AhBot m_timers[WUPDATE_AHBOT].SetInterval(20 * IN_MILLISECONDS); // every 20 sec + // for AutoBroadcast + sLog.outString("Starting AutoBroadcast System"); + if (m_broadcastEnable) + { LoadBroadcastStrings(); } + else + { sLog.outString("AutoBroadcast is disabled");} + sLog.outString(); + + if (m_broadcastEnable) + { m_broadcastTimer.SetInterval(getConfig(CONFIG_UINT32_AUTOBROADCAST_INTERVAL) * IN_MILLISECONDS); } + // to set mailtimer to return mails every day between 4 and 5 am // mailtimer is increased when updating auctions // one second is 1000 -(tested on win system) @@ -1468,6 +1494,20 @@ void World::Update(uint32 diff) { m_timers[i].SetCurrent(0); } } + if (m_broadcastEnable) + { + if (m_broadcastTimer.GetCurrent() >= 0) + { m_broadcastTimer.Update(diff); } + else + { m_broadcastTimer.SetCurrent(0); } + + if (m_broadcastTimer.Passed()) + { + m_broadcastTimer.Reset(); + AutoBroadcast(); + } + } + ///- Update the game time and check for shutdown time _UpdateGameTime(); @@ -2266,3 +2306,74 @@ void World::InvalidatePlayerDataToAllClient(ObjectGuid guid) data << guid; SendGlobalMessage(&data); } + +void World::LoadBroadcastStrings() +{ + if (!m_broadcastEnable) + return; + + std::string queryStr = "SELECT `autobroadcast`.`id`, `autobroadcast`.`content`,`autobroadcast`.`ratio` FROM `autobroadcast`"; + + QueryResult* result = WorldDatabase.Query(queryStr.c_str()); + + if (!result) + { + m_broadcastEnable = false; + sLog.outErrorDb("DB table `autobroadcast` is empty."); + sLog.outString(); + return; + } + + m_broadcastList.clear(); + + BarGoLink bar(result->GetRowCount()); + m_broadcastWeight = 0; + + do + { + Field* fields = result->Fetch(); + bar.step(); + + uint32 ratio = fields[2].GetUInt32(); + if (ratio == 0) + continue; + + m_broadcastWeight += ratio; + + BroadcastString bs; + bs.text = fields[1].GetString(); + bs.freq = m_broadcastWeight; + m_broadcastList.push_back(bs); + } + while (result->NextRow()); + + delete result; + if (m_broadcastWeight == 0) + { + sLog.outString(">> Loaded 0 broadcast strings."); + m_broadcastEnable = false; + } + else + { + sLog.outString(">> Loaded " SIZEFMTD " broadcast strings.", m_broadcastList.size()); + } +} + +void World::AutoBroadcast() +{ + if (m_broadcastList.size() == 1) + { + SendWorldText(LANG_AUTOBROADCAST, m_broadcastList[0].text.c_str()); + } + else + { + uint32 rn = urand(1, m_broadcastWeight); + std::vector::const_iterator it; + for (it = m_broadcastList.begin(); it != m_broadcastList.end(); ++it) + { + if (rn <= it->freq) + break; + } + SendWorldText(LANG_AUTOBROADCAST, it->text.c_str()); + } +} diff --git a/src/game/WorldHandlers/World.h b/src/game/WorldHandlers/World.h index 1a73cf57..f6b16ad2 100644 --- a/src/game/WorldHandlers/World.h +++ b/src/game/WorldHandlers/World.h @@ -74,13 +74,13 @@ enum ShutdownExitCode /// Timers for different object refresh rates enum WorldTimers { - WUPDATE_AUCTIONS = 0, - WUPDATE_UPTIME = 1, - WUPDATE_CORPSES = 2, - WUPDATE_EVENTS = 3, - WUPDATE_DELETECHARS = 4, - WUPDATE_AHBOT = 5, - WUPDATE_COUNT = 6 + WUPDATE_AUCTIONS = 0, + WUPDATE_UPTIME, + WUPDATE_CORPSES, + WUPDATE_EVENTS, + WUPDATE_DELETECHARS, + WUPDATE_AHBOT, + WUPDATE_COUNT }; /// Configuration elements @@ -203,6 +203,7 @@ enum eConfigUInt32Values CONFIG_UINT32_PLAYERBOT_RESTRICTLEVEL, CONFIG_UINT32_PLAYERBOT_MINBOTLEVEL, #endif + CONFIG_UINT32_AUTOBROADCAST_INTERVAL, CONFIG_UINT32_VALUE_COUNT }; @@ -605,6 +606,7 @@ class World void LoadDBVersion(); char const* GetDBVersion() { return m_DBVersion.c_str(); } + void LoadBroadcastStrings(); /** * \brief: force all client to request player data @@ -639,6 +641,18 @@ class World bool configNoReload(bool reload, eConfigFloatValues index, char const* fieldname, float defvalue); bool configNoReload(bool reload, eConfigBoolValues index, char const* fieldname, bool defvalue); + // AutoBroadcast system + void AutoBroadcast(); + struct BroadcastString + { + uint32 freq; + std::string text; + }; + std::vector m_broadcastList; + uint32 m_broadcastWeight; + bool m_broadcastEnable; + IntervalTimer m_broadcastTimer; + static volatile bool m_stopEvent; static uint8 m_ExitCode; uint32 m_ShutdownTimer; diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index facad724..3df975c4 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -3,7 +3,7 @@ ################################################################################ [MangosdConf] -ConfVersion=2016032801 +ConfVersion=2017011200 ################################################################################ # CONNECTIONS AND DIRECTORIES @@ -769,6 +769,11 @@ SD3ErrorLogFile = "scriptdev3-errors.log" # Motd # Message of the Day. Displayed at worldlogin for every user ('@' for a newline). # +# AutoBroadcast +# Timer interval (in seconds) for automatic server announcements (autobroadcasts). Zero value means AB is disabled +# 0 (AB is disabled) +# Default: 600 (AB every 10 minutes) +# N (>0, AB every N seconds) ################################################################################ GameType = 1 @@ -835,6 +840,7 @@ ShowProgressBars = 1 WaitAtStartupError = 10 PlayerCommands = 0 Motd = "Welcome to Mangos Zero" +AutoBroadcast = 600 ################################################################################ # PLAYER INTERACTION diff --git a/src/shared/SystemConfig.h.in b/src/shared/SystemConfig.h.in index 129058f7..250dae57 100644 --- a/src/shared/SystemConfig.h.in +++ b/src/shared/SystemConfig.h.in @@ -42,7 +42,7 @@ // Format is YYYYMMDDRR where RR is the change in the conf file // for that day. #ifndef MANGOSD_CONFIG_VERSION -# define MANGOSD_CONFIG_VERSION 2016031901 +# define MANGOSD_CONFIG_VERSION 2017011200 #endif #ifndef REALMD_CONFIG_VERSION # define REALMD_CONFIG_VERSION 2010062001 diff --git a/src/shared/revision.h b/src/shared/revision.h index 648afb86..7fff5bb1 100644 --- a/src/shared/revision.h +++ b/src/shared/revision.h @@ -37,7 +37,7 @@ #define CHAR_DB_UPDATE_DESCRIPTION "Remove field from dbDocs" #define WORLD_DB_VERSION_NR 21 - #define WORLD_DB_STRUCTURE_NR 11 - #define WORLD_DB_CONTENT_NR 73 - #define WORLD_DB_UPDATE_DESCRIPTION "Script_Binding" + #define WORLD_DB_STRUCTURE_NR 12 + #define WORLD_DB_CONTENT_NR 1 + #define WORLD_DB_UPDATE_DESCRIPTION "AutoBroadcast" #endif // __REVISION_H__