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