Fulqrum Publishing Home   |   Register   |   Today Posts   |   Members   |   UserCP   |   Calendar   |   Search   |   FAQ

Go Back   Official Fulqrum Publishing forum > Fulqrum Publishing > IL-2 Sturmovik: Cliffs of Dover > FMB, Mission & Campaign builder Discussions

Reply
 
Thread Tools Display Modes
  #1  
Old 12-10-2011, 01:49 PM
wildwillie wildwillie is offline
Approved Member
 
Join Date: Aug 2010
Posts: 111
Default Scripting help needed

I need help with a couple of scripts for the stats/server manager program I am working on.

1st I need to check every 5 seconds to see of there is any commands in the queue to be processed. I have the queue stuff setup, just need the timing stuff. This is what I have so far based on examples I have seen, but it needs the timer number correctly:

Code:
    public override void OnTickGame()
    {
        if (Time.tickCounter() % 5000 == 50)
        {
            if (stats != null )
            {
               newCmds = stats.getCommands();
               if (newCmds.Count > 0)
                   ProcessCommands(newCmds);
            }
        }
 }
The next is for sending messages to the HUDlog. I would like the ability to send messages to (All players, All players in army 1(Red) or army 2(Blue), or a specific player) This is what I have so far:

Code:
    private void ProcessCommands(List<ServerCommand> newCmds)
    {
        try
        {
            foreach (ServerCommand sc in newCmds)
            {
                if (sc.CommandType.Equals("HUDmsg"))
                {
                	if (sc.ToWho.Equals("All"))
                    GamePlay.gpHUDLogCenter(sc.Command);
                  else if (sc.ToWho.Equals("Red"))
                   // Send message to Red Team
                    ????
                  else if (sc.ToWho.Equals("Blue"))
                   // Send message to Blue team
                   ???
                  else
                  {
                  	// Message is for a specific player based on player name in string sc.ToWho
                          ????
                  }
                }
            }
        }
        catch (Exception ex)
        {
            System.Console.WriteLine("Stats.ProcessCommands - Exception: " + ex);
        }
    }
Any help is appreciated,

WildWillie
Reply With Quote
  #2  
Old 12-10-2011, 02:26 PM
Octocat Octocat is offline
Approved Member
 
Join Date: Dec 2011
Posts: 22
Default

Code:
int armyPlayer = GamePlay.gpPlayer().Army();
int armyRed = 1;
int armyBlue = 2;
Full interfaces:

Code:
namespace maddox.game
{
  public interface Player
  {
    int Army();                           // Player army
    bool AutopilotPrimary();
    bool AutopilotSecondary();
    int Channel();
    string ConnectAddress();
    int ConnectPort();
    bool IsConnected();
    bool IsExpelArmy(int army);
    bool IsExpelUnit(AiActor unit);
    string LanguageName();
    string Name();
    AiPerson PersonPrimary();
    AiPerson PersonSecondary();
    int Ping();
    AiActor Place();
    void PlaceEnter(AiActor actor, int indxPlace);
    void PlaceLeave(int indxPlace);
    int PlacePrimary();
    int PlaceSecondary();
    void SelectArmy(int army);
  }

  public interface IGamePlay
  {
    AiActor gpActorByName(string actorName);
    bool gpActorIsValid(AiActor actor);
    AiAirGroup gpAiAirGroup(int ID, int army);
    AiAirGroup[] gpAirGroups(int Army);
    AiAirport[] gpAirports();
    int[] gpArmies();                                    //All armies
    string gpArmyName(int army);
    void gpAviPlay(string args);
    bool gpBattleIsRun();
    void gpBattleStop();
    AiBirthPlace[] gpBirthPlaces();
    ISectionFile gpConfigUserFile();
    ISectionFile gpCreateSectionFile();
    ISectionFile gpCreateSectionFile(string line, out string firstWord);
    DifficultySetting gpDifficultyGet();
    IRecalcPathParams gpFindPath(Point2d a, double ra, Point2d b, double rb, PathType type, int army);
    int gpFrontArmy(double x, double y);
    double gpFrontDistance(int army, double x, double y);
    bool gpFrontExist();
    AiAction gpGetAction(string name);
    AiTrigger gpGetTrigger(string name);
    AiGroundGroup[] gpGroundGroups(int Army);
    void gpHUDLogCenter(string msg);
    void gpHUDLogCenter(Player[] to, string msg);
    void gpHUDLogCenter(Player[] to, string msg, object[] parms);
    void gpHUDLogCenter(Player[] to, string msg, object[] parms, double lifeTime);
    object[] gpInvoke(object[] args);
    bool gpIsServerDedicated();
    bool gpIsServerSingle();
    bool gpIsValidAccess();
    LandTypes gpLandType(double x, double y);
    ISectionFile gpLoadSectionFile(string fileName);
    void gpLogServer(Player[] to, string format, object[] args);
    void gpLogServerArg(bool newArg, string format, object[] parms);
    void gpLogServerBegin(Player[] to, string format);
    void gpLogServerEnd();
    AiAirGroup gpMakeAirGroup(AiAircraft[] items, AiAirWayPoint[] way);
    int gpNextMissionNumber();
    Player gpPlayer();
    void gpPostMissionLoad(ISectionFile file);
    void gpPostMissionLoad(string fileName);
    Player[] gpRemotePlayers();
    string gpSectorName(double x, double y);
    void gpSetOrderMissionMenu(Player player, bool thisSubMenu, int ID, string[] keys, bool[] bSubMenu);
    ITime gpTime();
  }
}
Reply With Quote
  #3  
