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 10-31-2012, 12:01 PM
FG28_Kodiak FG28_Kodiak is offline
Approved Member
 
Join Date: Dec 2009
Location: Swabia->Bavaria->Germany
Posts: 884
Default

the orginal OnTrigger is defined in the Battle-Script:
Code:
public virtual void OnTrigger(int missionNumber, string shortName, bool active)
{
    if (this.missions.Count > 0)
    {
        foreach (AMission mission in this.missions)
        {
            if (mission.IsMissionListener(missionNumber))
            {
                mission.OnTrigger(missionNumber, shortName, active);
            }
        }
    }
    else if (active)
    {
        AiAction action = this.GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName));
        if (action != null)
        {
            action.Do();
        }
    }
}
If you override the OnTrigger - Method, you create a empty new method so the ability to spawn Airgroups etc is lost, this is nessesary to avoid side-effects.
So to get the old behavior you must insert code to spawn the Actors again for example with:
Code:
    public override void OnTrigger(int missionNumber, string shortName, bool active)
    {
        base.OnTrigger(missionNumber, shortName, active);


        AiAction action = GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName));
        if (action != null)
        {
            action.Do();
        }
    }

Last edited by FG28_Kodiak; 10-31-2012 at 12:10 PM.
Reply With Quote
  #2  
Old 10-31-2012, 01:07 PM
moggel moggel is offline
Approved Member
 
Join Date: Mar 2011
Posts: 70
Default

Quote:
Originally Posted by FG28_Kodiak View Post
the orginal OnTrigger is defined in the Battle-Script:
Code:
public virtual void OnTrigger(int missionNumber, string shortName, bool active)
{
    if (this.missions.Count > 0)
    {
        foreach (AMission mission in this.missions)
        {
            if (mission.IsMissionListener(missionNumber))
            {
                mission.OnTrigger(missionNumber, shortName, active);
            }
        }
    }
    else if (active)
    {
        AiAction action = this.GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName));
        if (action != null)
        {
            action.Do();
        }
    }
}
If you override the OnTrigger - Method, you create a empty new method so the ability to spawn Airgroups etc is lost, this is nessesary to avoid side-effects.
So to get the old behavior you must insert code to spawn the Actors again for example with:
Code:
    public override void OnTrigger(int missionNumber, string shortName, bool active)
    {
        base.OnTrigger(missionNumber, shortName, active);


        AiAction action = GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName));
        if (action != null)
        {
            action.Do();
        }
    }
Let's see if I understand you correctly Kodiak...

First of all, you mention "the battle script" and even present the OnTrigger virtual method. Is the AMission class source code available somewhere?! If so, where can I find it?

You then say...
Quote:
Originally Posted by FG28_Kodiak
If you override the OnTrigger - Method, you create a empty new method so the ability to spawn Airgroups etc is lost, this is nessesary to avoid side-effects.
If I override the OnTrigger i can add base.OnTrigger(...), which of course would be quite useless, but my experiments indicated that overriding OnTrigger is mandatory, like bolox said, to allow actions to actually be triggered, right?
In your override you check for 'missions' (if (this.missions.Count > 0)). Are those "sub missions" loaded by "this" mission?

You then iterate those missions and calls their OnTrigger(), but only if they are "mission listeners". What is that?

Then, if there's no (sub?) missions you move ahead and actively checks for any action to be triggered and calls its .Do() method if the trigger is active which makes sense of course but why is this done only if there's no (sub?) missions? Is this to allow those (sub?) missions to make the ultimate decision to act on the trigger or not?

Finally, you present an override that starts with calling the default behavior. But then it goes ahead and forces the affected action to trigger regardless. Why is that?

Thanks for taking the time mate!
__________________
Core i7 3930K @ 4.8GHz; 16Gb DDR3 (Vengeance); nVidia GTX580; OS disk: 150Gb 10000rpm; SIM disk: 300Gb 10000rpm; Windows 7 x64 Ultimate
Reply With Quote
  #3  
Old 10-31-2012, 01:59 PM
FG28_Kodiak FG28_Kodiak is offline
Approved Member
 
Join Date: Dec 2009
Location: Swabia->Bavaria->Germany
Posts: 884
Default

The first code is the orginal virtual method from ABattle (not from me, it contains also control structures for different missions), you don't have access to it via normal script, it was only a example how the orginal code looks like.

There is nothing interesting in AMission:
Code:
public abstract class AMission
{
    // Methods
    protected AMission()
    {
    }

    public virtual void Init(ABattle battle, int missionNumber)
    {
        this.Battle = battle;
        this.MissionNumber = missionNumber;
        this.MissionNumberListener = missionNumber;
        this.Inited();
    }

    public virtual void Inited()
    {
    }

    public virtual bool IsMissionListener(int missionNumber)
    {
        return ((this.MissionNumberListener < 0) || (missionNumber == this.MissionNumberListener));
    }

    public virtual void OnActorCreated(int missionNumber, string shortName, AiActor actor)
    {
    }

    public virtual void OnActorDamaged(int missionNumber, string shortName, AiActor actor, AiDamageInitiator initiator, NamedDamageTypes damageType)
    {
    }

    public virtual void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
    {
    }

    public virtual void OnActorDestroyed(int missionNumber, string shortName, AiActor actor)
    {
    }

    public virtual void OnActorTaskCompleted(int missionNumber, string shortName, AiActor actor)
    {
    }

