View Single Post
  #12  
Old 05-19-2012, 05:12 AM
Smokeynz Smokeynz is offline
Approved Member
 
Join Date: Apr 2011
Posts: 106
Default

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
Attached Files
File Type: zip MisTimer.zip (4.5 KB, 2 views)
Reply With Quote