Patch for 9411
diff --git a/sql/broadcast/mangos_mangos_string.sql b/sql/broadcast/mangos_mangos_string.sql
new file mode 100644
index 0000000..ff5dc4e
--- /dev/null
+++ b/sql/broadcast/mangos_mangos_string.sql
@@ -0,0 +1 @@
+INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
(11000, '|cffffcc00[server]: |cff00ff00%s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
\\ No newline at end of file
diff --git a/sql/broadcast/realmd_broadcast_strings.sql b/sql/broadcast/realmd_broadcast_strings.sql
new file mode 100644
index 0000000..37b1813
--- /dev/null
+++ b/sql/broadcast/realmd_broadcast_strings.sql
@@ -0,0 +1,6 @@
+CREATE TABLE IF NOT EXISTS `broadcast_strings` (
+ `id` int(11) unsigned NOT NULL auto_increment,
+ `text` text NOT NULL,
+ `next` int(11) unsigned NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
\\ No newline at end of file
diff --git a/src/game/Language.h b/src/game/Language.h
index 4e03a5c..efb3547 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -832,6 +832,8 @@ enum MangosStrings
// 10000-10999
// Use for custom patches 11000-11999
+ // Broadcaster
+ LANG_AUTO_BROADCAST = 11000,
// NOT RESERVED IDS 12000-1999999999
// `db_script_string` table index 2000000000-2000009999 (MIN_DB_SCRIPT_STRING_ID-MAX_DB_SCRIPT_STRING_ID)
diff --git a/src/game/World.cpp b/src/game/World.cpp
index a9e6f4b..ee41c83 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -62,6 +62,7 @@
#include "WaypointManager.h"
#include "GMTicketMgr.h"
#include "Util.h"
+#include "Language.h"
INSTANTIATE_SINGLETON_1( World );
@@ -95,6 +96,9 @@ World::World()
m_defaultDbcLocale = LOCALE_enUS;
m_availableDbcLocaleMask = 0;
+
+ // Initialize broadcaster nextId
+ m_nextId = 0;
for(int i = 0; i < CONFIG_UINT32_VALUE_COUNT; ++i)
m_configUint32Values[i] = 0;
@@ -1100,6 +1104,11 @@ void World::LoadConfigSettings(bool reload)
sLog.outString( "WORLD: VMap support included. LineOfSight:%i, getHeight:%i",enableLOS, enableHeight);
sLog.outString( "WORLD: VMap data directory is: %svmaps",m_dataPath.c_str());
sLog.outString( "WORLD: VMap config keys are: vmap.enableLOS, vmap.enableHeight, vmap.ignoreMapIds, vmap.ignoreSpellIds");
+
+ // Broadcaster
+ setConfig(CONFIG_UINT32_BROADCAST_ENABLED, "Broadcast.Enabled", true);
+ setConfig(CONFIG_UINT32_BROADCAST_INTERVAL, "Broadcast.Interval", 150000);
+ setConfig(CONFIG_UINT32_BROADCAST_POSITION, "Broadcast.Position", 1);
}
/// Initialize the World
@@ -1523,6 +1532,9 @@ void World::SetInitialWorldSettings()
uint32 nextGameEvent = sGameEventMgr.Initialize();
m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent); //depend on next event
+ sLog.outString("Starting Autobroadcast system..." );
+ m_timers[WUPDATE_BROADCAST].SetInterval(m_configUint32Values[CONFIG_UINT32_BROADCAST_INTERVAL]);
+
sLog.outString( "WORLD: World initialized" );
uint32 uStartInterval = getMSTimeDiff(uStartTime, getMSTime());
@@ -1678,6 +1690,13 @@ void World::Update(uint32 diff)
m_timers[WUPDATE_EVENTS].Reset();
}
+ ///- Process autobroadcaster
+ if(getConfig(CONFIG_UINT32_BROADCAST_ENABLED) && m_timers[WUPDATE_BROADCAST].Passed())
+ {
+ m_timers[WUPDATE_BROADCAST].Reset();
+ SendBroadcast();
+ }
+
/// [/list]
///- Move all creatures with "delayed move" and remove and delete all objects with "delayed remove"
sMapMgr.DoDelayedMovesAndRemoves();
@@ -2207,3 +2226,42 @@ void World::LoadDBVersion()
if(m_CreatureEventAIVersion.empty())
m_CreatureEventAIVersion = "Unknown creature EventAI.";
}
+
+/// Broadcast a message
+void World::SendBroadcast()
+{
+ std::string message;
+
+ QueryResult *result;
+ if(m_nextId > 0)
+ result = loginDatabase.PQuery("SELECT `text`, `next` FROM `broadcast_strings` WHERE `id` = %u;", m_nextId);
+ else
+ result = loginDatabase.PQuery("SELECT `text`, `next` FROM `broadcast_strings` ORDER BY RAND();", m_nextId);
+
+ if(!result)
+ return;
+
+ Field *fields = result->Fetch();
+ m_nextId = fields[1].GetUInt32();
+ message = fields[0].GetString();
+
+ delete result, fields;
+
+ if((getConfig(CONFIG_UINT32_BROADCAST_POSITION) & BROADCAST_LOCATION_CHAT) == BROADCAST_LOCATION_CHAT)
+ sWorld.SendWorldText(LANG_AUTO_BROADCAST, message.c_str());
+ if((getConfig(CONFIG_UINT32_BROADCAST_POSITION) & BROADCAST_LOCATION_TOP) == BROADCAST_LOCATION_TOP)
+ {
+ WorldPacket data(SMSG_NOTIFICATION, (message.size()+1));
+ data << message;
+ sWorld.SendGlobalMessage(&data);
+ }
+
+ if((getConfig(CONFIG_UINT32_BROADCAST_POSITION) & BROADCAST_LOCATION_IRC) == BROADCAST_LOCATION_IRC)
+#ifdef MANGCHAT_INSTALLED
+ sIRC.Send_IRC_Channel(sIRC._irc_chan[sIRC.anchn].c_str(), "\\00311[server]: " + message);
+#else
+ sLog.outError("AutoBroadcaster: You have IRC broadcasting enabled but we couldn't detect mangchat");
+#endif
+
+ sLog.outString("AutoBroadcast: '%s'",message.c_str());
+}
\\ No newline at end of file
diff --git a/src/game/World.h b/src/game/World.h
index 170fc2a..12e20bd 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -77,7 +77,8 @@ enum WorldTimers
WUPDATE_UPTIME = 4,
WUPDATE_CORPSES = 5,
WUPDATE_EVENTS = 6,
- WUPDATE_COUNT = 7
+ WUPDATE_BROADCAST = 7,
+ WUPDATE_COUNT = 8
};
/// Configuration elements
@@ -222,6 +223,12 @@ enum WorldConfigs
CONFIG_UINT32_TIMERBAR_BREATH_MAX,
CONFIG_UINT32_TIMERBAR_FIRE_GMLEVEL,
CONFIG_UINT32_TIMERBAR_FIRE_MAX,
+
+ // Broadcaster
+ CONFIG_UINT32_BROADCAST_ENABLED,
+ CONFIG_UINT32_BROADCAST_INTERVAL,
+ CONFIG_UINT32_BROADCAST_POSITION,
+
CONFIG_UINT32_VALUE_COUNT
};
@@ -334,6 +341,13 @@ enum RealmZone
REALM_ZONE_CN9 = 29 // basic-Latin at create, any at login
};
+enum BroadcastLocation
+{
+ BROADCAST_LOCATION_CHAT = 1,
+ BROADCAST_LOCATION_TOP = 2,
+ BROADCAST_LOCATION_IRC = 4,
+};
+
// DB scripting commands
#define SCRIPT_COMMAND_TALK 0 // source = unit, target=any, datalong ( 0=say, 1=whisper, 2=yell, 3=emote text)
#define SCRIPT_COMMAND_EMOTE 1 // source = unit, datalong = anim_id
@@ -597,6 +611,10 @@ class World
std::string m_DBVersion;
std::string m_CreatureEventAIVersion;
std::string m_ScriptsVersion;
+
+ //Broadcaster
+ uint32 m_nextId;
+ void SendBroadcast();
};
extern uint32 realmID;
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
index 479a6ce..126e4ca 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -1374,3 +1374,26 @@ Ra.IP = 0.0.0.0
Ra.Port = 3443
Ra.MinLevel = 3
Ra.Secure = 1
+
+###################################################################################################################
+# Automatic Broadcaster
+#
+# AutoBroadcast.Enabled
+# Enable/Disable the broadcaster
+# Default: 0 - off
+# 1 - on
+#
+# AutoBroadcast.Position
+# Where to display the message (Just add the values for multiple)
+# Default: 1 - In the in-game chat window
+# 2 - In the top-middle of the screen
+# 4 - In the announcements IRC channel (if mangchat is installed)
+#
+# AutoBroadcast.Interval
+# Interval at which to broadcast messages
+#
+###################################################################################################################
+
+Broadcast.Enabled = 1
+Broadcast.Position = 2
+Broadcast.Interval = 30000