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

Материал из АвиаВики
Перейти к: навигация, поиск
Строка 1: Строка 1:
== 1 ==
+
== Инструменты отладки при работе со скриптами и .dll ==
 
::'''Вопрос:''' ''В случае более-менее сложного скрипта, какие инструменты отладки можно использовать?''
 
::'''Вопрос:''' ''В случае более-менее сложного скрипта, какие инструменты отладки можно использовать?''
 
::'''Ответ:'''
 
::'''Ответ:'''
Строка 16: Строка 16:
 
  using maddox.game.world;
 
  using maddox.game.world;
 
  После код просто копирую в игру. Единственное убираю неймспейс моего проекта. Не самая удобная штука, но писать вполне можно.
 
  После код просто копирую в игру. Единственное убираю неймспейс моего проекта. Не самая удобная штука, но писать вполне можно.
== 2 ==
+
 
 +
== Обозначение групп с номерами 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".
== 3 ==
+
 
 +
== Как отслеживать статики?==
 
::'''Вопрос:''' ''Как отследить статики? Они не являются AiActor (по крайней мере события на них не реагируют - уничтожен, поврежден и т.д.). Ни в Battle, ни в GamePlay методов никаких похожих тоже нет. GamePlay.gpActorByName("StaticName") тоже ничего не дает.  Отследить уничтожение статика(ов) удалось только повесив на них триггер.''
 
::'''Вопрос:''' ''Как отследить статики? Они не являются AiActor (по крайней мере события на них не реагируют - уничтожен, поврежден и т.д.). Ни в Battle, ни в GamePlay методов никаких похожих тоже нет. GamePlay.gpActorByName("StaticName") тоже ничего не дает.  Отследить уничтожение статика(ов) удалось только повесив на них триггер.''
 
::'''Ответ:'''
 
::'''Ответ:'''
 
  Да, статики, это не акторы, у них нет "мозга", и они для красоты стоят, событий не вызывают.
 
  Да, статики, это не акторы, у них нет "мозга", и они для красоты стоят, событий не вызывают.
== 4 ==
+
 
 +
== MissionNumberListener и присвоение номера миссии ==
 
::'''Вопрос:''' ''Что есть поле MissionNumberListener? Пробовал присваивать номер свежезагруженной миссии - вообще всякие события вызывать перестало (в этой миссии).''
 
::'''Вопрос:''' ''Что есть поле MissionNumberListener? Пробовал присваивать номер свежезагруженной миссии - вообще всякие события вызывать перестало (в этой миссии).''
 
::'''Ответ:'''
 
::'''Ответ:'''
 
  Это поле, которое показывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - поле в меньше нуля выставить надо (то есть "-1").
 
  Это поле, которое показывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - поле в меньше нуля выставить надо (то есть "-1").
== 5 ==
+
 
 +
== Как убирать с земли самолеты, которые сели на вынужденную или разбились? ==
 
::'''Вопрос:''' ''Как убирать с земли самолеты, которые сели на вынужденную, разбились не долетев до посадки?''
 
::'''Вопрос:''' ''Как убирать с земли самолеты, которые сели на вынужденную, разбились не долетев до посадки?''
 
::'''Ответ:'''
 
::'''Ответ:'''
Строка 40: Строка 44:
 
         });
 
         });
 
     }
 
     }
== 6 ==
+
Подробнее [[здесь]].
 +
 
 +
== Что такое airport.cpp ==
 
::'''Вопрос:''' ''Если увеличить радиус airport.cpp до 10000, будет ли это убирать обломки с земли/самолеты на вынужденной во всем радиусе действия? Чем грозит такое увеличение радиуса? Каков верхний предел? 50000, 100000 будет работать?''
 
::'''Вопрос:''' ''Если увеличить радиус airport.cpp до 10000, будет ли это убирать обломки с земли/самолеты на вынужденной во всем радиусе действия? Чем грозит такое увеличение радиуса? Каков верхний предел? 50000, 100000 будет работать?''
 
::'''Ответ:'''
 
::'''Ответ:'''
 
  '''naryv''': airport.cpp не убирает самолёты и обломки, он должен машинки к севшим самолётам подвозить, но не уверен что работает, это очень старый скрипт, как реликт скорее всего остался.
 
  '''naryv''': airport.cpp не убирает самолёты и обломки, он должен машинки к севшим самолётам подвозить, но не уверен что работает, это очень старый скрипт, как реликт скорее всего остался.
== 7 ==
+
 
 +
== Отправка сообщений для заданной армии и типа самолета(истребитель/бомбардировщик) ==
 
::'''Вопрос:''' ''Как видоизменить код, чтобы надписи в момент подгрузки под-миссий были разные для синей и для красной стороны, а также для истребителей и бомбардировщиков?''
 
::'''Вопрос:''' ''Как видоизменить код, чтобы надписи в момент подгрузки под-миссий были разные для синей и для красной стороны, а также для истребителей и бомбардировщиков?''
 
::'''Ответ:'''
 
::'''Ответ:'''
Строка 63: Строка 70:
 
         }
 
         }
 
  Подробнее [[Ил-2 Штурмовик: Битва за Британию. Скрипты. Отправка сообщений для заданной армии и типа самолета(истребитель/бомбардировщик)|здесь.]]
 
  Подробнее [[Ил-2 Штурмовик: Битва за Британию. Скрипты. Отправка сообщений для заданной армии и типа самолета(истребитель/бомбардировщик)|здесь.]]
 +
 +
== Имена групп ==
 +
::'''Вопрос:''' ''Имена групп. Проигрывается одна и та же миссия, получаем имя группы (например, убитого самолета)- в одних случаях получается имя как прописано в миссии, в других на том же самом самолете имя группы становится 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();       
 +
        }
  
 
[[Категория:Ил-2 Штурмовик: Битва за Британию. Скрипты]]
 
[[Категория:Ил-2 Штурмовик: Битва за Британию. Скрипты]]

Версия 20:13, 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();         
       }