Ил-2 Штурмовик: Битва за Британию. Скрипты. Удаление самолетов

Материал из АвиаВики
Перейти к: навигация, поиск

Удаление разбившихся или приземлившихся самолетов

Автор: TheEnlightenedFlorist
Ссылка: airwarfare.com
Архив для скачивания: ...
Действие скрипта: удаляет приземлившиеся и разбитые самолеты под управлением AI и игрока. Если игрок имеет AI в своей группе, они также удаляются.

Нам понадобится следующий метод в скрипте:

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 && isAiControlledPlane(aircraft))
           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);
           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); }
               );
       }
   }

Поместите следующий код в метод OnPlaceLeave(). Теперь, если игрок покинет самолет, у него отключится управление и двигатели, а через 300 секунд самолет будет удален. Конечно же он разобьется перед этим.

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

После одного из патчей разработчики сделали так, чтобы севшие или разбившиеся самолеты удалялись без использования скрипта. Это делает следующий блок кода лишним, однако вы все еще можете использовать его для уменьшения времени удаления самолетов. Поместите этот код в методы OnAircraftLanded()и OnAircraftCrashLanded(). "300" - это время в секундах до удаления самолета.

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

Вот как это должно выглядеть все вместе. Методы OnAircraftLanded () и OnAircraftCrashLanded () здесь являются лишними и необязательными.

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

public class Mission : AMission
{
   public override void OnBattleStarted()
   {
       base.OnBattleStarted();

       //listen to events from all missions.
       MissionNumberListener = -1;
   }

   public override void OnPlaceLeave(Player player, AiActor actor, int placeIndex)
   {
       base.OnPlaceLeave(player, actor, placeIndex);
       Timeout(1, () =>
       { damageAiControlledPlane(actor); }
           );
   }

   public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
   {
       base.OnAircraftCrashLanded(missionNumber, shortName, aircraft);
       Timeout(300, () =>
       { destroyPlane(aircraft); }
           );
   }
   public override void OnAircraftLanded(int missionNumber, string shortName, AiAircraft aircraft)
   {
       base.OnAircraftLanded(missionNumber, shortName, aircraft);
       Timeout(300, () =>
       { 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);
           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); }
               );
       }
   }
}