Forum EFG

Escadrille virtuelle

Vous n'êtes pas identifié.

#1 21-03-2014 19:55:04

EFG_Richy
Administrateur

Script despawn

J'ai testé un autre script de despawn qui m'a l'air pas mal.
Avec le script "classique", 30s après avoir tué un pilote joueur ou après qu'il ait sauté en parachute, l'avion est supprimé en plein ciel si le combat était en altitude ou si il volait à peu près droit.
Cela peut poser 2 "problèmes":
- en mission on peut voir disparaitre un appareil en plein vol, surtout si on pourchasse un pilote mort sans le savoir. Idem s'il y a une déconnexion l'avion va continuer à voler jusqu'à disparaître miraculeusement, ça tue l'immersion...
- le kill n'est pas compté si l'avion est supprimé avant son crash, ce qui peut gêner ceux qui lisent les stats en fin de vol.

Avec le script qui suit, si un avion n'est plus piloté par un joueur, il subit certains dégâts qui vont le faire passer sur le dos puis rapidement plonger au sol en un piqué presque vertical, du coup l'appareil va percuter la planète en quelques secondes, avant sa disparition. On peut se dire que le pilote mort appuie sur le manche, au moins l'avion ne continue pas imperturbable.
Si l'appareil est au sol il n'y a rien de particulier il va disparaitre au bout d'une minute.


Code:

public override void OnPlaceLeave(Player player, AiActor actor, int placeIndex)
    {
        base.OnPlaceLeave(player, actor, placeIndex);

        if (actor != null && actor is AiAircraft)
        {
            //check limited aircraft
            switch ((actor as AiAircraft).InternalTypeName())
            {

            }
        }

        Timeout(1, () => { damageAiControlledPlane(actor); } );
    }

    public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
    {
        base.OnActorDead(missionNumber, shortName, actor, damages);
        if (actor != null && actor is AiGroundActor)
            Timeout(300, () => { (actor as AiGroundActor).Destroy(); ; });
    }

    public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
    {
        base.OnAircraftCrashLanded(missionNumber, shortName, aircraft);
        // COLANDER
        //Timeout(120, () => { destroyPlane(aircraft); } );
    }
    public override void OnAircraftLanded(int missionNumber, string shortName, AiAircraft aircraft)
    {
        base.OnAircraftLanded(missionNumber, shortName, aircraft);
        // COLANDER
        //Timeout(120, () => { destroyPlane(aircraft); } );
    }

    private bool isAiControlledPlane(AiAircraft aircraft)
    {
        if (aircraft == null)
            return false;

        //check if a player is in any of the "places"
        for (int i = 0; i < aircraft.Places(); i++)
            if (aircraft.Player(i) != null)
                return false;

        return true;
    }

    private void destroyPlane(AiAircraft aircraft)
    {
        if (aircraft != null)
            aircraft.Destroy();
    }

    private void damageAiControlledPlane(AiActor actorMain)
    {
        foreach (AiActor actor in actorMain.Group().GetItems())
        {
            if (actor == null || !(actor is AiAircraft))
                return;

            AiAircraft aircraft = (actor as AiAircraft);

            if (!isAiControlledPlane(aircraft))
                return;

            if (aircraft == null)
                return;

            aircraft.hitNamed(part.NamedDamageTypes.ControlsElevatorDisabled);
            aircraft.hitNamed(part.NamedDamageTypes.ControlsAileronsDisabled);
            aircraft.hitNamed(part.NamedDamageTypes.ControlsRudderDisabled);
            aircraft.hitNamed(part.NamedDamageTypes.FuelPumpFailure);
            aircraft.hitNamed(part.NamedDamageTypes.Eng0TotalFailure);
            aircraft.hitNamed(part.NamedDamageTypes.ElecPrimaryFailure);
            aircraft.hitNamed(part.NamedDamageTypes.ElecBatteryFailure);

            aircraft.hitLimb(part.LimbNames.WingL1, -0.5);
            aircraft.hitLimb(part.LimbNames.WingL2, -0.5);
            aircraft.hitLimb(part.LimbNames.WingL3, -0.5);
            aircraft.hitLimb(part.LimbNames.WingL4, -0.5);
            aircraft.hitLimb(part.LimbNames.WingL5, -0.5);
            aircraft.hitLimb(part.LimbNames.WingL6, -0.5);
            aircraft.hitLimb(part.LimbNames.WingL7, -0.5);


            int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
            for (int i = 0; i < iNumOfEngines; i++)
            {
                aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
            }


            Timeout(300, () => { destroyPlane(aircraft); });

        }
    }

PS: Pour info, pour écrire des scripts sans prendre trop de place pour la lisibilité du forum, on peut utiliser la balise [ code][/ code] (sans les espaces!)


Les chasseurs font des films, les bombardiers écrivent l'Histoire.

Hors ligne

 

#2 22-03-2014 09:05:16

EFG_Mike_Sky
Administrateur

Re: Script despawn

ok.

Hors ligne

 

Pied de page des forums

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson