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

Материал из АвиаВики
Перейти к: навигация, поиск
Строка 2: Строка 2:
 
::'''Вопрос:''' ''В случае более-менее сложного скрипта, какие инструменты отладки можно использовать?''
 
::'''Вопрос:''' ''В случае более-менее сложного скрипта, какие инструменты отладки можно использовать?''
 
::'''Ответ:'''
 
::'''Ответ:'''
К сожалению, похоже, что кроме собственной головы - никаких. Если кто найдет обратное, буду очень признателен.
+
::К сожалению, похоже, что кроме собственной головы - никаких. Если кто найдет обратное, буду очень признателен.
Почти наверняка влияет вот эта строчка - //-$debug, но я с ней пока не экспериментировал.
+
::Почти наверняка влияет вот эта строчка - //-$debug, но я с ней пока не экспериментировал.
Я делаю так - запускаю студию, новый проект любой C#. Прилинковал к проекту:
+
::Я делаю так - запускаю студию, новый проект любой C#. Прилинковал к проекту:
 
  ...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\part.dll
 
  ...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\part.dll
 
  ...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\maddox.dll
 
  ...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\maddox.dll
Строка 10: Строка 10:
 
  ...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\gamePlay.dll
 
  ...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\gamePlay.dll
 
  ...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\bob\Campaign.dll
 
  ...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\bob\Campaign.dll
Подозреваю, что не все эти сборки необходимы, но особо туда не лез, пусть будут. Последняя же нужна только для миссий из кампании.
+
::Подозреваю, что не все эти сборки необходимы, но особо туда не лез, пусть будут. Последняя же нужна только для миссий из кампании.
Создал класс, в using прописал необходимый минимум
+
::Создал класс, в using прописал необходимый минимум
 
  using System;
 
  using System;
 
  using maddox.game;
 
  using maddox.game;
 
  using maddox.game.world;
 
  using maddox.game.world;
После код просто копирую в игру. Единственное убираю неймспейс моего проекта. Не самая удобная штука, но писать вполне можно.
+
::После код просто копирую в игру. Единственное убираю неймспейс моего проекта. Не самая удобная штука, но писать вполне можно.
  
 
== Обозначение групп с номерами I и V==
 
== Обозначение групп с номерами I и V==
 
::'''Вопрос:''' ''Как определить, имеется ли самолет какой-либо группы в данный момент или нет? У немцев названия группы содержат знаки (|, ||, |||, |V, V, V|) и так далее. Но, при написании скрипта игра подобные знаки игнорирует. С англичанами проблем нет, у них обозначения цифровые, например 218Sqn. А вот у немцев обозначения типа JG51_| и игра их не видит''
 
::'''Вопрос:''' ''Как определить, имеется ли самолет какой-либо группы в данный момент или нет? У немцев названия группы содержат знаки (|, ||, |||, |V, V, V|) и так далее. Но, при написании скрипта игра подобные знаки игнорирует. С англичанами проблем нет, у них обозначения цифровые, например 218Sqn. А вот у немцев обозначения типа JG51_| и игра их не видит''
 
::'''Ответ:'''
 
::'''Ответ:'''
Пример из игры -"BoB_LW_JG53_I"
+
::Пример из игры -"BoB_LW_JG53_I"
1 - латинская буква "I", 5 -латинская "V".
+
::1 - латинская буква "I", 5 -латинская "V".
  
 
== Как отслеживать статики?==
 
== Как отслеживать статики?==
 
::'''Вопрос:''' ''Как отследить статики? Они не являются AiActor (по крайней мере события на них не реагируют - уничтожен, поврежден и т.д.). Ни в Battle, ни в GamePlay методов никаких похожих тоже нет. GamePlay.gpActorByName("StaticName") тоже ничего не дает.  Отследить уничтожение статика(ов) удалось только повесив на них триггер.''
 
