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

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

Основные понятия

Скрипты для "Ил-2 Штурмовик: Битва за Британию." пишутся на языке программирования C# с использованием подходящих для этого языка редакторов кода - можно пользоваться даже стандартным блокнотом, однако если подойти к вопросу серьезнее, то нужно скачать бесплатную версию Visual Studio 2010 Express. Дополнительно для работы можно использовать Notepad++, который подходит для быстрой правки и просмотра кода.

Файл скрипта

Скрипт представляет собой файл с разрешением .cs. Название скрипта совпадает с названием миссии, вместе с которой он вызывается.

Например:
test.mis
test.cs

В начале файла задаем пространство имен. Основное:

using System;
using maddox.game;
using maddox.game.world;

Дополнительно, если требуется:

using maddox.GP;
using System.Collections.Generic;
using System.Collections;

Далее идет класс, в котором переопределяем нужные нам методы

public class Mission : AMission 
{
}

Скелет скрипта будет выглядеть так:

using System;
using maddox.game;
using maddox.game.world;
public class Mission : AMission 
{
}

Выполнение скрипта

Миссии и подмиссии

Надо сильно забыть концепцию миссии из ила, т.к. тут как таковой миссии (с точки зрения Ила) не существует. Есть "битва", а в ее рамках выполняются различные миссии. Миссия вообще умеет может загружать сама себя. Технически это конечно не так, но выглядит именно так. Т.е. из миссии мы приказываем через GamePlay.gpPostMissionLoad() загрузить в битву еще одну миссию, а что это за миссия - не важно. Каждая миссия загружается под новым номером. Скажем есть одна миссия-хост (так сказать, "точка входа"). По OnBattleStarted() она загружает стартовый набор миссий (скажем одна - красные танки, вторая синие танки, едут навстречу). И в каждой из этих миссий отслеживается OnActorDead(). Если была уничтожена группа (она одна все равно), миссия загружает себя снова, сразу или по таймеру. Если помер танчик, то через несколько секунд убираем его трупик через Destroy(), что бы не мешался. Получается "бесконечная" стенка-на-стенку.

Рекомендации. Если вы создаете миссию, которая многократно загружает саму себя

Необходимо, что бы при повторной загрузке подмиссии удалять объекты, которые породила предыдущая загрузка. На OnActorDead полагаться полностью нельзя. Тогда не будет бардака с кучей мусора тут и там. Самый простой вариант - миссия контролирует сама себя:

  1. Миссия "слушает" только себя.
  2. Загружает эта миссия тоже, сама себя. Исключение - только первая загрузка из миссии-хоста.
  3. Перед загрузкой самой себя прибивает все старые свои объекты.
  4. Не рожает больше никаких объектов(типа старта скриптом и т.д.) и не загружает больше никаких миссий, кроме таких же по поведению.

В таком варианте не будет мусора, но и работать миссия будет сугубо автономно, на собственной логике.

Смысл подмиссии слушать только себя в том, что бы:

  1. Убирать трупики только за собой - по ActorDead. Мало-ли, может время уборки надо разное поставить. Или трупик из другой миссии убирать не надо, например.
  2. По ActorCreated (или что там) запомнить без лишних телодвижений только свои объекты куда ни будь в коллекцию. Что бы после не шерстить всю немерянную толпу акторов при уборке, выбирая своих. Если акторов в миссии немного, можно вообще его руками прописать, найти по имени после загрузки и сохранить в приватном поле - что бы прибить после, опять же (в кампаниях стартовых такой похожий подход можно найти).

Можно конечно, слушать всех, но тогда и фильтровать все сообщения надо будет, и плюс лишняя нагрузка, никому не нужная в общем случае. Смысл того что миссия должна грузить сама себя - она прекрасно знает, кого нарожала (номер миссии есть - своих найти не проблема), и соответственно, прибраться не проблема перед загрузкой повторной.

Хост может слушать миссии, может не слушать - как хочет, если ему надо, пусть слушает. Например, что бы представлять, что вообще в мире происходит.

Недостаток такого подхода, повторюсь - если такую миссию загрузишь, она уйдет в свободное плаванье и начхать ей на хост. Можно конечно организовать сообщение (типа замаппить файл на общий доступ и т.д.) но это уже дебри.

Как запустить подмиссию

Запуск подмиссии осуществляется через GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/ххх.mis")(путь может быть другой). Есть несколько вариантов:

Метод public override void OnBattleStarted()

Позволяет при старте основной миссии-хоста загрузить одну и более подмиссий(в примере blue01.mis и red01.mis):

public override void OnBattleStarted()
   {
       base.OnBattleStarted();
       GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/blue01.mis");
       GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/red01.mis");
    }

[на страницу "Скрипты"]