Nice patch, which should be implemented to mangos imo.
This works on 9312 for me.
diff --git a/src/game/Language.h b/src/game/Language.h
index 9f9f7af..857d6b9 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -778,6 +778,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 ca23473..ab5edf4 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;
}
/// World destructor
@@ -1082,6 +1086,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
+ m_configs[CONFIG_BROADCAST_ENABLED] = sConfig.GetBoolDefault("Broadcast.Enabled", true);
+ m_configs[CONFIG_BROADCAST_INTERVAL] = sConfig.GetIntDefault("Broadcast.Interval", 150000);
+ m_configs[CONFIG_BROADCAST_POSITION] = sConfig.GetIntDefault("Broadcast.Position", 1);
}
/// Initialize the World
@@ -1491,6 +1500,9 @@ void World::SetInitialWorldSettings()
uint32 nextGameEvent = gameeventmgr.Initialize();
m_timers[WUPDATE_EVENTS].SetInterval(nextGameEvent); //depend on next event
+ sLog.outString("Starting Autobroadcast system..." );
+ m_timers[WUPDATE_BROADCAST].SetInterval(m_configs[CONFIG_BROADCAST_INTERVAL]);
+
sLog.outString( "WORLD: World initialized" );
}
@@ -1643,6 +1655,13 @@ void World::Update(uint32 diff)
m_timers[WUPDATE_EVENTS].Reset();
}
+ ///- Process autobroadcaster
+ if(getConfig(CONFIG_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"
MapManager::Instance().DoDelayedMovesAndRemoves();
@@ -2176,3 +2195,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_BROADCAST_POSITION) & BROADCAST_LOCATION_CHAT) == BROADCAST_LOCATION_CHAT)
+ sWorld.SendWorldText(LANG_AUTO_BROADCAST, message.c_str());
+ if((getConfig(CONFIG_BROADCAST_POSITION) & BROADCAST_LOCATION_TOP) == BROADCAST_LOCATION_TOP)
+ {
+ WorldPacket data(SMSG_NOTIFICATION, (message.size()+1));
+ data << message;
+ sWorld.SendGlobalMessage(&data);
+ }
+
+ if((getConfig(CONFIG_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());
+}
diff --git a/src/game/World.h b/src/game/World.h
index 74c897a..7a58e59 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_TIMERBAR_BREATH_MAX,
CONFIG_TIMERBAR_FIRE_GMLEVEL,
CONFIG_TIMERBAR_FIRE_MAX,
+
+ // Broadcaster
+ CONFIG_BROADCAST_ENABLED,
+ CONFIG_BROADCAST_INTERVAL,
+ CONFIG_BROADCAST_POSITION,
+
CONFIG_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..705e28e 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -1374,3 +1374,27 @@ 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
+#
+###################################################################################################################
+
+AutoBroadcast.Enabled = 1
+AutoBroadcast.Position = 1
+AutoBroadcast.Interval = 30000
+