::'''Вопрос:''' ''Как отследить статики? Они не являются AiActor (по крайней мере события на них не реагируют - уничтожен, поврежден и т.д.). Ни в Battle, ни в GamePlay методов никаких похожих тоже нет. GamePlay.gpActorByName("StaticName") тоже ничего не дает.  Отследить уничтожение статика(ов) удалось только повесив на них триггер.''
 
::'''Ответ:'''
 
::'''Ответ:'''
Да, статики, это не акторы, у них нет "мозга", и они для красоты стоят, событий не вызывают.
+
::Да, статики, это не акторы, у них нет "мозга", и они для красоты стоят, событий не вызывают.
  
 
== MissionNumberListener и присвоение номера миссии ==
 
== MissionNumberListener и присвоение номера миссии ==
 
::'''Вопрос:''' ''Что есть поле MissionNumberListener? Пробовал присваивать номер свежезагруженной миссии - вообще всякие события вызывать перестало (в этой миссии).''
 
::'''Вопрос:''' ''Что есть поле MissionNumberListener? Пробовал присваивать номер свежезагруженной миссии - вообще всякие события вызывать перестало (в этой миссии).''
 
::'''Ответ:'''
 
::'''Ответ:'''
Это поле, которое показывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - поле в меньше нуля выставить надо (то есть "-1").
+
::Это поле, которое показывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - поле в меньше нуля выставить надо (то есть "-1").
  
 
== Как убирать с земли самолеты, которые сели на вынужденную или разбились? ==
 
== Как убирать с земли самолеты, которые сели на вынужденную или разбились? ==
Строка 49: Строка 49:
 
::'''Вопрос:''' ''Если увеличить радиус airport.cpp до 10000, будет ли это убирать обломки с земли/самолеты на вынужденной во всем радиусе действия? Чем грозит такое увеличение радиуса? Каков верхний предел? 50000, 100000 будет работать?''
 
::'''Вопрос:''' ''Если увеличить радиус airport.cpp до 10000, будет ли это убирать обломки с земли/самолеты на вынужденной во всем радиусе действия? Чем грозит такое увеличение радиуса? Каков верхний предел? 50000, 100000 будет работать?''
 
::'''Ответ:'''
 
::'''Ответ:'''
'''naryv''': airport.cpp не убирает самолёты и обломки, он должен машинки к севшим самолётам подвозить, но не уверен что работает, это очень старый скрипт, как реликт скорее всего остался.
+
::'''naryv''': airport.cpp не убирает самолёты и обломки, он должен машинки к севшим самолётам подвозить, но не уверен что работает, это очень старый скрипт, как реликт скорее всего остался.
  
 
== Отправка сообщений для заданной армии и типа самолета(истребитель/бомбардировщик) ==
 
== Отправка сообщений для заданной армии и типа самолета(истребитель/бомбардировщик) ==
 
::'''Вопрос:''' ''Как видоизменить код, чтобы надписи в момент подгрузки под-миссий были разные для синей и для красной стороны, а также для истребителей и бомбардировщиков?''
 
::'''Вопрос:''' ''Как видоизменить код, чтобы надписи в момент подгрузки под-миссий были разные для синей и для красной стороны, а также для истребителей и бомбардировщиков?''
 
::'''Ответ:'''
 
::'''Ответ:'''
Определить армию игрока и выдавать ему соответствующее сообщение:
+
::Определить армию игрока и выдавать ему соответствующее сообщение:
  
 
  if (aircraft != null)
 
  if (aircraft != null)
Строка 75: Строка 75:
 
::'''Вопрос:''' ''Имена групп. Проигрывается одна и та же миссия, получаем имя группы (например, убитого самолета)- в одних случаях получается имя как прописано в миссии, в других на том же самом самолете имя группы становится NoName. Игрок всегда определяется правильно. Запустить группу по '''action.Do()''' тоже получается как-то загадочно. В одной и той же миссии, не трогая ни саму миссию, ни скрипта, то стартует, то не стартует. Гарантированно лечится заходом в полный редактор, переназначением имени группы и переназначением стартуемой группы в действиях.''
 
::'''Вопрос:''' ''Имена групп. Проигрывается одна и та же миссия, получаем имя группы (например, убитого самолета)- в одних случаях получается имя как прописано в миссии, в других на том же самом самолете имя группы становится NoName. Игрок всегда определяется правильно. Запустить группу по '''action.Do()''' тоже получается как-то загадочно. В одной и той же миссии, не трогая ни саму миссию, ни скрипта, то стартует, то не стартует. Гарантированно лечится заходом в полный редактор, переназначением имени группы и переназначением стартуемой группы в действиях.''
 
::'''Ответ:'''
 
::'''Ответ:'''
Группа, которая стартует скриптом (с помощью действия, скажем), по сути относится уже к другой миссии. Попробуйте во-первых, назначить переменной MissionNumberListener значение -1, примерно вот так:
+
::Группа, которая стартует скриптом (с помощью действия, скажем), по сути относится уже к другой миссии. Попробуйте во-первых, назначить переменной MissionNumberListener значение -1, примерно вот так:
  
 
  public override void OnBattleStarted()
 
  public override void OnBattleStarted()
Строка 82: Строка 82:
 
     MissionNumberListener = -1;
 
     MissionNumberListener = -1;
 
  }
 
  }
Во-вторых, имя группы состоит из собственно имени группы и префикса "принадлежности к миссии" (номер миссии с двоеточием). Получить правильно полное имя группы (например для использования в '''GamePlay.gpActorByName()''') можно примерно вот так:
+
::Во-вторых, имя группы состоит из собственно имени группы и префикса "принадлежности к миссии" (номер миссии с двоеточием). Получить правильно полное имя группы (например для использования в '''GamePlay.gpActorByName()''') можно примерно вот так:
 
  public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
 
  public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
 
  {
 
  {
Строка 88: Строка 88:
 
     string fullName = ActorName.Full(missionNumber, shortName);
 
     string fullName = ActorName.Full(missionNumber, shortName);
 
  }
 
  }
В любом событии, относящемся к акторам, в первых двух параметрах передаются собственно номер миссии, где произошло событие, и короткое имя актора (как указано в файле миссии). Из двух этих параметров мы и получаем полное имя актора.
+
::В любом событии, относящемся к акторам, в первых двух параметрах передаются собственно номер миссии, где произошло событие, и короткое имя актора (как указано в файле миссии). Из двух этих параметров мы и получаем полное имя актора.
  
 
== Удаление спауна группы (BirthPlaces)==
 
== Удаление спауна группы (BirthPlaces)==
 
::'''Вопрос:''' ''Как средствами редактора удалить старый спаун? Он же уже подгружен в миссию, нужен инструмент, чтобы его удалить.''
 
::'''Вопрос:''' ''Как средствами редактора удалить старый спаун? Он же уже подгружен в миссию, нужен инструмент, чтобы его удалить.''
 
::'''Ответ:'''
 
::'''Ответ:'''
Средствами редактора это невозможно, скриптом так:
+
::Средствами редактора это невозможно, скриптом так:
  
 
  foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces())
 
  foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces())
Строка 104: Строка 104:
 
::'''Вопрос:''' ''Как во время миссии пересадить игрока в другой самолет?''
 
::'''Вопрос:''' ''Как во время миссии пересадить игрока в другой самолет?''
 
::'''Ответ:'''
 
::'''Ответ:'''
    Находим группу, в цикле перебираем самолеты группы и сажаем игрока в первый же самолет, где есть кабина пилота.
+
::Находим группу, в цикле перебираем самолеты группы и сажаем игрока в первый же самолет, где есть кабина пилота.
  
 
     AiActor actor = GamePlay.gpActorByName(ActorName.Full(MissionNumber, "BoB_LW_LG2_I.01"));
 
     AiActor actor = GamePlay.gpActorByName(ActorName.Full(MissionNumber, "BoB_LW_LG2_I.01"));
Строка 132: Строка 132:
 
::'''Вопрос:''' ''Как во время миссии пересадить игрока в другой самолет?''
 
::'''Вопрос:''' ''Как во время миссии пересадить игрока в другой самолет?''
 
::'''Ответ:'''
 
::'''Ответ:'''
Периодические загрузки миссии без использования '''TickCounter()''' осуществляются через '''MissionLoader''':
+
::Периодические загрузки миссии без использования '''TickCounter()''' осуществляются через '''MissionLoader''':
  
 
  //Runs once, when mission is loaded
 
  //Runs once, when mission is loaded
Строка 156: Строка 156:
 
::'''Вопрос:''' ''Как можно настраивать GamePlay.gpHUDLogCenter , чтобы писать мельче, другим цветом (ярко-синим, например) и внизу экрана. Как можно возврат каретки / перенос вставить, менять длительность показа?''
 
::'''Вопрос:''' ''Как можно настраивать GamePlay.gpHUDLogCenter , чтобы писать мельче, другим цветом (ярко-синим, например) и внизу экрана. Как можно возврат каретки / перенос вставить, менять длительность показа?''
 
::'''Ответ:'''
 
::'''Ответ:'''
'''GamePlay.gpHUDLogCenter("",123)''' ,где 123 - длительность отображения надписи. Также можно показывать сообщение определённым игрокам, по остальным вопросам - пока никак, возможно позже добавится более широкое управление.
+
::'''GamePlay.gpHUDLogCenter("",123)''' ,где 123 - длительность отображения надписи. Также можно показывать сообщение определённым игрокам, по остальным вопросам - пока никак, возможно позже добавится более широкое управление.
 
   
 
   
 
== Относятся ли корабли к AiGroundActor? ==
 
== Относятся ли корабли к AiGroundActor? ==
 
::'''Вопрос:''' ''Относятся ли корабли к AiGroundActor?''
 
::'''Вопрос:''' ''Относятся ли корабли к AiGroundActor?''
 
::'''Ответ:'''
 
::'''Ответ:'''
Да, корабль - это AiGroundActor и AiGroundGroup ,с типом Ship , всех кораблей страны найти можно так :
+
::Да, корабль - это AiGroundActor и AiGroundGroup ,с типом Ship , всех кораблей страны найти можно так:
  
 
  foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
 
  foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
Строка 175: Строка 175:
 
::'''Вопрос:''' ''Сейчас логи идут по принципу намемка=самолёт. Т.е если скажем ПВО убило самолёт - это документируется в логах сервера. Но вот обратный процесс, штурмовка и бомбежка никак не видны. Кроме того нет логов "наземка=наземка", т.е никаких данных по скажем уничтожению танками топливохранилищь на уровне логов сервера нет?''
 
::'''Вопрос:''' ''Сейчас логи идут по принципу намемка=самолёт. Т.е если скажем ПВО убило самолёт - это документируется в логах сервера. Но вот обратный процесс, штурмовка и бомбежка никак не видны. Кроме того нет логов "наземка=наземка", т.е никаких данных по скажем уничтожению танками топливохранилищь на уровне логов сервера нет?''
 
::'''Ответ:'''
 
::'''Ответ:'''
Это сейчас уже можно, например в скрипте миссии:
+
::Это сейчас уже можно, например в скрипте миссии:
 
   
 
   
 
  public override void OnActorDead(int missionNumber, string shortName, AiActor actor, System.Collections.Generic.List<DamagerScore> damages)
 
  public override void OnActorDead(int missionNumber, string shortName, AiActor actor, System.Collections.Generic.List<DamagerScore> damages)
Строка 183: Строка 183:
 
     }
 
     }
  
 
+
== Как открыть подмиссию, чтобы в ней отображались все объекты? ==
 +