    public virtual void OnAiAirNewEnemy(AiAirEnemyElement element, int army)
    {
    }

    public virtual void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
    {
    }

    public virtual void OnAircraftCutLimb(int missionNumber, string shortName, AiAircraft aircraft, AiDamageInitiator initiator, LimbNames limbName)
    {
    }

    public virtual void OnAircraftDamaged(int missionNumber, string shortName, AiAircraft aircraft, AiDamageInitiator initiator, NamedDamageTypes damageType)
    {
    }

    public virtual void OnAircraftKilled(int missionNumber, string shortName, AiAircraft aircraft)
    {
    }

    public virtual void OnAircraftLanded(int missionNumber, string shortName, AiAircraft aircraft)
    {
    }

    public virtual void OnAircraftLimbDamaged(int missionNumber, string shortName, AiAircraft aircraft, AiLimbDamage limbDamage)
    {
    }

    public virtual void OnAircraftTookOff(int missionNumber, string shortName, AiAircraft aircraft)
    {
    }

    public virtual void OnAutopilotOff(AiActor actor, int placeIndex)
    {
    }

    public virtual void OnAutopilotOn(AiActor actor, int placeIndex)
    {
    }

    public virtual void OnBattleInit()
    {
    }

    public virtual void OnBattleStarted()
    {
    }

    public virtual void OnBattleStoped()
    {
    }

    public virtual void OnBombExplosion(string title, double mass, Point3d pos, AiDamageInitiator initiator, int eventArgInt)
    {
    }

    public virtual void OnBuildingKilled(string title, Point3d pos, AiDamageInitiator initiator, int eventArgInt)
    {
    }

    public virtual void OnCarter(AiActor actor, int placeIndex)
    {
    }

    public virtual void OnMissionLoaded(int missionNumber)
    {
    }

    public virtual void OnOrderMissionMenuSelected(Player player, int ID, int menuItemIndex)
    {
    }

    public virtual void OnPersonHealth(AiPerson person, AiDamageInitiator initiator, float deltaHealth)
    {
    }

    public virtual void OnPersonMoved(AiPerson person, AiActor fromCart, int fromPlaceIndex)
    {
    }

    public virtual void OnPersonParachuteFailed(AiPerson person)
    {
    }

    public virtual void OnPersonParachuteLanded(AiPerson person)
    {
    }

    public virtual void OnPlaceEnter(Player player, AiActor actor, int placeIndex)
    {
    }

    public virtual void OnPlaceLeave(Player player, AiActor actor, int placeIndex)
    {
    }

    public virtual void OnPlayerArmy(Player player, int army)
    {
    }

    public virtual void OnPlayerConnected(Player player)
    {
    }

    public virtual void OnPlayerDisconnected(Player player, string diagnostic)
    {
    }

    public virtual void OnSingleBattleSuccess(bool success)
    {
    }

    public virtual void OnStationaryKilled(int missionNumber, GroundStationary _stationary, AiDamageInitiator initiator, int eventArgInt)
    {
    }

    public virtual void OnTickGame()
    {
    }

    public virtual void OnTickReal()
    {
    }

    public virtual void OnTrigger(int missionNumber, string shortName, bool active)
    {
    }

    public virtual void OnUserCreateUserLabel(GPUserLabel ul)
    {
    }

    public virtual void OnUserDeleteUserLabel(GPUserLabel ul)
    {
    }

    public virtual void Timeout(double sec, DoTimeout doTimeout)
    {
        this.Battle.Timeout(sec, doTimeout);
    }

    // Properties
    public ABattle Battle { get; private set; }

    public IGamePlay GamePlay
    {
        get
        {
            return this.Battle.GamePlay;
        }
    }

    public int MissionNumber { get; private set; }

    public int MissionNumberListener { get; protected set; }

    public ITime Time
    {
        get
        {
            return this.Battle.Time;
        }
    }
}

Last edited by FG28_Kodiak; 10-31-2012 at 02:02 PM.
Reply With Quote
  #4  
Old 11-09-2012, 07:22 AM
moggel moggel is offline
Approved Member
 
Join Date: Mar 2011
Posts: 70
Default

Thanks chaps. Everything is clear now. :O)
__________________
Core i7 3930K @ 4.8GHz; 16Gb DDR3 (Vengeance); nVidia GTX580; OS disk: 150Gb 10000rpm; SIM disk: 300Gb 10000rpm; Windows 7 x64 Ultimate
Reply With Quote
  #5  
Old 01-31-2013, 09:21 PM
Punch_145 Punch_145 is offline
Approved Member
 
Join Date: May 2012
Posts: 24
Default

Cant seem to get it to work...........
I have a trigger set for some Dorniers to spawn. The trigger is a air group entering an area and I see the Hud message but no dorniers spawn?

Code:
public override void OnTrigger(int missionNumber, string shortName, bool active)
    {
        base.OnTrigger(missionNumber, shortName, active);

        if ("DoSpawn".Equals(shortName) && active)
        {
            AiAction action = GamePlay.gpGetAction("DoSpawn");

            if (action != null)
            {
                action.Do();
            }
            SendScreenMessageTo(Blue(), "Dorniers request Escort: Boulogne,(H,5) Alt:3500M, 10 mins ! ");
            GamePlay.gpGetTrigger(shortName).Enable = false;

        }
}
Reply With Quote
Reply

Thread Tools
Display Modes

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 05:09 AM.


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