Ok here is a mission timer (Attached)
Reports Mission design TIME value by reading mis data directly.
Reports Ingame run timer, Mins, Seconds,Ticks
Reports Time from Mission TIME + run time(in decimal mins)
Note Config in system folder,
Config:
"timeIO", "ON"
"timevalue", "15"
set "timeIO", "ON" = runs timer,
set "timeIO", "OFF" = turns off timer,
set "timevalue", "15" = seconds between count and screen reporting.
Rerun mission to activate new time values
note download the attached Mistimer.zip, as it contains correct setup
Note: drop MisTimer into missions folder and run from there.
here is the script for those interested,
Please report bugs if found. seems to work though.
enjoy.
Code:
/**MisTimer.cs**/
//
//C# script for CLOD missions,
//Features:
//Configlist: for easy setup "ON" runs timer, "OFF" turns off timer, timevalue = seconds between count and screen reporting.
//
//By Smokeynz
//
//lastmod 19/5/2012
//Dedicated server compatible
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.IO;
using maddox.game;
using maddox.game.world;
using maddox.GP;
public class Mission : AMission
{
/*=========================================*/
#region Mission paths
/*=========================================*/
static string userdocpath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
/*=========================================*/
// the following 2 items are for main mission folder path and mis name, edit for preference
static string MISname = "MisTimer.mis"; //alter this to your mission name
static string FILEname = "MisTimer"; //alter this to your mission folder name
/*=========================================*/
static string filepackpath = userdocpath + @"\1C SoftClub\il-2 sturmovik cliffs of dover\missions\"; //path to mission file pack
static string mainmissionpath = filepackpath + FILEname + @"\"; // main mission
//configs
static string syspath = mainmissionpath + @"system\"; // data path for system config
static string configfile = syspath + "config.txt";
//loading mission path data
static string timefile = mainmissionpath + MISname;
/*=========================================*/
#endregion
/*=========================================*/
#region Declarations, ints, doubles, bools
/*=========================================*/
//Msgs To
private const int All = -1;
private const int Allies = 1;
private const int Axis = 2;
bool timeIO;// = true; //time indicator switch on/off
double timevalue;
double timeindicator;
double MisHour;
double MisMin;
//config file indexing
int idxIO;
int idxTV;
// Internal file creation
public int idxlist;
/*=========================================*/
#endregion
/*=========================================*/
#region Mission Parse & Class
/*=========================================*/
// mission config settings(Allows external configuration)
List<Config> ConfigList = new List<Config>();
internal class Config
{
public string ConfigName { get; set; }//item name
public string ConfigValue { get; set; }//item value
public Config(string configName, string configValue)
{
this.ConfigName = configName;
this.ConfigValue = configValue;
}
}
public void ParseConfigFile(string confile)
{
if (!File.Exists(confile))
{
GamePlay.gpLogServer(null, "File {0} not found!", new object[] { confile });
return;
}
using (StreamReader reader = new StreamReader(confile))
{
string conline;
int conlineNr = 0;
while ((conline = reader.ReadLine()) != null)
{
conlineNr++;
if (conline != "")
{
string[] tmpconPart;
conline = conline.TrimStart('"'); // remove first "
conline = conline.TrimEnd('"'); // remove last "
tmpconPart = conline.Split(new string[] { "\", \"", "\",\"" }, StringSplitOptions.None); // split string on ", " or ","
if (tmpconPart.Length < 2)
{
GamePlay.gpLogServer(null, "Error reading configlist file: {0} : {1}", new object[] { conlineNr, conline });
}
else
{
if (tmpconPart[0].Equals("null"))
tmpconPart[0] = null;
if (tmpconPart[1].Equals("null"))
tmpconPart[1] = null;
ConfigList.Add(new Config(tmpconPart[0], tmpconPart[1]));
}
}
}
}
idxIO = ConfigList.FindIndex(r => r.ConfigName.Equals("timeIO"));
idxTV = ConfigList.FindIndex(s => s.ConfigName.Equals("timevalue"));
double.TryParse(ConfigList[idxTV].ConfigValue, out timevalue);
}
public void ParseTimeDataFile(string Tfile)
{
if (!File.Exists(Tfile))
{
GamePlay.gpLogServer(null, "File {0} not found!", new object[] { Tfile });
return;
}
using (StreamReader reader = new StreamReader(Tfile))
{
string line;
int lineNr = 0;
while ((line = reader.ReadLine()) != null)
{
lineNr++;
if (line != "")
{
if (line.Contains("TIME"))
{
string[] tmptime = line.Split(new string[] { " " }, StringSplitOptions.None); // split string
if (tmptime.Length < 3)
{
GamePlay.gpLogServer(null, "Error reading Time object line : {0} : {1}", new object[] { lineNr, line });
}
else
{
GamePlay.gpLogServer(null, "Time Line Split 0:{0} 1:{1} 2:{2} 3:{3}", new object[] { tmptime[0], tmptime[1], tmptime[2], tmptime[3] });//test reading
string[] tmptime2 = tmptime[3].Split(new string[] { "." }, StringSplitOptions.None); // split string
if (tmptime2.Length < 2)
{
double.TryParse(tmptime2[3], out MisHour);
}
else
{
GamePlay.gpLogServer(null, "Time Line Split 0:{0} 1:{1}", new object[] { tmptime2[0], tmptime2[1] });
double.TryParse(tmptime2[0], out MisHour);
double.TryParse(tmptime2[1], out MisMin);
if (MisMin < 10) { MisMin = MisMin / 10; }
if (MisMin > 9) { MisMin = MisMin / 100; }
}
}
}
}
}
}
}
/*=========================================*/
#endregion
/*=========================================*/
#region Main mission operation
/*=========================================*/
//listen to events from all missions.
public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
ParseConfigFile(configfile);
ParseTimeDataFile(timefile);
}
public override void OnTickGame()
{
base.OnTickGame();
// Time.current() in seconds from Battle Start
timeIO = (ConfigList[idxIO].ConfigValue == "ON" ? true : false);
if (timeIO == true)
{
if (Time.current() >= timeindicator)
{
double MisTime = MisHour + MisMin;
ScreenMsg(-1, "MisStart:: " + MisTime + " decimalhours");
Timeout(2.0, () => { ScreenMsg(-1, "Elapsed Time:Min:" + timeindicator / 60 + " Secs:" + timeindicator + " Ticks:" + timeindicator * 30); });
MisTime = Math.Round((MisHour + ((MisMin*60) + (timeindicator / 60)) / 60), 2);
Timeout(4.0, () => { ScreenMsg(-1, "MisTime:: " + MisTime + " decimalhours"); });
}
}
if (Time.current() >= timeindicator)
{
timeindicator = timeindicator + timevalue;
}
}
/*=========================================*/
#endregion
/*=========================================*/
#region ScreenMsg screen message
/*=========================================*/
private void ScreenMsg(int army, string msg, params object[] args)
{
List<Player> Consignees = new List<Player>();
if (GamePlay.gpPlayer() != null)
Consignees.Add(GamePlay.gpPlayer());
if (GamePlay.gpRemotePlayers() != null)
Consignees.AddRange(GamePlay.gpRemotePlayers());
if (army == -1)
{
GamePlay.gpHUDLogCenter(null, msg, args);
GamePlay.gpLogServer(null, msg, args);
}
else if (Consignees.Exists(item => item.Army() == army))
{
GamePlay.gpHUDLogCenter(Consignees.FindAll(item => item.Army() == army).ToArray(), msg, args);
GamePlay.gpLogServer(Consignees.FindAll(item => item.Army() == army).ToArray(), msg, args);
}
}
/*
private void sendChatMessage(int army, string msg, params object[] args)
{
List<Player> Consignees = new List<Player>();
if (GamePlay.gpPlayer() != null)
Consignees.Add(GamePlay.gpPlayer());
if (GamePlay.gpRemotePlayers() != null)
Consignees.AddRange(GamePlay.gpRemotePlayers());
if (army == -1)
GamePlay.gpLogServer(null, msg, args);
else if (Consignees.Exists(item => item.Army() == army))
GamePlay.gpLogServer(Consignees.FindAll(item => item.Army() == army).ToArray(), msg, args);
}
*/
/*=========================================*/
#endregion
/*=========================================*/
}
//note the last bracket wraps Amission