PDA

Просмотр полной версии : Как реализовывать ("включать") скрипты?



instruktor
12.11.2011, 10:48
Подскажите пожалуйста чайнику, как реализовывать ("включать", устанавливать) скрипты?

podvoxx
12.11.2011, 12:30
Создается файл миссии в редакторе, допустим mission.mis, в этой же папке(это важно!) файл скрипта mission.cs в кодировке UTF-8. Скрипт автоматически запустится при старте миссии. Для редактирования и изменения кодировок желательно использовать этот замечательный текстовый редактор Notepad++ (http://notepad-plus-plus.org/)(в нем также есть подсветка синтаксиса большинства языков программирования)
В папке должно быть так:


mission.mis
mission.cs

Здесь (http://wiki.sukhoi.ru/index.php?title=%D0%98%D0%BB-2_%D0%A8%D1%82%D1%83%D1%80%D0%BC%D0%BE%D0%B2%D0%B8%D0%BA:_%D0%91%D0%B8%D1%82%D0%B2%D0%B0_%D0%B7%D0%B0_%D0%91%D1%80%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D1%8E._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B) есть обрывочные сведения которые удалось собрать.

Если в файле mission.cs разместить такой код:



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");
}
}


То можно запустить скрипт из любого места в папке missions в Моих документах, только с ним также должен быть одноименный файл .mis, к которому мы указываем путь.

golloper
02.12.2011, 13:16
Из вышеописанного ,возникает следующий вопрос. А если скриптов два или три или десять? то как их загружать,запускать? Делать одинаковые миссии с разными скриптами и по очереди их запускать? Или же,можно как то прописать нужные скрипты в .cmd?
Не все так шарят в этом деле,как некоторые тут собравшиеся. А если кто ни будь напишет маленький мануальчик хотя бы по основным вопросам,то многие,такие как я будут вам безмерно благодарны!:beer:

Small_Bee
02.12.2011, 13:44
Из вышеописанного ,возникает следующий вопрос. А если скриптов два или три или десять? то как их загружать,запускать? Делать одинаковые миссии с разными скриптами и по очереди их запускать? Или же,можно как то прописать нужные скрипты в .cmd?
Не все так шарят в этом деле,как некоторые тут собравшиеся. А если кто ни будь напишет маленький мануальчик хотя бы по основным вопросам,то многие,такие как я будут вам безмерно благодарны!:beer:

Построено это все дело, если вкратце, следующим образом.

1. Есть битва, есть миссии в пределах этой битвы. Битва всегда начинается с какой-то первой миссии, к ней уже погоняло прилепилось - хост-миссия. Когда вы запускаете выделенный сервер, как раз ее перед стартом битвы и загружаете. Если запускаете обычный сервер или сингл, та миссия, которую вы выбираете, и будет хостом, первой миссией в битве.

2. К каждой миссии может прилепится скрипт, с одноименным названием. Например миссия za_spichkami.mis и к ней идет скрипт za_spichkami.сs.

2а. Скрипт представляет собой обычное определение класса. Класс должен быть публичным и наследоваться от абстрактного класса maddox.game.AMission или от maddox.game.campaign.AMission в случае если это миссия статической кампании. Имя класса помещается в глобальное пространство имен сборки (т.е. никаких namespace {...} быть не должно).

Примерно так


using maddox.game;

public class Mission: AMission
{
// здесь переопределяем методы базового класса, пишем свою логику и прочее;
}


3. При загрузке новой миссии в битву игра добавляет на карту все объекты, которые находятся в файле, и добавляет к их именам префикс с номером миссии (новой миссии назначается след. порядковый номер, у хоста он будет 0, у последующих 1, 2, 3 и т.д.). Получается примерно так - у стат. арты c именем Static1 в миссии, которая загрузилась, скажем, под номером 5, будет имя 5:Static1. Первое имя называется коротким (shortName) второе - полным. Если у миссии есть скрипт, игра создает новый экземпляр класса Mission, описанный в скрипте, и помещает его в коллекцию missions (вроде так называется). Перед этим файл скрипта компилится в сборку, сборка помещается в папку кеша (найти можно в папке пользователя), сборка загружается оттуда же.

4. При возникновении какого либо события в пределах какой-то миссии, игра перебирает коллекцию с миссиями и вызывает соответствующий метод соответствующей миссии, если номер миссии и номер миссии, "вызвавшей" событие, совпадают. Например, помер кто-то с именем, в котором префикс есть цифрой 10 (помним, при загрузке новой миссии игра назначает номера автоматом), игра вызывает OnActorDead(...) в миссии номер 10. Большинство методов в параметрах предоставляют и номер миссии, и короткое имя актора, к которому событие относится. Каждая миссия содержит свойство MissionNumberListener, которое указывает, события в какой именно миссии ее интересуют. Т.е. переопределив это свойство, мы сможем заставить миссию получать неродные события (например миссия 10 сможет слушать события с номером 9). Если мы установим это свойство в -1, миссия будет получать все события независимо от номера. Важно: некоторые методы (OnMissionLoaded, OnGameTick...) вызываются в каждой миссии, вне зависимости от ее номера.

Вот так вот вкратце это и работает. Переопределяя методы AMission в своем классе Mission мы пишем собственную обработку возникающих событий в битве. Таких миссий может быть сколько угодно. Изучаем доступные нам методы (в этом разделе и на wiki есть). Или же с помощью Visual Studio подключаем сборки из папки игры и получаем исчерпывающую информацию о доступных нам классах, интерфейсах и их свойствах и методах.

golloper
02.12.2011, 14:03
Спасибо,вполне понятно:thx: