Official Fulqrum Publishing forum

Official Fulqrum Publishing forum (http://forum.fulqrumpublishing.com/index.php)
-   FMB, Mission & Campaign builder Discussions (http://forum.fulqrumpublishing.com/forumdisplay.php?f=203)
-   -   spawn airgroups? (http://forum.fulqrumpublishing.com/showthread.php?t=26515)

David198502 10-16-2011 01:49 PM

Kodiak your script to destroy planes works fine.i tried it with 6He's and they disappeared after a minute like they should.yesterday i tried to replace the He's with Hurricanes and edited the script to destroy them instead of He's.it didnt work cause i used a wrong name for them.so i looked again at your script and how you defined the name for the He's.your script states He-111P-2, but i in the FMB the He's are defined as He 111P-2...so without the first hyphen.today i looked in the mission file itself and there the aircraft is defined as in your script...so i assume that if i want to destroy hurricanes or any other planes, i have to look in the .mis file first to know the correct designation for them...!?...is that correct?

i also tried to destroy only certain groups, so that not all He's disappear after a minute. so i added two seperate flights of He's and displaced the section:

case "bob:Aircraft.He-111H-2":

with:

case "bob:Aircraft.0.BoB_LW_KuFIGr_706.03":

didnt work, so i tried:

case "bob:AirGroup.0.BoB_LW_KuFIGr_706.03":


...but that didnt work as well...

i also tried to destroy only one single plane of the group, but that didnt work either, but im sure its possible.



another question about this script:
as it is now, the planes will disappear after a period of 60seconds.
but do the 60seconds count from the beginning of the mission, or from the moment when the airplane is spawned?
cause if i would have different flights of He's all spawning at different times, but after 60seconds of the mission they destroy themself again, all flights which would normally spawn after one minute, wouldnt appear at all, because they are destroyed before they are born..

Osprey 10-16-2011 02:10 PM

It's ok, I found the problem! This is the trouble with no documentation, there's nothing to tell you the minor little bits and bobs. It was "Script spawn or" unchecked. It works now :D

I do find something weird though, don't know if others get it but seems that at some airfields when the AI spawn in they drop into the sea underneath the land. Ever seen it?

David198502 10-16-2011 03:34 PM

hey Kodiak, godfather of COD scripting,how do i correctly combine two scripts?
i tried to kombine your script where the airplanes get destroyed after a certain period with the script which combines a main and three submissions....both of their own work well, but as soon as i paste the "destroying" script into the other, none of them will work....

FG28_Kodiak 10-16-2011 04:01 PM

@David:
I use the InternalTypeName of the plane, here others for the flyable planes:
bob:Aircraft.Bf-109E-3
bob:Aircraft.Bf-109E-3B
bob:Aircraft.Bf-109E-1
bob:Aircraft.Bf-109E-4
bob:Aircraft.Bf-109E-4B
bob:Aircraft.Bf-110C-4
bob:Aircraft.Bf-110C-7
bob:Aircraft.Ju-87B-2
bob:Aircraft.Ju-88A-1
bob:Aircraft.He-111H-2
bob:Aircraft.He-111P-2
bob:Aircraft.SpitfireMkIa
bob:Aircraft.SpitfireMkI
bob:Aircraft.HurricaneMkI
bob:Aircraft.HurricaneMkI_dH5-20
bob:Aircraft.BlenheimMkIV
bob:Aircraft.SpitfireMkIIa

to figure this out the KI-Only Planes you can add:
Code:

GamePlay.gpLogServer(null, "InternalTypeName: {0}", new object[]{(actor as AiAircraft).InternalTypeName()});
to OnActorCreated(...) so you see the internal name in the chatbar and in the log (if enabled in conf.ini).

To destroy the planes from a specific Airgroup is not possible in OnActorCreated(..) at the time of creation there is no Airgroup.
But you can use the ActorName
Code:

GamePlay.gpLogServer(null, "ActorName: {0}", new object[] { (actor as AiAircraft).Name() });
If i use:
Code:

    public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
    {
        base.OnActorCreated(missionNumber, shortName, actor);

        if (actor != null && actor is AiAircraft)
        {

            GamePlay.gpLogServer(null, "InternalTypeName: {0}", new object[] { (actor as AiAircraft).InternalTypeName() });

            GamePlay.gpLogServer(null, "ActorName: {0}", new object[] { (actor as AiAircraft).Name() });
        }
}

i get this in the chatbar (from earlier example)
Server: InternalTypeName: bob:Aircraft.Bf-109E-4
Server: ActorName: 0:BoB_LW_LG2_I.000
Server: InternalTypeName: bob:Aircraft.He-111H-2
Server: ActorName: 0:BoB_LW_KuFlGr_706.000
Server: InternalTypeName: bob:Aircraft.He-111H-2
Server: ActorName: 0:BoB_LW_KuFlGr_706.001
Server: InternalTypeName: bob:Aircraft.He-111H-2
Server: ActorName: 0:BoB_LW_KuFlGr_706.002
Server: InternalTypeName: bob:Aircraft.He-111H-2
Server: ActorName: 0:BoB_LW_KuFlGr_706.010
Server: InternalTypeName: bob:Aircraft.He-111H-2
Server: ActorName: 0:BoB_LW_KuFlGr_706.011
Server: InternalTypeName: bob:Aircraft.He-111H-2
Server: ActorName: 0:BoB_LW_KuFlGr_706.012

so if you like to destroy planes from a Airgroup you could use:
Code:

        if (actor is AiAircraft && actor.Name().Contains("BoB_LW_KuFlGr_706"))
        {
            Timeout(60, () =>    // Time in Seconds
                        {
                            (actor as AiAircraft).Destroy();
                        });
        }

or a specific plane
Code:

        if (actor is AiAircraft && actor.Name().Contains("BoB_LW_KuFlGr_706.010"))
        {
            Timeout(60, () =>    // Time in Seconds
                        {
                            (actor as AiAircraft).Destroy();
                        });
        }


FG28_Kodiak 10-16-2011 04:05 PM

Quote:

Originally Posted by David198502 (Post 349813)
hey Kodiak, godfather of COD scripting,how do i correctly combine two scripts?
i tried to kombine your script where the airplanes get destroyed after a certain period with the script which combines a main and three submissions....both of their own work well, but as soon as i paste the "destroying" script into the other, none of them will work....

Could you poste the code please?

David198502 10-16-2011 04:45 PM

1 Attachment(s)
there it is...

FG28_Kodiak 10-16-2011 05:39 PM

Ok, i see couldn't work

this is the main block:

Code:

using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;

public class Mission : AMission
{


}

You must place your code between the two brackets { ... }

so you must place
public override void OnActorCreated(....)
{
.....
.....
}

and
public override void OnTickGame(...)
{
.....
.....
}
between the brackets.
Your fault was that you placed the OnActorCreated into the OntickGame and this is not allowed in C#.
Hint: Open your Clod Console and you will see error messages if anything goes wrong.

So should your code look like:
Code:

using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;

public class Mission : AMission
{

    public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
    {
        base.OnActorCreated(missionNumber, shortName, actor);

        if (actor is AiAircraft)
        {
            switch ((actor as AiAircraft).InternalTypeName())
            {

                case "bob:Aircraft.He-111P-2":

                    Timeout(600, () =>    // Time in Seconds
                        {
                            (actor as AiAircraft).Destroy();
                        });
                    break;
            }
        }
    }




    public override void OnTickGame()
    {

        // loads the 1st sub-mission in 10 min and repeates it every 60 min.
        if (Time.tickCounter() % 10800 == 180) // 108000 = 60 min repeat. 1800 = 10 min delay.
        // pls. note!!! the 1st figure above must be always larger than 2nd!
        {
            GamePlay.gpPostMissionLoad("missions/Single/mission1.mis");

            // prints message on screen after mission load
            GamePlay.gpHUDLogCenter("Hello, world! Mission1.mis loaded!");

            // prints message on screen in 10 minutes
            double initTime = 0.0;
            Timeout(initTime += 600, () =>
            {
                GamePlay.gpHUDLogCenter("10 minutes into the 1st mission! Wow! It works!!!");
            });

            // prints message on screen in 5 minutes
            Timeout(initTime += 300, () =>
            {
                GamePlay.gpHUDLogCenter("Wholy s.. it works!!!");
            });

        }

        // loads the 2nd sub-mission, etc. the same way
        if (Time.tickCounter() % 10800 == 1000) //  108000 = 60 min repeat, 54000 = 30 min delay.
        {
            GamePlay.gpPostMissionLoad("missions/Single/mission2.mis");
            GamePlay.gpHUDLogCenter("Mission2.mis loaded!");
            double initTime = 0.0;
            Timeout(initTime += 600, () =>
            {
                GamePlay.gpHUDLogCenter("Mission2 10 min message!");
            });

            Timeout(initTime += 300, () =>
              {
                  GamePlay.gpHUDLogCenter("Mission2 15 min message!");
              });
        }

        // loads the 3rd sub-mission
        if (Time.tickCounter() % 10800 == 2000) // 60 min repeat, 50 min delay
        {
            GamePlay.gpPostMissionLoad("missions/Multi/Single/mission3.mis");
            GamePlay.gpHUDLogCenter("Mission3.mis loaded!");

            double initTime = 0.0;
            Timeout(initTime += 600, () =>
            {
                GamePlay.gpHUDLogCenter("Mission3 10 min message!");
            });
            Timeout(initTime += 300, () =>
            {
                GamePlay.gpHUDLogCenter("Now it really works! You are a genius! Have fun!");
            });
        }
    }
}

btw i've not tested the script in Clod so may be there are other errors are present, but normaly it should work.

Ataros 10-16-2011 06:32 PM

Very interesting thread. Thank you, Kodiak.

I guess spawning the same group OnTrigger again and again may not work because when the group spawns the 2nd time it belongs to the second mission, etc. The game engine includes mission counter as far as I understand from naryv's examples. I think a long_name of a group may include a mission (submission) number.

Maybe the way to load the same group OnTrigger is to make a sub-mission which includes both an airgroup and a trigger. Then load the same submission OnTrigger. Can not grasp it 100% myself, just thinking aloud.

SNAFU 10-17-2011 09:29 AM

No, that works, but you have to clear the trigger again, after it was triggered.

If you have the following for the trigger:
Code:


 if (("RedIntercept1".Equals(shortName) && active) && (CountAIAirplanes(1) <= maxRedAI))
          {
                AiAction action = GamePlay.gpGetAction("RedIntercept1");
                if (action != null)
                        MissionTimer1Int.Restart();
                        MissionTimer1IntA.Start();                       
                        GamePlay.gpLogServer(null, "Intercept 1 triggered ", new object[] { }); //Testmeldung
                {
                    action.Do();
                }
                GamePlay.gpGetTrigger(shortName).Enable = false;           
          }

You can clear the trigger again by something like this:
Code:

if (MissionTimer1IntA.Elapsed.Minutes >= 30)                          //wieder freischalten des Triggers
    {
        GamePlay.gpGetTrigger("RedIntercept1").Enable = true;
        MissionTimer1IntA.Reset();                                       
        GamePlay.gpLogServer(null, "Trigger 1 clear", new object[] { });                //Testmeldung
        }


David198502 10-17-2011 01:11 PM

ok Kodiak...i tried the script.
the He's of the main mission disappear after the 60seconds, but all other He's of the submissions will stay on the map...

so i pasted the relevant part of the script in all the submissios to destroy these He's as well.....this works!

...but is it possible to edit the script of the main mission, that all He's, including the ones of the submissions, disappear?

i looked at your brilliant tutorials on sturmovik.de and saw that its possible to destroy planes not only after a certain time, but when they cross a certain waypoint...but honestly im a bit overwhelmed by all its details that i dont consider myself capable of doing this by myself....

i also saw that it is possible to load submissions randomly...but in your tutorial you have some conditions which determine whether a mission is loaded or not(mission x will not be loaded if one destroys friendly vehicle)...i would like to load submissions randomly, regardless of any conditions, every xx seconds.is that possible?

i think its a better solution for my purpose to load submissions by random than loading mission after mission in determined sequence, because this would add an surprising factor, and i think it would shorten the script drastically, if i want to have 20 or more submissions.


btw, i really appreciate your help, and admire your patience with me!thx in advance...




PHP Code:

/**** 
 * Brief startup guide to scripting. 
 * This is a sample script to create a small online 'campaign' containing a main mission and 3 sub-missions.
 * 
 * Copy this script to Notepad and save it as sample.cs into the same folder your mission will be located, e.g. 
 * C:\Users\%user%\Documents\1C SoftClub\il-2 sturmovik cliffs of dover\missions\Multi\Dogfight\My_mis1\
 * Scripts have to be saved with .cs extension and have the same name as the main mission.
 * Create and edit your main mission in FMB. In this example the main mission name should be sample.mis because the script name is sample.cs.
 * Make sure you have both sample.mis and sample.cs in the following directory (on the drive you have your Documents folder):
 * C:\Users\%user%\Documents\1C SoftClub\il-2 sturmovik cliffs of dover\missions\Multi\Dogfight\My_mis1\ 
 * Create and edit 3 missions you want to be loaded into the main mission with FMB.
 * Put these 3 missions in the same directory, name them as mission1.mis, mission2.mis and mission3.mis.
 * That's it.
 * 
 * In case you saved your mission files into other directory than Multi/Dogfight/Dogfight/My_mis1/ , than edit 3 filepaths in this file. 
 * e.g. the line GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/My_mis1/mission1.mis" contains the path to the 1st sub-mission.  * 
 * 
 * Change message text after GamePlay.gpHUDLogCenter commands to whatever you like (usually mission objectives and their location on the map).
 * The text in this example is visible to both sides for simplicity.
 * 
 * You may wish to download and use Microsoft Visual Studio 2010 Express to open and edit .cs files. It is free and makes .cs files easy to read and understand.
 * Download link http://www.microsoft.com/express/Downloads/#2010-Visual-CS
 * 
 * All text after // marks are comments describing what the script does.
 * You may play your mission in MP or as a SP mission if you create a passworded server.
 * Have fun! and S! from 3GIAP
 * 
 * Feel free to delete all the comments above and including this line from this file. ****/

using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;

public class 
Mission AMission
{

    public 
override void OnActorCreated(int missionNumberstring shortNameAiActor actor)
    {
        
base.OnActorCreated(missionNumbershortNameactor);

        if (
actor is AiAircraft)
        {
            switch ((
actor as AiAircraft).InternalTypeName())
            {

                case 
"bob:Aircraft.He-111P-2":

                    
Timeout(60, () =>    // Time in Seconds
                         
{
                             (
actor as AiAircraft).Destroy();
                         });
                    break;
            }
        }
    }


 
public 
override void OnTickGame()
{

// loads the 1st sub-mission in 10 min and repeates it every 60 min.
    
if (Time.tickCounter() % 20000 == 320// 108000 = 60 min repeat. 1800 = 10 min delay. 
        // pls. note!!! the 1st figure above must be always larger than 2nd!
  
{
      
GamePlay.gpPostMissionLoad("missions/Single/apocalypseLondon/mission1.mis");

      
// prints message on screen after mission load
      
GamePlay.gpHUDLogCenter("Hello, world! Mission1.mis loaded!");

      
// prints message on screen in 10 minutes
      
double initTime 0.0;
      
Timeout(initTime += 600, () =>
      {
          
GamePlay.gpHUDLogCenter("10 minutes into the 1st mission! Wow! It works!!!");
      });

      
// prints message on screen in 5 minutes
      
Timeout(initTime += 300, () =>
      {
          
GamePlay.gpHUDLogCenter("Wholy s.. it works!!!");
      });

   }

// loads the 2nd sub-mission, etc. the same way
       
if (Time.tickCounter() % 10800 == 1000//  108000 = 60 min repeat, 54000 = 30 min delay. 
    
{
        
GamePlay.gpPostMissionLoad("missions/Single/apocalypseLondon/mission2.mis");
        
GamePlay.gpHUDLogCenter("Mission2.mis loaded!"); 
      
double initTime 0.0;
      
Timeout(initTime += 600, () =>
       {
           
GamePlay.gpHUDLogCenter("Mission2 10 min message!");
       });
            
      
Timeout(initTime += 300, () =>
         {
             
GamePlay.gpHUDLogCenter("Mission2 15 min message!");
         });
    }

// loads the 3rd sub-mission
       
if (Time.tickCounter() % 10800 == 1500// 60 min repeat, 50 min delay 
       
{
           
GamePlay.gpPostMissionLoad("missions/Single/apocalypseLondon/mission3.mis");
           
GamePlay.gpHUDLogCenter("Mission3.mis loaded!");

           
double initTime 0.0;
           
Timeout(initTime += 600, () =>
           {
               
GamePlay.gpHUDLogCenter("Mission3 10 min message!");
           });
           
Timeout(initTime += 300, () =>
           {
               
GamePlay.gpHUDLogCenter("Now it really works! You are a genius! Have fun!");
           });
       }

// loads the 4th sub-mission
       
if (Time.tickCounter() % 10800 == 2000// 60 min repeat, 50 min delay 
       
{
           
GamePlay.gpPostMissionLoad("missions/Single/apocalypseLondon/mission4.mis");
           
GamePlay.gpHUDLogCenter("Mission4.mis loaded!");

           
double initTime 0.0;
           
Timeout(initTime += 600, () =>
           {
               
GamePlay.gpHUDLogCenter("Mission3 10 min message!");
           });
           
Timeout(initTime += 300, () =>
           {
               
GamePlay.gpHUDLogCenter("Now it really works! You are a genius! Have fun!");
           });
       }


}






All times are GMT. The time now is 06:53 AM.

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