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

Материал из АвиаВики
Перейти к: навигация, поиск
(Загрузка подмиссий (автор FG28_Kodiak))
 
(не показано 25 промежуточных версии ещё одного участника)
Строка 1: Строка 1:
 
:'''Автор:''' FG28_Kodiak
 
:'''Автор:''' FG28_Kodiak
 
:'''Ссылка:''' [http://translate.google.com/translate?hl=en&sl=de&tl=en&u=http%3A%2F%2Fforum.sturmovik.de%2Findex.php%2Fboard%2C17.0.html Перейти (перевод Google)]
 
:'''Ссылка:''' [http://translate.google.com/translate?hl=en&sl=de&tl=en&u=http%3A%2F%2Fforum.sturmovik.de%2Findex.php%2Fboard%2C17.0.html Перейти (перевод Google)]
 +
:[http://forum.sturmovik.de/index.php?action=dlattach;topic=699.0;attach=202 MissionNachladen1.zip]
 +
:[http://forum.sturmovik.de/index.php?action=dlattach;topic=699.0;attach=203 MissionNachladen2.zip]
 +
Скачать примеры с Sukhoi.ru:
 +
:[http://www.sukhoi.ru/forum/attachment.php?attachmentid=142109&d=1317816029 MissionNachladen1.zip]
 +
:[http://www.sukhoi.ru/forum/attachment.php?attachmentid=142108&d=1317816029 MissionNachladen2.zip]
  
Cliffs of Dover with the help of the scripting language provides the ability to missions in ongoing missions to load. This is an interesting turn for online server, on the other hand, this results in even very interesting possibilities for offline missions.
 
One can make the game world as living by existing missions to the current charges, or give the missions a certain amount of randomness by randomly selecting one of several submissions and invites you to take. Also, this example is stored in the possibility of a ground battle in one submission at the right moment to load via triggers, so that the player not only matters when everything is over, etc.
 
  
Invite us to a mission, the gameplay, the class method void gpPostMissionLoad (string filename) are available.  
+
"Ил-2 Штурмовик: Битва за Британию" при помощи скриптов позволяет нам загружать под-миссии из текущей миссии. Это дает нам интересные возможности как для серверов, так и для одиночных миссий. Можно сделать игровой мир живущим по установленным текущей миссией правилам или предоставить возможность случайно или в зависимости от ваших действий выбирать из нескольких вариантов под-миссий. Также возможны наземные битвы, загружаемые из под-миссий при срабатывании триггера в нужный момент.
  
Usage example:
+
Для загрузки под-миссии в нашем распоряжении имеется метод '''void gpPostMissionLoad(string fileName)'''
GamePlay.gpPostMissionLoad ("missions \ \ music \ \ samples \ \ test submissions \ \ TestSubMission1.mis");
+
  
The double \ \ in C # is necessary to demonstrate the system to the \ character is meant to be, because the \ in C # also introduces control sequences.  
+
Пример использования метода:
 +
GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission1.mis");
  
It is also possible to use the normal slash.  
+
Двойной символ обратной косой черты '''\\''' в C # является [http://www.skillcoding.com/Default.aspx?id=187 escape-последовательностью] которая обозначает символ '''\'''. Применение escape-последовательностей связано, прежде всего, с тем, что необходимо задавать в строке непечатаемые символы, такие, как, например, символ табуляции и др. Кроме того можно использовать обычный символ '''/'''  ''(slash)''.
GamePlay.gpPostMissionLoad ("Missions / Single / samples / test submissions / TestSubMission.mis");  
+
GamePlay.gpPostMissionLoad("missions/Single/Samples/TestSubmissions/TestSubMission.mis");
  
Suppose you want a couple of submissions at the beginning of the mission to load.  
+
Предположим вы хотите загрузить под-миссии сразу при старте основной миссии. В начале любой миссии "Ил-2.БЗБ" вызывается метод  '''public virtual void OnBattleStarted()'''. Именно при его помощи мы будем загружать под-миссии при старте основной миссии (миссии-хоста). Метод вызывается один раз при старте битвы. Точнее - как только битва уже стартовала.
  
At the beginning of the Mission Cliffs of Dover, the method public virtual void OnBattleStarted () (is AMission of Campaign and others made available) is called. This we can overload our submissions and invite as equal at the start.
+
Теперь у нас все готово, чтобы загрузить подмиссии при помощи метода '''public virtual void OnBattleStarted()'''
  
So:
+
public override void OnBattleStarted()
 +
{
 +
        base.OnBattleStarted();
 +
        MissionNumberListener = -1;
 +
        GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission1.mis");
 +
        GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission2.mis");
 +
        GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission3.mis");
 +
}
  
public override void OnBattleStarted ()
+
''Пояснения к коду:''
{
+
base.OnBattleStarted ();
+
MissionNumberListener = -1;
+
GamePlay.gpPostMissionLoad ("missions \ \ music \ \ samples \ \ test submissions \ \ TestSubMission1.mis");
+
GamePlay.gpPostMissionLoad ("missions \ \ music \ \ samples \ \ test submissions \ \ TestSubMission2.mis");
+
GamePlay.gpPostMissionLoad ("missions \ \ music \ \ samples \ \ test submissions \ \ TestSubMission3.mis");
+
}
+
  
Explanation:
+
'''base.OnBattleStarted()''' - Роль ключевого слова base. Вызывается переопределяемый метод класса-предка. На пример - у нас есть класс MyMission, предком которого является AMission. В классе MyMission переопределен OnBattleStarted(), в котором мы пишем на экран - "Битва началась!". Определим еще один класс RealMission, предком которого будет класс MyMission, и так же, переопределим в нем метод OnBattleStarted(), где на экран выведем - "Таки да, началась!" Что произойдет, если мы создадим экземпляр RealMission и вызовем в нем OnBattleStarted()? Как и предполагается, будет выведена надпись "Таки да, началась!". Получается, весь код, который мы писали в MyMission в том же методе, никак не используется. Для этого и существует base. Т.е. Этим мы вызовем метод предка. Т.е., если в реализации RealMission.OnBattleStarted() вначале (или в другом месте метода) дописать base.OnBattleStarted(), мы получим две последовательно выведенные надписи - "Битва началась!" и "Таки да, началась!".
base.OnBattleStarted () serves the original method call once to initialize properly at all.  
+
 +
'''MissionNumberListener = -1''' - параметр,который указывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - необходимо поставить значение меньше нуля (то есть "-1"). В данном случае из миссии-хоста мы сможем управлять всеми событиями под-миссий, загруженных при помощи '''GamePlay.gpPostMissionLoad'''.
  
MissionNumberListener = -1 sets the script is also responsible for all the events charged Submission. Otherwise, you could specify here the (get the first loaded the mission number one, the second number 2, etc.) only the events of the currently running mission (mission number listener = 0) or only a certain SubMission Cinema. If you want to have to consider all the events of the missions mission number one listener to assign a negative value, eg -1.
 
 
So really we have already all that is needed to load the submission at the beginning.
 
 
Nor to the rest of the script and you're ready:
 
  
 
Code:
 
Code:
 +
 
  using System;   
 
  using System;   
 
  using maddox.game;  
 
  using maddox.game;  
Строка 53: Строка 53:
 
  }   
 
  }   
  
As mission designers really need to customize only the number of submissions to be loaded and the path and name.  
+
Как создатель миссий для использования под-миссий вы нуждаетесь только в настройке номеров загружаемых из миссии-хоста под-миссий и задания пути к их файлам.  
  
 +
Но как известно пример никогда не помешает, мы модифицируем миссию из предыдущих уроков:
  
But since it is known can never harm an example .
+
[[Файл:Sfdp1-1.jpg|800px]]
We modify our previous lesson from the already well-known example:  
+
  
<code>
 
вввввввввввввв
 
gggggggg
 
fggg
 
fffffff
 
ggggg
 
      cccccccccc
 
</code>
 
  
<code>
+
Удаляем все наземные объекты, оставляем Bf-109 и триггер - это будет наша миссия-хост:
using System;   
+
 
using maddox.game;  
+
[[Файл:Sfdp1-2.jpg|800px]]
using maddox.game.world;
+
 
public class Mission : AMission  
+
 
{  
+
Затем создадим три новые миссии, которые будут включать только наземные объекты.
     public override void OnBattleStarted() { base.OnBattleStarted();  
+
Первая:
     MissionNumberListener = -1;
+
 
     GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission1.mis");        
+
[[Файл:Sfdp1-3.jpg|800px]]
     GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission2.mis");  
+
 
     GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission3.mis");  
+
 
     }
+
Вторая:
}  
+
 
</code>
+
[[Файл:Sfdp1-4.jpg|800px]]
 +
 
 +
Третья:
 +
 
 +
[[Файл:Sfdp1-5.jpg|800px]]
 +
 
 +
 
 +
В коде скрипта скорректируйте пути к файлам и их названия:
 +
 
 +
using maddox.game;  
 +
  using maddox.game.world;
 +
public class Mission : AMission
 +
{
 +
public override void OnBattleStarted()
 +
  {
 +
  base.OnBattleStarted();
 +
  MissionNumberListener = -1;
 +
  GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub1.mis");
 +
  GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub2.mis");
 +
  GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub3.mis");
 +
  }
 +
}
 +
 
 +
Теперь можно запустить основную миссию. В миссии появится заботливо расставленная вами в под-миссиях техника:
 +
 
 +
[[Файл:Sfdp1-6.jpg|800px]]
 +
 
 +
 
 +
Вы также можете скачать готовую миссию [http://www.sukhoi.ru/forum/attachment.php?attachmentid=142109&d=1317816029 MissionNachladen1.zip]
 +
 
 +
Как мы помним в миссии у нас присутствует триггер, пока он не "подключен" к скриптам. Чтобы сделать это добавим в код скрипта миссии-хоста секцию '''OnTrigger()'''из нашего предыдущего урока. Вот как это будет выглядеть все вместе:
 +
 +
 
 +
using System;
 +
using maddox.game;  
 +
using maddox.game.world;  
 +
public class Mission : AMission  
 +
{
 +
     public override void OnBattleStarted()  
 +
    {  
 +
    base.OnBattleStarted();  
 +
     MissionNumberListener = -1;
 +
     GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub1.mis");  
 +
     GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub2.mis");  
 +
     GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub3.mis");
 +
     {
 +
        public override void OnTrigger(int missionNumber, string shortName, bool active)
 +
        {
 +
        base.OnTrigger(missionNumber, shortName, active);
 +
        if ("WinCondition1".Equals(shortName) && active)
 +
        {
 +
        GamePlay.gpHUDLogCenter("Задание выполнено.");
 +
        GamePlay.gpGetTrigger(shortName).Enable = false;
 +
        GamePlay.gpGetTrigger("FailCondition1").Enable = false;
 +
        }
 +
        if ("FailCondition1".Equals(shortName) && active)
 +
        {
 +
        GamePlay.gpHUDLogCenter("Вы неуложились в норматив Руделя!");
 +
        GamePlay.gpGetTrigger(shortName).Enable = false;
 +
        GamePlay.gpGetTrigger("WinCondition1").Enable = false;
 +
        }  
 +
    }
 +
}
 +
 
 +
:Архив с миссией: [http://www.sukhoi.ru/forum/attachment.php?attachmentid=142108&d=1317816029 MissionNachladen2.zip]
 +
 
 +
Когда мы запустим миссию, нужно помнить, что необходимо уничтожить 6 целей в двух левых колоннах в течении 320 секунд.
 +
 
 +
Поражено 6 целей, ничего не происходит!
 +
 
 +
[[Файл:Sfdp1-777.jpg|800px]]
 +
 
 +
 
 +
Даже после уничтожения более 6-ти целей ничего не происходит!
 +
 
 +
[[Файл:Sfdp1-8.jpg|800px]]
 +
 
 +
 
 +
Каждый раз после удачной атаки мы получаем только это сообщение ''("Вы неуложились в норматив Руделя!")'', означающее неудачную штурмовку:
 +
 
 +
[[Файл:Sfdp1-9.jpg|800px]]
 +
 
 +
Что же случилось? На самом деле триггер '''WinCondition1''' игнорирует загруженные из подмиссии цели, тогда как триггер '''FailCondition1''' исправно отсчитывает время выписывая нам незаслуженный проигрыш. Чтобы исправить это недоразумение есть три способа:
 +
 
 +
#Отказаться от подмиссий связанных с триггером и обойтись лишь основной миссией с техникой, добавленной в полном редакторе.
 +
#Так как мы задали параметр '''MissionNumberListener = -1''' мы можем управлять событиями и объектами подмиссий из миссии-хоста.
 +
#Создать новый триггер.
 +
 
 +
Для следующего урока мы выберем 2-й способ, где и устраним несправедливость с зачетом наших достижений в штурмовой атаке.
  
[[File:Sfdp1-2.png|frameless|caption]]
+
: ''Для установки миссий-примеров скопируйте их в папку:
 +
..\Documents\1C SoftClub\il-2 sturmovik cliffs of dover\missions\Single
  
 +
----
 +
=== Загрузка подмиссий (автор FG28_Kodiak) ===
 +
Оригинальные темы см. на форуме [http://translate.google.com/translate?hl=en&sl=de&tl=en&u=http%3A%2F%2Fforum.sturmovik.de%2Findex.php%2Fboard%2C17.0.html sturmovik.de](перевод от Google):
  
 +
*[[Ил-2 Штурмовик: Битва за Британию. Скрипты. Скрипты для чайников. Часть 2 - Загрузка подмиссий|Часть 2 - Загрузка подмиссий]]
 +
*[[Ил-2 Штурмовик: Битва за Британию. Скрипты. Скрипты для чайников. Часть 3 - Загрузка подмиссий|Часть 3 - Загрузка подмиссий]]
 +
*[[Ил-2 Штурмовик: Битва за Британию. Скрипты. Скрипты для чайников. Часть 4 - Загрузка подмиссий|Часть 4 - Загрузка подмиссий]]
  
 +
[[Ил-2 Штурмовик: Битва за Британию. Скрипты|Вернуться на страницу "Скрипты"]]
  
 
[[Категория:Ил-2 Штурмовик: Битва за Британию. Скрипты]]
 
[[Категория:Ил-2 Штурмовик: Битва за Британию. Скрипты]]

Текущая версия на 18:28, 6 ноября 2011

Автор: FG28_Kodiak
Ссылка: Перейти (перевод Google)
MissionNachladen1.zip
MissionNachladen2.zip

Скачать примеры с Sukhoi.ru:

MissionNachladen1.zip
MissionNachladen2.zip


"Ил-2 Штурмовик: Битва за Британию" при помощи скриптов позволяет нам загружать под-миссии из текущей миссии. Это дает нам интересные возможности как для серверов, так и для одиночных миссий. Можно сделать игровой мир живущим по установленным текущей миссией правилам или предоставить возможность случайно или в зависимости от ваших действий выбирать из нескольких вариантов под-миссий. Также возможны наземные битвы, загружаемые из под-миссий при срабатывании триггера в нужный момент.

Для загрузки под-миссии в нашем распоряжении имеется метод void gpPostMissionLoad(string fileName)

Пример использования метода:

GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission1.mis");

Двойной символ обратной косой черты \\ в C # является escape-последовательностью которая обозначает символ \. Применение escape-последовательностей связано, прежде всего, с тем, что необходимо задавать в строке непечатаемые символы, такие, как, например, символ табуляции и др. Кроме того можно использовать обычный символ / (slash).

GamePlay.gpPostMissionLoad("missions/Single/Samples/TestSubmissions/TestSubMission.mis");

Предположим вы хотите загрузить под-миссии сразу при старте основной миссии. В начале любой миссии "Ил-2.БЗБ" вызывается метод public virtual void OnBattleStarted(). Именно при его помощи мы будем загружать под-миссии при старте основной миссии (миссии-хоста). Метод вызывается один раз при старте битвы. Точнее - как только битва уже стартовала.

Теперь у нас все готово, чтобы загрузить подмиссии при помощи метода public virtual void OnBattleStarted()

public override void OnBattleStarted()
{
       base.OnBattleStarted();
       MissionNumberListener = -1;
       GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission1.mis");
       GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission2.mis");
       GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission3.mis");
}

Пояснения к коду:

base.OnBattleStarted() - Роль ключевого слова base. Вызывается переопределяемый метод класса-предка. На пример - у нас есть класс MyMission, предком которого является AMission. В классе MyMission переопределен OnBattleStarted(), в котором мы пишем на экран - "Битва началась!". Определим еще один класс RealMission, предком которого будет класс MyMission, и так же, переопределим в нем метод OnBattleStarted(), где на экран выведем - "Таки да, началась!" Что произойдет, если мы создадим экземпляр RealMission и вызовем в нем OnBattleStarted()? Как и предполагается, будет выведена надпись "Таки да, началась!". Получается, весь код, который мы писали в MyMission в том же методе, никак не используется. Для этого и существует base. Т.е. Этим мы вызовем метод предка. Т.е., если в реализации RealMission.OnBattleStarted() вначале (или в другом месте метода) дописать base.OnBattleStarted(), мы получим две последовательно выведенные надписи - "Битва началась!" и "Таки да, началась!".

MissionNumberListener = -1 - параметр,который указывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - необходимо поставить значение меньше нуля (то есть "-1"). В данном случае из миссии-хоста мы сможем управлять всеми событиями под-миссий, загруженных при помощи GamePlay.gpPostMissionLoad.


Code:

using System;  
using maddox.game; 
using maddox.game.world;
public class Mission : AMission 
{   
   public override void OnBattleStarted()  {  base.OnBattleStarted(); 
   MissionNumberListener = -1;  
   GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission1.mis");          
   GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission2.mis"); 
   GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\TestSubMission3.mis"); 
   }  
}  

Как создатель миссий для использования под-миссий вы нуждаетесь только в настройке номеров загружаемых из миссии-хоста под-миссий и задания пути к их файлам.

Но как известно пример никогда не помешает, мы модифицируем миссию из предыдущих уроков:

Sfdp1-1.jpg


Удаляем все наземные объекты, оставляем Bf-109 и триггер - это будет наша миссия-хост:

Sfdp1-2.jpg


Затем создадим три новые миссии, которые будут включать только наземные объекты. Первая:

Sfdp1-3.jpg


Вторая:

Sfdp1-4.jpg

Третья:

Sfdp1-5.jpg


В коде скрипта скорректируйте пути к файлам и их названия:

using maddox.game; 
using maddox.game.world; 
public class Mission : AMission 
{ 
public override void OnBattleStarted() 
  { 
  base.OnBattleStarted(); 
  MissionNumberListener = -1; 
  GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub1.mis"); 
  GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub2.mis"); 
  GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub3.mis"); 
  } 
} 

Теперь можно запустить основную миссию. В миссии появится заботливо расставленная вами в под-миссиях техника:

Sfdp1-6.jpg


Вы также можете скачать готовую миссию MissionNachladen1.zip

Как мы помним в миссии у нас присутствует триггер, пока он не "подключен" к скриптам. Чтобы сделать это добавим в код скрипта миссии-хоста секцию OnTrigger()из нашего предыдущего урока. Вот как это будет выглядеть все вместе:


using System; 
using maddox.game; 
using maddox.game.world; 
public class Mission : AMission 
{
   public override void OnBattleStarted() 
   { 
   base.OnBattleStarted(); 
   MissionNumberListener = -1;
   GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub1.mis"); 
   GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub2.mis"); 
   GamePlay.gpPostMissionLoad("missions\\Single\\Samples\\TestSubmissions\\MissionNachladen1Sub3.mis");
   {
       public override void OnTrigger(int missionNumber, string shortName, bool active)
       {
       base.OnTrigger(missionNumber, shortName, active);
       if ("WinCondition1".Equals(shortName) && active)
       {
       GamePlay.gpHUDLogCenter("Задание выполнено.");
       GamePlay.gpGetTrigger(shortName).Enable = false;
       GamePlay.gpGetTrigger("FailCondition1").Enable = false;
       }
       if ("FailCondition1".Equals(shortName) && active) 
       {
       GamePlay.gpHUDLogCenter("Вы неуложились в норматив Руделя!");
       GamePlay.gpGetTrigger(shortName).Enable = false;
       GamePlay.gpGetTrigger("WinCondition1").Enable = false;
       } 
   } 
} 
Архив с миссией: MissionNachladen2.zip

Когда мы запустим миссию, нужно помнить, что необходимо уничтожить 6 целей в двух левых колоннах в течении 320 секунд.

Поражено 6 целей, ничего не происходит!

Sfdp1-777.jpg


Даже после уничтожения более 6-ти целей ничего не происходит!

Sfdp1-8.jpg


Каждый раз после удачной атаки мы получаем только это сообщение ("Вы неуложились в норматив Руделя!"), означающее неудачную штурмовку:

Sfdp1-9.jpg

Что же случилось? На самом деле триггер WinCondition1 игнорирует загруженные из подмиссии цели, тогда как триггер FailCondition1 исправно отсчитывает время выписывая нам незаслуженный проигрыш. Чтобы исправить это недоразумение есть три способа:

  1. Отказаться от подмиссий связанных с триггером и обойтись лишь основной миссией с техникой, добавленной в полном редакторе.
  2. Так как мы задали параметр MissionNumberListener = -1 мы можем управлять событиями и объектами подмиссий из миссии-хоста.
  3. Создать новый триггер.

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

Для установки миссий-примеров скопируйте их в папку:
..\Documents\1C SoftClub\il-2 sturmovik cliffs of dover\missions\Single

Загрузка подмиссий (автор FG28_Kodiak)

Оригинальные темы см. на форуме sturmovik.de(перевод от Google):

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