::'''Вопрос:''' ''При открытии подмиссий в полном редакторе не появляются ни танки, ни самолеты, ни точки маршрута (открывается чистая карта), хотя в тексте миссии они есть, если открыть ее блокнотом. Почему это происходит?''
 +
::'''Ответ:'''
 +
::Секция с описанием карты, времени и пр. начальных условий миссии не нужна в подмиссии - ведь она загружается к уже запущенной миссии - поэтому такую секцию я удалил - так подмиссия чуть-чуть, но быстрее грузится. Если надо в редакторе открыть - можно просто из основной эту секцию скопировать в файл подмиссии :
 +
[PARTS]
 +
  core.100
 +
  bob.100
 +
  [MAIN]
 +
  MAP Land$Online_Cross_v_Roundel
 +
  BattleArea 6000 6000 26000 26000 1000
 +
  TIME 16
 +
  WeatherIndex 0
 +
  CloudsHeight 1000
 +
  BreezeActivity 10
 +
  ThermalActivity 10
  
  

Версия 21:25, 3 октября 2011

Инструменты отладки при работе со скриптами и .dll

Вопрос: В случае более-менее сложного скрипта, какие инструменты отладки можно использовать?
Ответ:
К сожалению, похоже, что кроме собственной головы - никаких. Если кто найдет обратное, буду очень признателен.
Почти наверняка влияет вот эта строчка - //-$debug, но я с ней пока не экспериментировал.
Я делаю так - запускаю студию, новый проект любой C#. Прилинковал к проекту:
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\part.dll
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\maddox.dll
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\gameWorld.dll
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\core\gamePlay.dll
...\Steam\SteamApps\common\il-2 sturmovik cliffs of dover\parts\bob\Campaign.dll
Подозреваю, что не все эти сборки необходимы, но особо туда не лез, пусть будут. Последняя же нужна только для миссий из кампании.
Создал класс, в using прописал необходимый минимум
using System;
using maddox.game;
using maddox.game.world;
После код просто копирую в игру. Единственное убираю неймспейс моего проекта. Не самая удобная штука, но писать вполне можно.

Обозначение групп с номерами I и V

Вопрос: Как определить, имеется ли самолет какой-либо группы в данный момент или нет? У немцев названия группы содержат знаки (|, ||, |||, |V, V, V|) и так далее. Но, при написании скрипта игра подобные знаки игнорирует. С англичанами проблем нет, у них обозначения цифровые, например 218Sqn. А вот у немцев обозначения типа JG51_| и игра их не видит
Ответ:
Пример из игры -"BoB_LW_JG53_I"
1 - латинская буква "I", 5 -латинская "V".

Как отслеживать статики?

Вопрос: Как отследить статики? Они не являются AiActor (по крайней мере события на них не реагируют - уничтожен, поврежден и т.д.). Ни в Battle, ни в GamePlay методов никаких похожих тоже нет. GamePlay.gpActorByName("StaticName") тоже ничего не дает. Отследить уничтожение статика(ов) удалось только повесив на них триггер.
Ответ:
Да, статики, это не акторы, у них нет "мозга", и они для красоты стоят, событий не вызывают.

MissionNumberListener и присвоение номера миссии

Вопрос: Что есть поле MissionNumberListener? Пробовал присваивать номер свежезагруженной миссии - вообще всякие события вызывать перестало (в этой миссии).
Ответ:
Это поле, которое показывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - поле в меньше нуля выставить надо (то есть "-1").

Как убирать с земли самолеты, которые сели на вынужденную или разбились?

Вопрос: Как убирать с земли самолеты, которые сели на вынужденную, разбились не долетев до посадки?
Ответ:
public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
   {
       base.OnAircraftCrashLanded(missionNumber, shortName, aircraft);
       Timeout(5, () =>
       {
           aircraft.Destroy();
       });
   }
Подробнее здесь. 

Что такое airport.cpp

Вопрос: Если увеличить радиус airport.cpp до 10000, будет ли это убирать обломки с земли/самолеты на вынужденной во всем радиусе действия? Чем грозит такое увеличение радиуса? Каков верхний предел? 50000, 100000 будет работать?
Ответ:
naryv: airport.cpp не убирает самолёты и обломки, он должен машинки к севшим самолётам подвозить, но не уверен что работает, это очень старый скрипт, как реликт скорее всего остался.

Отправка сообщений для заданной армии и типа самолета(истребитель/бомбардировщик)

Вопрос: Как видоизменить код, чтобы надписи в момент подгрузки под-миссий были разные для синей и для красной стороны, а также для истребителей и бомбардировщиков?
Ответ:
Определить армию игрока и выдавать ему соответствующее сообщение:
if (aircraft != null)
       switch (aircraft.Army())
       {                
           case 1:
               if (aircraft.Type() == AircraftType.Bomber)
               { GamePlay.gpHUDLogCenter(new Player[] {player},"Red Bomber, Bomb it all, hitler caput"); }
               else { GamePlay.gpHUDLogCenter(new Player[] { player }, "Red Fighter, fight them all"); }
               break;
           case 2:
               if (aircraft.Type() == AircraftType.Bomber)
               { GamePlay.gpHUDLogCenter(new Player[] { player }, "Das bomber!"); }
               else { GamePlay.gpHUDLogCenter(new Player[] { player }, "Das jager!"); }
               break;
       }
Подробнее здесь.

Имена групп

Вопрос: Имена групп. Проигрывается одна и та же миссия, получаем имя группы (например, убитого самолета)- в одних случаях получается имя как прописано в миссии, в других на том же самом самолете имя группы становится NoName. Игрок всегда определяется правильно. Запустить группу по action.Do() тоже получается как-то загадочно. В одной и той же миссии, не трогая ни саму миссию, ни скрипта, то стартует, то не стартует. Гарантированно лечится заходом в полный редактор, переназначением имени группы и переназначением стартуемой группы в действиях.
Ответ:
Группа, которая стартует скриптом (с помощью действия, скажем), по сути относится уже к другой миссии. Попробуйте во-первых, назначить переменной MissionNumberListener значение -1, примерно вот так:
public override void OnBattleStarted()
{
    base.OnBattleStarted();
    MissionNumberListener = -1;
}
Во-вторых, имя группы состоит из собственно имени группы и префикса "принадлежности к миссии" (номер миссии с двоеточием). Получить правильно полное имя группы (например для использования в GamePlay.gpActorByName()) можно примерно вот так:
public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
   base.OnActorCreated(missionNumber, shortName, actor);
   string fullName = ActorName.Full(missionNumber, shortName);
}
В любом событии, относящемся к акторам, в первых двух параметрах передаются собственно номер миссии, где произошло событие, и короткое имя актора (как указано в файле миссии). Из двух этих параметров мы и получаем полное имя актора.

Удаление спауна группы (BirthPlaces)

Вопрос: Как средствами редактора удалить старый спаун? Он же уже подгружен в миссию, нужен инструмент, чтобы его удалить.
Ответ:
Средствами редактора это невозможно, скриптом так:
foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces())
       {
           if (bp != null)
               bp.destroy();         
       }

Как во время миссии пересадить игрока в другой самолет?

Вопрос: Как во время миссии пересадить игрока в другой самолет?
Ответ:
Находим группу, в цикле перебираем самолеты группы и сажаем игрока в первый же самолет, где есть кабина пилота.
   AiActor actor = GamePlay.gpActorByName(ActorName.Full(MissionNumber, "BoB_LW_LG2_I.01"));
           if (actor is AiAirGroup && GamePlay.gpPlayer() != null)
           {
               Player player = GamePlay.gpPlayer();
               foreach (AiAircraft airc in (actor as AiAirGroup).GetItems())
               {
                   bool isFound = false;
                   for (int i = 0; i < airc.Places(); i++)
                   {
                       if (airc.ExistCabin(i))
                       {
                           if (airc.CrewFunctionPlace(i).Equals(CrewFunction.Pilot))
                           {
                               player.PlaceEnter(airc, i);
                               isFound = true;
                               break;
                           }
                       }
                   }
                   if (isFound) break;
               }
           }

