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

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

Язык программирования C#

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

C# (произносится си-шарп) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270. Ссылка

MSDN. Официальный ресурс Microsoft

Основным вашим справочником по C# будет MSDN на сайте Microsoft. В вашем распоряжении окажутся видеоуроки, информация по средам разработки, спецификации языков программирования, примеры и т.д. в удобной форме Wiki.

MSDN. Официальный ресурс Microsoft
MSDN. Интерактивный учебник по Visual C#

Руководства и справочники на русскоязычных ресурсах

C# и .NET
Первые шаги
Учебный курс С#
C# для чайников

Настройка среды разработки Visual Studio для работы с библиотеками игры

Замечательное руководство по настройке на английском языке от Kodiak

Подключив библиотеки игры (.dll) вы сможете видеть и использовать все доступные методы. Для этого необходимо подключить библиотеки,которые находятся в папке игры Steam/steamapps/common/il-2 sturmovik cliffs of dover/parts/core .

  • Сначала создадим новый проект C#, в котором будем работать над скриптами. Делается это стандартным образом, например через меню: File >> New >>
  • В созданном проекте находим "Solution Explorer", кликаем в нем правой кнопкой мыши и выбираем в контекстном меню "References", "Add Reference..."
  • Далее выбираем закладку "Browse" и указываем путь к папке core в папке с игрой "Steam/steamapps/common/il-2 sturmovik cliffs of dover/parts/core"
  • Добавляем в проект все файлы с разрешением ".dll" из папки core, некоторые могут выдавать ошибки - просто пропустите их
  • После добавления библиотек кликните правой кнопкой на имени проекта и выберите в меню "Add Existing Item" , далее найдите файл скрипта с которым собираетесь работать и добавьте его в проект. Теперь Visual Studio показывает все доступные методы (также их можно посмотреть через меню View >> Object Browser
Важно: Visual Studio создает копию файла в проекте, поэтому после изменения скрипта необходимо скопировать код в файл скрипта в папке с миссией

Альтернативная бесплатная среда разработки SharpDevelop

Очень удобная, с интерфейсом аналогичным Visual Studio, быстрая и бесплатная среда разработки. Установка и подключение библиотек проводится за пару минут.

SharpDevelop 4.1

Скрипты в игре

Файл скрипта

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

Например:
test.mis - файл миссии
test.cs - файл скрипта миссии

Скрипт ВСЕГДА загружается с миссией, отдельно загрузить скрипт не получится. Поэтому если нужно загрузить только скрипт просто создайте файл миссии без объектов. В начале файла задаем пространство имен. Основные:

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

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

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):

using System;
using maddox.game;
using maddox.game.world;
public class Mission : AMission 
{
   public override void OnBattleStarted()
   {
       base.OnBattleStarted();
       GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/blue01.mis");
       GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/red01.mis");
    }
}

Данный скрипт полностью рабочий, попробуйте запустить его.



Вернуться на страницу "Скрипты"