Old 12-10-2011, 05:09 PM
FG28_Kodiak FG28_Kodiak is offline
Approved Member
 
Join Date: Dec 2009
Location: Swabia->Bavaria->Germany
Posts: 884
Default

@wildwillie:

To send a message to a specific army (1 red, 2 blue, -1 to all)
Code:
    private void sendScreenMessageTo(int army, string msg, object[] parms)
    {
        List<Player> Players = new List<Player>();

        // on Dedi the server or for singleplayertesting
        if (GamePlay.gpPlayer() != null)
        {
                if (GamePlay.gpPlayer().Army() == army || army == -1)
                    Players.Add(GamePlay.gpPlayer());
        } 
        if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
        {
            foreach (Player p in GamePlay.gpRemotePlayers())
            {
                if (p.Army() == army || army == -1)
                    Players.Add(p);
            }
        }
        if (Players != null && Players.Count > 0)
            GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
    }


    private void sendChatMessageTo(int army, string msg, object[] parms)
    {
        List<Player> Players = new List<Player>();
        // on Dedi the server:
        if (GamePlay.gpPlayer() != null)
        {
            if (GamePlay.gpPlayer().Army() == army || army == -1)
                Players.Add(GamePlay.gpPlayer());
        } //rest of the crowd
        if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
        {
            foreach (Player p in GamePlay.gpRemotePlayers())
            {
                if (p.Army() == army || army == -1)
                    Players.Add(p);
            }
        }
        if (Players != null && Players.Count > 0)
            GamePlay.gpLogServer(Players.ToArray(), msg, parms);
    }
sendScreenMessageTo is for HUD messages
sendChatMessageTo send the message to the chat

to use
following sends a HudMessage "Hello red" to red Army
sendScreenMessageTo(1, "Hello red", null);
to all
sendScreenMessageTo(-1, "Hello all", null);

if you want show values etc. you can use
int redpoints = 100; //example value
sendScreenMessageTo(1, "Hello red, you have {0} points", new object[]{ redpoints});
so red gets the message "Hello red, you have 100 points"


to a specific player:
Code:
    private void sendChatMessageTo(Player player, string msg, object[] parms)
    {
        if (player != null)
            GamePlay.gpLogServer(new Player[] { player }, msg, parms);
    }

    private void sendScreenMessageTo(Player player, string msg, object[] parms)
    {
        if (player != null)
            GamePlay.gpHUDLogCenter(new Player[] { player }, msg, parms);
    }

for timing i use Stopwatch from.net, ontickgame is not very exact.
example:
Code:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using maddox.game;
using maddox.game.world;


public class Mission : AMission
{

    Stopwatch MissionTimer = new Stopwatch();

    public override void OnBattleStarted()
    {
        base.OnBattleStarted();

        MissionTimer.Start(); // start the stopwatch
    
    }



    public override void OnTickGame()
    {
        base.OnTickGame();

        
        if (MissionTimer.Elapsed.TotalSeconds >= 50) // 50 seconds
        {
            MissionTimer.Restart(); // stopwatch reset to 0 and restart
            
            // Do something
        }
    }
}

Last edited by FG28_Kodiak; 12-10-2011 at 05:32 PM.
Reply With Quote
  #4  
Old 12-10-2011, 09:34 PM
Octocat Octocat is offline
Approved Member
 
Join Date: Dec 2011
Posts: 22
Default

Another solution, based on the example above

Code:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using maddox.game;
using maddox.game.world;


public class Mission : AMission
{
  /// <summary>
  /// Returns a list of all users
  /// </summary>
  private List<Player> GetPlayers()
  {
    var result = new List<Player>();
    if (GamePlay.gpRemotePlayers() != null)
    {
      result.AddRange(GamePlay.gpRemotePlayers());
    }
    if (GamePlay.gpPlayer() != null)
    {
      result.Add(GamePlay.gpPlayer());
    }
    return result;
  }

  /// <summary>
  /// Returns a list of all users of specified army
  /// </summary>
  private List<Player> GetPlayers(int army)
  {
    return (army < 0) ? GetPlayers() : GetPlayers().FindAll(player => player.Army().Equals(army));
  }

  /// <summary>
  /// Sends a message to the screens of all users of specified army
  /// </summary>
  private void BroadcastScreenMessage(int army, string format, params object[] args)
  {
    GamePlay.gpHUDLogCenter(GetPlayers(army).ToArray(), format, args);
  }

  /// <summary>
  /// Sends a message to the logs of all users of specified army
  /// </summary>
  private void BroadcastLogMessage(int army, string format, params object[] args)
  {
    GamePlay.gpLogServer(GetPlayers(army).ToArray(), format, args);
  }
  
  public override void OnBattleStarted()
  {
    base.OnBattleStarted();

    BroadcastScreenMessage(1, "Your army color: {0}, your side: {1}", "Red", "Allies");
    BroadcastScreenMessage(2, "Your army color: {0}, your side: {1}", "Blue", "Axis");

    BroadcastLogMessage(1, "Big group of german {0} heading to {1}.", "Bombers", "London");
    BroadcastLogMessage(2, "Group of our {0} need to cover in their raid to {1}, rendezvous point at sector {2}.", "Heinkels", "London", "G9");  
  }
}
Reply With Quote
  #5  
Old 12-10-2011, 09:50 PM
wildwillie wildwillie is offline
Approved Member
 
Join Date: Aug 2010
Posts: 111
Default

Thank you for the quick replys. I'll work them in later this weekend.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 07:50 AM.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © 2007 Fulqrum Publishing. All rights reserved.