Как задать периодические загрузки миссии без использования TickCounter()?

Вопрос: Как во время миссии пересадить игрока в другой самолет?
Ответ:
Периодические загрузки миссии без использования TickCounter() осуществляются через MissionLoader:
//Runs once, when mission is loaded
public override void Init(maddox.game.ABattle battle, int missionNumber)
{
base.Init(battle,missionNumber);
//Planned missions
MissionLoader(30,10,"missions/Multi/Dogfight/bombers1.mis");  // 10s from main mission start and repeatedly every 30s
MissionLoader(100,60,"missions/Multi/Dogfight/bombers2.mis"); // 60s from main mission start and repeatedly every 100s
}
public void MissionLoader(int period, int offset, string mission)
{
    if (offset > 0)
    Timeout(offset, () => {MissionLoader(period,0,mission);});
    else
    {
    GamePlay.gpPostMissionLoad(mission);
    Timeout(period, () => {MissionLoader(period,0,mission);});
    }
}

Какие параметры у GamePlay.gpHUDLogCenter?

Вопрос: Как можно настраивать GamePlay.gpHUDLogCenter , чтобы писать мельче, другим цветом (ярко-синим, например) и внизу экрана. Как можно возврат каретки / перенос вставить, менять длительность показа?
Ответ:
GamePlay.gpHUDLogCenter("",123) ,где 123 - длительность отображения надписи. Также можно показывать сообщение определённым игрокам, по остальным вопросам - пока никак, возможно позже добавится более широкое управление.

Относятся ли корабли к AiGroundActor?

Вопрос: Относятся ли корабли к AiGroundActor?
Ответ:
Да, корабль - это AiGroundActor и AiGroundGroup ,с типом Ship , всех кораблей страны найти можно так:
foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
{
if (gg.Type == AiGroundGroupType.Ship)
   {// тут делаем с ними что нам нужно, например
        if (gg != null)
        (gg as AiGroundActor).Destroy();  // уничтожаем
   }
}

Как передать в лог сервера сообщения об уничтоженных объектах?

Вопрос: Сейчас логи идут по принципу намемка=самолёт. Т.е если скажем ПВО убило самолёт - это документируется в логах сервера. Но вот обратный процесс, штурмовка и бомбежка никак не видны. Кроме того нет логов "наземка=наземка", т.е никаких данных по скажем уничтожению танками топливохранилищь на уровне логов сервера нет?
Ответ:
Это сейчас уже можно, например в скрипте миссии:
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, System.Collections.Generic.List<DamagerScore> damages)
   {
       base.OnActorDead(missionNumber, shortName, actor, damages);        
       GamePlay.gpLogServer(null, "{0} actor dead, 1st killer is {1} ", new object[] { actor.Name(),damages[0].initiator.Actor.Name()});
   }

Как открыть подмиссию, чтобы в ней отображались все объекты?

Вопрос: При открытии подмиссий в полном редакторе не появляются ни танки, ни самолеты, ни точки маршрута (открывается чистая карта), хотя в тексте миссии они есть, если открыть ее блокнотом. Почему это происходит?
Ответ:
Секция с описанием карты, времени и пр. начальных условий миссии не нужна в подмиссии - ведь она загружается к уже запущенной миссии - поэтому такую секцию я удалил - так подмиссия чуть-чуть, но быстрее грузится. Если надо в редакторе открыть - можно просто из основной эту секцию скопировать в файл подмиссии :
[PARTS]
 core.100
 bob.100
 [MAIN]
 MAP Land$Online_Cross_v_Roundel
 BattleArea 6000 6000 26000 26000 1000
 TIME 16
 WeatherIndex 0
 CloudsHeight 1000
 BreezeActivity 10
 ThermalActivity 10