А как напрямую получить статистику по игроку во время миссии? Я имею в виду ганстат, киллы, смерти и т.д. в общем все что есть.
Вид для печати
А как напрямую получить статистику по игроку во время миссии? Я имею в виду ганстат, киллы, смерти и т.д. в общем все что есть.
А здесь нельзя ещё по одному уровню if добавить? Как-то так:
case 1:
if (aircraft.Type() == AircraftType.Bomber)
{ GamePlay.gpHUDLogCenter(new Player[] {player},"You should bomb tankers in Folkestone-Calais. Цель-танкеры в Фолкстон-Кале."); }
else if (aircraft.Type() == AircraftType.Divebomber)
{ GamePlay.gpHUDLogCenter(new Player[] {player},"You should bomb tankers in Folkestone-Calais. Цель-танкеры в Фолкстон-Кале."); }
else { GamePlay.gpHUDLogCenter(new Player[] { player }, "You should cover bombers in Folkestone-Calais. Прикрывайте бомберов в Фолкстон-Кале."); }
break;
case 2:
if (aircraft.Type() == AircraftType.Bomber)
{ GamePlay.gpHUDLogCenter(new Player[] { player }, "You should bomb tankers in Folkestone-Calais. Цель-танкеры в Фолкстон-Кале."); }
else if (aircraft.Type() == AircraftType.Divebomber)
{ GamePlay.gpHUDLogCenter(new Player[] {player},"You should bomb tankers in Folkestone-Calais. Цель-танкеры в Фолкстон-Кале."); }
else { GamePlay.gpHUDLogCenter(new Player[] { player }, "You should cover bombers in Folkestone-Calais. Прикрывайте бомберов в Фолкстон-Кале."); }
break;
или так:
case 1:
if (aircraft.Type() == AircraftType.Bomber)
{ GamePlay.gpHUDLogCenter(new Player[] {player},"You should bomb tankers in Folkestone-Calais. Цель-танкеры в Фолкстон-Кале."); }
else { if (aircraft.Type() == AircraftType.Divebomber)
{ GamePlay.gpHUDLogCenter(new Player[] {player},"You should bomb tankers in Folkestone-Calais. Цель-танкеры в Фолкстон-Кале."); }
else { GamePlay.gpHUDLogCenter(new Player[] { player }, "You should cover bombers in Folkestone-Calais. Прикрывайте бомберов в Фолкстон-Кале."); } }
break;
case 2:
if (aircraft.Type() == AircraftType.Bomber)
{ GamePlay.gpHUDLogCenter(new Player[] { player }, "You should bomb tankers in Folkestone-Calais. Цель-танкеры в Фолкстон-Кале."); }
else { if (aircraft.Type() == AircraftType.Divebomber)
{ GamePlay.gpHUDLogCenter(new Player[] {player},"You should bomb tankers in Folkestone-Calais. Цель-танкеры в Фолкстон-Кале."); }
else { GamePlay.gpHUDLogCenter(new Player[] { player }, "You should cover bombers in Folkestone-Calais. Прикрывайте бомберов в Фолкстон-Кале."); } }
break;
()
А Destroy() не помогает?
http://www.sukhoi.ru/forum/showthrea...=1#post1602377
Здесь пример, как убрать трупики через определенное время.
Решение для штурцев без дублирования кода
Код:if (aircraft.Type() == AircraftType.Bomber || aircraft.Type() == AircraftType.Divebomber) { ... }
У меня с кораблями засада была, они как-то не так как самолеты и танки уничтожаются.
Вот так будет работать?
AiCart - это вообще кто такой?Код:public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
if (actor is AiGroundGroup)
{
if ((actor as AiGroundGroup).Type() == AiGroundGroupType.Ship)
{
AiGroundGroup shipGroup = actor as AiGroundGroup;
foreach (AiActor item in shipGroup.GetItems())
{
if (item is AiCart)
{ // 5 минут таймаут
Timeout(300, () =>
{
if (item != null)
{
(item as AiCart).Destroy(); // уничтожаем
}
}
);
}
}
}
}
}
Так тоже попробуй, кажется 1 или 2х скобок низу не хватает.
--- Добавлено ---
ОК, спасибо, значит лучше так.
OnActorDead когда случается? Когда корабль тонуть начинает или когда уже утонул? там обломков полузатонувших много нужно убирать.
А вот этот вопрос - сложнее.
Я где то выше писал - просто таки необходимо, что бы при повторной загрузке подмиссии убивать объекты, которые породила предыдущая загрузка. На OnActorDead полагаться полностью нельзя. Тогда не будет бардака с кучей мусора тут и там.
Самый простой вариант - миссия контролирует сама себя. для этого
1. Миссия "слушает" только себя.
2. Загружает эта миссия тоже, сама себя. Исключение - только первая загрузка из миссии-хоста.
3. Перед загрузкой самой себя прибивает все старые свои объекты.
4. Не рожает больше никаких объектов(типа старта скриптом и т.д.) и не загружает больше никаких миссий, кроме таких же по поведению.
В таком варианте не будет мусора, но и работать миссия будет сугубо автономно, на собственной логике.
Мы это сами не сочиним. Готового варианта скрипта нет для зачистки?
Там кстати кораблики рождаются каждые 40 минут (или час), а плыть им 2.5 часа. Т.е. убивать их нельзя перед повторной загрузкой, они треть пути только пройдут. Сейчас стоит вопрос только об обломках а не о целых кораблях. Целые мы в конце пути превратим в обломки.
Пример такой организации по той же ссылке, что я выше дал. Миссия с танками грузит сама себя, когда ее танки уничтожены. Может играть до бесконечности(вернее исчерпания Int64 :)), никакого мусора.
Не грузите миссии по таймеру из хоста. Сделайте загрузку миссий волнами - первая группа миссий, через 40 минут вторую группу миссий (не эту же самую!) еще через 40 еще группу миссий. И т.д. В каждой - по кораблику. Можно и несколько, но тогда и появляться они толпой будут. А она уже сама разбирается, когда ей загрузится повторно - это может быть таймер, TaskCompleted (кораблик приехал), ActorDead или все вместе и т.д. И перед загрузкой, если кораблик еще как-то есть, делаем ему дестрой. Все. Только не пересекайте маршруты.
Плюсы. Никакого мусора. Четко знаем, сколько корабликов максимум одновременно плавает. Убить сервер толпой юнитов исключено.
Можно по таймеру, можно как хочешь. Смысл в том, хост загрузил подмиссию только один раз, а все остальное отдать на откуп самой подмиссии, которая и грузит сама себя, если решит что надо, и мусор за собой убирает.
Смысл подмиссии слушать только себя в том, что бы:
1. Убирать трупики только за собой - по ActorDead. Мало-ли, может время уборки надо разное поставить. Или трупик из другой миссии убирать не надо, например.
2. По ActorCreated (или что там) запомнить без лишних телодвижений только свои объекты куда ни будь в коллекцию. Что бы после не шерстить всю немерянную толпу акторов при уборке, выбирая своих. Если акторов в миссии немного, можно вообще его руками прописать, найти по имени после загрузки и сохранить в приватном поле - что бы прибить после, опять же (в кампаниях стартовых такой похожий подход можно найти).
Можно конечно, слушать всех, но тогда и фильтровать все сообщения надо будет, и плюс лишняя нагрузка, никому не нужная в общем случае.
Смысл того что миссия должна грузить сама себя - она прекрасно знает, кого нарожала (номер миссии есть - своих найти не проблема), и соответственно, прибраться не проблема перед загрузкой повторной.
Хост может слушать миссии, может не слушать - как хочет, если ему надо, пусть слушает. Например, что бы представлять, что вообще в мире происходит.
Недостаток такого подхода, повторюсь - если такую миссию загрузишь, она уйдет в свободное плаванье и начхать ей на хост. Можно конечно организовать сообщение (типа замаппить файл на общий доступ и т.д.) но это уже дебри.
Интересно, спасибо, я как-то старался одним скриптом обходиться, т.к. даже в одном путаюсь :)
Там, где у Small_Bee моноготочие - это место для твоего кода по-моему. Посмотри какой раньше был скрипт и в какую часть Small_Bee divebomber добавил. Добавь так же.
Hаоборот. Разобраться в десяти маленьких проще чем в одном большом. Читать проще, картину лучше видно.
--- Добавлено ---
Все верно, на место троеточия -код. В фигурных скобках код выполнится, если выражение в круглых скобках будет верно. В данном случае мы говорим
если ТипСамолета = Бомбер или ТипСамолета = Пикировщик тогда делаем то, что заключено в следующие фигурные скобки.
Надо всегда проверять код на предмет опечаток и прочего - в окне скрипта правой клавишей и скомпилировать (появится еще вкладка и будет написано ОК, либо подсказка что где не так).
На форуме есть тег CODE, заключай код в этот тег.
Уточнил тут - AircraftType имеет аттрибут флага, это значит что самолет может иметь несколько разных типов одновременно, т.е. и проверка будет другая. По свободе подправлю.
Если ничего не работает, открывай консоль - там будут видны ошибки какие были.
не видя ошибки сложно сказать что и почему глючило.
да, вполне вариант.
там зависит от того какой бой, если с ходу вступили - могут не успеть перестроится, или дорога удобная - тогда колонной продолжат идти. А так вообще в бою должны перестраиваться.
"капитаны" есть, насчёт препятствий посмотрю, почему не обруливают.
нет, нельзя управлять так самолётом.
дороги, емнип в файл с расширением .misroads идут, его тоже надо на сервер загрузить.
Вот такое было http://www.sukhoi.ru/forum/showthrea...=1#post1621897
battle stop актеров не убирает с сервера.
Ответил здесь - http://www.sukhoi.ru/forum/showthrea...=1#post1685346
@ naryv
Большое спасибо за странички брифинга в меню и на карте в онлайне. Порадовало больше, чем звук :) Можно ли их содержание менять динамически в процессе хода миссии? Хотя бы подгружать туда несколько строк с обновленными целями?
Единственное, что смущает, это что по умолчанию брифинг скрыт, что драматически понижает его читаемость, которая даже в Ил-2 страдала :) Тем более хорошо, что он на карте дублируется. Придется в полете напоминалки писать, чтобы брифинг смотрели.
Ангары пока не удалось потестировать. Удалось ли исправить рождение многомоторных самолетов в одномоторных ангарах с последующим взрывом?
Вот интересный новый метод появился в классе миссии - OnOrderMissionMenuSelected(player, ID, menuItemIndex); любопытненько... :)
и в геймплее новый метод - gpSetOrderMissionMenu(Player player, bool thisSubMenu, int ID, string[] keys, bool[] bSubMenu);... Гм. :)
А для Player есть LanguageName() - языковая проблема походу решена.
и Ping() есть. По идее можно по пингу кикнуть, но как пока не нашел.
Ну это не мне спасибо, не я их делал :)
Можно делать брифинги для армий(синей, красной, нейтральной), информационный(показывется при выборе миссии) и регулярные - их можно привязать к конкретной группе самолётов, выбирается в редакторе в свойствах группы.
При подгрузке миссии со своими брифингами - они обновляются. Т.е. если загружаем миссию с новым брифингом для какой-то страны - этот брифинг будет отображаться для этой страны.
При выборе стороны, емнип, кнопка брифинга доступной становится.
пока нет но работаем над этим.
:) старались. Да, теперь можно делать юзерское меню, разной степени вложенности, и выполнять действия по выборам меню, например так
вызывается по <Tab> +<4> :)Код:using System;
using System.Collections;
using maddox.game;
using maddox.game.world;
public class Mission : AMission {
private void setMainMenu( Player player ) {
GamePlay.gpSetOrderMissionMenu( player, false, 0, new string[] { "1", "2", "3" }, new bool[] { true, false, false } );
}
private void setSubMenu( Player player ) {
GamePlay.gpSetOrderMissionMenu( player, true, 1, new string[] { "1-1", "1-2", "1-3" }, new bool[] { false, false, false } );
}
public override void OnOrderMissionMenuSelected( Player player, int ID, int menuItemIndex ) {
if( ID == 0 ) { // main menu
if( menuItemIndex == 1 ) {
GamePlay.gpHUDLogCenter("Menu selected Loading mission aaa2.mis");
GamePlay.gpPostMissionLoad("missions\\aaa2.mis");
setSubMenu( player );
}
} else if( ID == 1 ) { // sub menu
setMainMenu( player );
}
}
public override void OnPlayerConnected( Player player ) {
if( MissionNumber == 0 ) {
setMainMenu( player );
}
}
public override void Inited() {
if( MissionNumber == 0 ) {
setMainMenu(GamePlay.gpPlayer());
}
}
}
да, теперь можно на "родном" языке писать сообщения.
кикать сервер должен, можно, наверное, ему кидать команду, но это точно не знаю.
Ай карашо! :) Насколько я понимаю, меню выбора миссий можно использовать не только для загрузки миссий, а для чего душе угодно. Например, игрок может запросить текущую ситуацию. Или в качестве разведчика указать цель для налета бомбардировщиков. Ай карашо!
Хотелось бы еще к спаун-точке привязать в онлайне. А на вкладке карты пилота какой из брифингов показывается? Видимо желательно все показывать по порядку (общий, стороны и регулярный). На вкладку брифинга удобнее кнопкой переходить, как в других симах, чем меню по ПКМ. Правую руку нельзя надолго с РУСа убирать, а левой в меню не получается так ловко = неудобство. К тому же меню вообще редко кто открывает, а кнопка привлечет внимание сразу.
Т.е. можно к каждой подгружаемой\сгенеренной миссии скриптом генерить брифинг (текстовый файл) с новыми координатами целей, например, перед подгрузкой этой миссии или скриптом не получится брифинг сгенерить?
Спасибо! А как-то хитро скриптом нельзя все ангары временно сделать совсем недоступными?
За это отдельное спасибо!
Получается, можно будет прикручивать разные голосовалки, выборы офицера\ров. Разрешать офицерам выбирать новые направления атаки, новые типы миссий, запрашивать поставки топлива и боеприпасов, посылать ботов на разные задания прямо из игры?
А текст из чата скрипты научились перехватывать, чтобы пароли у игроков запрашивать, например? Где-то читал, что раньше это было невозможно.
Если можно это уточнить, все игроки серверов Repka были бы благодарны. Австраллийцы и Бразильцы десинк вызывают частенько.
Еще вопрос про инструменты карты и различные вейпойнты, которые там можно ставить (иконки кораблей, танков и т.п.). Можно ли как-то ставить вейпойнты, чтобы они были видны всей стороне или добавить такой инструмент?
Можно ли скриптом ставить вейпойнты на карту пилота? и на карту в брифинге? Можно ли в редакторе ставить такие вейпойнты на карту брифинга и пилота?
--- Добавлено ---
Только в хост-миссию воткни 2 брифинга в редакторе: Blue Army и Red Army.
Вчера воткнул все брифинги для теста и посмотрел, какие показались на сервере.
--- Добавлено ---
А есть где-то список этих системных многоязыковых сообщений и пример как их вызывать скриптом? Они в какой чат пишутся? Ботов или Server? Они голосом ботов дублируются?
кстати мысль возникла. послабление это или нет, можно подумать. мысль такова. показывать местонахождение на карте только сам самолет пилоты было бы тоже неправильно. gps какой-то. а вот подсвечивать квадрат где пилот сейчас летит - было бы не в пример интереснее.
Нефиг шо. Игроку на тайгере делаем менюшку "Бздынь!", он ее жмакает, миссия рисует бомберов в точкой атаки там где был тайгер, и вперед!. Или собирать куда нить в определенном радиусе от тайгера координаты вражьей наземки и после посадки к примеру вывешивать ее в брифинге или еще где.
PS сам правда пока не пробовал, но в теории походу можно. :)
Есть для SayToGroup() или что то вроде этого - если сообщение родное, то походу должно продублироваться и голосом, и переведено на язык игрока.
Все остальное примерно так
Код:private string GetLocalizedMessage(string lang, string key)
{
switch(key)
{
case "Hello":
{
switch (lang)
{
case "ru": return "Привет!";
case "en": return "Hello!";
case "turtle": return "Cawabanga dude!";
}
} break;
}
return String.Empty;
}
Андерс, ты когда составляешь маршрут самолётов в миссии, старайся делать так, что бы маршрут имел линию без пересечений от рождения до посадки, иначе часто сбивается задание, и не надо делать так много точек бомбить-цель, достаточно 2-х, 3-х. Вообще если у самолётов стоят даже точки "обычный полёт" то бомберы при пролёте над целью будут её бомбить, а истребители вступать в бой с любой целью( это точка автомат по умолчанию ИИ сам принимает решение). Сейчас в начале миссии тока синие бомберы бомбят, а красные пролетают в стороне.
да, естественно, выбор меню просто генерирует событие, а обрабатывать его можно как угодно, ну и сами меню динамически строить:).
с этим сложнее, пока нельзя, и можно-ли будет - не понятно пока.
если есть регулярный - он показывается, если его нет - тогда стороны.
учтём, но вряд-ли скоро.
с подгружённой миссией пробовал - грузится новый брифинг, с генерёнными не пробовал, но теоретически должно работать - никаких препятствий к этому нет.
нет, увы. Но на части маленьких карт выдвинули парковочные точки из ангаров - там не должны взрываться.
да, именно так, только, естественно, это всё в скрипте надо закодить.
нет, нельзя. Пароль при входе на сервер должно спрашивать, если он запаролен.
ну, то что сервер может кикать - это точно, опять таки вопрос как обрабатывать пинг.
так и планировалось, но пока не доделано.
Имеется в виду пароль игрока, а не пароль сервера. Т.е. если в онлайн проекте за игроком или за сквадом закреплены хорошие самолеты, то нельзя, чтобы кто-то другой зашел под ником этого игрока или члена сквада и эти самолеты использовал. Для этого при входе на сервер в проектах типа ADW каждый игрок вводил свой личный пароль и отправлял на канал Server. Как это сделать в БзБ?
Опять же, чтобы через кастомное меню вызвать бомберов на атаку цели полезно квадрат атаки указать руками в чате, т.к. меню с перчислением всех квадратов на карте пролива будет очень длинным и неудобным. Или, например, новый курс ИИ группе было бы удобнее с клавиатуры вводить с точностью до градуса, чем из меню выбирать.
Клавиатура - необходимый инструмент, было бы обидно если через нее нельзя было бы общаться со скриптами.
Все это, если не ошибаюсь, можно будет реализовать в серверном аддоне.. По крайней мере там вроде видел методы относительно чата и т.д.
К спаун точке брифинг можно думаю можно брифинг привязать и скриптом. При рождении самолета находим ближайший спаун, определяемся, какой именно брифинг привязывать относительно спауна и привязываем брифинг к группе, которой самолет принадлежит.
Пример менюшки http://simhq.com/forum/ubbthreads.ph...s/3385237.html
Код:using System;
using System.Collections;
using maddox.game;
using maddox.game.world;
//GamePlay.gpHUDLogCenter("Pressed: " + menuItemIndex);
public class Mission : AMission {
bool dmgOn = false;
private void setMainMenu( Player player ) {
GamePlay.gpSetOrderMissionMenu( player, false, 0, new string[] { "Damage & Diagnostics" },
new bool[] { true } );
}
private void setSubMenu( Player player ) {
GamePlay.gpSetOrderMissionMenu( player, true, 1, new string[] { "Destroy Wings", "Destroy Engine",
"Destroy Guns", "Report Damage On", "Report Damage Off"}, new bool[] { false, false, false, false, false } );
}
public override void OnOrderMissionMenuSelected( Player player, int ID, int menuItemIndex ) {
if( ID == 0 ) { // main menu
if( menuItemIndex == 1 ) {
setSubMenu( player );
}
} else if( ID == 1 ) { // sub menu
if (menuItemIndex == 1)
{
Player[] all = { player };
AiActor where = player.Place();
AiAircraft aircraft = (GamePlay.gpPlayer().Place() as AiAircraft);
GamePlay.gpLogServer(all, "POW!!", null);
aircraft.cutLimb(part.LimbNames.WingR2);
setMainMenu( player );
}
else if (menuItemIndex == 2)
{
Player[] all = { player };
AiActor where = player.Place();
AiAircraft aircraft = (GamePlay.gpPlayer().Place() as AiAircraft);
GamePlay.gpLogServer(all, "POW!!", null);
aircraft.hitNamed(part.NamedDamageTypes.Eng0TotalFailure);
setMainMenu( player );
}
else if (menuItemIndex == 3)
{
Player[] all = { player };
AiActor where = player.Place();
AiAircraft aircraft = (GamePlay.gpPlayer().Place() as AiAircraft);
GamePlay.gpLogServer(all, "POW!!", null);
aircraft.hitNamed(part.NamedDamageTypes.Machinegun00Failure);
aircraft.hitNamed(part.NamedDamageTypes.Machinegun01Failure);
aircraft.hitNamed(part.NamedDamageTypes.Machinegun02Failure);
setMainMenu( player );
}
else if (menuItemIndex == 4)
{
dmgOn = true;
GamePlay.gpHUDLogCenter("Will show damage on all aircraft");
setMainMenu( player );
}
else if (menuItemIndex == 5)
{
dmgOn = false;
GamePlay.gpHUDLogCenter("Will not show damage on all aircraft");
setMainMenu( player );
}
}
}
public override void OnPlayerConnected( Player player ) {
if( MissionNumber == 0 ) {
setMainMenu( player );
}
}
public override void Inited() {
if( MissionNumber == 0 ) {
setMainMenu(GamePlay.gpPlayer());
}
}
public override void OnAircraftDamaged(int missionNumber, string shortName,
AiAircraft Aircraft, AiDamageInitiator DamageFrom, part.NamedDamageTypes WhatDamaged)
{
base.OnAircraftDamaged(missionNumber, shortName, Aircraft, DamageFrom, WhatDamaged);
if (DamageFrom.Player != null )
{
if (dmgOn == true)
{
GamePlay.gpLogServer (null, "{0} hits {1} : {2} \n", new object []
{DamageFrom.Player, shortName, WhatDamaged});
}
}
}
}
Есть пара вопросов.
Тестировать онлайн миссии лучше на сервере созданном из игры или на выделенном? (выделенный вылетает, наверное мощности ПК не хватает)
На данный момент можно вызвать скриптом звуковой файл во время миссии и вывести на экран текст от имени бота? Например, если попал по врагу хорошо - бот поздравляет с победой. Или это уже моды нужны?
Сейчас выводятся как я понимаю через сообщения сервера и большую надпись по центру экрана, от имени ботов (в виде радиопереговоров вроде не встречал).
Еще вопрос. В скриптах destroyPlane, damageAiControlledPlane, OnPlaceLeave() и т.п. называются методами класса по-научному? Есть ли где-нибудь их список с кратким значением каждого? Нужно для Вики.
Еще по вот этому есть вопрос:
В каких случаях что ставить и за что они отвечают? (в скриптах разные сочетания бывают)Код:using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;
using maddox.GP;
Здесь список http://www.sukhoi.ru/forum/showthrea...9&daysprune=-1
Там по названию понятно. В патче уже новые появились. Выше naryv писал.
Вопрос по команде GamePlay.gpHUDLogCenter
GamePlay.gpHUDLogCenter(unitName, text, time)
unitName: NameObject
text: String
time: Number
Если команда прописывается в таком виде:
unitName будет равен null? Кому отправится сообщение? И каков формат unitName?Код:GamePlay.gpHUDLogCenter("Мы очень ждем патч")
time в этом случае чему равно? Измеряется в секундах?
Есть ли где-нибудь/у кого-нибудь хотя бы частичный список с расшифровкой параметров?
четыре варианта есть :
gpHUDLogCenter(string msg); всем отправляется строка msg
gpHUDLogCenter( Player[] to, string msg ); массиву Player отправляется строка msg
gpHUDLogCenter( Player[] to, string msg, object[] parms );массиву Player отправляется строка msg с параметрамии строки, например
gpHUDLogCenter( Player[] to, string msg, object[] parms, double lifeTime ); массиву Player отправляется строка msg с параметрамии строки , будет на экране lifeTime секундКод:int num_target = 10;
gpHUDLogCenter(gpRemotePlayers(), " Вам надо уничтожить {0} целей", num_target );
Спасибо!
Сразу еще пару вопросов хочется уточнить
Какое значение возвращает? Всех игроков в миссии?Цитата:
gpRemotePlayers()
Это переменная или массив переменных?Цитата:
object[] parms
И я правильно понимаю, что вариант gpHUDLogCenter(string msg, double lifeTime); недопустим?
Хотелось бы уточнить
public override void OnBattleStarted() - это переопределение метода, в него мы заносим то, что нужно сделать при старте миссии-хоста (?), здесь загружаем миссии и слушаем их все. Можно получить какое-то нормально определение, что это такое? И что в нем делает это: base.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");
}
У меня есть только такое определение:
И:Цитата:
В начале любой миссии "Ил-2.БЗБ" вызывается метод '''public virtual void OnBattleStarted()'''. Именно при его помощи мы будем загружать под-миссии при старте основной миссии (миссии-хоста):
Оба неустраивают, хотелось бы ясности.Цитата:
base.OnBattleStarted() - метод вызова, выполняемый один раз при инициализации.
Насколько я понимаю, это случается, когда сервер нажимает кнопку Battle! или если выделенный, то когда пишет battle start в консоли launcher.exe.
Есть еще другой метод Init, который происходит при загрузке миссии емнип.
Для чего используется base. ... во многих методах самому интересно.
Еще смежный вопрос: onMissionLoaded если прописан в миссии хосте, будет срабатывать при подгрузке подмиссий или только хоста? Соответственно, в подмиссию можно его включать и, например запускать timeout некоторых процессов подмиссии в методе onMissionLoaded ? Например для подмиссии:
OnBattleStarted() если присутствует в подмиссии при загрузке подмиссии будет срабатывать?Код:onMissionLoaded ...
timeout ...
{
destroy actors
и перезагрузить саму себя
}
В тех скриптах, что у меня есть - этот метод прописывается в подмиссии и значит срабатывает, вот пример naruv'а scripttest
Код:public override void OnBattleStarted()
{
AiActor actor = GamePlay.gpActorByName("Static0");
if (actor != null)
{
serverMessage("Объект найден");
}
else
{
serverMessage("Объект не найден");
}
}
OnBattleStarted()
Метод вызывается один раз при старте битвы. Точнее - как только битва уже стартовала.
OnMissionLoaded(...)
Вызывается как только загрузилась новая миссия. Причем вызывается во всех ранее загруженных миссиях.
Роль ключевого слова base. Вызывается переопределяемый метод класса-предка. На пример - у нас есть класс MyMission, предком которого является AMission. В классе MyMission переопределен OnBattleStarted(), в котором мы пишем на экран - "Битва началась!". Определим еще один класс RealMission, предком которого будет класс MyMission, и так же, переопределим в нем метод OnBattleStarted(), где на экран выведем - "Таки да, началась!" Что произойдет, если мы создадим экземпляр RealMission и вызовем в нем OnBattleStarted()? Как и предполагается, будет выведена надпись "Таки да, началась!". Получается, весь код, который мы писали в MyMission в том же методе, никак не используется. Для этого и существует base. Т.е. Этим мы вызовем метод предка. Т.е., если в реализации RealMission.OnBattleStarted() вначале дописать base.OnBattleStarted(), мы получим две последовательно выведенные надписи - "Битва началась!" и "Таки да, началась!".
Спасибо за подробный ответ!
Можно это назвать вызовом метода MyMission из RealMission, после которого уже идет выполнение самого RealMission?
А если добавить третий класс SuperMission, предок которого RealMission, как тогда добраться до MyMission? Или так делать нельзя?