Code:
///
/// Broadcasting Events and Mission Status
///
/// @Author Artist
/// @Version 1.0.0
///
///
/// === Example integration into Mission ===
///
/// //$include <put-your-path-here>/Broadcast-vX.y.z.cs
///
///
/// class Mission : AMission {
/// ...
/// public Broadcast m_Broadcast = null;
/// ...
/// public override void OnBattleStarted()
/// {
/// ...
/// m_Broadcast = new Broadcast(this, Time);
/// /// Print mission's status and time left in stated intervals (minutes)
/// m_Broadcast.AddAutoMessageChat(Broadcast.ARMY_ALL, 5, GetMissionStatusText);
/// ...
/// }
/// public string GetMissionStatusText()
/// {
/// string sResponse = "Mission status is ...";
/// return sResponse;
/// }
/// public void OnSomeEvent()
/// {
/// ...
/// m_Broadcast.ToChatAndScreen(Broadcast.ARMY_ALL, "airfield XYZ has been destroyed!");
/// ...
/// }
///
using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;
using maddox.GP;
public class Broadcast {
/// Delegate definition
/// Delegate naming with class as prefix, funny errors if delegates from different classes have same name
public delegate string Broadcast_GetString();
/// some constants for readability
public const int ARMY_ALL = -1;
public const int ARMY_NONE = 0;
public const int ARMY_RED = 1;
public const int ARMY_BLUE = 2;
/// Internals
/// Class for auto messages
protected class AutoMessage {
public Broadcast_GetString m_dgGetString = null;
public int m_iInterval = 0;
public int m_iArmy = -1;
public int m_iLastTick = 0;
public bool m_bToChat = false;
public bool m_bToScreen = false;
}
protected AMission m_Mission = null;
protected ITime m_Time = null;
protected List<AutoMessage> m_aAutoMessages = null;
/// <summary>
/// Constructor
/// </summary>
/// <param name="Mission">The Mission (use 'this')</param>
public Broadcast(AMission Mission, ITime Time)
{
m_Mission = Mission;
m_Time = Time;
m_aAutoMessages = new List<AutoMessage>();
}
/// <summary>
/// Add a message to be broadcasted in the chat at a stated interval.
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="iMinutes">Brodcast interval in minutes</param>
/// <param name="dgFunc">A function that returns the message as string</param>
public bool AddAutoMessageChat(int iArmy, int iMinutes, Broadcast_GetString dgFunc)
{
return AddAutoMessage(iArmy, iMinutes, false, true, dgFunc);
}
/// <summary>
/// Add a message to be broadcasted on the screen at a stated interval.
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="iMinutes">Brodcast interval in minutes</param>
/// <param name="dgFunc">A function that returns the message as string</param>
public bool AddAutoMessageScreen(int iArmy, int iMinutes, Broadcast_GetString dgFunc)
{
return AddAutoMessage(iArmy, iMinutes, true, false, dgFunc);
}
/// <summary>
/// Add a message to be broadcasted in the chat, on the screen, or both at a stated interval.
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="iMinutes">Brodcast interval in minutes</param>
/// <param name="dgFunc">A function that returns the message as string</param>
public bool AddAutoMessage(int iArmy, int iMinutes, bool bToScreen, bool bToChat, Broadcast_GetString dgFunc)
{
AutoMessage Am = new AutoMessage();
Am.m_dgGetString = dgFunc;
Am.m_iArmy = iArmy;
Am.m_iInterval = iMinutes*60*36;
Am.m_iLastTick = m_Time.tickCounter();
Am.m_bToChat = bToChat;
Am.m_bToScreen = bToScreen;
m_aAutoMessages.Add(Am);
return true;
}
/// <summary>
/// Check for and send auto messages due
/// </summary>
/// <param name="iCurTick">Current game/time tick</param>
public void DoAutoMessages()
{
int iCurTick = m_Time.tickCounter();
foreach(AutoMessage Am in m_aAutoMessages)
{
if(Am.m_iLastTick + Am.m_iInterval < iCurTick)
{
Am.m_iLastTick = iCurTick;
if(Am.m_bToChat)
{
ToChat(Am.m_iArmy, Am.m_dgGetString());
}
if(Am.m_bToScreen)
{
ToScreen(Am.m_iArmy, Am.m_dgGetString());
}
}
}
}
/// <summary>
/// Broadcast message in the chat
/// Constructor
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="sAnnouncement">The text</param>
public void ToChat(int iArmy, string sAnnouncement)
{
ToChat(iArmy, sAnnouncement, new object[] { });
}
/// <summary>
/// Broadcast message in the chat
/// Constructor
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="sAnnouncement">The text</param>
/// <param name="aParams">additional params for GamePlay.gpLogServer</param>
public void ToChat(int iArmy, string sAnnouncement, object[] aParams)
{
if(ARMY_ALL == iArmy)
{
m_Mission.GamePlay.gpLogServer(null, sAnnouncement, aParams);
}
else
{
List<Player> Players = GetRecipents(iArmy);
if (0 < Players.Count)
{
m_Mission.GamePlay.gpLogServer(Players.ToArray(), sAnnouncement, aParams);
}
}
}
/// <summary>
/// Broadcast message both in the chat and on the screen
/// Constructor
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="sAnnouncement">The text</param>
public void ToChatAndScreen(int iArmy, string sAnnouncement)
{
ToChatAndScreen(iArmy, sAnnouncement, new object[] { });
}
/// <summary>
/// Broadcast message both in the chat and on the screen
/// Constructor
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="sAnnouncement">The text</param>
/// <param name="aParams">additional params for GamePlay.gpLogServer / GamePlay.gpHUDLogCenter</param>
public void ToChatAndScreen(int iArmy, string sAnnouncement, object[] aParams)
{
if(ARMY_ALL == iArmy)
{
m_Mission.GamePlay.gpHUDLogCenter(null, sAnnouncement, aParams);
m_Mission.GamePlay.gpLogServer(null, sAnnouncement, aParams);
}
else
{
List<Player> Players = GetRecipents(iArmy);
if (0 < Players.Count)
{
m_Mission.GamePlay.gpHUDLogCenter(Players.ToArray(), sAnnouncement, aParams);
m_Mission.GamePlay.gpLogServer(Players.ToArray(), sAnnouncement, aParams);
}
}
}
/// <summary>
/// Broadcast message on the screen
/// Constructor
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="sAnnouncement">The text</param>
public void ToScreen(int iArmy, string sAnnouncement)
{
ToScreen(iArmy, sAnnouncement, new object[] { });
}
/// <summary>
/// Broadcast message on the screen
/// Constructor
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <param name="sAnnouncement">The text</param>
/// <param name="aParams">additional params for GamePlay.gpHUDLogCenter</param>
public void ToScreen(int iArmy, string sAnnouncement, object[] aParams)
{
if(ARMY_ALL == iArmy)
{
m_Mission.GamePlay.gpHUDLogCenter(null, sAnnouncement, aParams);
}
else
{
List<Player> Players = GetRecipents(iArmy);
if (0 < Players.Count)
{
m_Mission.GamePlay.gpHUDLogCenter(Players.ToArray(), sAnnouncement, aParams);
}
}
}
/// <summary>
/// Collect players to broadcast to
/// </summary>
/// <param name="iArmy">1 = red, 2 = blue, -1 = both</param>
/// <returns>list of players</return>
private List<Player> GetRecipents(int iArmy)
{
List<Player> Players = new List<Player>();
/// Singleplayer mode or dedicated server
if (m_Mission.GamePlay.gpPlayer() != null)
{
if (m_Mission.GamePlay.gpPlayer().Army() == iArmy || iArmy == ARMY_ALL)
Players.Add(m_Mission.GamePlay.gpPlayer());
}
/// Multiplayer (Host Server on Client)
if (m_Mission.GamePlay.gpRemotePlayers() != null || m_Mission.GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in m_Mission.GamePlay.gpRemotePlayers())
{
if (p.Army() == iArmy || iArmy == ARMY_ALL)
Players.Add(p);
}
}
return Players;
}
}
Bookmarks