PDA

Просмотр полной версии : Вопросы.



Страницы : 1 [2] 3 4

Vetochka
04.08.2011, 18:49
Боты и автопилот не торопятся оторваться, поэтому у них успевает событие OnTookOff срабатывать , лётчики-человеки торопятся:) . Попробуйте по полосе бежать подольше разгоняясь, должно сработать. Но вообще это, наверное, не очень правильно, в след. патче сделаем чтобы по отрыву срабатывало.
Это будет хорошо, если сделаете. :) А пока будем определять взлет по высоте и скорости.

-atas-
11.08.2011, 10:57
На всякий случай дубль http://www.sukhoi.ru/forum/showthread.php?t=71102&p=1669388&viewfull=1#post1669388

Vetochka
12.08.2011, 13:32
Как-то можно в одиночной миссии установить новое игровое время? Или сделать пропуск какого-то временного участка?
Например, миссия началась в 10:00 игрового времени, полетали, постреляли, вдруг произошло какое-то событие, после которого установилось игровое время 12:00. Такое возможно?
Да, системное время желательно не трогать :)

Vetochka
12.08.2011, 15:06
Веточка, а в каком языковом редакторе лучше заниматься миссиями для БОБа, не подскажешь? :)
Visual studio 2010.
Качать отсюда:
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express
Только ты не по адресу обращаешься :) У нас тут много программистов, а мои интуитивно-обрывочные школьные знания и знания моего соавтора кампаний явно малы, чтобы еще кому-то чего-то объяснять.
Я могу подробно объяснить как ликвидировать или зарегистрировать ООО или на что в суде напирать, чтобы доказать свои правоту :D

-atas-
12.08.2011, 20:01
@ naryv

Накропал как мог http://www.sukhoi.ru/forum/showthread.php?t=69472&page=2&p=1671559&viewfull=1#post1671559

-atas-
16.08.2011, 10:57
А что конкретно не получается? Флажок? Сторона? Аэродром? Самолет?

Бывает, что в настройках сложности запрещают выбор стороны. Нужно там 4 галочки снять справа внизу.

А, ну и миссию сначала запустить нужно, а потом самолет создавать ;)

Geniok
16.08.2011, 16:22
А что конкретно не получается? Флажок? Сторона? Аэродром? Самолет?

Бывает, что в настройках сложности запрещают выбор стороны. Нужно там 4 галочки снять справа внизу.

А, ну и миссию сначала запустить нужно, а потом самолет создавать ;)

Он просто запускает не выделенный сервер а обычный. Таким образом хочет одновременно быть и клиентом и сервером через интерфейс игры. А она, как я понял позволяетбыть или тем, или тем. Через выделенный сервер все прекрасно работает.

-atas-
17.08.2011, 00:50
Он просто запускает не выделенный сервер а обычный. Таким образом хочет одновременно быть и клиентом и сервером через интерфейс игры. А она, как я понял позволяетбыть или тем, или тем. Через выделенный сервер все прекрасно работает.

Я запускал срвер из интерфейса и летал. Просто с настройками что-то.

--- Добавлено ---


Как пользоваться "эродромными" точками и путями? :) Т.е. как их правильно ставить, и что они дают?

Это точки где спаунятся самолеты на аэродроме. Один из объектов аэродрома в редакторе. В настройках клавиш в игре (не в редакторе) нужно назначить клавишу для команды branch (ветвление), чтобы оставлять рулежки мжду этими точками.
2 точки кажется должны находиться на ВПП, чтобы боты туда выруливали. Посмотри как в миссии с Р3 они поставлены красиво.

Small_Bee
17.08.2011, 02:39
Возник вопрос следующего плана.

1. В каких единицах возвращается значение по запросу Z_VelocityIAS и подобные? Получал с subtype=-1. Значение в среднем ниже на 2,36, если ориентироваться по прибору в км/ч на 500-х метрах.
2. Так как не совсем ясно, в каких единицах возвращается значение по вопросу выше, пробовал получать по Z_VelocityMach. Стало похоже на правду, но возник еще вопрос: конкретное значение ск. звука зависит от температуры воздуха?

В общем, коротко говоря, мне надо получить TAS и IAS в понятных единицах измерения.

-atas-
17.08.2011, 14:41
Если создавать свой новый аэродром, то самолеты будут рождаться на его окружности (внутренней если нет ВПП и внешней, если создать ВПП) если не создать аэродромные точки. Самолеты вероятно рождаются на том аэродроме, ближе к центру которого расположена точка спауна. Радиус окружности можно кстати отредактировать в файле миссии в блокноте, чтобы сделать его меньше, чем предусмотрено редактором.

Маркеры видимо можно поставить в редакторе, потом открыть миссию в блокноте и скопировать координаты в файл .section

Черный экран - это возможно нехватка памяти или глюки драйверов или директ-Х. Никогда такого не было. Все 4 галки снять нужно, может из-за них.

Geniok
17.08.2011, 16:33
to Geniok. Еще раз спасибо за ликбез для чайников :)! Запустил-таки выделенный сервер, а то лез в папку игры по привычке, правда красным навыделяло ошибки. Еще интересно, а эта миссия у тебя работала на выделенном сервере?

Всегда пожалуйста. ;)

Твоя?! да, все отлично работало. правда я перед этим исправил твои ошибки с базами.

naryv
17.08.2011, 17:26
Возник вопрос следующего плана.

1. В каких единицах возвращается значение по запросу Z_VelocityIAS и подобные? Получал с subtype=-1. Значение в среднем ниже на 2,36, если ориентироваться по прибору в км/ч на 500-х метрах. в метрах/секунду все подобные параметры.


2. Так как не совсем ясно, в каких единицах возвращается значение по вопросу выше, пробовал получать по Z_VelocityMach. Стало похоже на правду, но возник еще вопрос: конкретное значение ск. звука зависит от температуры воздуха? да, зависит

Small_Bee
17.08.2011, 18:38
в метрах/секунду все подобные параметры.

да, зависит

Ок, спасибо! про метры в секунду мог бы и сам, блин, догадаться, но башка уже не варила.

naryv
17.08.2011, 19:54
Ок, спасибо! про метры в секунду мог бы и сам, блин, догадаться, но башка уже не варила. :) а я уж проверять начал, что там не так :)

Geniok
17.08.2011, 22:48
Единственное, не совсем понял как запустить выделенный сервер, и самому же к нему присоединиться. Ведь как я понял, если уже запустил БОБ с параметром -server, то пока его не снимешь - не сможешь запустить же обычный "несерверный" БОБ, чтобы опять присоединиться к серверу? Или серверный БОБ позволяет и запустить сервер, и тут же к нему присоединиться? В-общем чето я заблудился тут в серверах :beer:

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

но лучше написать cmd-файл для запуска сервера.

Geniok
28.08.2011, 13:08
Олег, вопрос такого плана: скажем мне нужно постоянно возрождать группу кораблей после ее уничтожения. Если написать на одних триггерах, то я ставлю триггер на уничтожение группы (выбираю корабли), ставлю действие возрождение группы (выбираю опять корабли), получаю возрождение кораблей после их уничтожения. Но мне нужно, чтобы это происходило постоянно, т.е. цикл до бесконечности. Пробовал создавать второй аналогичный триггер с действием возрождения, выбирал этот же кораблик (в идеале хотел поставить скажем 5 возрождений на один танкер), но кораблик возрождался все равно только один раз. Можно ли добиться этого эффекта средствами редактора или тут уже нужны скрипты? Или просто создавать группы кораблей по цепочке, каждый раз указывая для возрождения новую группу? В принципе так можно, но тогда если мне нужно, чтобы кораблик возродился, предположим, 5 раз, то мне нужно для 10 кораблей создать 5*10=50 групп - это не совсем удобно.

А не проще при уничтожении загружать миссию с танкером? Ты же уничтожил 1 танкер, значит и появиться должен 1 танкер. Значит нужна миссия с 1 танкером.

Vetochka
28.08.2011, 14:08
Олег, вопрос такого плана: скажем мне нужно постоянно возрождать группу кораблей после ее уничтожения. Если написать на одних триггерах, то я ставлю триггер на уничтожение группы (выбираю корабли), ставлю действие возрождение группы (выбираю опять корабли), получаю возрождение кораблей после их уничтожения. Но мне нужно, чтобы это происходило постоянно, т.е. цикл до бесконечности. Пробовал создавать второй аналогичный триггер с действием возрождения, выбирал этот же кораблик (в идеале хотел поставить скажем 5 возрождений на один танкер), но кораблик возрождался все равно только один раз. Можно ли добиться этого эффекта средствами редактора или тут уже нужны скрипты? Или просто создавать группы кораблей по цепочке, каждый раз указывая для возрождения новую группу? В принципе так можно, но тогда если мне нужно, чтобы кораблик возродился, предположим, 5 раз, то мне нужно для 10 кораблей создать 5*10=50 групп - это не совсем удобно.
Это через триггеры не сделаешь. Триггер "уничтожение группы" вроде как работает только для групп, запущенных в первой миссии, а на группу, которая уже запущена скриптом триггер первой миссии не срабатывает. Возможно я чего-то не догнала.
Так что либо делать загрузку миссий как предлагает Женя, по идеи триггер, приписанный в загружаемой миссии должен работать. Но я не проверяла.
Либо вот так:
Вот этот скрипт по идеи должен работать. Как танкер тонет, то рождается новый в начальной точке.
Проверить не могу, т.к. БзБ нет под рукой.


public class Mission : AMission
{
// ------------
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> initiatorList)
{
if (shortName.IndexOf("0_Chief", 0) > 0) //0_Chief краткое имя корабля, см. в файле миссии в разделе [Chiefs]
{
AiAction action = GamePlay.gpGetAction("a1"); //a1 - действие по рождению танкера, которое прописывается в редакторе
if (action != null)
{
action.Do();
}
}
}
}

По любому нужно писать скрипт.

Vetochka
28.08.2011, 14:50
Самое прикольное, что когда в редакторе создаешь триггеры-действия, то в разделе скрипты естественно появляются скрипты. Но когда заходишь в папку с миссией, то там один только файл .mis. Т.е. для нормальной работы .cs файл создавать неизбежно (даже, чтобы воткнуть скрипт Vetochki), а Atas говорит, что если создать .cs, то он перебьет внутренние скрипты миссии (к-е, создаются автоматом на триггеры внутри редактора).
Именно так. Но с триггерами все просто.
Внутри AMission дописываем следующее:



public class Mission : AMission
{
// ------здесь скрипт, который уже был, его не трогать. Вставлять дописанное перед последней скобкой скрипта
// ----- вставлять отсюда -----------------
public override void OnTrigger(int missionNumber, string shortName, bool active)
{

AiAction action;
if ("tname1".Equals(shortName) && active) //tmane1 - имя 1-го триггера
{
GamePlay.gpGetTrigger(shortName).Enable = false;
action = GamePlay.gpGetAction("aname1"); //aname1 - имя действия 1, которое вызывается по срабатыванию 1-го триггера
if (action != null)
{
action.Do();
}
}

if ("tname2".Equals(shortName) && active) //tmane2 - имя 2-го триггера
{
GamePlay.gpGetTrigger(shortName).Enable = false;
action = GamePlay.gpGetAction("aname2"); //aname2 - имя действия 2, которое вызывается по срабатыванию 2-го триггера
if (action != null)
{
action.Do();
}
}
// аналогично можно вставлять сколько удодно триггеров и привязывать к ним действия


}
// ------------ до сюда
} // а это последняя скобка скрипта :)

Vetochka
28.08.2011, 15:09
Да вот еще какую ерунду заметил. Я поработал с миссией для р1. Закрыл ее, создал новую миссию на основе пустой карты "кресты-круги", создавал в ней триггеры, и в какой-то момент обнаружил , что к ней "прилип" скрипт из миссии для р1. А он мне сто лет там не нужен. Еще не мог понять, почему мне при тестировании возгласы про ненайденные объекты вылетают...
Это я не знаю.

-atas-
28.08.2011, 21:20
Внутри AMission дописываем следующее:

После добавления этого куска кода в скрипт триггеры редактора начинают работать со скриптом.

Я бы добавил, что имена, группы и прочее тригеров 1 и 2 и действий 1 и 2 задаются в редакторе. Для меня это было откровением в свое время.

naryv
28.08.2011, 21:55
Именно так. Но с триггерами все просто.
Внутри AMission дописываем следующее:



public class Mission : AMission
{
// ------здесь скрипт, который уже был, его не трогать. Вставлять дописанное перед последней скобкой скрипта
// ----- вставлять отсюда -----------------
public override void OnTrigger(int missionNumber, string shortName, bool active)
{

AiAction action;
if ("tname1".Equals(shortName) && active) //tmane1 - имя 1-го триггера
{
GamePlay.gpGetTrigger(shortName).Enable = false;
action = GamePlay.gpGetAction("aname1"); //aname1 - имя действия 1, которое вызывается по срабатыванию 1-го триггера
if (action != null)
{
action.Do();
}
}

if ("tname2".Equals(shortName) && active) //tmane2 - имя 2-го триггера
{
GamePlay.gpGetTrigger(shortName).Enable = false;
action = GamePlay.gpGetAction("aname2"); //aname2 - имя действия 2, которое вызывается по срабатыванию 2-го триггера
if (action != null)
{
action.Do();
}
}
// аналогично можно вставлять сколько удодно триггеров и привязывать к ним действия


}
// ------------ до сюда
} // а это последняя скобка скрипта :)




Можно ещё проще :

public override void OnTrigger(int missionNumber, string shortName, bool active)
{
base.OnTrigger(missionNumber, shortName, active);
AiAction action = GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName));
if (action != null)
action.Do();
}
так все триггеры будут запускать одноимённые экшены, не надо на каждый триггер код писать.



После добавления этого куска кода в скрипт триггеры редактора начинают работать со скриптом.

а в чём "скрип"? Может быть MissionNumberListener неверно установлен? Напомню, на всякий случай - по умолчанию каждая миссия "слышит" только свои события, т.е. если управляющий скрипт у нас в первой запущенной миссии, она не узнает о событии вызванном триггером или актором в подгруженной другой миссии. Чтобы скрипт "слышал" все события - надо установить параметр MissionNumberListener в -1 , вот так:

public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
} , теперь такая миссия "слышит" события во всех дозагруженных миссиях .

-atas-
28.08.2011, 22:25
так все триггеры будут запускать одноимённые экшены, не надо на каждый триггер код писать.

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

Можно было бы это устранить, чтобы не обязательно было в скрипт вставлять этот код, а было бы достаточно задать триггер и акшн в редакторе. andersbravers не даст соврать, скрипты для картодела это что-то совсем непонятное и отталкивающее на первом этапе. andersbravers например сделал больше недели назад миссию для Р1, а оказалось, что триггеры заданные в редакторе в ней не работают, т.к. не прописаны в скрипте. Т.е. на тестовой карте без скрипта триггеры работают, а когда переносишь их в миссию со скриптом триггеры перестают работать. Непорядок :)

naryv
28.08.2011, 23:45
В свое время я просто не знал, что такой код можно вставить в скрипт, чтобы триггеры заданные в редакторе работали вместе со скриптом брошенным в папку миссии. Т.е. одноименные триггеры заданные в редакторе у меня срабатывали пока у миссии не было скрипта, а как только у миссии появлялся любой скрипт, то почему-то триггеры, заданные в редакторе, но не прописанные в скрипте переставали работать.

Можно было бы это устранить, чтобы не обязательно было в скрипт вставлять этот код, а было бы достаточно задать триггер и акшн в редакторе. andersbravers не даст соврать, скрипты для картодела это что-то совсем непонятное и отталкивающее на первом этапе. andersbravers например сделал больше недели назад миссию для Р1, а оказалось, что триггеры заданные в редакторе в ней не работают, т.к. не прописаны в скрипте. Т.е. на тестовой карте без скрипта триггеры работают, а когда переносишь их в миссию со скриптом триггеры перестают работать. Непорядок :) Понятно. Ну тут получается так - если создателю миссии достаточно просто триггеров и средств редактора, без скриптов - тогда связка триггер-экшн работает без скрипта. Ну а если планируется использовать скрипт - тогда надо написать, что делать с этой связкой в миссии - т.к. управление игровыми событиями переходит к скрипту, предполагается, что если создатель миссии пишет скрипт, он сможет записать и вышеописанную конструкцию, либо свою обработку реакции миссии на триггер:).

-atas-
29.08.2011, 00:12
предполагается, что если создатель миссии пишет скрипт, он сможет записать и вышеописанную конструкцию, либо свою обработку реакции миссии на триггер:).

Есть еще 3я категория пользователей, достаточно многочисленная, которая триггеры пишет в редакторе, а потом скачивает с форума какой-нибудь скрипт с нужным функционалом и бросает его в папку с миссией. Важно, чтобы все, что было создано в редакторе не переставало при этом работать, включая триггеры и экшны.

PS. Кстати, на продолжение темы танковых битв для Репки2 можно надеяться? Не к спеху, просто когда -нибудь?

Leon ZH
29.08.2011, 00:16
@ naryv
А можно ли только триггерами задать непрерывное возрождение группы или группа может возобновлятся только один раз?

-atas-
29.08.2011, 00:20
@ naryv
А можно ли только триггерами задать непрерывное возрождение группы или группа может возобновлятся только один раз?

У меня получалось, но не до бесконечности. Т.е. в какой-то момент возрождение почему-то сбивалось. Поэтому надежнее запускать группы по времени все-таки с определенным интервалом на случай, если триггер вдруг не сработает. А внутри интервала уже можно возрождать триггером.

naryv
29.08.2011, 02:14
Есть еще 3я категория пользователей, достаточно многочисленная, которая триггеры пишет в редакторе, а потом скачивает с форума какой-нибудь скрипт с нужным функционалом и бросает его в папку с миссией. Важно, чтобы все, что было создано в редакторе не переставало при этом работать, включая триггеры и экшны. ну тогда надо кусочек, что я выше привёл вставить в скрипт - тогда триггеры отработают как и задумывалось в редакторе:)


PS. Кстати, на продолжение темы танковых битв для Репки2 можно надеяться? Не к спеху, просто когда -нибудь?да, я начал делать, но сейчас очень плотно с патчем занят, чуть посвободнее буду - продолжу


@ naryv
А можно ли только триггерами задать непрерывное возрождение группы или группа может возобновлятся только один раз?честно говоря не пробовал, наверное надо поставить триггер уничтоженной группы на группу, и экшн, который будет рождать её-же. Правда не уверен, что она не посчитается уже рождённой, надо пробовать.

naryv
29.08.2011, 15:28
честно говоря не пробовал, наверное надо поставить триггер уничтоженной группы на группу, и экшн, который будет рождать её-же. Правда не уверен, что она не посчитается уже рождённой, надо пробовать. попробовал, без скрипта не получится. Дело в том, что рождённые по скрипту группы создаются уже в новой миссии а триггер работает по имени основной миссии+имя группы. В общем надо скриптом грузить миссию в которой стоит триггер на уничтожение объекта из миссии. И по этому триггеру опять грузить эту миссию, так получится бесконечный цикл уничтожения-восстановления группы.


А в патч уже поздно воткнуть фунционал зацикливания для триггера рождения (в полном редакторе)? Это ну очень бы облегчило создание миссий. Сейчас все вопят по поводу Р1, что там убив все танкеры, новые не рождаются. Т.е. можно сделать, чтобы они возродились 1 раз максимум. Но уже возникла необходимость подобных циклов для самолетов-ботов, наземки (автоколонн, н-р), и т.д.. :) нет, триггеры и экшены сделаны для общих задач, всё узкоспециализированное - только скриптами.

-atas-
29.08.2011, 16:34
В случае с ботами понятно: подмиссия рождает боты-самолеты с триггером на уничтожение, к-е уничтожают корабли в их подмиссии. Самолеты возвращаются на базу, по их прилету в заданную точку подгружается новая подмиссия с самолетами с триггером на уничтожение, и по новой. А если вместо ботов-самолетов люди? Корабли-то они потопят, но новые триггеры на уничтожение не подгрузятся, следовательно не произойдет рождение кораблей. Принцип ясен, посмотреть бы простой пример, очень назрел вопрос.

Триггеру все равно кто потопит корабли. Корабли уничтожены - триггер сработал. Триггер должен быть в подмиссии с кораблями, а не самолетами.

-atas-
29.08.2011, 17:10
Триггер 123TankerDestroyed, например, ты все равно задаешь в редакторе в подмиссии 123.mis. А дейстивие "загрузить подмиссию 123.mis" при срабатывании триггера 123TankerDestroyed прописываешь в главном скрипте миссии.

Чтобы читать скрипты советую за 2 вечера просмотреть вот эту книжку http://www.hse.ru/ru/news/25546368.html или что-то с таким же содержанием в интернете. Потом прочитать все скрипты из выложенных ранее миссий. Многие вопросы отпадут.

naryv
29.08.2011, 17:53
В случае с ботами понятно: подмиссия рождает боты-самолеты с триггером на уничтожение, к-е уничтожают корабли в их подмиссии. Самолеты возвращаются на базу, по их прилету в заданную точку подгружается новая подмиссия с самолетами с триггером на уничтожение, и по новой. А если вместо ботов-самолетов люди? Корабли-то они потопят, но новые триггеры на уничтожение не подгрузятся, следовательно не произойдет рождение кораблей. Принцип ясен, посмотреть бы простой пример, очень назрел вопрос. не так, не важно кто потопит корабль, при его потоплении, миссия с кораблём загрузится снова - вот пример: 139719 в миссии ship.mis танкер плывёт и есть триггер на его уничтожение, в основной миссии ship_respawn эта миссия грузится при старте и при потоплении танкера, по триггеру ship_Destroy из миссии ship, будет грузиться каждый раз при уничтожении танкера.


Еще вопрос по кораблям-самолетам. Скажем есть 10 танкеров, которые идут через пролив. Нужно, чтобы 1 раз в 20-30 минут возникало звено бомберов и топило эти танкеры. Вопрос вот в чем: танкеры не группируются в 1 группу. Т.е. у нас есть подмиссия с самолетами, и есть подмиссия с 10 танкерами. Если звено самолетов может одновременно атаковать только 1 танкер, то нужно создать тогда 10 подмиссий, в каждой из к-х будет по 1 танкеру? И ссылаться тогда на каждую по отдельности? Или можно каким-то образом перечислить все 10 танкеров в 1 подмиссии для авиазвена? в этом же примере группа штук атакует баржи, т.к. target не указан - боты сами разбирают себе цели.

-atas-
29.08.2011, 18:05
в этом же примере группа штук атакует баржи, т.к. target не указан - боты сами разбирают себе цели.

Вау! это решит многие проблемы.
В каком радиусе и как долго бомберы будут искать себе цели? Т.е. если танкеры только что родились где-то далеко, бомберы полетят их искать в их направлении или как долго будут ждать их подхода?
Тот же вопрос, если бомберам будет указана 3я точка маршрута с посадкой, будут ли они искать цель в каком-то радиусе или ждать ее какое-то время?
Просто есть идея возрождать танкеры по триггеру, а бомберы по времени и они могут рождаться и подходить к точке рандеву совсем не одновременно.

ps. Если танкеры и бомберы рождаются в разных подмиссиях, бомберы про танкеры будут "знать", будут их искать?

Scavenger
29.08.2011, 18:07
по времени... по времени было бы круто когда неизвестно по какому. каждый раз какое-то случайное бы.. от 25 до 45 минут. было бы интереснее, жизненнее. то вот на подходе атака, а то вот уже вот, вражеский берег близко, и тут летять!! летять наши!!!

naryv
29.08.2011, 18:53
Вау! это решит многие проблемы.
В каком радиусе и как долго бомберы будут искать себе цели? 5 км

Т.е. если танкеры только что родились где-то далеко, бомберы полетят их искать в их направлении или как долго будут ждать их подхода? если это крайняя точка маршрута - будут летать ждать.

Тот же вопрос, если бомберам будет указана 3я точка маршрута с посадкой, будут ли они искать цель в каком-то радиусе или ждать ее какое-то время? цель поищут в 5 км, если не найдут - бомбы кидают в молоко и на посадку.

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


ps. Если танкеры и бомберы рождаются в разных подмиссиях, бомберы про танкеры будут "знать", будут их искать? если таргет не указан - бомберы про корабли не знают, но когда те появятся в 5 км - "увидят", не важно из какой миссии. Можете поэкспериментировать на примере выше - в основной миссии с барж перенаправьте бомберов в район куда приходит танкер.

-atas-
29.08.2011, 20:13
Эх, примерчик не рабочий, прошу прощения. Как не скакал, ну никак не возрождаются танкеры. Загружал ship_respawn.mis. ЧЯДНТ?

Может быть танкер не до конца утонул? Обломки долго бывает плавают.

(в соседней теме написал как можно без триггеров пока сделать)

ps. директория-то правильная?

-atas-
29.08.2011, 22:04
Эх, елки-зеленые, везде где мог кидал: и в корень Dogfights и ship_respawn в папку Dogfights, путь прописывал в ship_respawn.cs, но не пошло, ни одного корабля не воссоздалось за весь вечер, Atas а у тебя?

я не пробовал. Когда перепрописывал возможно неправильно прописал. Зачем такие сложности? Не проще в /missions/ положить для проверки, если он был изначально прописан? Какие ошибки в консоль пишутся? Советую скачать файл еще раз и положить сразу куда нужно :)

naryv
29.08.2011, 22:57
да, забыл написать, что просто в missions положить надо. Ничего со слэшами делать не нужно. Насчёт барж - они для того чтобы показать как бомберы разбирают цели, подгружается после уничтожения - танкер, он идёт от круглого острова на юг, никаких барж в скрипте нет.

-atas-
29.08.2011, 23:39
а в файле ship.mis должна стоять галка рождение по скрипту? Просто по умолчанию она не стояла. И кораблик грузился сразу в начале миссии, но надписи не выскакивали. Поставил галку - кораблик перестал грузиться, зато стали выскакивать надписи. Но надписи не обязательно, а как все-таки сделать, чтобы корабль возникал именно на уничтожение баржи, а не в начале миссии? Сейчас попробую еще положить все просто в папку missions.

Галки не нужно. Корабль грузится в начале, потому что в скрипте есть строка, которая подмиссию грузит в начале. Но если его не грузить в начале, то триггер же никогда не сработает, потому что уничтожать будет нечего :) Что бы что-то уничтожить нужно это сначала загрузить. Логично?

Скрипт лучше читать перед запуском. Там обычно 50% понятно интуитивно по названию функций.

naryv
29.08.2011, 23:40
Ну да, баржи были прописаны только в файле ship_respawn.mis, они кстати автоматом поменялись на танкеры в этом файле, когда вместо них поставил танкеры в редакторе.
Был такой список:
0_Chief Ship.MotorBarge_Large1 gb /sleep 0/skill 2/slowfire 1
1_Chief Ship.MotorBarge_Large1 gb /sleep 0/skill 2/slowfire 1
2_Chief Ship.MotorBarge_Large1 gb /sleep 0/skill 2/slowfire 1
3_Chief Ship.MotorBarge_Large1 gb /sleep 0/skill 2/slowfire 1
4_Chief Ship.MotorBarge_Large1 gb /sleep 0/skill 2/slowfire 1

стал такой:

0_Chief Ship.Tanker_Medium1 gb /sleep 0/skill 2/slowfire 1
1_Chief Ship.Tanker_Medium1 gb /sleep 0/skill 2/slowfire 1
2_Chief Ship.Tanker_Medium1 gb /sleep 0/skill 2/slowfire 1
3_Chief Ship.Tanker_Medium1 gb /sleep 0/skill 2/slowfire 1
4_Chief Ship.Tanker_Medium1 gb /sleep 0/skill 2/slowfire 1 ну, это логично - если меняете баржи на танкеры - получатся танкеры:)


а в файле ship.mis должна стоять галка рождение по скрипту? нет, танкер в ship.mis не рождается экшеном, вся миссия подгружается в основную. Если галку поставите - он не родится, никакой команды на спаун ему никто не отдаст. Галка - не нужна.


Просто по умолчанию она не стояла. так и должно быть.


И кораблик грузился сразу в начале миссии, но надписи не выскакивали.
правильно, я же написал - первый танкер грузится при старте основной миссии, вот здесь:
public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
GamePlay.gpPostMissionLoad("missions\\ship.mis");
}. Можно загрузить его не на старте а по таймеру, например. Надпись выскакивает показывающая что триггер отработал.

Поставил галку - кораблик перестал грузиться, зато стали выскакивать надписи. Но надписи не обязательно, а как все-таки сделать, чтобы корабль возникал именно на уничтожение баржи, а не в начале миссии? Сейчас попробую еще положить все просто в папку missions. Чтобы миссия с танкером подгрузилась не на старте - надо сделать какое-нибудь условие, например поставить триггер на уничтожение баржи, и потом , в скрипте, написать, что при срабатывании этого триггера - надо загрузить эту ship.mis , как здесь:
public override void OnTrigger(int missionNumber, string shortName, bool active)
{

base.OnTrigger(missionNumber, shortName, active);
if ("ship_Destroed".Equals(shortName) && active)
{

GamePlay.gpHUDLogCenter("Ship destroed. New ship spawn");
GamePlay.gpPostMissionLoad("missions\\ship.mis");
}
}
только вместо "ship_Destroed" своё название триггера поставить. Что - то типа такого :

public override void OnTrigger(int missionNumber, string shortName, bool active)
{

base.OnTrigger(missionNumber, shortName, active);
if ("ship_Destroed".Equals(shortName) && active)
{

GamePlay.gpHUDLogCenter("Ship destroed. New ship spawn");
GamePlay.gpPostMissionLoad("missions\\ship.mis");
}
if ("barzha_Destroed".Equals(shortName) && active)
{

GamePlay.gpHUDLogCenter("Ship destroed. New ship spawn");
GamePlay.gpPostMissionLoad("missions\\ship.mis");
}
}

"barzha_Destroed" - это название вашего триггера

-atas-
29.08.2011, 23:42
С самого начала миссии загрузился кораблик, еще до того как штуки разбомбили баржи. Может я чего не понял :)

Почему ты решил, что баржи как-то связаны с рождением кораблика? Посмотри какой триггер в миссии стоит.

naryv же писал об этом.

ps. не успел ответить )

naryv
30.08.2011, 00:28
Просто у меня суть проблемы-то в том, что на уничтожение какого-то кораблика - нужно его возродить. В идеале было бы если бы возрождался тот самый кораблик, что и утонул. Т.е. штуки потопили вторую баржу - вторая баржа опять появилась. Потопили бы третью баржу - появилась третья баржа. Вот я про что. Я думал пример как раз про это. Нет, ну сейчас еще попробую новый вариант Ильи. Ну, не правильно сказал, все это правильно, что вы говорите, пробую, чтобы получилось как мне надо. :)для этого самый простой способ - разнести все кораблики по подмиссиям - т.е. один кораблик - одна подмиссия, и при уничтожении кораблика - грузить снова подмиссию с ним.

--- Добавлено ---


Вот еще важный вопрос: сейчас рождается 1 кораблик, независимо убили 1 баржу или все 5. А как сделать, чтобы кораблик появлялся на уничтожение каждой баржи? Т.е. убили первую - появился кораблик, убили вторую - опять появился кораблик, а не один раз как сейчас. Т.е. у меня в миссии вся фишка именно в серийности рождения кораблей. На каждый убитый танкер - должен рождаться новый. Вот в чем дело. А одного раза мало. 5 барж к респауну танкера отношения не имеют! Их можно выкинуть из миссии вообще, я их вставил, чтобы показать как задавать цель бомберам.

Вот, как выше писал - каждый танкер из своей миссии грузится, никаких больше барж:) : 139736 положить в missions, старые файлы заменить, загружаются 4 подмиссии в каждой идёт танкер, соответственно 4 штуки идут от круглого острова на юг, при уничтожении какого-то из них опять подгрузится миссия с уничтоженным и он начнёт свой скорбный путь заново:)

Leon ZH
30.08.2011, 08:30
да, забыл написать, что просто в missions положить надо. Ничего со слэшами делать не нужно. Насчёт барж - они для того чтобы показать как бомберы разбирают цели, подгружается после уничтожения - танкер, он идёт от круглого острова на юг, никаких барж в скрипте нет.

А в какую папку missions положить multi/dogfight, чтобы посмотреть как работает возрождение кораблей?

Leon ZH
30.08.2011, 08:35
@andersbravers

Может anders ты подскажешь.

--- Добавлено ---

Спасибо!

-atas-
30.08.2011, 10:11
@ naryv

А как сделать, чтобы новые корабли на обломки не наезжали или по крайней мере не рождались внутри обломков?

Этот вопрос уже был по статическим кораблям, зениткам и проч. Т.е. если новы объект рождается на месте обломков обломки надо бы убрать. ИМХО лучше в коде игры, чтобы каждый объект в скрипте не прописывать.

Пока это не возможно, что добавить в скрипт , чтобы при приближении к обломкам возродившегося танкера идущего по тому же маршруту их убирать? Или для начала не рождать танкер в обломках? В идеале можно рядом рождать, а обломки уничтожать через час, например, чтобы сервер не грузили. Или обломки за час сами исчезнут? Некоторые суда садятся на мель после бомбардировки и не исчезают.

Пересечение объектов некрасиво смотрится. В коде бы "защиту от дурака" вставить. В моей миссии то же самое было.

-atas-
30.08.2011, 14:31
Вопрос: перебивает ли скрипт миссии триггеры внутри нее или подмиссий? Т.е. если в редакторе задать триггер, а затем прописать скрипты в .cs-файле, т.е. мнение, что скрипты (возможно некоторые) могут отключать действия триггеров.

на 12й странице Веточка и naryv объяснили как триггеры в скрипт прописывать. Если не прописать, не будут работать. Т.е. ты триггер делаешь в редакторе, а потом описываешь его в скрипте. В примере с кораблями так сделано тоже. По другому никак.

-atas-
30.08.2011, 15:33
Т.е. в приниципе не вижу оснований почему тогда в таком случае не вставить вчерашний скрипт с кораблями от naryv, если триггеры могут быть "услышаны"? Там MissionNumberListener = -1 - как раз, чтобы было слышно триггер возрождения кораблей.



Против триггеров никто не возражает, просто для сервера лучше запустить хотя бы что-то на 1м этапе, а потом добавлять поэтапно только рабочие версии, включая триггеры. Сейчас я так понимаю и танкеры на сервере не возрождаются и ИИ бомберы на сервере не летают совсем. Не дело это держать сервер с нерабочей версией

лучше в соседней теме

naryv
30.08.2011, 16:28
Илья, еще раз спасибо за корабли, все работало безукоризненно, с первой попытки! Вопрос возник такого плана: а можно ли каким-то образом создавать группы кораблей, по типу самолетов? Ну, такое своеобразное "звено". Т.е. выбрал кораблик, поставил количество, допустим 4, задал строй - "кильватер", "правый пеленг", "левый пеленг", "фронт", ну и т.д. Если такое невозможно (в редакторе вроде не встречал), то планируется ли включить со временем? Было бы очень удобно ПМСМ :). Нет, нельзя, корабль уже является "группой" состоящей из отдельных частей связанных вместе.


@ naryv

А как сделать, чтобы новые корабли на обломки не наезжали или по крайней мере не рождались внутри обломков?
Я бы рождал новые после таймаута, например, так:

base.OnTrigger(missionNumber, shortName, active);
if ("ship_Destroed".Equals(shortName) && active)
{
GamePlay.gpHUDLogCenter("Ship destroed. New ship will be spawn 3 minutes later");
Timeout(180, () => {
GamePlay.gpPostMissionLoad("missions\\ship.mis");
});

} новый корабль загрузится соответственно через три минуты, не будет один в другом рождаться.


Этот вопрос уже был по статическим кораблям, зениткам и проч. Т.е. если новы объект рождается на месте обломков обломки надо бы убрать. ИМХО лучше в коде игры, чтобы каждый объект в скрипте не прописывать. да по идее обломки через какое-то время должны исчезать сами, минут 20 по-моему.


Пока это не возможно, что добавить в скрипт , чтобы при приближении к обломкам возродившегося танкера идущего по тому же маршруту их убирать? Или для начала не рождать танкер в обломках? В идеале можно рядом рождать, а обломки уничтожать через час, например, чтобы сервер не грузили. Или обломки за час сами исчезнут? Некоторые суда садятся на мель после бомбардировки и не исчезают. за час должны бы исчезнуть уже. На мель не садятся, просто недобитые - плавучесть сохранилась, если пробоины мелкие - заполнятся трюмы могут и несколько часов до потопления, хотя так редко бывает.


Пересечение объектов некрасиво смотрится. В коде бы "защиту от дурака" вставить. В моей миссии то же самое было. есть временная задержка на прогнозирование наземкой своего пути - поэтому в колонне часто в подбитого кто-то врезается, не успевает среагировать. Иначе все ресурсы уйдут на обнаружение наземкой новых препятствий у себя на пути, а так они "видят" препятствие если оно стоит уже какое-то время, секунд 10 вроде.


Вот кстати про это тоже хотел сказать, что можно ли задать задержку рождения танкеров скажем 10 мин, чтобы если он даже родится в самом начале пути, то другой тут же не наезжал на него, а давал возможность в течение 10 мин потонуть первому. Ну или удаление обломков через 5 мин, рождение нового танкера - через 10 мин. Потому как многие тоже жаловались, что в миссии на Р1 обломки не уничтожаются, плавают там себе под водой, вводят комрадов в заблуждение. :D см. выше, пример с таймаутом, время таймаута задаётся в секундах.


И еще: теперь, когда с кораблями разобрались, остро встал вопрос окончания миссии. Т.е. танкер приходит в порт, и миссия перезагружается. Как это грамотно сделать? Ну, допустим, один из танкеров прорвался таки в порт противника, достиг заданной точки - все, конец миссии, надпись на экране "В этот раз вы проиграли, герр, в следующий раз вы обязательно победите!"? :) Рестарт битвы на сервере надо делать battle Stop и battle Start . Ну или можно по всем объектам пробежать и дестроить их, тогда с карты можно не уходить, самолёты тоже можно оставить, а потом загрузить первую миссию.


Еще возникал вопрос по стату: возможно ли вести статистику, кто сколько раз победил? Ну допустим, если миссия в целом будет работать по 4-6 часов, то несколько раз она перезагрузится точно, можно как раз вести статистику, н-р красные-синие - 6:0 или 25:32, ну и т.д. так в течение времени будет накапливаться. да, конечно ввести переменные для счёта и по разным событиям их изменять, я в миссиях которые раньше выкладывал показывал как.

-atas-
30.08.2011, 18:20
Рестарт битвы на сервере надо делать battle Stop и battle Start . Ну или можно по всем объектам пробежать и дестроить их, тогда с карты можно не уходить, самолёты тоже можно оставить, а потом загрузить первую миссию.

На Репках и Синдикате от battle Stop и battle Start пришлось отказаться, т.к. вылезали ошибки notDestroyedActor, которые как-то глючили, не помню уже. Видимо остается 2й вариант - дестроить всех акторов кроме игроков, написать на экране о победе\поражении, счет +1, и о том, что "Миссия перезагружена, проверьте карту" :) Чтобы те кто в воздухе на аэродром противника не садились.

--- Добавлено ---



есть временная задержка на прогнозирование наземкой своего пути - поэтому в колонне часто в подбитого кто-то врезается, не успевает среагировать. Иначе все ресурсы уйдут на обнаружение наземкой новых препятствий у себя на пути, а так они "видят" препятствие если оно стоит уже какое-то время, секунд 10 вроде.

В бою это каждый раз происходит. Их бы клином или уступом развернуть заранее. Можно везде кроме мостов и населенных пунктов. И тольлько на мостах и в городах пусть в колонно перестраиваются. Антуражнее будет и ресурсов не больше.

--- Добавлено ---



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

В прошлой миссии с Р1 по 3-4 корабля недотопленных в цепочку собирались. Выкладывал ссылку на галерею багов Р1 в теме про баги.

Сейчас то же самое получится в новой миссии. Через 30-40 минут новый корабль может врезаться в недотопленный прошлый корабль. Или триггер не сработает пока корабль ко дну не пошел совсем? ИИ капитанов на судах нет, чтобы обходить обломки как танки хотя бы?

Small_Bee
30.08.2011, 19:38
В прошлой миссии с Р1 по 3-4 корабля недотопленных в цепочку собирались. Выкладывал ссылку на галерею багов Р1 в теме про баги.

Сейчас то же самое получится в новой миссии. Через 30-40 минут новый корабль может врезаться в недотопленный прошлый корабль. Или триггер не сработает пока корабль ко дну не пошел совсем? ИИ капитанов на судах нет, чтобы обходить обломки как танки хотя бы?

Надо, даже обязательно надо, четко отслеживать момент, что бы не рождалось наземки больше, чем уничтожалось.
Например, это делается так - миссия-хост загружает (назовем все миссии, отличные от стартовой - слейвами) слейв только один раз. И слейв сам себя контролирует. В случае с колоннами чуть сложнее, в случае с танкерами - слейв самостоятельно отслеживает состояние своего танкера (найти его не проблема, по-умолчанию миссия вызывает методы только для своих объектов), и, по условию, перед тем как загрузить сама себя, принудительно танкер уничтожает. Точно также и танки - перед загрузкой самой себя слейв прибивает все свои объекты. Тогда не будет лишних обломков и битва не будет зарастать мусором.
Недостаток такого подхода очевиден, слейв ничего не знает о событиях в масштабе битвы. За исключением, конечно, прямого приказа слушать все события. Но все равно он ничего не знает о пользовательских данных хоста (счет и т.д). Это можно обойти чуть более сложным методом:
1. Именовать объекты в миссии таким способом, что бы хост точно знал, к какой миссии какой объект относится. Перед загрузкой нового слейва убиваем все объекты старые прямо из хоста. Имена объектов можно менять прямо в файле (имена подчиняются определенным правилам правда).
2. Любой актор в полном имени содержит в начале номер миссии к которой принадлежит. Загружаем слейв, реагируем на OnMissionLoaded - в параметре передается номер свежей миссии. Все, мы можем выборочно убивать объекты по номеру. Далее загрузили следующую, и т.д.
3. Если не ошибаюсь, можно получить доступ к номеру, который будет присвоен следующей загруженной миссии. Тогда перез загрузкой новой миссии просто запоминаем этот номер. Далее как во втором пункте.

Идея всего вышеописанного - обязательно убирать за собой перед повторной загрузкой. Тогда и танкеры не будут упираться в своих предшественников.

Kros
30.08.2011, 20:20
Подскажите, с команд скрипта можно влиять на управление самолета игрока? Ну допустив взять и отклонить на определенный угол элерон или руль высоты, т.е. я задам в скрипте значение переменной которое отклонит руль на 5 едениц. Если можно то какие параметры или классы (не знаю как назвать) за это отвечают, пример в коде былбы кстати.

Vetochka
30.08.2011, 21:48
А как напрямую получить статистику по игроку во время миссии? Я имею в виду ганстат, киллы, смерти и т.д. в общем все что есть.

Tata33
01.09.2011, 15:49
Два вопроса:
1. Нужен скрипт на подчистку трупов кораблей, самолетов в миссии.
2. Есть такой скрипт, к-й выводит сообщения для бомбардировщиков:

{
case 1:
if (aircraft.Type() == AircraftType.Bomber)
{ 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 { GamePlay.gpHUDLogCenter(new Player[] { player }, "You should cover bombers in Folkestone-Calais. Прикрывайте бомберов в Фолкстон-Кале."); }
break;

Есть место рождения синих, к-му назначен статус бомберского. На этом месте могут появляться также штуки и Ю-88, но они относятся к классу divebomber. Как сделать так, чтобы сообщения, предназначенные для bomber, выходили также для divebomber? Решит ли проблему добавление такого куска:

{
case 1:
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.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;

--- Добавлено ---

Есть еще давний вопрос, он был задан при тестировании миссии на Р1, довольно интересный:
"А, и ещё вопрос - а как различить которые кораблики свои,а которые нет? Флагов я никаких на танкерах не заметил... Может плохо смотрел?"

Предусмотрено ли различие по флагам в зависимости от принадлежности корабля той или иной стороне?

А здесь нельзя ещё по одному уровню 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;

Small_Bee
02.09.2011, 15:10
Помогите, други! Как чистить трупы кораблей и крафтов? Точки на воде - это они, мертвяки, сидят и ждут свою жертву... %)()

А Destroy() не помогает?

http://www.sukhoi.ru/forum/showthread.php?t=68369&p=1602377&viewfull=1#post1602377
Здесь пример, как убрать трупики через определенное время.

Решение для штурцев без дублирования кода


if (aircraft.Type() == AircraftType.Bomber || aircraft.Type() == AircraftType.Divebomber) { ... }

-atas-
02.09.2011, 17:29
()

А Destroy() не помогает?


У меня с кораблями засада была, они как-то не так как самолеты и танки уничтожаются.
Вот так будет работать?

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(); // уничтожаем
}
}
);
}
}
}
}
}

AiCart - это вообще кто такой?

Small_Bee
02.09.2011, 17:35
У меня с кораблями засада была, они как-то не так как самолеты и танки уничтожаются.
Вот так будет работать?

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(); // уничтожаем
}
}
);
}
}
}
}
}
AiCart - это вообще кто такой?

Должон походу, у меня убивались - вроде ж я этот код и писал (или один из вариантов). Корабль есть группа. Сколько там мемберов хз - грохаем всех. AiCart это какой-то базовый интерфейс, именно в нем определен метод Destroy(), поэтому его и юзаю, как самый элементарный.

-atas-
02.09.2011, 17:37
Это вот про это (по ссылке):
Так тоже попробуй, кажется 1 или 2х скобок низу не хватает.

--- Добавлено ---


Должон походу, у меня убивались - вроде ж я этот код и писал (или один из вариантов). Корабль есть группа. Сколько там мемберов хз - грохаем всех. AiCart это какой-то базовый интерфейс, именно в нем определен метод Destroy(), поэтому его и юзаю, как самый элементарный.

ОК, спасибо, значит лучше так.

OnActorDead когда случается? Когда корабль тонуть начинает или когда уже утонул? там обломков полузатонувших много нужно убирать.

Small_Bee
02.09.2011, 17:48
OnActorDead когда случается? Когда корабль тонуть начинает или когда уже утонул? там обломков полузатонувших много нужно убирать.

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

Самый простой вариант - миссия контролирует сама себя. для этого

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

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

-atas-
02.09.2011, 17:54
Я где то выше писал - просто таки необходимо, что бы при повторной загрузке подмиссии убивать объекты, которые породила предыдущая загрузка.

Мы это сами не сочиним. Готового варианта скрипта нет для зачистки?

Там кстати кораблики рождаются каждые 40 минут (или час), а плыть им 2.5 часа. Т.е. убивать их нельзя перед повторной загрузкой, они треть пути только пройдут. Сейчас стоит вопрос только об обломках а не о целых кораблях. Целые мы в конце пути превратим в обломки.

Small_Bee
02.09.2011, 18:12
Пример такой организации по той же ссылке, что я выше дал. Миссия с танками грузит сама себя, когда ее танки уничтожены. Может играть до бесконечности(вернее исчерпания Int64 :)), никакого мусора.

Не грузите миссии по таймеру из хоста. Сделайте загрузку миссий волнами - первая группа миссий, через 40 минут вторую группу миссий (не эту же самую!) еще через 40 еще группу миссий. И т.д. В каждой - по кораблику. Можно и несколько, но тогда и появляться они толпой будут. А она уже сама разбирается, когда ей загрузится повторно - это может быть таймер, TaskCompleted (кораблик приехал), ActorDead или все вместе и т.д. И перед загрузкой, если кораблик еще как-то есть, делаем ему дестрой. Все. Только не пересекайте маршруты.

Плюсы. Никакого мусора. Четко знаем, сколько корабликов максимум одновременно плавает. Убить сервер толпой юнитов исключено.

-atas-
02.09.2011, 20:03
Пример такой организации по той же ссылке, что я выше дал. Миссия с танками грузит сама себя, когда ее танки уничтожены. Может играть до бесконечности(вернее исчерпания Int64 :)), никакого мусора.

Не грузите миссии по таймеру из хоста. Сделайте загрузку миссий волнами - первая группа миссий, через 40 минут вторую группу миссий (не эту же самую!) еще через 40 еще группу миссий. И т.д. В каждой - по кораблику. Можно и несколько, но тогда и появляться они толпой будут. А она уже сама разбирается, когда ей загрузится повторно - это может быть таймер, TaskCompleted (кораблик приехал), ActorDead или все вместе и т.д. И перед загрузкой, если кораблик еще как-то есть, делаем ему дестрой. Все. Только не пересекайте маршруты.

Плюсы. Никакого мусора. Четко знаем, сколько корабликов максимум одновременно плавает. Убить сервер толпой юнитов исключено.

Т.е. у каждой подмиссии свой скрипт будет?

Волны грузить по таймеру?

В этом случае хост должен все миссии слушать или нет?

Small_Bee
02.09.2011, 21:02
Т.е. у каждой подмиссии свой скрипт будет?

Волны грузить по таймеру?

В этом случае хост должен все миссии слушать или нет?

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

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

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

-atas-
02.09.2011, 22:01
Интересно, спасибо, я как-то старался одним скриптом обходиться, т.к. даже в одном путаюсь :)

-atas-
02.09.2011, 23:02
Там, где у Small_Bee моноготочие - это место для твоего кода по-моему. Посмотри какой раньше был скрипт и в какую часть Small_Bee divebomber добавил. Добавь так же.

Small_Bee
03.09.2011, 01:51
Интересно, спасибо, я как-то старался одним скриптом обходиться, т.к. даже в одном путаюсь :)

Hаоборот. Разобраться в десяти маленьких проще чем в одном большом. Читать проще, картину лучше видно.

--- Добавлено ---


Там, где у Small_Bee моноготочие - это место для твоего кода по-моему. Посмотри какой раньше был скрипт и в какую часть Small_Bee divebomber добавил. Добавь так же.

Все верно, на место троеточия -код. В фигурных скобках код выполнится, если выражение в круглых скобках будет верно. В данном случае мы говорим

если ТипСамолета = Бомбер или ТипСамолета = Пикировщик тогда делаем то, что заключено в следующие фигурные скобки.

Small_Bee
03.09.2011, 15:33
последний раз так писал не помогло тоже...


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

Уточнил тут - AircraftType имеет аттрибут флага, это значит что самолет может иметь несколько разных типов одновременно, т.е. и проверка будет другая. По свободе подправлю.
Если ничего не работает, открывай консоль - там будут видны ошибки какие были.

naryv
05.09.2011, 11:19
На Репках и Синдикате от battle Stop и battle Start пришлось отказаться, т.к. вылезали ошибки notDestroyedActor, которые как-то глючили, не помню уже.
не видя ошибки сложно сказать что и почему глючило.

Видимо остается 2й вариант - дестроить всех акторов кроме игроков, написать на экране о победе\поражении, счет +1, и о том, что "Миссия перезагружена, проверьте карту" :) Чтобы те кто в воздухе на аэродром противника не садились. да, вполне вариант.


В бою это каждый раз происходит. Их бы клином или уступом развернуть заранее. Можно везде кроме мостов и населенных пунктов. И тольлько на мостах и в городах пусть в колонно перестраиваются. Антуражнее будет и ресурсов не больше. там зависит от того какой бой, если с ходу вступили - могут не успеть перестроится, или дорога удобная - тогда колонной продолжат идти. А так вообще в бою должны перестраиваться.


В прошлой миссии с Р1 по 3-4 корабля недотопленных в цепочку собирались. Выкладывал ссылку на галерею багов Р1 в теме про баги.

Сейчас то же самое получится в новой миссии. Через 30-40 минут новый корабль может врезаться в недотопленный прошлый корабль. Или триггер не сработает пока корабль ко дну не пошел совсем? ИИ капитанов на судах нет, чтобы обходить обломки как танки хотя бы? "капитаны" есть, насчёт препятствий посмотрю, почему не обруливают.


Подскажите, с команд скрипта можно влиять на управление самолета игрока? Ну допустив взять и отклонить на определенный угол элерон или руль высоты, т.е. я задам в скрипте значение переменной которое отклонит руль на 5 едениц. Если можно то какие параметры или классы (не знаю как назвать) за это отвечают, пример в коде былбы кстати. нет, нельзя управлять так самолётом.


На карте проложил дороги, вид=>проложить дороги=>Apply to map. В миссии их было видно, когда миссия загружена на сервер - дороги не видно: ни бетонки аэродрома, ни ж/д дороги, ни грунтовых стоянок - все исчезло, как будто их там и не было... дороги, емнип в файл с расширением .misroads идут, его тоже надо на сервер загрузить.

-atas-
05.09.2011, 14:27
не видя ошибки сложно сказать что и почему глючило.

Вот такое было http://www.sukhoi.ru/forum/showthread.php?t=68697&page=4&p=1621897&viewfull=1#post1621897
battle stop актеров не убирает с сервера.

Small_Bee
05.09.2011, 16:41
Пробовал вчера из основной миссии делать загрузку подмиссий а подчистку мертвяков делать в самих подмиссиях. Работает. Зацикливание по тикам, т.е. через определенные интервалы времени, в подмиссиях не работает. Поэтому вынес их опять в основную миссию. А мертвяки чистятся в подмиссиях.

--- Добавлено ---

Small_Bee, как я понял в идеале лучше делать зацикливание в самой подмиссии, чтобы она убитые статики за собой чистила? Но у меня вчера мертвяки, повторюсь, чистились, а перезагрузка миссии самой себя не работала. ЧЯДНТ? А по одному разу-то подмиссии проскочили.

Ответил здесь - http://www.sukhoi.ru/forum/showthread.php?t=68369&p=1685346&viewfull=1#post1685346

-atas-
07.09.2011, 00:21
@ naryv

Большое спасибо за странички брифинга в меню и на карте в онлайне. Порадовало больше, чем звук :) Можно ли их содержание менять динамически в процессе хода миссии? Хотя бы подгружать туда несколько строк с обновленными целями?

Единственное, что смущает, это что по умолчанию брифинг скрыт, что драматически понижает его читаемость, которая даже в Ил-2 страдала :) Тем более хорошо, что он на карте дублируется. Придется в полете напоминалки писать, чтобы брифинг смотрели.

Ангары пока не удалось потестировать. Удалось ли исправить рождение многомоторных самолетов в одномоторных ангарах с последующим взрывом?

Small_Bee
07.09.2011, 00:39
Вот интересный новый метод появился в классе миссии - OnOrderMissionMenuSelected(player, ID, menuItemIndex); любопытненько... :)
и в геймплее новый метод - gpSetOrderMissionMenu(Player player, bool thisSubMenu, int ID, string[] keys, bool[] bSubMenu);... Гм. :)

А для Player есть LanguageName() - языковая проблема походу решена.
и Ping() есть. По идее можно по пингу кикнуть, но как пока не нашел.

naryv
07.09.2011, 14:23
@ naryv

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


Можно ли их содержание менять динамически в процессе хода миссии? Хотя бы подгружать туда несколько строк с обновленными целями?
При подгрузке миссии со своими брифингами - они обновляются. Т.е. если загружаем миссию с новым брифингом для какой-то страны - этот брифинг будет отображаться для этой страны.



Единственное, что смущает, это что по умолчанию брифинг скрыт, что драматически понижает его читаемость, которая даже в Ил-2 страдала :) Тем более хорошо, что он на карте дублируется. Придется в полете напоминалки писать, чтобы брифинг смотрели. При выборе стороны, емнип, кнопка брифинга доступной становится.


Ангары пока не удалось потестировать. Удалось ли исправить рождение многомоторных самолетов в одномоторных ангарах с последующим взрывом? пока нет но работаем над этим.


Вот интересный новый метод появился в классе миссии - OnOrderMissionMenuSelected(player, ID, menuItemIndex); любопытненько... :)
и в геймплее новый метод - gpSetOrderMissionMenu(Player player, bool thisSubMenu, int ID, string[] keys, bool[] bSubMenu);... Гм. :) :) старались. Да, теперь можно делать юзерское меню, разной степени вложенности, и выполнять действия по выборам меню, например так

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());
}
}
}
вызывается по <Tab> +<4> :)

А для Player есть LanguageName() - языковая проблема походу решена. да, теперь можно на "родном" языке писать сообщения.

и Ping() есть. По идее можно по пингу кикнуть, но как пока не нашел. кикать сервер должен, можно, наверное, ему кидать команду, но это точно не знаю.

Small_Bee
07.09.2011, 14:37
Ай карашо! :) Насколько я понимаю, меню выбора миссий можно использовать не только для загрузки миссий, а для чего душе угодно. Например, игрок может запросить текущую ситуацию. Или в качестве разведчика указать цель для налета бомбардировщиков. Ай карашо!

-atas-
07.09.2011, 14:50
Брифинг написал в миссии, даже звук с картинкой попробовал подгрузить, но в брифинг так и не удалось проникнуть. ЧЯДНТ? :)

Ответ в соседней теме читал? Ты какой брифинг создал, армии или общий или регулярный? Показывается брифинг армии в онлайне.

-atas-
07.09.2011, 15:20
регулярные - их можно привязать к конкретной группе самолётов, выбирается в редакторе в свойствах группы.


Хотелось бы еще к спаун-точке привязать в онлайне. А на вкладке карты пилота какой из брифингов показывается? Видимо желательно все показывать по порядку (общий, стороны и регулярный). На вкладку брифинга удобнее кнопкой переходить, как в других симах, чем меню по ПКМ. Правую руку нельзя надолго с РУСа убирать, а левой в меню не получается так ловко = неудобство. К тому же меню вообще редко кто открывает, а кнопка привлечет внимание сразу.



При подгрузке миссии со своими брифингами - они обновляются. Т.е. если загружаем миссию с новым брифингом для какой-то страны - этот брифинг будет отображаться для этой страны.


Т.е. можно к каждой подгружаемой\сгенеренной миссии скриптом генерить брифинг (текстовый файл) с новыми координатами целей, например, перед подгрузкой этой миссии или скриптом не получится брифинг сгенерить?



пока нет но работаем над этим.

Спасибо! А как-то хитро скриптом нельзя все ангары временно сделать совсем недоступными?



:) старались. Да, теперь можно делать юзерское меню, разной степени вложенности, и выполнять действия по выборам меню


За это отдельное спасибо!
Получается, можно будет прикручивать разные голосовалки, выборы офицера\ров. Разрешать офицерам выбирать новые направления атаки, новые типы миссий, запрашивать поставки топлива и боеприпасов, посылать ботов на разные задания прямо из игры?

А текст из чата скрипты научились перехватывать, чтобы пароли у игроков запрашивать, например? Где-то читал, что раньше это было невозможно.



кикать сервер должен, можно, наверное, ему кидать команду, но это точно не знаю.

Если можно это уточнить, все игроки серверов Repka были бы благодарны. Австраллийцы и Бразильцы десинк вызывают частенько.

Еще вопрос про инструменты карты и различные вейпойнты, которые там можно ставить (иконки кораблей, танков и т.п.). Можно ли как-то ставить вейпойнты, чтобы они были видны всей стороне или добавить такой инструмент?

Можно ли скриптом ставить вейпойнты на карту пилота? и на карту в брифинге? Можно ли в редакторе ставить такие вейпойнты на карту брифинга и пилота?

--- Добавлено ---


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

Только в хост-миссию воткни 2 брифинга в редакторе: Blue Army и Red Army.

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

--- Добавлено ---



А для Player есть LanguageName() - языковая проблема походу решена.

А есть где-то список этих системных многоязыковых сообщений и пример как их вызывать скриптом? Они в какой чат пишутся? Ботов или Server? Они голосом ботов дублируются?

Scavenger
07.09.2011, 15:23
кстати мысль возникла. послабление это или нет, можно подумать. мысль такова. показывать местонахождение на карте только сам самолет пилоты было бы тоже неправильно. gps какой-то. а вот подсвечивать квадрат где пилот сейчас летит - было бы не в пример интереснее.

Small_Bee
07.09.2011, 15:28
Илья, спасибо за работу, молодца, так держать! С кнопкой вчера ну никак не получалось выбрать. Брифинг написал в миссии, даже звук с картинкой попробовал подгрузить, но в брифинг так и не удалось проникнуть. ЧЯДНТ? :)
ЗЫ. Армию выбирал, аэродром, но брифинг все равно не грузился.

--- Добавлено ---


В смысле можно Тайгер заслать в качестве разведчика, а он будет сливать оперативную обстановку в районе боевых действий?

Нефиг шо. Игроку на тайгере делаем менюшку "Бздынь!", он ее жмакает, миссия рисует бомберов в точкой атаки там где был тайгер, и вперед!. Или собирать куда нить в определенном радиусе от тайгера координаты вражьей наземки и после посадки к примеру вывешивать ее в брифинге или еще где.

PS сам правда пока не пробовал, но в теории походу можно. :)

Small_Bee
07.09.2011, 15:38
А есть где-то список этих системных многоязыковых сообщений и пример как их вызывать скриптом? Они в какой чат пишутся? Ботов или Server? Они голосом ботов дублируются?

Есть для 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;
}

LevPZ
07.09.2011, 15:46
Андерс, ты когда составляешь маршрут самолётов в миссии, старайся делать так, что бы маршрут имел линию без пересечений от рождения до посадки, иначе часто сбивается задание, и не надо делать так много точек бомбить-цель, достаточно 2-х, 3-х. Вообще если у самолётов стоят даже точки "обычный полёт" то бомберы при пролёте над целью будут её бомбить, а истребители вступать в бой с любой целью( это точка автомат по умолчанию ИИ сам принимает решение). Сейчас в начале миссии тока синие бомберы бомбят, а красные пролетают в стороне.

-atas-
07.09.2011, 16:01
Или собирать куда нить в определенном радиусе от тайгера координаты вражьей наземки и после посадки к примеру вывешивать ее в брифинге или еще где.

Можно сразу координаты целей в чат передавать: "танки, самолеты, арта, ... в квадрате..." Радио же было уже в то время. А после посадки только скриншоты выкладывать.

зы. Недавно вышел знаменитый PR мод для ArmA2. Там куча кастомных менюшек и действий заскриптовано.

naryv
07.09.2011, 16:15
Ай карашо! :) Насколько я понимаю, меню выбора миссий можно использовать не только для загрузки миссий, а для чего душе угодно. Например, игрок может запросить текущую ситуацию. Или в качестве разведчика указать цель для налета бомбардировщиков. Ай карашо! да, естественно, выбор меню просто генерирует событие, а обрабатывать его можно как угодно, ну и сами меню динамически строить:).


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

А на вкладке карты пилота какой из брифингов показывается? Видимо желательно все показывать по порядку (общий, стороны и регулярный). если есть регулярный - он показывается, если его нет - тогда стороны.


На вкладку брифинга удобнее кнопкой переходить, как в других симах, чем меню по ПКМ. Правую руку нельзя надолго с РУСа убирать, а левой в меню не получается так ловко = неудобство. К тому же меню вообще редко кто открывает, а кнопка привлечет внимание сразу. учтём, но вряд-ли скоро.


Т.е. можно к каждой подгружаемой\сгенеренной миссии скриптом генерить брифинг (текстовый файл) с новыми координатами целей, например, перед подгрузкой этой миссии или скриптом не получится брифинг сгенерить? с подгружённой миссией пробовал - грузится новый брифинг, с генерёнными не пробовал, но теоретически должно работать - никаких препятствий к этому нет.


Спасибо! А как-то хитро скриптом нельзя все ангары временно сделать совсем недоступными? нет, увы. Но на части маленьких карт выдвинули парковочные точки из ангаров - там не должны взрываться.


За это отдельное спасибо!
Получается, можно будет прикручивать разные голосовалки, выборы офицера\ров. Разрешать офицерам выбирать новые направления атаки, новые типы миссий, запрашивать поставки топлива и боеприпасов, посылать ботов на разные задания прямо из игры? да, именно так, только, естественно, это всё в скрипте надо закодить.


А текст из чата скрипты научились перехватывать, чтобы пароли у игроков запрашивать, например? Где-то читал, что раньше это было невозможно. нет, нельзя. Пароль при входе на сервер должно спрашивать, если он запаролен.


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


Еще вопрос про инструменты карты и различные вейпойнты, которые там можно ставить (иконки кораблей, танков и т.п.). Можно ли как-то ставить вейпойнты, чтобы они были видны всей стороне или добавить такой инструмент?


Можно ли скриптом ставить вейпойнты на карту пилота? и на карту в брифинге? Можно ли в редакторе ставить такие вейпойнты на карту брифинга и пилота?
так и планировалось, но пока не доделано.

-atas-
07.09.2011, 16:38
нет, нельзя. Пароль при входе на сервер должно спрашивать, если он запаролен.

Имеется в виду пароль игрока, а не пароль сервера. Т.е. если в онлайн проекте за игроком или за сквадом закреплены хорошие самолеты, то нельзя, чтобы кто-то другой зашел под ником этого игрока или члена сквада и эти самолеты использовал. Для этого при входе на сервер в проектах типа ADW каждый игрок вводил свой личный пароль и отправлял на канал Server. Как это сделать в БзБ?

Опять же, чтобы через кастомное меню вызвать бомберов на атаку цели полезно квадрат атаки указать руками в чате, т.к. меню с перчислением всех квадратов на карте пролива будет очень длинным и неудобным. Или, например, новый курс ИИ группе было бы удобнее с клавиатуры вводить с точностью до градуса, чем из меню выбирать.

Клавиатура - необходимый инструмент, было бы обидно если через нее нельзя было бы общаться со скриптами.

Small_Bee
07.09.2011, 16:49
Имеется в виду пароль игрока, а не пароль сервера. Т.е. если в онлайн проекте за игроком или за сквадом закреплены хорошие самолеты нельзя, чтобы кто-то другой зашел под ником этого игрока или члена сквада и эти самолеты использовал. Для этого при входе на сервер в проектах типа ADW каждый игрок вводил свой личный пароль и отправлял на канал Server. Как это сделать в БзБ?

Опять же, чтобы через кастомное меню вызвать бомберов на атаку цели полезно квадрат атаки указать руками в чате, т.к. меню с перчислением всех квадратов на карте пролива будет очень длинным и неудобным. Или, например, новый курс ИИ группе было бы удобнее с клавиатуры вводить с точностью до градуса, чем из меню выбирать.

Клавиатура - необходимый инструмент, было бы обидно если через нее нельзя было бы общаться со скриптами.

Все это, если не ошибаюсь, можно будет реализовать в серверном аддоне.. По крайней мере там вроде видел методы относительно чата и т.д.

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

-atas-
08.09.2011, 13:31
:) старались. Да, теперь можно делать юзерское меню, разной степени вложенности, и выполнять действия по выборам меню, например так

Пример менюшки http://simhq.com/forum/ubbthreads.php/topics/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});
}
}

}

}

-atas-
09.09.2011, 18:56
Цитата Сообщение от naryv Посмотреть сообщение
нет, нельзя. Пароль при входе на сервер должно спрашивать, если он запаролен.Имеется в виду пароль игрока, а не пароль сервера. Т.е. если в онлайн проекте за игроком или за сквадом закреплены хорошие самолеты, то нельзя, чтобы кто-то другой зашел под ником этого игрока или члена сквада и эти самолеты использовал. Для этого при входе на сервер в проектах типа ADW каждый игрок вводил свой личный пароль и отправлял на канал Server. Как это сделать в БзБ?

В этой связи возник вопрос: может ли скрипт получить Steam ID игрока, чтобы проверять уникальность игрока не по нику и паролю, а по Steam ID ?

podvoxx
23.09.2011, 15:02
Нефиг шо. Игроку на тайгере делаем менюшку "Бздынь!", он ее жмакает, миссия рисует бомберов в точкой атаки там где был тайгер, и вперед!. Или собирать куда нить в определенном радиусе от тайгера координаты вражьей наземки и после посадки к примеру вывешивать ее в брифинге или еще где.
PS сам правда пока не пробовал, но в теории походу можно. :)

Ох, неужели нормальную разведку можно будет сделать.:cool: Прощайте дымы и расстрелянные машинки

Vetochka
29.09.2011, 19:27
В этой связи возник вопрос: может ли скрипт получить Steam ID игрока, чтобы проверять уникальность игрока не по нику и паролю, а по Steam ID ?
Кстати, да. Очень полезный вопрос и не только с точки зрения создания проектов. :)
И есть ли уже реализация каких-нибудь админских функций?

podvoxx
30.09.2011, 15:06
Есть пара вопросов.

Тестировать онлайн миссии лучше на сервере созданном из игры или на выделенном? (выделенный вылетает, наверное мощности ПК не хватает)

На данный момент можно вызвать скриптом звуковой файл во время миссии и вывести на экран текст от имени бота? Например, если попал по врагу хорошо - бот поздравляет с победой. Или это уже моды нужны?

podvoxx
30.09.2011, 15:40
Раньше один человек со слабым компом наоборот спрашивал как запустить (и запустил) выделенный сервер именно по причине слабости компа (Пентиум 4 ЕМНИП и т.д.). При подгрузке миссии надписи выводятся как сейчас на Р1. По завершении миссии выводится "нажмите esc", поэтому при достижении определенных условий надписи выводить можно, думаю и звук наверное. Кампаниеделы должны знать хау-ноу :).

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

Еще вопрос. В скриптах destroyPlane, damageAiControlledPlane, OnPlaceLeave() и т.п. называются методами класса по-научному? Есть ли где-нибудь их список с кратким значением каждого? Нужно для Вики (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).

Еще по вот этому есть вопрос:


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



В каких случаях что ставить и за что они отвечают? (в скриптах разные сочетания бывают)

-atas-
30.09.2011, 16:35
Есть ли где-нибудь их список с кратким значением каждого?

Здесь список http://www.sukhoi.ru/forum/showthread.php?t=68369&daysprune=-1
Там по названию понятно. В патче уже новые появились. Выше naryv писал.

podvoxx
04.10.2011, 12:37
Вопрос по команде GamePlay.gpHUDLogCenter

GamePlay.gpHUDLogCenter(unitName, text, time)

unitName: NameObject
text: String
time: Number

Если команда прописывается в таком виде:

GamePlay.gpHUDLogCenter("Мы очень ждем патч")

unitName будет равен null? Кому отправится сообщение? И каков формат unitName?
time в этом случае чему равно? Измеряется в секундах?

Есть ли где-нибудь/у кого-нибудь хотя бы частичный список с расшифровкой параметров?

naryv
04.10.2011, 14:05
Вопрос по команде GamePlay.gpHUDLogCenter

GamePlay.gpHUDLogCenter(unitName, text, time)

unitName: NameObject
text: String
time: Number

Если команда прописывается в таком виде:

GamePlay.gpHUDLogCenter("Мы очень ждем патч")

unitName будет равен null? Кому отправится сообщение? И каков формат unitName?
time в этом случае чему равно? Измеряется в секундах?

Есть ли где-нибудь/у кого-нибудь хотя бы частичный список с расшифровкой параметров? четыре варианта есть :
gpHUDLogCenter(string msg); всем отправляется строка msg
gpHUDLogCenter( Player[] to, string msg ); массиву Player отправляется строка msg
gpHUDLogCenter( Player[] to, string msg, object[] parms );массиву Player отправляется строка msg с параметрамии строки, например


int num_target = 10;
gpHUDLogCenter(gpRemotePlayers(), " Вам надо уничтожить {0} целей", num_target );
gpHUDLogCenter( Player[] to, string msg, object[] parms, double lifeTime ); массиву Player отправляется строка msg с параметрамии строки , будет на экране lifeTime секунд

podvoxx
04.10.2011, 14:16
четыре варианта есть :
gpHUDLogCenter(string msg); всем отправляется строка msg
gpHUDLogCenter( Player[] to, string msg ); массиву Player отправляется строка msg
gpHUDLogCenter( Player[] to, string msg, object[] parms );массиву Player отправляется строка msg с параметрамии строки, например


int num_target = 10;
gpHUDLogCenter(gpRemotePlayers(), " Вам надо уничтожить {0} целей", num_target );
gpHUDLogCenter( Player[] to, string msg, object[] parms, double lifeTime ); массиву Player отправляется строка msg с параметрамии строки , будет на экране lifeTime секунд

Спасибо!
Сразу еще пару вопросов хочется уточнить

gpRemotePlayers()
Какое значение возвращает? Всех игроков в миссии?


object[] parms
Это переменная или массив переменных?

И я правильно понимаю, что вариант gpHUDLogCenter(string msg, double lifeTime); недопустим?

naryv
04.10.2011, 15:44
Спасибо!
Сразу еще пару вопросов хочется уточнить

Какое значение возвращает? Всех игроков в миссии? да, это все игроки.


Это переменная или массив переменных? массив, емнип параметры через запятую , как-то так ("параметр {0},{1},{2}",num0,num1,num2)


И я правильно понимаю, что вариант gpHUDLogCenter(string msg, double lifeTime); недопустим? да, правильно, работают только те 4 варианта которые я указал

podvoxx
04.10.2011, 15:51
да, правильно, работают только те 4 варианта которые я указал

Спасибо, теперь даже вопросов не осталось по этой команде :)

podvoxx
05.10.2011, 12:31
Хотелось бы уточнить

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();.

У меня есть только такое определение:

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

base.OnBattleStarted() - метод вызова, выполняемый один раз при инициализации.

Оба неустраивают, хотелось бы ясности.

-atas-
05.10.2011, 12:49
Оба неустраивают, хотелось бы ясности.

Насколько я понимаю, это случается, когда сервер нажимает кнопку Battle! или если выделенный, то когда пишет battle start в консоли launcher.exe.

Есть еще другой метод Init, который происходит при загрузке миссии емнип.

Для чего используется base. ... во многих методах самому интересно.

Еще смежный вопрос: onMissionLoaded если прописан в миссии хосте, будет срабатывать при подгрузке подмиссий или только хоста? Соответственно, в подмиссию можно его включать и, например запускать timeout некоторых процессов подмиссии в методе onMissionLoaded ? Например для подмиссии:

onMissionLoaded ...
timeout ...
{
destroy actors
и перезагрузить саму себя
}

OnBattleStarted() если присутствует в подмиссии при загрузке подмиссии будет срабатывать?

podvoxx
05.10.2011, 13:12
OnBattleStarted() если присутствует в подмиссии при загрузке подмиссии будет срабатывать?

В тех скриптах, что у меня есть - этот метод прописывается в подмиссии и значит срабатывает, вот пример naruv'а scripttest


public override void OnBattleStarted()
{
AiActor actor = GamePlay.gpActorByName("Static0");
if (actor != null)
{
serverMessage("Объект найден");
}
else
{
serverMessage("Объект не найден");
}

}

Small_Bee
05.10.2011, 13:18
OnBattleStarted()
Метод вызывается один раз при старте битвы. Точнее - как только битва уже стартовала.

OnMissionLoaded(...)
Вызывается как только загрузилась новая миссия. Причем вызывается во всех ранее загруженных миссиях.

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

podvoxx
05.10.2011, 13:23
OnBattleStarted()
Метод вызывается один раз при старте битвы. Точнее - как только битва уже стартовала.
OnMissionLoaded(...)
Вызывается как только загрузилась новая миссия. Причем вызывается во всех ранее загруженных миссиях.
Спасибо за подробный ответ!


Для этого и существует base. Т.е. Этим мы вызовем метод предка. Т.е., если в реализации RealMission.OnBattleStarted() вначале дописать base.OnBattleStarted(), мы получим две последовательно выведенные надписи - "Битва началась!" и "Таки да, началась!".

Можно это назвать вызовом метода MyMission из RealMission, после которого уже идет выполнение самого RealMission?
А если добавить третий класс SuperMission, предок которого RealMission, как тогда добраться до MyMission? Или так делать нельзя?

Small_Bee
05.10.2011, 13:42
Спасибо за подробный ответ!

Можно это назвать вызовом метода MyMission из RealMission, после которого уже идет выполнение самого RealMission?
А если добавить третий класс SuperMission, предок которого RealMission, как тогда добраться до MyMission? Или так делать нельзя?

Да, можно. RealMission есть "прокачанный" вариант MyMission. А после, до или во время зависит от того, где именно base пропишете.
Это зависит от того, что написано в RealMission.

-atas-
05.10.2011, 15:47
Нужна помощь. Не могу понять, почему в миссии на карте Степи чтобы сменить самолет, нажав ESC нужно сначала кликнуть на флажек страны. В других миссиях достаточно клика на спауне своей же стороны или клика на карте. В этой миссии ничего не происходит, пока не кликнешь на флажек своей стороны (или противника). При этом появляется окно "Вы действительно хотите покинуть свой самолет?".

В настройках реализма сервера все пересадки полностью разрешены, все галочки с чекбоксов сняты. Скрипта нет.
При попытке добавить в миссию
Army 1 gb
Army 2 de
редактор виснет на загрузке миссии (переходит в полноэкранный режим без меню и возможности выхода).

Миссию прилагаю.

podvoxx
06.10.2011, 14:11
Это правильный формат?


void gpLogServer(Player[] to, string msg, new object[] parms)

Пример:
GamePlay.gpLogServer (null, "OnTrigger ({0} | {1} | {2}) wurde ausgelost", new object [] {missionNumber, shortName, active});

Встречал еще такой:

void gpLogServer(maddox.game.Player[] to, string format, object[] args)

Какой из них правильный и нет ли разных вариантов, как для gpHUDLogCenter

Small_Bee
06.10.2011, 14:13
Это правильный формат?


void gpLogServer(Player[] to, string msg, new object[] parms)

GamePlay.gpLogServer (null, "OnTrigger ({0} | {1} | {2}) wurde ausgelost", new object [] {missionNumber, shortName, active});

Встречал еще такой:

void gpLogServer(maddox.game.Player[] to, string format, object[] args)

Какой из них правильный и нет ли разных вариантов, как для gpHUDLogCenter

Это одно и то же.. Если в секции uses не прописан прямо неймспейс maddox.game - второй вариант, если прописан - без разницы. В первом варианте ошибка - new к описанию отношения не имеет - это только при вызове метода.

-atas-
06.10.2011, 18:34
Можно ли запрограммировать некий админский вход на сервер, чтобы на сервере без внешних видов админ мог пользоваться внешними видами для отладки?

Как это сделать?

podvoxx
07.10.2011, 16:04
Прошу пояснить первую строчку.



Чтобы не копировать постоянно названия триггеров, мы можем использовать такой код:

if (shortName.Substring(0, 12).Equals("WinCondition") && active)
{
WinConditionCounter++;
GamePlay.gpGetTrigger(shortName).Enable = false;
}

Имеются подмиссии, в каждой триггер с именем "WinCondition1", "WinCondition2", "WinCondition3" ... "WinConditionn". При срабатывании любого триггера, он проверяется в условии.

shortName.Substring(0, 12) позволяет учитывать только первые 12 символов названия триггеров. Т.е. мы можем добавлять сколь угодно подмиссий с именами типа "WinConditionn" и не портить при этом код главного скрипта. Я прав? Что означает ноль?

GamePlay.gpGetTrigger(shortName).Enable = false; - переключает триггер в состояние OFF?

Тогда GamePlay.gpGetTrigger(shortName).Enable = enable; наоборот, включает ?

П.С.Прошу прощения за простые вопросы, но с работы не могу нормально пользоваться поиском, а дома скорее всего не будет времени этим заняться.

-atas-
09.10.2011, 14:34
@ naryv
В IL-2 (на ADW, например) можно было кикать игроков за неправильно установленные сетевые настройки (запрещалось ставить в настройках LAN при большом количестве народа).

Как это можно сделать в БзБ? Как получить в скрипт скорость соединения клиента и как его кикнуть скриптом? (Вроде можно в банлист тоже добавить?) Как вообще из скрипта команды серверные посылать? Например, добавить в банлист, выйти из launcher.exe, и т.д.

--- Добавлено ---


Прошу пояснить первую строчку.

Вроде все верно.
Возможно считают с 0 до 11. Часто такое встречал (от 0 до < 12).

Откуда кстати такой код? Может, там еще что интересное есть? Не видел раньше.

Small_Bee
09.10.2011, 15:09
Прошу пояснить первую строчку.



Чтобы не копировать постоянно названия триггеров, мы можем использовать такой код:

if (shortName.Substring(0, 12).Equals("WinCondition") && active)
{
WinConditionCounter++;
GamePlay.gpGetTrigger(shortName).Enable = false;
}

Имеются подмиссии, в каждой триггер с именем "WinCondition1", "WinCondition2", "WinCondition3" ... "WinConditionn". При срабатывании любого триггера, он проверяется в условии.

shortName.Substring(0, 12) позволяет учитывать только первые 12 символов названия триггеров. Т.е. мы можем добавлять сколь угодно подмиссий с именами типа "WinConditionn" и не портить при этом код главного скрипта. Я прав? Что означает ноль?

GamePlay.gpGetTrigger(shortName).Enable = false; - переключает триггер в состояние OFF?

Тогда GamePlay.gpGetTrigger(shortName).Enable = enable; наоборот, включает ?

П.С.Прошу прощения за простые вопросы, но с работы не могу нормально пользоваться поиском, а дома скорее всего не будет времени этим заняться.

Все верно. В многих случаях нумерация символов с строке начинается с нуля (в других языках может и с единицы) Соответственно первые двенадцать символов будут иметь индексы с 0 до 11. В данном случае первая цифра (0) означает индекс символа, с которого надо начинать отсчет. "12" означает кол-во символов, которые надо забрать. Статья на MSDN (http://msdn.microsoft.com/ru-ru/library/aka44szs.aspx).

--- Добавлено ---


@ naryv
В IL-2 (на ADW, например) можно было кикать игроков за неправильно установленные сетевые настройки (запрещалось ставить в настройках LAN при большом количестве народа).

Как это можно сделать в БзБ? Как получить в скрипт скорость соединения клиента и как его кикнуть скриптом? (Вроде можно в банлист тоже добавить?) Как вообще из скрипта команды серверные посылать? Например, добавить в банлист, выйти из launcher.exe, и т.д.

Пинг получить можно.. Кикнуть скриптом - не видел.

-atas-
09.10.2011, 17:15
Пинг получить можно.. Кикнуть скриптом - не видел.

Пинг тоже хорошо, но хотелось бы еще настройки сети клиента получить.

Вот это из БзБ или из Ил-2?


[17:31:32] <ban>
[17:31:32] [ADD] [REM] [NAME [<name>]] [PATTERN [<pattern>]] [CLEAR] [LOAD [<file name>]] [SAVE [<file name>]]

<kick<player - kicks player matching pattern (wildcards: ? - matches one charcter, * - matches any character)
<ban<player - bans player matching pattern (wildcards: ? - matches one charcter, * - matches any character)
<banlist - list banned players
<unban<player - remove ban for payer matching pattern (use <banlist to see what can be unbanned)

Если из БзБ, то можно скриптом сгенерить (и наверное запустить?) .cmd в который писать
kick<player>
Только как такой файл генерить в .net не знаю. У Веточки видел генерацию списков неких.

А <ban> точно работает. Я себя банил. В крайнем случае можно его вместо кика использовать.

Small_Bee
09.10.2011, 17:52
Пинг тоже хорошо, но хотелось бы еще настройки сети клиента получить.

Вот это из БзБ или из Ил-2?


[17:31:32] <ban>
[17:31:32] [ADD] [REM] [NAME [<name>]] [PATTERN [<pattern>]] [CLEAR] [LOAD [<file name>]] [SAVE [<file name>]]

<kick<player - kicks player matching pattern (wildcards: ? - matches one charcter, * - matches any character)
<ban<player - bans player matching pattern (wildcards: ? - matches one charcter, * - matches any character)
<banlist - list banned players
<unban<player - remove ban for payer matching pattern (use <banlist to see what can be unbanned)

Если из БзБ, то можно скриптом сгенерить (и наверное запустить?) .cmd в который писать
kick<player>
Только как такой файл генерить в .net не знаю. У Веточки видел генерацию списков неких.

А <ban> точно работает. Я себя банил. В крайнем случае можно его вместо кика использовать.

Гм.. В принципе, это идея однако.. Скриптом сгенерить батник и запустить его... Только я не сильно соображаю в этом - например, есть ли простой направить команды из этого батника в консоль? Можно конечно написать свою консольку, которая бы через telnet коннектилась к консоли сервера и отправляла туда команды.

BigREPA
09.10.2011, 19:10
Только я не сильно соображаю в этом - например, есть ли простой направить команды из этого батника в консоль?
Есть.

-atas-
09.10.2011, 21:51
Гм.. В принципе, это идея однако.. Скриптом сгенерить батник и запустить его... Только я не сильно соображаю в этом - например, есть ли простой направить команды из этого батника в консоль? Можно конечно написать свою консольку, которая бы через telnet коннектилась к консоли сервера и отправляла туда команды.

help kick выдает
<kick> <name>

А любой .cmd в папке конфигов игры все сразу в консоль передает. Так что генери и запускай kick.cmd с содержанием
kick <name> :) Желательно сначала предупреждения писать на экран многократные.

Сейчас проверил, кикает на ура, раньше такого не было :) Какие у вас ники игровые, кстати? :D
Пинг до 180 где-то ограничить видимо имеет смысл?

Скрипт может отправить сообщение от Server to Server. думаю, так можно и команды отправлять?
log: Server to [Server]: Captured BR.20M are used by UK side only. Check your fire!

podvoxx
10.10.2011, 16:33
@ naryv
Откуда кстати такой код? Может, там еще что интересное есть? Не видел раньше.

Из перевода (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._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B_%D0%B4%D0%BB%D1%8F_%D1%87%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2_-_%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BC%D0%B8%D1%81%D1%81%D0%B8%D0%B9) туторов Kodiak'а

-atas-
10.10.2011, 18:22
Из перевода (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._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B_%D0%B4%D0%BB%D1%8F_%D1%87%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2_-_%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D0%BF%D0%BE%D0%B4%D0%BC%D0%B8%D1%81%D1%81%D0%B8%D0%B9) туторов Kodiak'а

Спс. Это я тебя спрашивал, а не naryv :) Цитата некорректная :)

podvoxx
10.10.2011, 21:46
Спс. Это я тебя спрашивал, а не naryv :) Цитата некорректная :)

Ой)) Работа, спешка :)

-atas-
11.10.2011, 23:20
Как можно показывать разный онлайн-брифинг в зависимости от языка клиента, т.е. русским один, а всем остальным на английском?

Как можно отправлять консольные команды из скрипта сервера в консоль сервера?

naryv
12.10.2011, 12:13
Как можно показывать разный онлайн-брифинг в зависимости от языка клиента, т.е. русским один, а всем остальным на английском? если общий бриф(англ) в файле "1.briefing" то русский - в файле "1_ru.briefing" в полном редакторе выбираем меню Редактировать->языки там выбираем нужный , тогда брифинг сохранится с выбранным языком, ну или просто написать английский, потом в текстовом редакторе изменить на русский и переименовать добавив к названию миссии "_ru"


Как можно отправлять консольные команды из скрипта сервера в консоль сервера?
вот так попробуйте:
System.Console.WriteLine("bla-bla-bla");

Small_Bee
12.10.2011, 12:16
вот так попробуйте:
System.Console.WriteLine("bla-bla-bla");

ээ. елки, самый очевидный вариант, и даже не подумал за него...:ups: Тем более такое есть в скриптах к родным кампаниям.

-atas-
12.10.2011, 17:42
вот так попробуйте:
System.Console.WriteLine("bla-bla-bla");

Kodiak попробовал. В консоль написало, но его не кикнуло. Как правильно это сделать?


Nothing special, just for testing i tried (Tester was 30sec delay Trigger) :

public override void OnTrigger(int missionNumber, string shortName, bool active)
{
base.OnTrigger(missionNumber, shortName, active);

if ("Tester".Equals(shortName) && active)
{

System.Console.WriteLine("kick Kodiak");
}
}
I also tried "\r\n" and "\n". I get the message kick Kodiak in console, thats all
So the simply way doesn't exist
http://forum.1cpublishing.eu/showpost.php?p=348246&postcount=7

Dr. Lamov
12.10.2011, 20:28
Я, конечно не эксперт... Но, по-моему, console.writeline тут нам не поможет :)
Это вывод в stdout, а нам нужна запись в stdin, если я правильно понимаю задачу :)
Нужно искать класс и метод, который обрабатывает input в консоли сервера и в него передавать строку "kick Kodiak"...

-atas-
12.10.2011, 20:30
Нам поможет только naryv :)

-atas-
12.10.2011, 22:58
Как можно узнать к какой строке скрипта относится ошибка

[22:43:03] =================================================
[22:43:03] System.NullReferenceException: Object reference not set to an instance of an object.
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.JKbi78CdjsN(X2gm2Hr3Eswyj0blEYg , Boolean , String , String , String , String , Tuple3f , Tuple3f , Tuple3f , Single )
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.YBOi7ZxcXEW(D9b3NxnuyuLyLO34x8C )
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.oN0isvENAcV(D9b3NxnuyuLyLO34x8C , Boolean )
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.N5risyW927P(D9b3NxnuyuLyLO34x8C )
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.netInput(D9b3NxnuyuLyLO34x8C )
[22:43:03] at 4oJSpAkF4ydQeQ505nZ.FBRfvmkapO7g2DdMggm.c48QfoHY4L2(Object )
[22:43:03] at NCas604dIJxONptaMSB.Dyj7wo4KItdTK2rJaTL.RWkX76dcAE(Object )
[22:43:03] =================================================

Каким образом их расшифровывать самостоятельно?

Small_Bee
12.10.2011, 23:02
Как можно узнать к какой строке скрипта относится ошибка

[22:43:03] =================================================
[22:43:03] System.NullReferenceException: Object reference not set to an instance of an object.
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.JKbi78CdjsN(X2gm2Hr3Eswyj0blEYg , Boolean , String , String , String , String , Tuple3f , Tuple3f , Tuple3f , Single )
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.YBOi7ZxcXEW(D9b3NxnuyuLyLO34x8C )
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.oN0isvENAcV(D9b3NxnuyuLyLO34x8C , Boolean )
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.N5risyW927P(D9b3NxnuyuLyLO34x8C )
[22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.netInput(D9b3NxnuyuLyLO34x8C )
[22:43:03] at 4oJSpAkF4ydQeQ505nZ.FBRfvmkapO7g2DdMggm.c48QfoHY4L2(Object )
[22:43:03] at NCas604dIJxONptaMSB.Dyj7wo4KItdTK2rJaTL.RWkX76dcAE(Object )
[22:43:03] =================================================

Каким образом их расшифровывать самостоятельно?

Никак. Не факт, что это в скрипте. Такой ошибке стабильно предшествует появление нового самолета. Т.е. после самого появления - не всегда, а перед этой ошибкой - всегда. По крайней мере в чат уходит что-то вроде "Новая красная/синяя группа появилась".

--- Добавлено ---


Я, конечно не эксперт... Но, по-моему, console.writeline тут нам не поможет :)
Это вывод в stdout, а нам нужна запись в stdin, если я правильно понимаю задачу :)
Нужно искать класс и метод, который обрабатывает input в консоли сервера и в него передавать строку "kick Kodiak"...

Похоже именно так. В общем внешнюю утилитку сделаю.

-atas-
13.10.2011, 17:27
А скрипт из консоли может читать? Например, переменные скрипта менять-какие-либо было бы полезно для отладки.

string line = System.Console.ReadLine();

-atas-
14.10.2011, 14:50
Подскажите, как не напортачить.
Как проверить несколько триггеров в одном цикле OnTrigger?

Если обе проверки вложить во все циклы и расположить подряд, их как-то разделять нужно, например
if();
if else ();
else {};
break;

Или просто подряд перечислить?
if();
if();
if();
break;

Или сделать отдельно 3 цикла проверок,
if( циклы )
if( циклы )
if( циклы )



for (int j = 1; j < 3 ; j++) // Army
{ for (int i = 0; i < attackSector.Length ; i++)
{ for (int k = 0; k < Submission1.Length ; k++)
{
// air missions
string str = (j).ToString() + "_" + attackSector[i].ToString() + "_air" + (k).ToString() ; // + missionType[0].ToString()
if (str.Equals(shortName1))
{
}

// ground missions
if (str.Equals(shortName2))
{
}

// sea missions
if (str.Equals(shortName3))
{
}

break;
}
}
}
}


Так будет работать? (это 2й вариант).

Еще более важный вопрос, что происходит, если в процессе перебора цикла срабатывает новый триггер и начинается новый перебор. Оба перебора отработатся последовательно и корректно? В "танковых битвах" возрождение по тригеру работало несколько раз, но потом танки переставали рождаться по какой-то причине.

break; кстати правильно используется?

Small_Bee
14.10.2011, 15:11
После break закрывающая фигурная скобка - лишняя.
Наличие break в этом случае скорее баг - будет выход из цикла после первой же итерации, т.е. цикл смысла не имеет.

Break означает выход из цикла, использовать его надо, если цикл больше не нужен. Например, найдено искомое совпадение и ясно, что больше совпадений не будет.
Выбор варианта зависит от того, что хотите получить на выходе, так сказать, что какой-то из них неправильный, нельзя.

Разница между первым и вторым циклом. В первом варианте код будет проверять следующее условие только если предыдущее условие ложно, во втором проверки меж собой не связаны, все три отработают в любом случае.

-atas-
14.10.2011, 16:17
Спасибо за просвещение.

Break внутри проверки условия видимо был изначально. Совсем без break видимо тоже должно работать.

(я убежал, сервер лежит до сих пор без стима)

-atas-
18.10.2011, 12:05
У меня продолжается взаимная нелюбовь с триггерами.

Есть 2 подмиссии:

1_E3_air0.mis , 1_E3_air1.mis
2я получена путем копирования 1й с изменением самолета с Веллингтона на Бленим. Название группы соответственно осталось прежним.

В подмиссиях есть треиггеры на пролет группы 1_E3_air и 1_E3_air. Сейчас одинаковые, но перед этим пробовал перебирать и триггеры 1_E3_air0 и 1_E3_air1 в цикле с таким же результатом. Триггер создавался в 1й подмиссии, затем копировался во 2ю в блокноте.
1_E3_air TPassThrough 1 gb02.07 53073 33421 2000
1_E3_air TPassThrough 1 gb02.07 53073 33421 2000

В результате при пролете группы из 1й подмиссии триггер не срабатыват ни разу. При пролете группы из 2й подмиссии триггер срабатывает 2-5 раз (на каждый самолет?).

Вопросы: почему 1й триггер не срабатывает?
В каких случаях нужна проверка // && active) ?
В каких случаях добавлять //GamePlay.gpGetTrigger(shortName).Enable = false; ?
Как убрать повторные срабатывания?
Могут ли все триггеры подмиссий иметь одинаковые названия?
При копировании файла миссии нужно ли изменять название группы, чтобы оно было уникальным?
Если включить все триггеры только в миссию-хост, будут ли они срабатывать при пролете групп из подмиссий?


public override void OnTrigger(int missionNumber, string shortName, bool active)
{ base.OnTrigger(missionNumber, shortName, active);


string[] attackSector = { "C5", "D4", "E3" }; // sectors attacked

// air missions
#region air missions

string currMissType = "air";

for (int j = 1; j < 3 ; j++) // Army
{
for (int i = 0; i < attackSector.Length ; i++)
{
string str = (j).ToString() + "_" + attackSector[i].ToString() + "_" + currMissType; // +k.ToString(); // + missionType[1].ToString() //string str = i.ToString() + "_" + (j).ToString() + "_gg";
// && active) нужно?
if (str.Equals(shortName)) // && active) нужно? // test
{
sendChatMessageTo(-1, str , null); // test msg

if (j == 1) // red win
{
currBonusLoss = allowed109s - min109s;
if (currBonusLoss < 1) currBonusLoss++;

allowed109s = min109s;
ScoreRed += 1;

sendScreenMessageTo(-1, new string[] { "ru" }, "The Allies bombed the Axis' airfield! Limit of available Bf-109E4 is reduced by {0}!", new object[] { currBonusLoss });
sendScreenMessageTo(-1, "Красные разбомбили синий аэродром! Лимит доступных Bf-109E4 снижен на {0}!", new object[] { currBonusLoss });
sendChatMessageTo(-1, new string[] { "ru" }, "The Allies bombed the Axis' airfield! Limit of available Bf-109E4 is reduced by {0}!", new object[] { currBonusLoss });
sendChatMessageTo(-1, "ru", "Красные разбомбили синий аэродром! Лимит доступных Bf-109E4 снижен на {0}!", new object[] { currBonusLoss });
// testing
sendScreenAndChatMessageTo( -1, new object[] { currBonusLoss },
"Testing! sendScreenAndChatMessageTo Bf-109E4 is reduced by {0}!",
"Тест! sendScreenAndChatMessageTo Bf-109E4 is reduced by {0}!");


}

else // blue win
{

allowedSpit2s = minSpit2s;
ScoreBlue += 1;

sendScreenMessageTo(-1, new string[] { "ru" }, "The Axis bombed the Allies' airfield! Limit of available Spitfire IIa is reduced by {0}!", new object[] { currBonusLoss });
sendScreenMessageTo(-1, "Синие разбомбили красный аэродром! Лимит доступных Spitfire IIa снижен на {0}!", new object[] { currBonusLoss });
sendChatMessageTo(-1, new string[] { "ru" }, "The Axis bombed the Allies' airfield! Limit of available Spitfire IIa is reduced by {0}!", new object[] { currBonusLoss });
sendChatMessageTo(-1, "ru", "Синие разбомбили красный аэродром! Лимит доступных Spitfire IIa снижен на {0}!", new object[] { currBonusLoss });

}
// это нужно?
//GamePlay.gpGetTrigger(shortName).Enable = false;

break;
}

}
}
#endregion
}

podvoxx
25.10.2011, 13:56
В миссии для онлайна можно сделать так, чтобы одни спауны были старт с аэродрома, а другие в воздухе?

-atas-
25.10.2011, 14:26
В миссии для онлайна можно сделать так, чтобы одни спауны были старт с аэродрома, а другие в воздухе?

Да, высота спауна задается отдельно для каждого.

podvoxx
25.10.2011, 15:14
Да, высота спауна задается отдельно для каждого.

Спасибо.


Чувствую назревает высадка в Нормандии на планерах :).

Нет, хочу тренировочную миссию на скриптах сделать (через меню можно было выбрать задание), в которую можно будет онлайн полетать. :)

--- Добавлено ---

А ограничить вооружение на спауне возможно как-то?

podvoxx
25.10.2011, 15:36
А в свойствах спауна разве нет? Там где самолеты закидываешь. Чето не помню уже. Кстати, твою миссию на Хеше еще не пробовал.

Я ни разу еще спауны не использовал, хочу подготовиться заранее )
В той миссии ничего особенного, сделано наспех, только городок мне очень понравился. Хочу отделить обЪекты по разным подмиссиям, чтобы проще было редактировать. Постараюсь сделать две версия города для синих и красных

podvoxx
26.10.2011, 09:15
В коллекции скриптов от Атаса есть такой скрипт от naryv для использования меню:


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

Попробовал к онлайн-миссии прикрутить, вызов скрипта из хоста. Tab 4 не реагирует на нажатие (скорее всего из-за второго параметра false). Интересует формат команд.

1.
GamePlay.gpSetOrderMissionMenu( player, false, 0, new string[] { "1", "2", "3" }, new bool[] { true, false, false } );
1,2,3 - это текст пунктов меню как я понял. Что значит "new bool" - зависит отображается пункт или нет?

2. Зачем нужнаа проверка if( MissionNumber == 0 ) точнее как этот номер узнать или задать?

3. MainMenu - это меню, которое вызывается по Tab+4?
SubMenu - вложенных меню может быть сколько угодно уровней?

4. Для онлайна этот скрипт подходит?

5. Несколько раз встречал такую строчку:

List<string> CarTypes = new List<string>();
Это класс используемый вместо массива, какое преимущество он дает?

naryv
26.10.2011, 11:44
В коллекции скриптов от Атаса есть такой скрипт от naryv для использования меню:


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

Попробовал к онлайн-миссии прикрутить, вызов скрипта из хоста. Tab 4 не реагирует на нажатие (скорее всего из-за второго параметра false).
вот, пример кооп-миссии онлайновой с выбором места в самолёте из меню http://www.sukhoi.ru/forum/showthread.php?t=68697&p=1716159&viewfull=1#post1716159


Интересует формат команд.

1.
GamePlay.gpSetOrderMissionMenu( player, false, 0, new string[] { "1", "2", "3" }, new bool[] { true, false, false } );
1,2,3 - это текст пунктов меню как я понял. Что значит "new bool" - зависит отображается пункт или нет?
gpSetOrderMissionMenu( Player player, bool thisSubMenu, int ID, string[] keys, bool[] bSubMenu ); параметры :
Player player - игрок которому выдаётся кастомное меню
bool thisSubMenu - является ли данный набор пунктов подменю
int ID - ID пункта по которому его можно идентифицировать
string[] keys массив строк-пунктов меню
bool[] bSubMenu массив bool показывающий есть ли у каждого пункта подменю



2. Зачем нужнаа проверка if( MissionNumber == 0 ) точнее как этот номер узнать или задать? MissionNumber это номер миссии, по умолчанию, каждый скрипт работает только в "своей" миссии, задаётся номер автоматически при подгрузке миссии в битву. Чтобы скрипт "слушал" другие миссии надо задать MissionNumberListener с номером желаемой миссии, или MissionNumberListener= -1, чтобы работать со всеми объектами в битве.


3. MainMenu - это меню, которое вызывается по Tab+4?
SubMenu - вложенных меню может быть сколько угодно уровней?
да, и практически да(несколько десятков уровней вложения тестировали, теоретически сколько угодно можно)


4. Для онлайна этот скрипт подходит? должен, по идее.



5. Несколько раз встречал такую строчку:

List<string> CarTypes = new List<string>();
Это класс используемый вместо массива, какое преимущество он дает?
с List-ом по-моему удобнее и проще работать, легко добавлять, искать значения, размер не надо задавать и тд

podvoxx
26.10.2011, 12:08
Спасибо, теперь более понятно. :thx:

Еще вопрос, вот такая записья является правильной?



//Параметры меню
string[] descMainMenu; //Описание пунктов главного меню
descMainMenu = new string[] { "Тест системы сообщений", "Конвои" };

private void setMainMenu( Player player )
{
GamePlay.gpSetOrderMissionMenu( player, true, 0, descMainMenu, new bool[] { false, true } );
}

naryv
26.10.2011, 12:36
Спасибо, теперь более понятно. :thx:

Еще вопрос, вот такая записья является правильной?



//Параметры меню
string[] descMainMenu; //Описание пунктов главного меню
descMainMenu = new string[] { "Тест системы сообщений", "Конвои" };

private void setMainMenu( Player player )
{
GamePlay.gpSetOrderMissionMenu( player, true, 0, descMainMenu, new bool[] { false, true } );
} не совсем - с 0 ID (самый первый уровень вложения) не считается подменю , надо так -GamePlay.gpSetOrderMissionMenu( player, false, 0, descMainMenu, new bool[] { false, true });

podvoxx
26.10.2011, 12:53
не совсем - с 0 ID (самый первый уровень вложения) не считается подменю , надо так -GamePlay.gpSetOrderMissionMenu( player, false, 0, descMainMenu, new bool[] { false, true });

Ясно. А вариант с list так будет выглядеть?:



List<string> descMainMenu = new List<string>();
descMainMenu.Add("Тест системы сообщений");
descMainMenu.Add("Конвои");

private void setMainMenu( Player player )
{
GamePlay.gpSetOrderMissionMenu( player, false, 0, descMainMenu, new bool[] { false, true } );
}

Small_Bee
26.10.2011, 13:04
Ясно. А вариант с list так будет выглядеть?:



List<string> descMainMenu = new List<string>();
descMainMenu.Add("Тест системы сообщений");
descMainMenu.Add("Конвои");

private void setMainMenu( Player player )
{
GamePlay.gpSetOrderMissionMenu( player, false, 0, descMainMenu, new bool[] { false, true } );
}


GamePlay.gpSetOrderMissionMenu( player, false, 0, descMainMenu.ToArray(), new bool[] { false, true } );

podvoxx
26.10.2011, 13:23
GamePlay.gpSetOrderMissionMenu( player, false, 0, descMainMenu.ToArray(), new bool[] { false, true } );

Спасибо за преобразование в массив :)

Еще вопрос. Есть загруженная подмиссия с неизвестным номером. Как удалить все юниты именно этой подмиссией не перебирая в циклах всю наземку? Или может быть просто можно подмиссию выгрузить?

Small_Bee
26.10.2011, 13:53
Спасибо за преобразование в массив :)

Еще вопрос. Есть загруженная подмиссия с неизвестным номером. Как удалить все юниты именно этой подмиссией не перебирая в циклах всю наземку? Или может быть просто можно подмиссию выгрузить?

Никак.
Что бы миссия не была неизвестной, надо перед ее загрузкой запомнить след. номер (NextMissionNumber или как то так).
Частичное решение состоит в переборе наземных и воздушных групп для всех представленных армий и сверке запомненного номера миссии с номером, заключенном в полном имени юнита (формат примерно такое - номер миссии, двоеточие, shortName). Полное имя получается через AiActor.Name().
Почему частичное? Перебором групп ты не найдешь юнитов, которые групп не имеют (артиллерия и стат. корабли как минимум), т.е. по OnActorCreated надо еще и их запоминать. Похожее решение используется в морском льве.
Домики, ящички и все что в разделе статический и т.д. не удалишь вообще никак.

PS кстати, в голову пришло. возможная причина утечек у меня - удаляются только акторы, а группы нет.. надо проверить это дело.

podvoxx
28.10.2011, 13:08
Решено, работает прекрасно
1. С меню разобрался, остались брошенные самолеты. Такой код, если его добавить в хост миссию будет выполнять свою работу в онлайн? Или еще что-то нужно добавить?
2. Если загрузить отдельным скриптом будет работать?



//Удаление покинутых самолетов
public override void OnPlaceLeave(Player player, AiActor actor, int placeIndex)
{
base.OnPlaceLeave(player, actor, placeIndex);
Timeout(5, () =>
{
AiAircraft CurAircraft = player.Place() as AiAircraft;
AiAircraft PrevAircraft = actor as AiAircraft;
if (CurAircraft != PrevAircraft)
{(actor as AiAircraft).Destroy();}
});
}

//Удаление разбившихся самолетов
public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded(missionNumber, shortName, aircraft);
Timeout(10, () =>
{ destroyPlane(aircraft); }
);
}

//Удаление приземлившихся самолетов
public override void OnAircraftLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftLanded(missionNumber, shortName, aircraft);
Timeout(10, () =>
{ destroyPlane(aircraft); }
);
}


3. Неактуально


Решено
4. Как правильно использовать list<> в скриптах? Если делать по msdn выдает ошибки

5. Как получить ник игрока в онлайне, чтобы отправить в чат сервера?


6-7. Неактуально

podvoxx
31.10.2011, 13:04
8. Такой вопрос. В методе OnBattleStarted вызывается подмиссия с конвоем движущихся кораблей. При старте выделенного сервера и появлении первого игрока на аэродроме (не в воздухе) корабли стоят на месте и не двигаются, возможно другая техника тоже в спящем режиме. При появлении в воздухе/взлете процесс движения начинается. С чем это связано?

naryv
31.10.2011, 13:59
8. Такой вопрос. В методе OnBattleStarted вызывается подмиссия с конвоем движущихся кораблей. При старте выделенного сервера и появлении первого игрока на аэродроме (не в воздухе) корабли стоят на месте и не двигаются, возможно другая техника тоже в спящем режиме. При появлении в воздухе/взлете процесс движения начинается. С чем это связано? Они для игрока находящегося дальше радиуса видимости( ~20км) "спят", игрок о них не получает информацию, для сервера они перемещаются, когда игрок приблизится на расстояние ближе радиуса видимости, они у него на машине "проснутся" и переместятся туда, где они находятся у сервера и дальше будут двигаться синхронно. Сделано это, чтобы не грузить сеть ненужной информацией о дальних объектах и машину-клиента ненужными расчётами. Если в воздухе Вы появляетесь ближе радиуса видимости - кораблики "просыпаются" сразу.

podvoxx
31.10.2011, 14:30
Они для игрока находящегося дальше радиуса видимости( ~20км) "спят", игрок о них не получает информацию, для сервера они перемещаются, когда игрок приблизится на расстояние ближе радиуса видимости, они у него на машине "проснутся" и переместятся туда, где они находятся у сервера и дальше будут двигаться синхронно. Сделано это, чтобы не грузить сеть ненужной информацией о дальних объектах и машину-клиента ненужными расчётами. Если в воздухе Вы появляетесь ближе радиуса видимости - кораблики "просыпаются" сразу.

Спасибо, я уже думал что что-то не так сделал :)

KG40_Night
31.10.2011, 17:58
1) Влияют ли звукоулавливатели и прочие пуазо на зенитки?

2) Можно ли на танкер повесить вторую зенитку..?

podvoxx
03.11.2011, 10:05
Решено добавлением namespace System.IO
1. Поясните как правильно использовать метод Directory в скриптах. Требуется получить список файлов в папке и название самой папки, игра выдает ошибку. Требуется для динамического меню загрузчика миссий. Т.е. просто помещаем любые миссии в папку, они автоматически появляются в меню.

http://msdn.microsoft.com/ru-ru/library/07wt70x2


string missionPath = Directory.GetCurrentDirectory();
GamePlay.gpHUDLogCenter( "Текущая директория: " + missionPath );
..

podvoxx
07.11.2011, 10:13
1. Присоединяюсь к вопросу, как подключать звукоулавливатели к зениткам и прожекторам?

1) Влияют ли звукоулавливатели и прочие пуазо на зенитки?

2. Как получить папку игры в моих документах оптимальным способом? Сейчас делаю так:



string myDoc = Environment.GetFolderPath(Environment.SpecialFolder.Personal);// Documents folder
string[] missDirMassive = Directory.GetDirectories(myDoc + "\\1C SoftClub\\il-2 sturmovik cliffs of dover\\missions\\Multi\\Dogfight\\PilotTraining\\Missions");


В первой строчке получаю папку текущего пользователя, потом к ней добавляю путь от русскоязычной версии игры и это подходит только для win7(?). Как получить адрес папки missions в папке игры в Documents на разных версиях игры и ОС? По умолчанию(GetCurrentDirectory()) рабочим каталогом является папка в стиме куда установлена игра

podvoxx
08.11.2011, 10:13
Интересует назначение этих методов, для чего они?



public override void OnPlayerConnected( Player player )
{

}

public override void Inited()
{

}

naryv
09.11.2011, 12:24
1) Влияют ли звукоулавливатели и прочие пуазо на зенитки?

1. Присоединяюсь к вопросу, как подключать звукоулавливатели к зениткам и прожекторам?
пока нет, постараемся сделать


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



Интересует назначение этих методов, для чего они?



public override void OnPlayerConnected( Player player )
{

} вызывается, когда в мультиплеере подключается игрок, можно использовать для выдачи ему заданий и тп



public override void Inited()
{

} Вызывается в конце Init, можно оверрайдить если что-то нужно сделать после того как миссия была проинициализирована(выставлены битва, номер миссии,MissionNumberListener )

KG40_Night
09.11.2011, 20:22
Спасибо большое за ответы. Есть еще вопросик:

- как корректно установить аэростат на желаемую высоту, а то что то он у меня лишь на земле лежит.

-atas-
09.11.2011, 20:28
Спасибо большое за ответы. Есть еще вопросик:

- как корректно установить аэростат на желаемую высоту, а то что то он у меня лишь на земле лежит.

Там есть объекты - тележки с аэростатами. У них в свойствах есть начальная и конечная высота. Вот в какой момент он поднимается, не знаю.

naryv
09.11.2011, 23:07
да, раздел лебёдки , там немецкая и английская лебёдки с аэростатами, если галочка стоит - высота фиксируется, если нет - после таймаута с начальной до конечной высоты будет перемещаться.

LevPZ
10.11.2011, 12:04
144538
Спасибо большое за ответы. Есть еще вопросик:

- как корректно установить аэростат на желаемую высоту, а то что то он у меня лишь на земле лежит.

Установка высоты статического аэростата(не лебёдка).

podvoxx
10.11.2011, 12:09
144538

Установка высоты статического аэростата(не лебёдка).

Статические работают, только не падают после уничтожения. При проигрывании треков они всегда на земле, по обоим случаям отписано в баги

podvoxx
05.12.2011, 13:24
У меня такой вопрос - можно ли из подмиссии через другую подмиссию загрузить окопы и др. обЪекты из группы "Здания" и если да, то как. На выходных мучался и не понял как (получается только если добавить их в файл первой хост миссии).

Pavel_90
13.12.2011, 04:49
Подскажите пожалуйста как вызвать скриптом стандартную функцию перезарядки и заправки самолета? Где то здесь вычитал что вроде такая функция есть и она длится вроде около получаса. Но как её вызвать. Вроде посмотрел соответсвующие темы найти не могу.

Octocat
13.12.2011, 12:33
У меня такой вопрос - можно ли из подмиссии через другую подмиссию загрузить окопы и др. обЪекты из группы "Здания" и если да, то как. На выходных мучался и не понял как (получается только если добавить их в файл первой хост миссии).

Тоже пробовал. Сплайновые дороги и здания из подмиссий не загружаются.

--- Добавлено ---


Подскажите пожалуйста как вызвать скриптом стандартную функцию перезарядки и заправки самолета? Где то здесь вычитал что вроде такая функция есть и она длится вроде около получаса. Но как её вызвать. Вроде посмотрел соответсвующие темы найти не могу.

Нет такой функции, и вроде как не будет. Да и смысл ждать 30 минут, когда можно создать новый самолет и переместить себя на место его пилота. Команда: player.PlaceEnter(aircraft, placeIndex);

podvoxx
13.12.2011, 12:46
Тоже пробовал. Сплайновые дороги и здания из подмиссий не загружаются.

Понятно. Хотелось бы тогда узнать - это баг или так задумано? Чем здания-то не угодили, тем более что в них очень много важных обЪектов (окопы с ангарами, например)

Octocat
13.12.2011, 12:54
2. Как получить папку игры в моих документах оптимальным способом? Сейчас делаю так:



string myDoc = Environment.GetFolderPath(Environment.SpecialFolder.Personal);// Documents folder
string[] missDirMassive = Directory.GetDirectories(myDoc + "\\1C SoftClub\\il-2 sturmovik cliffs of dover\\missions\\Multi\\Dogfight\\PilotTraining\\Missions");


В первой строчке получаю папку текущего пользователя, потом к ней добавляю путь от русскоязычной версии игры и это подходит только для win7(?). Как получить адрес папки missions в папке игры в Documents на разных версиях игры и ОС? По умолчанию(GetCurrentDirectory()) рабочим каталогом является папка в стиме куда установлена игра

Игра использует свой, внутренний формат путей с макросами "$home/..." и "$user/...".

Для перевода путей из внутреннего формата в системный предусмотрена функция GameInterface.ToFileSystemPath, например: game.gameInterface.ToFileSystemPath("$user/missions/Single");

Pavel_90
13.12.2011, 12:58
Нет такой функции, и вроде как не будет. Да и смысл ждать 30 минут, когда можно создать новый самолет и переместить себя на место его пилота. Команда: player.PlaceEnter(aircraft, placeIndex);

Вроде гдето видел. Что то вроде repair или refuel, но небыло написано как примить. Интересно было попробовать.

podvoxx
13.12.2011, 13:05
Вроде гдето видел. Что то вроде repair или refuel, но небыло написано как примить. Интересно было попробовать.

Скорее всего ты скрипт видел. http://www.sukhoi.ru/forum/showthread.php?t=71750 тут что-то есть
И по смене самолета: http://www.sukhoi.ru/forum/showthread.php?t=72046


--- Добавлено ---


Игра использует свой, внутренний формат путей с макросами "$home/..." и "$user/...".

Для перевода путей из внутреннего формата в системный предусмотрена функция GameInterface.ToFileSystemPath, например: game.gameInterface.ToFileSystemPath("$user/missions/Single");

Спасибо, хотя и так вроде работает.

Pavel_90
13.12.2011, 13:46
Скорее всего ты скрипт видел. http://www.sukhoi.ru/forum/showthread.php?t=71750 тут что-то есть
И по смене самолета: http://www.sukhoi.ru/forum/showthread.php?t=72046


Точно оно спасибо. А то ищю ищю помню что гдето об этом видел. А параметр износ в полном редакторе на что-нибудь влияет? Сколько пробовал его менять никаких изменений не заметил.

Pavel_90
13.12.2011, 14:10
Скорее всего ты скрипт видел. http://www.sukhoi.ru/forum/showthread.php?t=71750 тут что-то есть
И по смене самолета: http://www.sukhoi.ru/forum/showthread.php?t=72046

Точно оно, Спасибо. А влияет ли параметр износ в полном редакторе на что нибудь? Пробовал ставить и 100% и 80% никаких изменений не заметил и сколько с ним летал ничего из строя не выходило.

Octocat
14.12.2011, 00:26
Запостите пожалуйста, у кого английская версия клиента, названия британских, немецких и итальянских позывных (callsigns), и названия скилов пилотов. Можно текстом, или скриншотами из полного редактора, как удобнее.

podvoxx
15.12.2011, 10:38
Точно оно, Спасибо. А влияет ли параметр износ в полном редакторе на что нибудь? Пробовал ставить и 100% и 80% никаких изменений не заметил и сколько с ним летал ничего из строя не выходило.

Влияет только на внешний вид. У меня идейка есть насчет скрипта отказов систем самолета. То есть в зависимости от изношенности возрастает вероятность поломки. Следовательно вопрос - можно ли получить параметр износа для самолета игрока и как, если это возможно? Систему отказов можно и так организовать в принципе, адреналинчику может добавить.

И еще вопрос, не могу найти что-то. Как получить стимовское ID игрока и его ник?

podvoxx
22.12.2011, 13:38
Еще один (надеюсь не столь риторический как предыдущие) вопрос. При задании наземке маршрутов линии между вэйпоинтами постоянно цепляются к дорогам, что просто ужасно мешает и утомляет. Приходится ради такого элементарного действия двигать туда-сюда вэйпоинты и результат так себе получается. Галочка в меню "Проложить дороги" не ставится. В итоге, когда танкам нужно наступать по полю они ищут дорожки, вэйпоинтов вместо двух становится три-четыре. Это баг или так задумано? Если задумано, то могу сказать что эта задумка отнимает в три раза больше времени, чем следовало бы тратить на прокладку маршрутов.

Small_Bee
22.12.2011, 15:50
Еще один (надеюсь не столь риторический как предыдущие) вопрос. При задании наземке маршрутов линии между вэйпоинтами постоянно цепляются к дорогам, что просто ужасно мешает и утомляет. Приходится ради такого элементарного действия двигать туда-сюда вэйпоинты и результат так себе получается. Галочка в меню "Проложить дороги" не ставится. В итоге, когда танкам нужно наступать по полю они ищут дорожки, вэйпоинтов вместо двух становится три-четыре. Это баг или так задумано? Если задумано, то могу сказать что эта задумка отнимает в три раза больше времени, чем следовало бы тратить на прокладку маршрутов.
Кхе, у меня четко противоположная проблема -как их заставить двигаться четко по дорогам
). Что бы в городах не плутали.

Octocat
22.12.2011, 16:12
Хотелось бы, чтобы было так: в свойствах каждой точки маршрута наземки, был чекбокс "Использовать дороги".
Если он включен, маршрут выбирается с учетом дорог, иначе - по полю напрямую. Этот чекбокс по умолчанию включен у обычных маршевых точек маршрута, и выключен у точек типа АТАКА.

-atas-
22.12.2011, 17:27
И еще вопрос, не могу найти что-то. Как получить стимовское ID игрока и его ник?

Серверная команда host + прочитать чат телнетом (Small_Bee умеет :) ).

--- Добавлено ---


Кхе, у меня четко противоположная проблема -как их заставить двигаться четко по дорогам
). Что бы в городах не плутали.

Проще при застревании на 3-5 минут скриптом их переносить на 500 м. вперед, если не в бою и если там не вода. 41Sqn_Banks емнип писал на желтом.

Например перед мостами бывают застревания, когда поворот очень крутой, танк на скорости не вписывается.

podvoxx
26.12.2011, 12:09
Вопрос по статистике.В "Битве за деревню" в ходе миссии нужно учитывать уничтоженные вражеские объекты:
- зенитная артиллерия - AAGun
- противотанковая артиллерия, стационарные танки из раздела "Артиллерия" - Artillery
- самолеты
- наземная техника("живая")

Все будет довольно простенько силами самой миссии без всяких заморочек: убил зенитку - получай +20, убил бомбер +50 и т.п.
Во время миссии стороны могут вызывать подкрепления, каждая миссия будет стоить определенное количество очков. Счет будет вестись для красных и синих. Сам подсчет я себе примерно представляю, а вот как хранить и/или передавать данные не очень. Если писать заработанные очки в файл, то может так получиться что к этому файлу будет несколько обращений одновременно.

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

2. И еще сопутствующий вопрос: как удобней и правильней задавать/читать параметры из конфиг-файла. Сейчас у меня в каждой строчке параметр в виде string, допустим "1" или текст какой-то. Хотелось бы(точнее это уже необходимость) что-то вроде этого:


maxNumberPlanes = 10
RedPoints = 560

И чтобы оно легко менялось неподготовленным человеком(не учитывались лишние пробелы и т.п.). Подробно не нужно, общее направление и/или хорошей ссылки будет достаточно. Заранее спасибо

Small_Bee
26.12.2011, 13:51
С точки зрения .NET ini файлы походу рассматриваются как архаизм, и родных классов для чтения ини в нем вроде как и нет. заменой ини служит XML. В этом случае смотреть в сторону XDocument.

Если все же ини, то читаем сюда - http://msdn.microsoft.com/ru-ru/library/ezwyzy7b.aspx.
После ищем первое вхождение знака "равно" и по нему разбиваем строку на имя-значение. После убираем лишние пробелы через trim(). Смотрим String http://msdn.microsoft.com/ru-ru/library/a292he7t.aspx

В инете есть классы разработанные третьими лицами для работы с ини, на крайний случай.

По поводу разделения данных между миссиями можно свой аbattle сделать через дополнения (только для оффлайна, онлайн тоже вроде можно, но как - хз).Соответственно он будет доступен всем миссиям. Все остальные способы относительно сложные.
Правда я не вижу задач, которые бы это требовали. Убиение наземки можно из одной миссии отслеживать, и там же считать очки и принимать решения о запрете или разрешении вызова новой миссии.

naryv
26.12.2011, 14:05
1. Можно хранить очки в переменной, но я не знаю как сделать эту переменную доступной в нескольких запущенных скриптах. Кто-нибудь может подсказать как это делается? а зачем в нескольких скриптах? В стартовом скрипте можно считать всю статистику по OnActorDead и всё.



2. И еще сопутствующий вопрос: как удобней и правильней задавать/читать параметры из конфиг-файла. Сейчас у меня в каждой строчке параметр в виде string, допустим "1" или текст какой-то. Хотелось бы(точнее это уже необходимость) что-то вроде этого:


maxNumberPlanes = 10
RedPoints = 560

И чтобы оно легко менялось неподготовленным человеком(не учитывались лишние пробелы и т.п.). Подробно не нужно, общее направление и/или хорошей ссылки будет достаточно. Заранее спасибо

есть класс ISectionFile с помощью которого можно читать "секционные" файлы, в файле формат записи такой примерно :

[VARS]
attackTime 30
attackedMarkers 1
frontMarkers 1
attackCountsRed 3
attackCountsBlue 3
attackTanksNrRed 4
attackTanksNrBlue 4 где VARS - имя секции, "attackTime" - имя ключа и "30" - значение, "=" не надо писать. Обрабатывить так примерно:


public class Mission : AMission
{

// переменные из инишника

internal double attackTime = 10;
internal int attackedMarkers = 10;
internal int frontMarkers = 10;
internal int attackCountsRed = 30;
internal int attackCountsBlue = 30;
internal int attackTanksNrRed = 40;
internal int attackTanksNrBlue = 40;

public void iniFileRead()
{
ISectionFile iniFile = GamePlay.gpLoadSectionFile("missions\\Multi\\Dogfight\\SmallWar\\smallWar.ini");
string section, key, value;
section = "VARS";
key = "attackTime";
value = iniFile.get(section, key);
if (value != null)
double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture.NumberFormat, out attackTime); // в переменную attackTime записывается значение ключа key = "attackTime"

key = "attackedMarkers";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackedMarkers); // в переменную attackTime записывается значение ключа key ="attackedMarkers"

key = "frontMarkers";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out frontMarkers);

key = "attackCountsRed";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackCountsRed);

key = "attackCountsBlue";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackCountsBlue);

key = "attackTanksNrRed";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackTanksNrRed);

key = "attackTanksNrBlue";
value = iniFile.get(section, key);
if (value != null)
int.TryParse( value, out attackTanksNrBlue);

}
}

podvoxx
26.12.2011, 14:29
Спасибо за ответы!


а зачем в нескольких скриптах? В стартовом скрипте можно считать всю статистику по OnActorDead и всё.

Не очень подходит вариант, так как использую для основы загрузчик (http://www.sukhoi.ru/forum/showthread.php?t=72909) и кол-во очков стороны должно влиять на возможность загрузки миссии через меню- если их недостаточно ,миссия не грузится, выводится соответствующее сообщение. В один файл все скидывать не хочется, он и так уже большой.

За секции отдельное спасибо, видел похожий код в миссии "Танки", там таким образом создаются файлы миссии.


naryv, а можно еще по этим вопросам разъяснить:
http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1755337&viewfull=1#post1755337
http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1744470&viewfull=1#post1744470


Обновление в коллекции от Атаса, как раз про подсчет очков и мн. другое - http://forum.1cpublishing.eu/showpost.php?p=373453&postcount=14. :thx:

naryv
26.12.2011, 14:55
Не очень подходит вариант, так как использую для основы загрузчик (http://www.sukhoi.ru/forum/showthread.php?t=72909) и кол-во очков стороны должно влиять на возможность загрузки миссии через меню- если их недостаточно ,миссия не грузится, выводится соответствующее сообщение. В один файл все скидывать не хочется, он и так уже большой.
ну, мне кажется так удобнее - меню же в стартовом скрипте создаётся? Если в нём же и статистика ведётся - проще разрешать или нет запуск миссии, можно вообще по очкам показывать только доступные для загрузки миссии в меню. А несколько перекрёстно связанных скриптов это скорее всего какие-нибудь глюки будут, я так никогда не делал.


За секции отдельное спасибо, видел похожий код в миссии "Танки", там таким образом создаются файлы миссии. да, конечно, файл миссии - это тоже секционный файл.


Еще один (надеюсь не столь риторический как предыдущие) вопрос. При задании наземке маршрутов линии между вэйпоинтами постоянно цепляются к дорогам, что просто ужасно мешает и утомляет. Приходится ради такого элементарного действия двигать туда-сюда вэйпоинты и результат так себе получается. Галочка в меню "Проложить дороги" не ставится. В итоге, когда танкам нужно наступать по полю они ищут дорожки, вэйпоинтов вместо двух становится три-четыре. Это баг или так задумано? Если задумано, то могу сказать что эта задумка отнимает в три раза больше времени, чем следовало бы тратить на прокладку маршрутов. так задумано, техника старается по дороге всегда ехать, на дорогах скорость гораздо выше чем "в поле". "Проложить дороги" - это пункт, который позволяет сплайновую дорогу из сплайна сделать дорогой, он к маршрутам движения напрямую не относится. В принципе при прокладке маршрута достаточно начальной и конечной точек, остальной маршрут оптимальный сама группа выбирает. Вот в городах проблема, да, там домов очень много :(.


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

podvoxx
26.12.2011, 15:05
так задумано, техника старается по дороге всегда ехать, на дорогах скорость гораздо выше чем "в поле". "Проложить дороги" - это пункт, который позволяет сплайновую дорогу из сплайна сделать дорогой, он к маршрутам движения напрямую не относится. В принципе при прокладке маршрута достаточно начальной и конечной точек, остальной маршрут оптимальный сама группа выбирает.

А как же бой? У меня есть группа танков (допустим 15 штук), мне достаточно только две точки - начало движения и конец на вражеской позиции. Когда ставишь второй вэйпоинт маршрут начинает прилипать к дорогам и танк в результате подставляет бок под прицел противотанковой артиллерии на поворотах. Если дорог много или она близко от направления атаки - это довольно быстро утомляет двигать туда-сюда, притом что это ни к чему и вредно для танкистов. Ну и не реалистично, вчера тестировал - по шоссе три танчика едут по ПДД, хотя вокруг все горит и взрывается, в том числе и их собратья в поле. Помогает поставить больше вэйпоинтов. А это +15 точек, у меня три таких подмиссии +45 точек всего, довольно много времени отнимает.
Может настройку ввести какую-нибудь, чтобы отключить движение по дорогам, если не требуется?



Вот в городах проблема, да, там домов очень много :(.

Для авиасима двигаются неплохо вполне, в Арме примерно также очень часто бывает :)
Да и даже реалистичности можно сказать добавляет - пока он в городе плутает, его легче добить артиллерии и самолетам

naryv
26.12.2011, 16:24
А как же бой? У меня есть группа танков (допустим 15 штук), мне достаточно только две точки - начало движения и конец на вражеской позиции. Когда ставишь второй вэйпоинт маршрут начинает прилипать к дорогам и танк в результате подставляет бок под прицел противотанковой артиллерии на поворотах. емнип в бою танки должны в боевой порядок перестраиваться и направляться в сторону врага, когда заметили того, но это когда заметят, в случае неожиданного огня их судьба сгореть :) .


Если дорог много или она близко от направления атаки - это довольно быстро утомляет двигать туда-сюда, притом что это ни к чему и вредно для танкистов. Ну и не реалистично, вчера тестировал - по шоссе три танчика едут по ПДД, хотя вокруг все горит и взрывается, в том числе и их собратья в поле. Помогает поставить больше вэйпоинтов. А это +15 точек, у меня три таких подмиссии +45 точек всего, довольно много времени отнимает.
Может настройку ввести какую-нибудь, чтобы отключить движение по дорогам, если не требуется?
Не знаю, точно не в ближайшее время, и будет ли вообще - обещать не могу.



Для авиасима двигаются неплохо вполне, в Арме примерно также очень часто бывает :)
Да и даже реалистичности можно сказать добавляет - пока он в городе плутает, его легче добить артиллерии и самолетам ну, всё-же иногда очень тупят:)

Octocat
26.12.2011, 16:36
ВНИМАНИЕ! Код приведенный здесь не работает, рабочая версия кода находится на несколько постов ниже.


Подвох, если все скрипты исполняются в одном процессе, то обмен данными можно организовать так:

// требуемые пространства имен
using System.Windows;
using System.Collections.Generic;

// при инициализации хост миссии создаем и регистрируем таблицу достижений пилотов
var table = new Dictionary<Player, int>();
Application.Current.Properties.Add("PlayerScoreTable", table);





// в процессе игры, в подмиссии, получаем количество очков пилота
if (Application.Current.Properties.Contains("PlayerScoreTable"))
{
// получаем таблицу
var tablex = (Dictionary<Player, int>)Application.Current.Properties["PlayerScoreTable"];

// блокируем таблицу на время использования
lock (tablex)
{
// тут получаем, не важно откуда, объект нужного нам игрока
Player player = GamePlay.gpPlayer();

// проверяем, есть ли в таблице запись для указанного игрока
if (tablex.ContainsKey(player))
{
// получаем количество очков
int score = tablex[player];

// добавляем указанному игроку 25 очков
tablex[player] += 25;
}
else
{
// добавляем в таблицу запись для указанного игрока
tablex.Add(player, 0);
}
}
}

podvoxx
26.12.2011, 16:43
см. ниже

Спасибо, очень грамотные и интересные решения всегда от тебя :) Попробую разобраться

podvoxx
26.12.2011, 20:43
Подвох, если все скрипты исполняются в одном процессе, то обмен данными можно организовать так:


Ругается на namespace CS0234
using System.Windows;

Читал обсуждение про референсы в соседней теме, придется перечитывать еще раз :rtfm:

Octocat
26.12.2011, 22:23
Если под рукой нет Вижуал Студио, в подобных случаях можно делать так:

- Смотрим какие новые классы введены в программу:
1. Dictionary - он из System.Collections, и к возникшей проблеме явно не имеет отношения.
2. Application - этот подозрительный, смотрим на него доку в онлайн MSDN-е (http://msdn.microsoft.com/en-us/library/system.windows.forms.application.aspx), и там видим такие строчки:

Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)

Ага, это явно наш пациент. :D
Добавляем в скрипт макрос с линком на указанную в доке сборку:

//$reference System.Windows.Forms.dll

Полный путь к сборке указывать не надо, она системная, поэтому заранее откомпилированная лежит в глобальном кэше сборок, и там будет найдена по любому. ;)

podvoxx
26.12.2011, 22:40
Если под рукой нет Вижуал Студио, в подобных случаях можно делать так:

- Смотрим какие новые классы введены в программу:
1. Dictionary - он из System.Collections, и к возникшей проблеме явно не имеет отношения.
2. Application - этот подозрительный, смотрим на него доку в онлайн MSDN-е (http://msdn.microsoft.com/en-us/library/system.windows.forms.application.aspx), и там видим такие строчки:

Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)

Ага, это явно наш пациент. :D
Добавляем в скрипт макрос с линком на указанную в доке сборку:

//$reference System.Windows.Forms.dll

Полный путь к сборке указывать не надо, она системная, поэтому заранее откомпилированная лежит в глобальном кэше сборок, и там будет найдена по любому. ;)

Спасибо, формы видел, но в мсдн пропустил мимо мозга :) Еще и папку NET всю просмотрел, теперь знают где что лежит. А студия не работает, только 2008я и только с++, решение -переустановка системы, но эти сотни гигабайт музыкальных программ убивают напрочь такое желание))

Vetochka
04.01.2012, 15:13
По кикобане посредством скриптов ничего нового? Все остановилось на этом?
http://forum.1cpublishing.eu/showthread.php?p=348246#post348246

Как получить чьё-то сообщение из чата?

podvoxx
07.01.2012, 21:58
Если под рукой нет Вижуал Студио, в подобных случаях можно делать так:

- Смотрим какие новые классы введены в программу:
1. Dictionary - он из System.Collections, и к возникшей проблеме явно не имеет отношения.
2. Application - этот подозрительный, смотрим на него доку в онлайн MSDN-е (http://msdn.microsoft.com/en-us/library/system.windows.forms.application.aspx), и там видим такие строчки:

Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)

Ага, это явно наш пациент. :D
Добавляем в скрипт макрос с линком на указанную в доке сборку:

//$reference System.Windows.Forms.dll

Полный путь к сборке указывать не надо, она системная, поэтому заранее откомпилированная лежит в глобальном кэше сборок, и там будет найдена по любому. ;)

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

-atas-
08.01.2012, 01:59
По кикобане посредством скриптов ничего нового? Все остановилось на этом?
http://forum.1cpublishing.eu/showthread.php?p=348246#post348246

Как получить чьё-то сообщение из чата?

Small_Bee кажется говорил, что его лимитер-коммандер читает чат через телнет. Телнет программка, что стоит на Репках тоже видит, что в чате пишется.

По другому видимо только лог копировать, сравнивать с новым и парсить новые строчки, что образовались.

Разработчики давно молчат по этому поводу.

podvoxx
08.01.2012, 02:05
Small_Bee кажется говорил, что его лимитер-коммандер читает чат через телнет. Телнет программка, что стоит на Репках тоже видит, что в чате пишется.

По другому видимо только лог копировать, сравнивать с новым и парсить новые строчки, что образовались.

Разработчики давно молчат по этому поводу.

Это сложно черезчур, хотелось бы без программ дополнительных.

Octocat
09.01.2012, 04:26
Подвох, сорри за нерабочий пример, вот 100% рабочий код:


//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Xaml.dll"
//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WindowsBase.dll"
//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\PresentationFramework.dll"

using System;
using System.Globalization;
using System.IO;
using System.Windows;
using maddox.game;
using maddox.GP;
using maddox.game.world;

public class Mission : AMission
{
private void Log(string format, params object[] args)
{
GamePlay.gpLogServer(new[] { GamePlay.gpPlayer() }, string.Format(CultureInfo.InvariantCulture, format, args), null);
}

public override void OnBattleInit()
{
base.OnBattleInit();

try
{
if (Application.Current == null)
{
new Application();
Log("**Application Instance Created");
}

Application.Current.Properties.Add("AF2505FCA", "OurStatsTable");
Log("**Stats Table Added");

if (Application.Current.Properties.Contains("AF2505FCA"))
{
Log("**Stats Table Founded");
Log("**Value is: {0}", (string)System.Windows.Application.Current.Properties["AF2505FCA"]);
}
}
catch (Exception error)
{
Log("**EXCEPTION: {0}", error);
}
}
}

Small_Bee
09.01.2012, 04:54
Small_Bee кажется говорил, что его лимитер-коммандер читает чат через телнет. Телнет программка, что стоит на Репках тоже видит, что в чате пишется.

По другому видимо только лог копировать, сравнивать с новым и парсить новые строчки, что образовались.

Разработчики давно молчат по этому поводу.

Со статой будет идти коммандер, я встрою возможность отправлять команды серверу из скрипта. Без телнета, будет перехватывать напрямую ввод\вывод.


--- Добавлено ---


По кикобане посредством скриптов ничего нового? Все остановилось на этом?
http://forum.1cpublishing.eu/showthread.php?p=348246#post348246

Как получить чьё-то сообщение из чата?

Обратное тоже в принципе возможно.

Octocat
09.01.2012, 05:26
Полная версия, с таблицей достижений:



//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Xaml.dll"
//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WindowsBase.dll"
//$reference "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\PresentationFramework.dll"

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Windows;
using maddox.game;
using maddox.game.world;

public class Mission : AMission
{
private void Log(string format, params object[] args)
{
GamePlay.gpLogServer(new[] { GamePlay.gpPlayer() }, string.Format(CultureInfo.InvariantCulture, format, args), null);
}

public override void OnBattleInit()
{
base.OnBattleInit();

try
{
// Master-mission
if (true)
{
var player = GamePlay.gpPlayer();
var pscore = PlayerScore.Get(player.Name());
Log("********Initial PlayerScore {0}", pscore);
}

// Submission
Timeout(5, () =>
{
var player = GamePlay.gpPlayer();
var pscore = PlayerScore.Get(player.Name());
pscore.KillsGnd++;
pscore.Score += 10;
Log("********PlayerScore After Tank Destroyed {0}", pscore);
});

// Another submission
Timeout(10, () =>
{
var player = GamePlay.gpPlayer();
var pscore = PlayerScore.Get(player.Name());
pscore.KillsAir++;
pscore.Score += 50;
Log("********PlayerScore After Aircraft Killed {0}", pscore);
});

}
catch (Exception error)
{
Log("********EXCEPTION: {0}", error);
}
}

class PlayerScore
{
public string Name { get; private set; }
public double Score { get; set; }
public int KillsAir { get; set; }
public int KillsGnd { get; set; }

public override string ToString()
{
return string.Format(CultureInfo.InvariantCulture,
"Name:{0} Score:{1} KillsAir/Ground: {2}/{3}", Name, Score, KillsAir, KillsGnd);
}

public static PlayerScore Get(string pname)
{
if (Application.Current == null)
{
new Application();
}

string token = "AF2505FCA";
Dictionary<string, PlayerScore> table = null;

if (Application.Current.Properties.Contains(token))
{
table = (Dictionary<string, PlayerScore>)Application.Current.Properties[token];
}
else Application.Current.Properties.Add(token, table = new Dictionary<string, PlayerScore>());

PlayerScore pscore = null;
if (table.TryGetValue(pname, out pscore) == false)
{
table.Add(pname, pscore = new PlayerScore() { Name = pname });
}

return pscore;
}
}
}

podvoxx
09.01.2012, 06:18
Полная версия, с таблицей достижений:

Спасибо большое! :thx:
Пока не пробовал, но уже выяснил что NET 4.0 у меня по указанному пути нет.:eek: В этой папке только 3.0 , 3.5. Сам 4-й есть, на всякий случай заново установил. Наверное искать его надо :)

Нашелся в папке Windows по такому пути:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319

На сервере это не создаст проблемы?

Octocat
09.01.2012, 14:44
Да, у меня они тоже там есть. Поправил исходный пост.

Попробуй, думаю все будет нормально.

podvoxx
09.01.2012, 19:21
1. Сейчас есть возможность в скриптах завершить миссию без использования аддинов? И загрузить потом следующую, т.е. oрганизовать ротацию?
Пробовал сделать ротацию на выделенном - первая миссия грузится нормально, в последующих подмиссии не грузятся. Читал на желтом о различии команд f и file, но не разобрался, подписсии все равно оказываются за бортом.
2. Старт самолетов на парковке сейчас корректно работает?

podvoxx
10.01.2012, 21:51
Нарисовалась проблема. Запустил миссию на выделенном, все воюет считается нормально, а как только сам захожу выскакивают ошибки и почти все объекты пропадают из миссии. Самому можно вообще заходить на свой выделенный?
Раньше это удавалось... Что в скрипте может приводить к такой ошибке?


=================================================
[21:56:12] System.NullReferenceException: Object reference not set to an instance of an object.
[21:56:12]
[21:56:12] Server stack trace:
[21:56:12] at 6UZP66dp5dKAdD5LMYr.F9pJL9dGtcbAt8r8Umh.JwjWWYN9w9(xnKDxkk8wATA33F3hpA , G7xPRi2e9fpuLtHG23a )
[21:56:12] at 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.sp1UnA9jmwb(Player[] , String , Object[] , Double )
[21:56:12] at 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.yEy1eAe2YPQxskLBZIku(Object , Object , Object , Double )
[21:56:12] at 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.d87UnNOmgnm(Player[] , String , Object[] )
[21:56:12] at pqlnUTF7gnMAoU4L9MP.lm1GgkFoiOOBGu1gmwf.ZnhKPrKgxsgJUIGtmgOK(Object , Object , Object )
[21:56:12] at pqlnUTF7gnMAoU4L9MP.lm1GgkFoiOOBGu1gmwf.HUDLogCenter(Player[] , String , Object[] )
[21:56:12] at maddox.game.GameDef.gpHUDLogCenter(Player[] to, String msg, Object[] parms)
[21:56:12] at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
[21:56:12] at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
[21:56:12]
[21:56:12] Exception rethrown at [0]:
[21:56:12] at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
[21:56:12] at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
[21:56:12] at maddox.game.IGamePlay.gpHUDLogCenter(Player[] to, String msg, Object[] parms)
[21:56:12] at Mission.sendScreenMessageTo(Int32 army, String msg, Object[] parms)
[21:56:12] at Mission.OnActorDead(Int32 missionNumber, String shortName, AiActor actor, List`1 damages)
[21:56:12] at maddox.game.world.Strategy.OnActorDead(Int32 missionNumber, String shortName, AiActor actor, AiDamageInitiator initiator)
[21:56:12] at maddox.game.ABattle.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[21:56:12] at maddox.game.world.Strategy.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[21:56:12] at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
[21:56:12] at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
[21:56:12]
[21:56:12] Exception rethrown at [1]:
[21:56:12] at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
[21:56:12] at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
[21:56:12] at maddox.game.IBattle.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[21:56:12] at maddox.game.GameDef.eventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[21:56:12] at RoFTf9069W6jWRmA8PN.U2RoVL0OVdWjVQJ7319.eventGame(GameEventId , Object , Object , Int32 )
[21:56:12] at NTlYp6NdtgpnKt7wGgO.VvFELvNie2My3mOTesk.WPGBQuHHKI8(GameEventId , Object , Object , Int32 )
[21:56:12] =================================================

-atas-
10.01.2012, 22:39
Читал на желтом о различии команд f и file, но не разобрался, подмиссии все равно оказываются за бортом.

Это только из .cmd файла вроде. Из скрипта должно работать если все миссии будут подмиссией мастермиссии или 2я миссия будет подмиссией первой и т.д. Самое надежное, наверное, все подмиссии всех миссий из одного мастер-скрипта грузить.

Ошибка вроде бы с отправкой сообщений как-то связана. Попробуй отключить. На выделенном сервере отсутствуют player, есть только remoteplayers емнип. У Kodiak система сообщений для онлайна и офлайна отличается поэтому.

podvoxx
10.01.2012, 22:47
Это только из .cmd файла вроде. Из скрипта должно работать если все миссии будут подмиссией мастермиссии или 2я миссия будет подмиссией первой и т.д. Самое надежное, наверное, все подмиссии всех миссий из одного мастер-скрипта грузить.
Так и есть сейчас. Могу выслать миссию



Ошибка вроде бы с отправкой сообщений как-то связана. Попробуй отключить. На выделенном сервере отсутствуют player, есть только remoteplayers емнип. У Kodiak система сообщений для онлайна и офлайна отличается поэтому.

Вот тут может быть. Хотя на нуль проверяется, а у Кодиака скрипты универсальные. Видимо из-за player, хотя проверка стоит же вроде..


//=========================LOCALIZATION=============================
string[] languageArray = { "en", "ru", "de", "fr", "es", "cs", "it", "pl" };

//******************Localize Message Method*******************
private string getLocalizedMessage(string textTranslate)
{
if (GamePlay.gpPlayer() != null)
{
string[] localizeArray;
string langIndex = GamePlay.gpPlayer().LanguageName();
switch (textTranslate)
{
//GET TEAM POINTS and win-msg
case "getPointsRED":
{
localizeArray = new string[]
{
"Red team gets points for complite task : ",
"Команда красных получает очки за выполнение задания: ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : ",
"Red team gets points for complite task : "
};
return localizeArray.GetValue(Array.IndexOf(languageArray, langIndex)).ToString();
} break;
}
return textTranslate;
}
//======================================================================

Small_Bee
10.01.2012, 22:54
[QUOTE=podvoxx;1767574]Так и есть сейчас. Могу выслать миссию
Вот тут может быть. Хотя на нуль проверяется, а у Кодиака скрипты универсальные.

Высылал ты мне эту миссию? Если хочешь, прикручу к ней свой локалайзер и отправлю назад - сразу пример будет.

podvoxx
10.01.2012, 22:57
Высылал ты мне эту миссию? Если хочешь, прикручу к ней свой локалайзер и отправлю назад - сразу пример будет.

Да, проверь почту. А может ты подправишь, там наверняка несерьезная ошибка?

-atas-
10.01.2012, 23:04
Вот тут может быть. Хотя на нуль проверяется, а у Кодиака скрипты универсальные. Видимо из-за player, хотя проверка стоит же вроде..


Там еще Server есть. Он возможно как player считается, не помню уже, когда-то на желтом обсуждали с Kodiak. Лучше посмотреть как у него реализовано. Он раз 10 код менял, чтобы все заработало на выделенном.

podvoxx
11.01.2012, 09:12
Там еще Server есть. Он возможно как player считается, не помню уже, когда-то на желтом обсуждали с Kodiak. Лучше посмотреть как у него реализовано. Он раз 10 код менял, чтобы все заработало на выделенном.

Сами сообщения сервера проходят как положено. Думаю разберусь, только нескоро получится. Заодно добавлю еще пару интересных вещей.
Кажется нашел ошибку, хотя не уверен. Много раз читал тему (http://forum.1cpublishing.eu/showpost.php?p=345082&postcount=2), но все равно особенности выделеного не учел.
Сам скрипт сообщений работает идеально.


//******************Send Screen Message Method*******************
private void sendScreenMessageTo(int army, string msg, object[] parms)
{
List<Player> Players = new List<Player>();
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}


[21:34:02] Server to [Server]: ======================================
[21:34:02] Server to [Server]: RED> [ 142 ] / [ 166 ] <BLUE
[21:34:02] Server to [Server]: Миссия будет остановлена через 2 min.
[21:34:02] Server to [Server]: ======================================
[21:34:19] Server to [Server]: Команда красных уничтожила самолет-разведчик синих[ 1 ]
[21:34:19] Server to [Server]: Команда красных получает очки за выполнение задания: [ 100 ]
[21:34:19] Server: Bf 110 C-4 () (Бот) сбил FW 200 () (Бот).

Пока "в игре" только [Server] - локализация (http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1767574&viewfull=1#post1767574) тоже работает правильно, но в ней есть определение языка игрока:

string langIndex = GamePlay.gpPlayer().LanguageName();

Получается, что текст сообщения определяется по GamePlay.gpPlayer()(скорее всего здесь конфликт), а сообщения отправляются массиву игроков(они все могут оказаться с разными языками):

sendScreenMessageTo(-1, getLocalizedMessage("noWinner"), new object[] { });

Попробую сделать определение языка для каждого игрока из массива и тправку сообщений в соответствии с ним, но я не очень хорошо понимаю отличия выделенного/сингла от мультиплеера. Хотел бы уточнить, чтобы правильно понимать что происходит с этими плеерами, так как они везде используются.
Для сингла и dedi:
GamePlay.gpPlayer() - это кто?

Для мультиплеера:
GamePlay.gpRemotePlayers() - массив игроков на сервере(он состоит из GamePlay.gpPlayer() ?)

И почему определение игрока отличается для сингла и выделенного?

podvoxx
11.01.2012, 12:05
Еще пара вопросов.

1.
GamePlay.gpPlayer() - игрок , выделенный сервер/сингл
GamePlay.gpPlayer().LanguageName() - язык игрока, string, вида "ru", "en" и т.д.
GamePlay.gpPlayer().Army() - армия игрока, может быть 1 и 2

GamePlay.gpRemotePlayers() - игрок , мультиплеер через главное меню
GamePlay.gpRemotePlayers().Length - количество игроков

Какие еще есть варианты и можно ли при помощи GamePlay.gpPlayer() определить ник игрока?

2.
Корректно ли в БОБе будет использовать метод определения и отсчета времени на основе DateTime?
Например для отсчета времени от начала миссии? Подойдет для точной засечки времени в миссии на гоночном сервере?


DateTime dateTime = DateTime.Now;
C.WriteLine ("d = {0:d}", dateTime ); // mm/dd/yyyy
C.WriteLine ("D = {0:D}", dateTime ); // month dd, yyyy
C.WriteLine ("f = {0:f}", dateTime ); // day, month dd, yyyy hh:mm
C.WriteLine ("F = {0:F}", dateTime ); // day, month dd, yyyy HH:mm:ss AM/PM
C.WriteLine ("g = {0:g}", dateTime ); // mm/dd/yyyy HH:mm
C.WriteLine ("G = {0:G}", dateTime ); // mm/dd/yyyy hh:mm:ss
C.WriteLine ("M = {0:M}", dateTime ); // month dd
C.WriteLine ("R = {0:R}", dateTime ); // ddd Month yyyy hh:mm:ss GMT
C.WriteLine ("s = {0:s}", dateTime ); // yyyy-mm-dd hh:mm:ss (Sortable)
C.WriteLine ("t = {0:t}", dateTime ); // hh:mm AM/PM
C.WriteLine ("T = {0:T}", dateTime ); // hh:mm:ss AM/PM

// yyyy-mm-dd hh:mm:ss (Sortable)
C.WriteLine ("u = {0:u}", dateTime );

// day, month dd, yyyy hh:mm:ss AM/PM
C.WriteLine ("U = {0:U}", dateTime );

// month, yyyy (March, 2006)
C.WriteLine ("Y = {0:Y}", dateTime );
C.WriteLine ("Month = " + dateTime.Month); // month number (3)

// day of week name (Friday)
C.WriteLine ("Day Of Week = " + dateTime.DayOfWeek);

// 24 hour time (16:12:11)
C.WriteLine ("Time Of Day = " + dateTime.TimeOfDay);

// (632769991310000000)
C.WriteLine("DateTime.Ticks = " + dateTime.Ticks);
// Ticks are the number of 100 nanosecond intervals since 01/01/0001 12:00am
// Ticks are useful in elapsed time measurement.

3.
Есть примеры с использованием Stopwatch(), он тоже подходит для отсчета времени? Выглядит очень удобным

Octocat
11.01.2012, 12:15
Подвох, вот SharpDevelop (http://www.icsharpcode.net/OpenSource/SD/Download/) - думаю неплохой вариант для тебя, раз уж студия не встает. Ставишь, подключаешь игровые либы, как описано здесь [Tutorial] Simple Scripting Lessons - Preparations (http://forum.1cpublishing.eu/showthread.php?t=28997). Писать и отлаживать код в блокноте - это не вариант.

podvoxx
11.01.2012, 12:27
Подвох, вот SharpDevelop (http://www.icsharpcode.net/OpenSource/SD/Download/) - думаю неплохой вариант для тебя, раз уж студия не встает. Ставишь, подключаешь игровые либы, как описано здесь [Tutorial] Simple Scripting Lessons - Preparations (http://forum.1cpublishing.eu/showthread.php?t=28997). Писать и отлаживать код в блокноте - это не вариант.

У меня стоит 2008-я, но я ее использую как удобный редактор только. И на работе какие-то тулзы с урезанной студией стоят, тоже как редактор подходит. Спасибо за наводку, как-то не подумал что в других программах тоже библиотеки можно подключить :thx:

-atas-
11.01.2012, 14:27
GamePlay.gpPlayer() - это кто?
Игрок сингла и хост сервера из GUI (на деди возможно сам Сервер).



Для мультиплеера:
GamePlay.gpRemotePlayers() - массив игроков на сервере(он состоит из GamePlay.gpPlayer() ?)
Не думаю.


И почему определение игрока отличается для сингла и выделенного?
Чтобы юзерам было неудобно программировать, было меньше миссий, меньше продаж. Саботаж, в общем :) Все авторы, даже такие профессионалы как Kodiak с этим мучаются часами.

--- Добавлено ---



3.
Есть примеры с использованием Stopwatch(), он тоже подходит для отсчета времени? Выглядит очень удобным

А компрессия времени в игре при этом работает?

onTickGame при включении компрессии тоже дает небольшие сбои как мне показалось, но наверное это надежнее?

podvoxx
11.01.2012, 15:06
А компрессия времени в игре при этом работает?
onTickGame при включении компрессии тоже дает небольшие сбои как мне показалось, но наверное это надежнее?

Это замедление/ускорение времени? Делаю для онлайн миссии, поэтому все нормально должно быть. У Snafu весь учет времени практически построен. И если верить мсдн, то этот метод используется как раз для точного измерения производительности.

--- Добавлено ---



Чтобы юзерам было неудобно программировать, было меньше миссий, меньше продаж. Саботаж, в общем :) Все авторы, даже такие профессионалы как Kodiak с этим мучаются часами.
А простые смертные как я днями и неделями :)

Octocat
11.01.2012, 15:13
Для операций с временными интервалами - TimeSpan, с датой и временем - DateTime.

Small_Bee
11.01.2012, 15:20
Чтобы юзерам было неудобно программировать, было меньше миссий, меньше продаж. Саботаж, в общем :) Все авторы, даже такие профессионалы как Kodiak с этим мучаются часами.[COLOR="Silver"]


Определение игроков не отличается ни для сервера, ни для сингла. И там и там это - AiPlayer.
GamePlay.gpPlayer() - мы всегда получаем хост. Для сингла он будет совпадать с собственно игроком. gpRemotePlayers() получает список всех игроков, подключившихся удаленно. Нет тут ни проблемы, ни противоречия вообще.
Если хотим сделать универсальный скрипт, проверяем сразу gpRemotePlayers() + gpPlayer(). Не вижу зла, в общем.

В конце концов можно проверить, что запущено - сингл, сервер или дедик.


Для мультиплеера:
GamePlay.gpRemotePlayers() - массив игроков на сервере(он состоит из GamePlay.gpPlayer() ?)

Проблема с определениями. GamePlay.gpPlayer() - это метод, возвращающий объект AiPlayer(). GamePlay.gpRemotePlayers() соответственно возвращает набор таких AiPlayer.

Универсальный совет - при получении любого массива методами из GamePlay и т.д., перед использованием всегда проверяем его на null.


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

Не изобретай велосипед. ;)

podvoxx
11.01.2012, 15:30
Спасибо за информацию, проблемы нет, только от незнания и ее отсутствия :) Про плееры примерно так и представлял.



Не изобретай велосипед. ;)

Там недолго править, в голове уже все исправил, осталось в коде )) Просто хочется попроще и без дополнений, чтобы миссии можно было запустить используя только ее файлы.

-atas-
11.01.2012, 19:20
Нет тут ни проблемы, ни противоречия вообще.
Если хотим сделать универсальный скрипт, проверяем сразу gpRemotePlayers() + gpPlayer(). Не вижу зла, в общем.

В конце концов можно проверить, что запущено - сингл, сервер или дедик.

Я о том, что с точки зрения usability и дружелюбности к создателю миссий эти проверки лучше бы делались самим движком, чтобы у создателя голова не болела.

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

Рабочему ВАЗа удобно пользоваться Жигулями. Остальным все же удобнее хотя бы Фиат. Yahoo или Altavista смотрели на свои страницы поиска глазами акционеров, менеджеров, программистов и размещали там рекламу, новости и т.д. Где они теперь? Гугл смотрел на страницу поиска глазами юзера и дал ему быстрый ответ на его вопрос "Как найти ...?".

Юзер, заходящий в мультик с вопросом "Хочу сервер, чтобы полетать!" найдет ответ на него только с 3го тыка, потому что программисту так было быстрее и просто лениво думать заранее, поставив себя на место пользователя и посмотреть его глазами. В Арме почему-то такой проблемы нет, список серверов находится сразу. Шкода лучше жигулей. Поэтому Российские компании обычно и неконкурентоспособны.

Также с созданием миссий. Тенденция, к сожалению. Мы с Kodiak тоже потратили немало времени на эту проблему http://forum.1cpublishing.eu/showthread.php?t=26623 Кодиак что-то в C# понимает в отличии от меня. podvoxx сталкивается абсолютно с теми же трудностями. Это уже проблема для продукта, "и так сойдет" может не прокатить на мировом рынке.

Также с хотфиксами. Нет звука в онлайне? Подождут месяца 3, т.к. девелоперу неудобно делать хотфикс, а удобнее сразу новый движок. Нет возможности летать из-за вылета лончера? Не важно, хотфикса не будет, ждите еще 3 месяца. Если компания ориентирована не на клиента, а на себя любимых/своих акционеров, она может исправить какие-то баги, но не может дать клиенту то, что он хочет как целостный продукт.

podvoxx
11.01.2012, 19:38
Я о том, что с точки зрения usability и дружелюбности к создателю миссий эти проверки лучше бы делались самим движком, чтобы у создателя голова не болела.

Поддерживаю тебя полностью, голова даже трещит иногда)) Но с другой стороны нам дали мощнейший инструмент, довольно сложный правда.

Small_Bee
11.01.2012, 21:30
Я о том, что с точки зрения usability и дружелюбности к создателю миссий эти проверки лучше бы делались самим движком, чтобы у создателя голова не болела.

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

Рабочему ВАЗа удобно пользоваться Жигулями. Остальным все же удобнее хотя бы Фиат. Yahoo или Altavista смотрели на свои страницы поиска глазами акционеров, менеджеров, программистов и размещали там рекламу, новости и т.д. Где они теперь? Гугл смотрел на страницу поиска глазами юзера и дал ему быстрый ответ на его вопрос "Как найти ...?".

Юзер, заходящий в мультик с вопросом "Хочу сервер, чтобы полетать!" найдет ответ на него только с 3го тыка, потому что программисту так было быстрее и просто лениво думать заранее, поставив себя на место пользователя и посмотреть его глазами. В Арме почему-то такой проблемы нет, список серверов находится сразу. Шкода лучше жигулей. Поэтому Российские компании обычно и неконкурентоспособны.

Также с созданием миссий. Тенденция, к сожалению. Мы с Kodiak тоже потратили немало времени на эту проблему http://forum.1cpublishing.eu/showthread.php?t=26623 Кодиак что-то в C# понимает в отличии от меня. podvoxx сталкивается абсолютно с теми же трудностями. Это уже проблема для продукта, "и так сойдет" может не прокатить на мировом рынке.

Также с хотфиксами. Нет звука в онлайне? Подождут месяца 3, т.к. девелоперу неудобно делать хотфикс, а удобнее сразу новый движок. Нет возможности летать из-за вылета лончера? Не важно, хотфикса не будет, ждите еще 3 месяца. Если компания ориентирована не на клиента, а на себя любимых/своих акционеров, она может исправить какие-то баги, но не может дать клиенту то, что он хочет как целостный продукт.

Я так и не понял, в чем именно проблема с этими игроками. Как хотелось бы это реализовать, что бы было понятно?

Хотфиксы - один, с точки зрения юзера маленький баг, может потребовать огромного труда и вложений. Понятно, что со стороны этого не видно.
По поводу гугла, у меня несколько другая информация о причинах его успеха, ну да это оффтоп.
Юзер это одно - создатель миссий - совсем разный уровень "пользователей". Поэтому. Текущий редактор практически ничем не отличается от старого, так что для миссий на уровне старого ила вообще никакими навыками обладать не надо, плюс он привычен уже.
Для более сложных сценариев - в руках мощный инструмент, но что бы его применить, да, необходим некоторый багаж знаний. И тут разработчик и "пользователь" начинают говорить на одном языке. Если владеют, конечно. А как иначе? Соседи сделали мега редактор, и что? Подозреваю, что создатели миссий не используют и 10-й доли его возможностей, а труда туда вложено дай боже. Теперь они сделали внешние интерфейсы без всяких иконок и GUI - народ духом воспрянул. Да, для того что бы их юзать, тоже надо обладать определенными навыками. И никакого "юзерфриндли" там нет и не надо. Или надо было сделать так же - что бы когда дали скрипты, все от счастья заплясали? )))

Для полного счастья мне не хватает только учета всех статиков и сетевых дополнений по аналогии с оффом. С остальным - проблем нет. У кого они есть - это не проблема ни игры, ни самого C#. За баги сейчас не говорим ).

Интерфейс игровой - это совсем другой вопрос. Я бы тоже сказал, что он неудобный, если бы не увидел интерфейс новых "Героев" )))

-atas-
11.01.2012, 22:45
Я так и не понял, в чем именно проблема с этими игроками. Как хотелось бы это реализовать, что бы было понятно?

Например, чтобы скрипт, который работает в оффлайне, или на хостед сервере, работал на выделенном. Если у меня нет внешнего IP я не могу выделенный сервер запустить, как мне миссии тестировать? Запускаю в лобби, они работают, запускаю на Репке, они не работают. Не порядок. Много таких моментов, где подходы не унифицированы. Например, танки можно как группу запустить, а корабли нельзя и т.д. и т.п. Унификация сильно облегчает обучение юзера, делающего миссии.


Хотфиксы - один, с точки зрения юзера маленький баг, может потребовать огромного труда и вложений. Понятно, что со стороны этого не видно.
Понятно, что это вопрос приоритетов (удобство пользователя vs. ресурсы команды, нервы, бессонные ночи, ругань с издателем, конфликты с начальством), бесплатного ничего не бывает. Кто выбирает правильные приоритеты, добивается любви пользователей, мировой славы продукта, выдающихся для Российской компании продаж. Кто выбирает неправильные, вызывает критику пользователей, забвение, закрытие проекта.

Мне вот рассказывали, что бывшие сотрудники на Олега жаловались, мол приносишь ему хорошую работу, а он заставляет переделывать, и так много раз, просто невыносимо. Видимо Олег смотрел не глазами программиста/дизайнера, а глазами юзера, как на западе принято. Иначе бы Ил-2 не был успешен. Другие продукты там продать невозможно. Работал раньше в западной кампании немного с иностранцами. Совсем другой подход, как у братков "пацан сказал, пацан сделал :)" Ресурсы никого не волнуют, это личная ответственность называется: рви зубами, когтями, не спи ночами, поставь всех на уши, вывернись наизнанку, но сделай на 100%. Сильно отличается от осваивания бюджета строго в рабочее время в отечественной контторе.

Но это все лирика, сори за оффтоп.

Octocat
11.01.2012, 23:03
Учет статиков и сетевые дополнения это конечно хорошо, но API нет, вообще. Ни красивого объектного API ни безобъектного, вообще никакого. Нормальный API - целый комплекс сервисов, где можно получить список дескрипторов типов самолетов, которые содержат всю мета-информацию о самолете, (вплоть до максимальной скорости в горизонте на разных высотах, скороподъемности, вариантах вооружения), дескипторы эскадрилий (типы используемых самолетов, количество и размеры звеньев, типы стандартных построений и решаемых задач), возможность до старта миссии проложить маршруты наземки, получить информацио о расположении линии фронта и координатах секторов, нормальные человеческие функци CreateGroup() и CreateUnit() чтобы порождать юниты и группы. Всего этого нет. Что же есть? Вместо всего перечисленного у нас ISectionFile, который по хорошему давно пора бы похоронить в свинцовом гробу, убожество, написанное джава-программистом в джава-стиле, работающее наполовину (колонны в поддмиссиях нельзя создать через gpPostMissionLoad(ISectionFile), только предварительно сохранив файл и вызвав gpPostMissionLoad(string)). В общем трешово все внутри с точки зрения коммерческого программиста. Про комментарии, оформление кода, и говорить нечего, в путевой фирме такой код к продакшн-ветке репозитория близко бы не подпустили. %)

Small_Bee
12.01.2012, 00:16
Колонны в поддмиссиях нельзя создать через gpPostMissionLoad(ISectionFile), только предварительно сохранив файл и вызвав gpPostMissionLoad(string)

Гм. А каким образом тогда работает пример с машинками на аэродромах от naryv? Там как раз это дело и используется.

Не очень представляю создание групп и прочего одним методом. Это ж сколько параметров туда передать? Разве что примитивное что-то вроде домиков и прочего. Моя претензия только к формату файла, ибо большой поклонник XML. ) Да и тоже можно найти оправдание - формат миссии привычен. )
Хотя конечно можно. И обрубать себе руки, потому что если захочется добавить фичу, то нифига не получится, иначе придется менять интерфейсы (в лучшем случае), а это значит, что старый код (нами же написанный) работать не будет. Либо нарисовать их настолько обобщенными, что будет похоже на.. ISectionFile.

По поводу скоростей и параметров. Их же можно вроде снять с самолета? Если надо макс. скорость по высотам - я делал небольшой скрипт, где у меня боты летали на всем на всех высотах. Через полтора часа мин. радиус виража я конечно не получил, но информация для генерации маршрутов у меня была в полном объеме.

За Олега тоже неоднозначный вывод. Что значит переделывать? Я так понимаю, есть конкретное ТЗ - если проект ТЗ соответствует, какие вопросы? Переделывание всегда влечет за собой трату времени, как реального, так и потенциального (время на старую работу тоже ведь потрачено было?), и чревато набором трудно уловимых ошибок. Если нет внятного ТЗ - это уже к руководителю вопросы. Можно конечно применять там модульные решения, с прицелом на расширяемость... Но. Кто знает, будет ли эта вся модульность реально использоваться в условиях отсутствия нормального ТЗ? А время потрачено.. Сделай то, не знаю что и далее по тексту.

Подход иностранцев конечно супер, но... такая фиговина частенько приводит к шикарному набору костылей и заплаток, потому что сделать нормально просто не было времени - работает, и слава богу, контракт выполнен, дальше - трава не расти или новый контракт. Вот кстати у иностранцев такие продукты и видел. Над ними же тихо сходил с ума ). А оценка потребного времени на решение задачи с точки зрения программиста головная боль еще та. Извечный, понимаешь "быстро, дешево, качественно - выбирайте любые два" )

В общем завязываем оффтопить, ибо все равно каждый при своем останется, а будет сообща искать выход из создавшегося положения. :)
Во кстати, Octocat, есть предложение - нарисовать классы-обертки для вот такого создания юнитов и прочего, как предложил. Это реально будет востребованная фича. Ну или объединить усилия )

Octocat
12.01.2012, 01:11
Мне практически этим приходится заниматься большую часть времени, разными обертками и подпорками, вместо полезных фич. А объединять усилия - дело хорошее, я однозначно за.

Про неправильную работу gpPostMissionLoad(), в этой (http://www.sukhoi.ru/forum/showthread.php?t=68465&page=5&p=1766490#post1766490) теме подробно расписал.

Насчет большого числа параметров, вот хороший пример: Scripting_Commands_ArmA2 (http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA2), функции CreateUnit, CreateVehicle, CreateGroup ;)

Small_Bee
12.01.2012, 01:28
Мне практически этим приходится заниматься большую часть времени, разными обертками и подпорками, вместо полезных фич. А объединять усилия - дело хорошее, я однозначно за.

Про неправильную работу gpPostMissionLoad(), в этой (http://www.sukhoi.ru/forum/showthread.php?t=68465&page=5&p=1766490#post1766490) теме подробно расписал.

Насчет большого числа параметров, вот хороший пример: Scripting_Commands_ArmA2 (http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA2), функции CreateUnit, CreateVehicle, CreateGroup ;)

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

По объединению усилий. Как известно, сейчас доделываю стату и коммандер. По коммандеру есть несколько задач, который можно раздельно писать, по самой библиотеке со статой и расширению ее функционала, ну и много чего есть. )
По коммандеру кстати я там использовал прием, который раньше не юзал - не помешает взгляд другого программера, ибо подозреваю, что не все идеально.
А вообще думаю надо обменяться ближайшими и не очень планами.
Будет хорошо, если обменяемся контактами и как то согласовывать работу начинать.

-atas-
12.01.2012, 02:18
Про неправильную работу gpPostMissionLoad(), в этой (http://www.sukhoi.ru/forum/showthread.php?t=68465&page=5&p=1766490#post1766490) теме подробно расписал.

Можно в теме про редактор еще продублировать http://www.sukhoi.ru/forum/showthread.php?t=68596&page=3

Планы по объединению усилий радуют, надеюсь Репкам с этого что-то перепадет :) Спасибо за труды.

podvoxx
12.01.2012, 13:57
Подвох, вот SharpDevelop (http://www.icsharpcode.net/OpenSource/SD/Download/) - думаю неплохой вариант для тебя, раз уж студия не встает. Ставишь, подключаешь игровые либы, как описано здесь [Tutorial] Simple Scripting Lessons - Preparations (http://forum.1cpublishing.eu/showthread.php?t=28997). Писать и отлаживать код в блокноте - это не вариант.

Octocat :thx:, спасибо, что наставил на путь истинный. Все скачалось-установилось-подключилось за пять минут, интерфейс как в студии, мне понравилась программка :) О чем я думал полгода не понимаю, может это ide для c++(я с него начал, когда с Армой возился) меня оттолкнули от нефирменных программ %) Наконец-то кончилась у меня эпоха использования боба как компилятора))

Есть такой вопрос. Встречал в миссиях объект маркер, который использовался для спауна наземки в определенном этим маркером положении. В редакторе где этот маркер находится?

По процессу спауна наземки. Допустим есть группа статиков, расставленных красиво в редакторе, мне нужно эту группу спаунить скриптом в определенных местах на карте, где не будет конфликтов с окружением на земле. Для этого я ставлю всю группу в подходящем месте на карте, беру координаты из файла миссии, затем повторяю процесс сколько нужно. Потом заношу эти координаты группы объектов в массив, случайным образом выбираю оттуда их при создании миссии и создаю в скрипте миссию с заданными координатами и группой объектов. Это нормальное решение? И задния/окопы наверное тоже не будут подгружаться?

podvoxx
12.01.2012, 16:25
1.
Есть ли в редакторы акторы, которые глючат/не работают, точнее список никто не составлял? Вчера из стандартной красной автоколонны черная дыра вылезла, танчик синий при этом удивительным образом пощадил машинку для аэростатов - возможно с лодом дамадж-модели проблемы или с человечком.

http://cs6003.vk.com/u13511680/149104035/z_958fa576.jpg
http://cs6003.vk.com/u13511680/149104035/z_8b75d9a3.jpg

-atas-
12.01.2012, 19:46
Есть такой вопрос. Встречал в миссиях объект маркер, который использовался для спауна наземки в определенном этим маркером положении. В редакторе где этот маркер находится?

По процессу спауна наземки. Допустим есть группа статиков, расставленных красиво в редакторе, мне нужно эту группу спаунить скриптом в определенных местах на карте, где не будет конфликтов с окружением на земле. Для этого я ставлю всю группу в подходящем месте на карте, беру координаты из файла миссии, затем повторяю процесс сколько нужно. Потом заношу эти координаты группы объектов в массив, случайным образом выбираю оттуда их при создании миссии и создаю в скрипте миссию с заданными координатами и группой объектов. Это нормальное решение? И задния/окопы наверное тоже не будут подгружаться?

Это маркер линии фронта. Как на нем спаунить технику - в примерах naryv в моем архиве. У него там хорошая танковая война, которую с небольшими исправлениями можно превратить в проект. Жаль, что он не довел до конца. Banks грозится внедрить ее в свой генератор, но когда это будет...

--- Добавлено ---


1.
Если в редакторы акторы, которые глючат/не работают, точнее список никто не составлял? Вчера из стандартной красной автоколонны черная дыра вылезла, танчик синий при этом удивительным образом пощадил машинку для аэростатов - возможно с лодом дамадж-модели проблемы или с человечком.


Это в багрепорты, если их кто-то еще читает. У меня была дыра с Pkz 222.

Vetochka
13.01.2012, 00:13
У меня при убийстве немецкой транспортной колонны "зенитки" и тягача G.QUAD подвисала игра.

podvoxx
13.01.2012, 10:57
1.
Какой метод вызывается, когда боты(и игрок наверное тоже?) прыгают из самолета?
Может быть этот?

public virtual void OnAircraftKilled(int missionNumber, string shortName, maddox.game.world.AiAircraft aircraft)
С actorDead у меня разведчик без экипажа сейчас сообщения отправляет пока самолет падает, а Кондор с 5 км падает долго :). Хотелось бы отобрать у экипажа сотовые

2.
Можно ли сменить юниту(наземному) изменить армию во время миссии?

3.

Это маркер линии фронта. Как на нем спаунить технику - в примерах naryv в моем архиве. У него там хорошая танковая война, которую с небольшими исправлениями можно превратить в проект. Жаль, что он не довел до конца. Banks грозится внедрить ее в свой генератор, но когда это будет...

Т.е. "пустого" объекта-маркера нет? В Арме с маркерами здорово налажено все - цвет, вид, назначение - чего только нет. Я помню с помощью их маршруты автобусные делал в Чернорусии.

podvoxx
31.01.2012, 14:55
Есть завод, состоит из объектов "Здание". В эти цеха необходимо поместить "живые" акторы, чтобы определить целые они или нет.
Пробовали ставить машинки разных типов. Они разъезжаются при загрузке мисии и начинают прятаться и снова пятится при появлении вражеского самолета, причем стены им не помеха %)
Что можно поставить вместо машинок? Прожекторы - живые объекты? Радары? Генератор? Можно артиллерию, но я не знаю как отключить ей стрельбу навсегда иначе она изнутри разнесет все цеха. Нужен 100% работающий вариант, так как тестировать и заниматься исследованиями нет больше возможности.

На картинке видно как грузовички торчат. Хотя бы галку добавили в настройки юнитов "Стоять и недвигаться никогда" (таймаут не подходит), раз статики бесполезные :(

http://www.sukhoi.ru/forum/attachment.php?attachmentid=149435&d=1327688342

podvoxx
03.02.2012, 09:56
Снова проблема с null и HUD-сообщениями. Здесь миссия со скриптом - http://www.sukhoi.ru/forum/showthread.php?t=73858&p=1783621&viewfull=1#post1783621.

Рецидив этой полученной в домашних условиях, ходя код совсем другой сейчас - http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1767524&viewfull=1#post1767524.

Суть ошибки такая получается. Имеем выделенный сервер. Отправляем HUD-сообщение только серверу(нет игроков) - ошибки нет.
Отправляем игрокам и серверу - ошибка 100%.
В чем может быть дело?

Код скрипта:


//======================Small_Bee Localization Class====================
string langFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "\\1C SoftClub\\il-2 sturmovik cliffs of dover\\missions\\SMP\\Friday on my mind\\localization\\";
string defaultLanguage = "en";
public Dictionary<string, Dictionary<string, string>> lines = new Dictionary<string, Dictionary<string, string>>();

public void SendMessageToAll(string msgKey, string target, params object[] args)
{
List<Player> players = new List<Player>();
if (GamePlay.gpPlayer() != null)
players.Add(GamePlay.gpPlayer());
if (GamePlay.gpRemotePlayers() != null)
players.AddRange(GamePlay.gpRemotePlayers());

if (players.ToArray() != null)
{
send(players.ToArray(), msgKey, target, args);
}
}

public void SendMessageToArmy(string msgKey, int army, string target, params object[] args)
{
List<Player> players = new List<Player>();
List<Player> acceptedPlayers = new List<Player>();

if (GamePlay.gpPlayer() != null)
players.Add(GamePlay.gpPlayer());
if (GamePlay.gpRemotePlayers() != null)
players.AddRange(GamePlay.gpRemotePlayers());

if (players != null)
{
foreach (Player player in players)
{
if (player.Army() == army) acceptedPlayers.Add(player);
}
if (acceptedPlayers.Count > 0)
{
send(acceptedPlayers.ToArray(), msgKey, target, args);
}
}
}

public void SendMessageToPlayers(string msgKey, Player[] players, string target, params object[] args)
{
if (players != null)
{
send(players, msgKey, target, args);
}
}

private void send(Player[] players, string msgKey, string target, params object[] args)
{
Dictionary<string, List<Player>> sorted = new Dictionary<string, List<Player>>();
load(langFolderPath);
foreach (Player player in players)
{
string langName = player.LanguageName();
if (!lines.ContainsKey(langName))
{
langName = defaultLanguage;
}
if (!sorted.ContainsKey(langName))
{
sorted.Add(langName, new List<Player>());
}
sorted[langName].Add(player);
}
foreach (KeyValuePair<string, List<Player>> kvp in sorted)
{
if (lines[kvp.Key].ContainsKey(msgKey))
{
switch (target)
{
case "ChatAndScreen":
{
GamePlay.gpLogServer(kvp.Value.ToArray(), lines[kvp.Key][msgKey], args);
GamePlay.gpHUDLogCenter(kvp.Value.ToArray(), lines[kvp.Key][msgKey], args);
} break;
case "Chat": GamePlay.gpLogServer(kvp.Value.ToArray(), lines[kvp.Key][msgKey], args); break;
case "Screen": GamePlay.gpHUDLogCenter(kvp.Value.ToArray(), lines[kvp.Key][msgKey], args); break;
}
} else
{
switch (target)
{
case "ChatAndScreen":
{
GamePlay.gpLogServer(kvp.Value.ToArray(), msgKey, args);
GamePlay.gpHUDLogCenter(kvp.Value.ToArray(), msgKey, args);
} break;
case "Chat": GamePlay.gpLogServer(kvp.Value.ToArray(), msgKey, args); break;
case "Screen": GamePlay.gpHUDLogCenter(kvp.Value.ToArray(), msgKey, args); break;
}
}
}
}
/*
public string sendOnlyTranslate(Player player, string msgKey)
{
load(langFolderPath);
string langName = player.LanguageName();
if (!lines.ContainsKey(langName))
{
langName = defaultLanguage;
}
if (lines[kvp.Key].ContainsKey(msgKey))
{
return lines[kvp.Key][msgKey];
}
else { return msgKey; }

}
*/
private void load(string langFolderPath)
{
IEnumerable<string> fileNames = Directory.EnumerateFiles(langFolderPath, "*.txt", SearchOption.TopDirectoryOnly);
foreach (string filename in fileNames)
{
parseLanguageFile(filename);
}
}

private void parseLanguageFile(string filename)
{
string[] filelines = File.ReadAllLines(filename);
string[] firstLine = filelines[0].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
if (firstLine[0].Equals("LanguageName"))
{
string langName = firstLine[1];
if (!lines.ContainsKey(langName))
{
lines.Add(langName, new Dictionary<string, string>());
}
for (int i = 1; i < filelines.Length; i++)
{
string[] lineArr = filelines[i].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
if (lineArr.Length != 2) continue;
lines[langName][lineArr[0]] = lineArr[1];
}
}
}
//======================================================================

Вывод сообщения:
SendMessageToAll("Hello null!", "Screen");

По идее ошибка должна быть здесь, так как остальной код совпадает с GamePlay.gpLogServer:


GamePlay.gpHUDLogCenter(kvp.Value.ToArray(), msgKey, args);


Примеры из логов:

Ошибка при выводе HUD игрокам и серверу:

[13:25:59] Server to [Server, Cassius Calhoun]: ======================================
[13:25:59] Server to [Server, Cassius Calhoun]: Команда красных уничтожила самолет-разведчик синих
[13:26:00]
[13:26:00] =================================================
[13:26:00] System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
[13:26:00]
[13:26:00] Server stack trace:
[13:26:00] в 6UZP66dp5dKAdD5LMYr.F9pJL9dGtcbAt8r8Umh.JwjWWYN9w9(xnKDxkk8wATA33F3hpA , G7xPRi2e9fpuLtHG23a )
[13:26:00] в 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.sp1UnA9jmwb(Player[] , String , Object[] , Double )
[13:26:00] в 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.yEy1eAe2YPQxskLBZIku(Object , Object , Object , Double )
[13:26:00] в 5iyST5gABhh0WhImZtw.4W7PgSgvHpySuqonJno.d87UnNOmgnm(Player[] , String , Object[] )
[13:26:00] в pqlnUTF7gnMAoU4L9MP.lm1GgkFoiOOBGu1gmwf.ZnhKPrKgxsgJUIGtmgOK(Object , Object , Object )
[13:26:00] в pqlnUTF7gnMAoU4L9MP.lm1GgkFoiOOBGu1gmwf.HUDLogCenter(Player[] , String , Object[] )
[13:26:00] в maddox.game.GameDef.gpHUDLogCenter(Player[] to, String msg, Object[] parms)
[13:26:00] в System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
[13:26:00] в System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
[13:26:00]
[13:26:00] Exception rethrown at [0]:
[13:26:00] в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
[13:26:00] в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
[13:26:00] в maddox.game.IGamePlay.gpHUDLogCenter(Player[] to, String msg, Object[] parms)
[13:26:00] в Mission.send(Player[] players, String msgKey, String target, Object[] args)
[13:26:00] в Mission.SendMessageToAll(String msgKey, String target, Object[] args)
[13:26:00] в Mission.messageTaskComplite(Int32 taskPrice, Int32 armyTask, String msg)
[13:26:00] в Mission.OnActorDead(Int32 missionNumber, String shortName, AiActor actor, List`1 damages)
[13:26:00] в maddox.game.world.Strategy.OnActorDead(Int32 missionNumber, String shortName, AiActor actor, AiDamageInitiator initiator)
[13:26:00] в maddox.game.ABattle.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[13:26:00] в maddox.game.world.Strategy.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[13:26:00] в System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
[13:26:00] в System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
[13:26:00]
[13:26:00] Exception rethrown at [1]:
[13:26:00] в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
[13:26:00] в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
[13:26:00] в maddox.game.IBattle.OnEventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[13:26:00] в maddox.game.GameDef.eventGame(GameEventId eventId, Object eventArg0, Object eventArg1, Int32 eventArgInt)
[13:26:00] в RoFTf9069W6jWRmA8PN.U2RoVL0OVdWjVQJ7319.eventGame(GameEventId , Object , Object , Int32 )
[13:26:00] в NTlYp6NdtgpnKt7wGgO.VvFELvNie2My3mOTesk.WPGBQuHHKI8(GameEventId , Object , Object , Int32 )
[13:26:00] =================================================
[13:29:30] Server: Cassius Calhoun Bf 110 C-7 () Пилот готов.
[13:29:30] Server: Стрелок Bf 110 C-7 () (Бот) готов.
[13:29:30] Server: Cassius Calhoun на Bf 110 C-7 () разбился.
[13:30:51] Server: До свидания, Cassius Calhoun!

Вывод HUD только серверу, нет ошибки:

[18:49:16] Server: Носовой стрелок FW 200 () (Бот) погиб от рук Минный тральщик 1935.
[18:50:34] Server to [Server]: ======================================
[18:50:34] Server to [Server]: Команда красных уничтожила самолет-разведчик синих
[18:50:34] Server to [Server]: Команда красных получает очки за выполнение задания [ 500 ]
[18:50:34] Server to [Server]: ======================================
[18:50:34] Server: Минный тральщик 1935, Минный тральщик 1935 сбил ИИ на FW 200 ().
[18:59:53] Server: =m=black875 теперь с нами.
[18:59:56] Server: =m=black875 будет летать за Красные ВВС.

В сообщении серверу нет ошибок:

[16:05:10] Server: =Apostol= Bf 109 E-3 () Пилот готов.
[16:05:10] Server: =Apostol= в кабине =Apostol= разбился.
[16:05:19] Server: До свидания, =Apostol=!
[16:05:56] Server to [Server, =ZERO_13=]: ======================================
[16:05:56] Server to [Server, =ZERO_13=]: RED> [ 40 ] / [ 26 ] <BLUE
[16:05:56] Server to [Server, =ZERO_13=]: Миссия будет остановлена через 60 min.
[16:05:56] Server to [Server, =ZERO_13=]: ======================================
[16:06:11] Server to [Server, =ZERO_13=]: ======================================
[16:06:11] Server to [Server, =ZERO_13=]: RED> [ 40 ] / [ 26 ] <BLUE
[16:06:11] Server to [Server, =ZERO_13=]: До конца миссии осталось [ 60 ] min.
[16:06:11] Server to [Server, =ZERO_13=]: ======================================
[16:06:45] Server: =ZERO_13= Bf 109 E-3 () Пилот готов.
[16:06:45] Server: =ZERO_13= в кабине =ZERO_13= влетел в ландшафт.

--- Добавлено ---
И второй вопрос:

Некоторые логи бывают такого вида с битой кодировкой:

[17:36:37] Server to [Server]: ======================================
[17:36:37] Server to [Server]: RED> [ 9 ] / [ 27 ] <BLUE
[17:36:37] Server to [Server]: До конца миссии осталось [ 210 ] min.
[17:36:37] Server to [Server]: ======================================
[17:41:17] >chat TS3: ts13.forteam.ru:10117 pass: sukhoi
[17:41:17] Chat: Server: TS3: ts13.forteam.ru:10117 pass: sukhoi
[17:41:17] >chat English-speaking channels available now!
[17:41:17] Chat: Server: English-speaking channels available now!
[17:41:17] >timeout 1800.00 f ts1.cmd
[17:45:43] Server: __MAVR__ РІС…РѕРґРёС‚ РІ Р±РѕР№.
[17:45:46] Server: __MAVR__ будет летать за Красные ВВС.
[17:46:39] Loading mission ...
[17:46:39] Mission loaded. time = 0,131
[17:48:45] Server: До свидания, __MAVR__!
[17:49:50] Server: __MAVR__ теперь с нами.
[17:49:53] Server: __MAVR__ сбежал! Его приветсвуют Красные.
Это из-за чего может быть? Таких немного, но попадаются.

-atas-
04.02.2012, 12:01
Это из-за чего может быть? Таких немного, но попадаются.

Баг. Желательно сообщать в багрепорты, чтобы не забыли.

evilvoland
12.02.2012, 01:32
Александр, так как Вы занимаетесь дизайном миссий - Вам вопрос: возможно ли появление не стандартных миссий, вроде: пролетая на бреющем, найти в лесу спрятавшегося снайпера; или сделать фотоснимки расположения вражеской техники? Когда-то очень порадовали задания в MFSX - не ожидал такой интересной мотивации полётов в гражданской авиации. Не говорю о спасении тюленей, но что-то необычное было бы здорово!

Rasim
12.02.2012, 04:27
Александр, так как Вы занимаетесь дизайном миссий - Вам вопрос: возможно ли появление не стандартных миссий, вроде: пролетая на бреющем, найти в лесу спрятавшегося снайпера; или сделать фотоснимки расположения вражеской техники? Когда-то очень порадовали задания в MFSX - не ожидал такой интересной мотивации полётов в гражданской авиации. Не говорю о спасении тюленей, но что-то необычное было бы здорово!

Поддерживаю на все сто!
На мой взгляд, для успешной игры в ней должна быть эмоциональная составляющая, сопереживание персонажам. В Иле это можно сделать как раз нестандартными миссиями. Например, АИ Вася пришел в эскадрилью недавно и уже имеет 10 сбитых, но тут его сбивают. Следующая миссия вполне может быть по спасению Васи на По-2... или на Тайгер Моте.

BlackSix
12.02.2012, 12:08
Александр, так как Вы занимаетесь дизайном миссий - Вам вопрос: возможно ли появление не стандартных миссий, вроде: пролетая на бреющем, найти в лесу спрятавшегося снайпера; или сделать фотоснимки расположения вражеской техники? Когда-то очень порадовали задания в MFSX - не ожидал такой интересной мотивации полётов в гражданской авиации. Не говорю о спасении тюленей, но что-то необычное было бы здорово!

Возможно, сейчас скрипты позволяют сделать очень многое.

Vetochka
12.02.2012, 13:23
Поддерживаю на все сто!
На мой взгляд, для успешной игры в ней должна быть эмоциональная составляющая, сопереживание персонажам. В Иле это можно сделать как раз нестандартными миссиями. Например, АИ Вася пришел в эскадрилью недавно и уже имеет 10 сбитых, но тут его сбивают. Следующая миссия вполне может быть по спасению Васи на По-2... или на Тайгер Моте.

Скрипты, которые есть в БзБ, позволяют игрокам делать практически любые сюжетные миссии. Найти и сделать фотосъемку вражеской техники командой меню, которое вызывается табом, спасти Васю, сделать сюжет, что если игрок сделал то-то, то произойдет то-то, пропустил разведчик - жди армаду бомберов или засветился на разведчике - получи пару перехватчиков, взлетевших персонально за тобой и т.д. и т.п. В принципе сюжетные миссии уже сейчас есть в ряде кампаний от игроков.
Можно вообще сделать одну бесконечную миссию, где игрок будет садиться - перезаряжаться и вылетать заново без "выйти-продолжить"... В общем в БзБ в отличие от Ил-2 заложен очень мощный механизм создания миссий, осталось только ботов привести в порядок и оффлайн может стать очень даже привлекательным.

Axel73
12.02.2012, 13:27
Это правда то, что ты перечислила?

podvoxx
12.02.2012, 13:30
Это правда то, что ты перечислила?

Это правда и возможностей еще больше на самом деле

Axel73
12.02.2012, 13:36
Эх спасибо! А я мучаюсь порой-не знаю в какую ж... моих персонажей засунуть))) А тут сразу столько ж... нарисовалось.

Vetochka
12.02.2012, 14:19
Это правда то, что ты перечислила?

Абсолютная правда. :D
Чтобы не голословить, могу привести ряд примеров из наших кампаний про Дюнкерк. Например, в Спитфайрах есть миссия с простым брифингом - прикрыть тайгермос, который с вражеского берега заберет пленного немца, уже над Францией выясняется что игроку приходится самому садиться, бросать спит и перебираться в тайгермос... всё это в сжатых временных рамках, т.е. если игрок будет тормозить с посадкой, то немцы отобьют своего пленного генерала, а если со взлетом, то пленным может стать уже игрок :) . Это как пример простого сюжета. Есть миссия с ветвлением сюжета, где игрок сначала должен найти лодку, которая что-то везет, если найдет, то к лодке вылетит сандерлэнд, не найдет - не вылетит, если будет долго искать, то лодка получит бомбой с немецкого гидросамолета, т.е. игрок должен успеть найти лодку и защитить ее от немца. Если все это он сделает, то надо сопровождать сандерленд, которого по дороге ожидают враги... а Хе-115 был с эскортом, желающим отомстить за гибель своего подопечного, надо успеть с эскортом разобраться и успеть за сандерлэндом. В принципе в этой миссии только единственный путь выполнения задания. В "мессершмиттах" есть похожая миссия, где можно пройти задание двумя путями - простым и усложненным. Игрок должен найти экипаж потопленной подводной лодки, который спасся и плавает где-то в проливе на плотиках и шлюпках. Как лодки найдены, то к ним вылетает немецкий гидросамолет. Их же ищут англичане и игрок после того как нашел шлюпки должен не дать над ними пролететь гидросамолетам томми, если не даст, то миссия будет выполнена простым путем, если упустит хотя бы один гидросамолет, то к лодкам начинает двигаться английский эсминец со всеми вытекающими. При таком развитие событий немцы высылают топить эсминец штуки, а англичане хурики на их перехват, т.е. игрок теперь должен отловить эти штуки и дать им возможность отбомбиться. При этом не забываем, что Не-115 уже вылетел за экипажем лодки, а истребители томми само собой на него могут совершенно случайно нарваться, т.е. игрок должен успеть и штук прикрыть и к моменту подхода Хе-115 вернуться на исходную позицию. И т.д.
Вот тебе примеры простейших сюжетов. При желание можно делать миссии с очень хитрым ветвлением событий. Я так думаю, что много похожего можно найти в кампаниях от иных авторов, просто оффлайн не моя тема, поэтому я в курсе только своих кампаний, которые писались в основном просто как проба скриптов.
Вот здесь, судя по описанию, делается (точнее сделана и совершенствуется) очень интересная динамика, которая в Ил-2 просто была не возможна.
http://www.sukhoi.ru/forum/showthread.php?t=73973
Вот здесь миссия, которой фактически может управлять сам игрок.
http://www.sukhoi.ru/forum/showthread.php?t=73858
Т.е. игрок определяет когда запустить бомберы, когда начать танковую атаку и т.д.

В общем кое-что уже есть, и уже виден огромный потенциал. Оффлайн пока портят боты... нет смысла убивать кучу времени на интересный сюжет миссии, если боты всё испортят. Но как я понимаю, разработчики за ботов всерьез взялись, судя по опросу игроков на тему как улучшить АИ, так что ждем. В онлайне пока тоже особо не злоупотребляют сложными скриптами, опять же по причине несовершенства игры, скрипт дает дополнительную нагрузку, а игра и без этого вылетает... В общем тоже ждем заплаток.

Axel73
12.02.2012, 15:01
Спасибо тебе-разъяснила:thx: у меня недописанная компания за бритов лежит. Пока не тороплюсь, решили с Пайпером и Женьком не форсировать тему до адеквачивания:D ботов.

=M=PiloT
12.02.2012, 23:08
Абсолютная правда...... :D
Крутые возможности .... кто наверно уже вовсю планы строит ..хорошо!

71мсп
16.02.2012, 00:45
Это очень хорошо. :bravo:
Кто разбирается, отпишите плиз, можно ли создавать в БзБ разведовательные миссии?

podvoxx
16.02.2012, 08:42
Это очень хорошо. :bravo:
Кто разбирается, отпишите плиз, можно ли создавать в БзБ разведовательные миссии?

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

Kariy
19.04.2012, 20:43
Доброго времени суток

У меня такой вот нестандартный вопрос)))
А можно ли както запустить полный редактор не запуская саму игру
(на ноуте старом не захотела запускаться сама игра с какойто там ошибкой)
ведь видео режимы совсем разныее (я так думаю)

podvoxx
20.04.2012, 16:17
Доброго времени суток

У меня такой вот нестандартный вопрос)))
А можно ли както запустить полный редактор не запуская саму игру
(на ноуте старом не захотела запускаться сама игра с какойто там ошибкой)
ведь видео режимы совсем разныее (я так думаю)

Нет, насколько знаю. А видеорежимы как раз те же. 3d объекты и террейн(а также листики на деревьях, солнышко и море)

Kariy
07.05.2012, 17:35
Доброго времени суток
Еще пару вопросов

1) есть ли в обьектах ворота(как в обучальных мисиях)
2) есть ли возможность узнать текущие координаты ЛА на котором летишь (для постановки ворот по этим координатам например для ведомого
или вообще для сохранения их например в файл)

Sinchuk
10.05.2012, 14:10
Люди добрые как заставить зены стрелять по самолетам ? а то ставлю зенитки а людей за ними нет (((( уже час читаю а найти не могу ...стоят просто и не стреляют.

-atas-
15.05.2012, 13:17
Люди добрые как заставить зены стрелять по самолетам ? а то ставлю зенитки а людей за ними нет (((( уже час читаю а найти не могу ...стоят просто и не стреляют.

Люди не нужны. Зенитки и самолеты должны принадлежать разным армиям.

podvoxx
18.05.2012, 10:59
Спрошу заранее, чтобы сэкономить время вечером, а то кажется опять заболел скриптовой лихорадкой :) (видимо от ботов, что вчера в тестовых полетах сбил)

1) Радиомаяки(вышки-антенны с задаваемой частотой) какими самолетами могут использоваться? Есть у красных такие машины?

2)2d карту из игры можно как-то использовать? А также название техники очеловеченные из файлов игры. Поясню. Планирую создать пока только просмоторщик файлов mis. Программка будет загружать на карту(должна быть той же, что и в игре) объекты из файла миссии - группы, здания, технику, погоду, маршруты движения, линию фронта и т.п. в виде иконок.

В файле у нас название допустим

Static2 Stationary.RadioBeacon.GenericLongRangeMast
Программа, как и редактор, должна показывать что-то вроде:

Радиомаяк
и показывать картинку объекта(картинки я видел в папке стима).
Можно ли это человечное название(возможно локализованное) брать из .dll какой-нибудь?

Тоже относится к названиям самолетов, техники, групп, боеприпасов. Задача: поместить программку в папку БОБа и используя его ресурсы отображать названия(например) актуальные для текущей версии игры.

3) Еще вопрос. Если нет внешнего IP можно самому подключиться к выделенному серверу(для тестирования скриптов)?

naryv
18.05.2012, 11:26
BR-20 пока только с ними работает, только частоту менять надо настроенными кнопками.

-atas-
18.05.2012, 15:24
Планирую создать пока только просмоторщик файлов mis. Программка будет загружать на карту(должна быть той же, что и в игре) объекты из файла миссии - группы, здания, технику, погоду, маршруты движения, линию фронта и т.п. в виде иконок.

Это же чит для онлайн проектов. Имо не надо такую программу делать.

podvoxx
18.05.2012, 15:33
Это же чит для онлайн проектов. Имо не надо такую программу делать.

В смысле чит? А где взять mis. с сервера? Если это возможно, то его и в редакторе можно посмотреть. Вообще это должен быть зачаток мини-редактора(для начала) с картой и отображением юнитов, а также возможностью настройки игры, чистки кэша, забивки лент, правка AI и т.д. Будет чем-то похоже на maptools. Одно из назначений - штурманские расчеты, прокладка маршрута. В старичке мне приходилось к примеру делать скриншоты брифинга, так как при запуске миссии маршрут на карте не отображался. Еще назначение - быстро делать красивые картинки с расположением войск, аэродромов, фоторазведку и т.п. Ну и если совсем все будет хорошо можно будет использовать для задания маршрутов атаки/снабжения наземке на серверах.

Charger
18.05.2012, 15:40
В смысле чит? А где взять mis. с сервера? Если это возможно, то его и в редакторе можно посмотреть. Вообще это должен быть зачаток мини-редактора(для начала) с картой и отображением юнитов, а также возможностью настройки игры, чистки кэша, забивки лент, правка AI и т.д. Будет чем-то похоже на maptools. Одно из назначений - штурманские расчеты, прокладка маршрута. В старичке мне приходилось к примеру делать скриншоты брифинга, так как при запуске миссии маршрут на карте не отображался. Еще назначение - быстро делать красивые картинки с расположением войск, аэродромов, фоторазведку и т.п. Ну и если совсем все будет хорошо можно будет использовать для задания маршрутов атаки/снабжения наземке на серверах.

Это будет НЕ чит, если в загруженом файле будет видно только разведанное, для каждой стороны. А вообще с просмотровщика для загруженного с сервера задания начались поиски виновных в проигрыше задания.
:)

podvoxx
18.05.2012, 15:44
Это будет НЕ чит, если в загруженом файле будет видно только разведанное, для каждой стороны. А вообще с просмотровщика для загруженного с сервера задания начались поиски виновных в проигрыше задания.
:)
Файл с сервера разве можно посмотреть? Чтобы программа работала, ей нужен файл. Т.е. можно посмотреть, только то, что лежит в документах.

Charger
18.05.2012, 15:56
Файл с сервера разве можно посмотреть? Чтобы программа работала, ей нужен файл. Т.е. можно посмотреть, только то, что лежит в документах.

Вот смотри, файл грузится, значит есть копия, и если её можно прочитать ДО выполнения задания... Это не кошерно.

podvoxx
18.05.2012, 15:58
Вот смотри, файл грузится, значит есть копия, и если её можно прочитать ДО выполнения задания... Это не кошерно.

Если она грузится, то ее можно посмотреть в редакторе? Причем тут грузится, не пойму. Программа будет открывать файл на диске в формате .mis, т.е. также как и редактор. Или эт паранойя? :)

Small_Bee
18.05.2012, 16:05
Имхо, паранойя ) Вообще не факт, что файл миссии даже на сервере существует, не то что на клиенте. Лев например вообще пустой файл загружал, все остальное на лету формировалось. Не, в теории конечно возможно все, вплоть до перехвата трафика, но заявленная программа тут никаким боком. )

Charger
18.05.2012, 16:09
Если она грузится, то ее можно посмотреть в редакторе? Причем тут грузится, не пойму. Программа будет открывать файл на диске в формате .mis, т.е. также как и редактор. Или эт паранойя? :)

Она самая. Варианты обвинений могут быть весьма разнообразны и многогранны :)

-atas-
18.05.2012, 16:11
2 игры на одной машине не запустишь (когда ты уже в миссии), а игру и твой редактор можно, т.е. в любой момент переключился в редактор, посмотрел разведку нужного района, переключился в игру. Даже на 2м компьютере чтобы игру запустить нужно ее 2й раз купить сначала, а с твоей программой не нужно будет, т.е. на ноутбуке или планшете всегда будет открыта разведанная карта.

Если есть желание программировать можно веб интерфейс для кооп-скрипта сделать (выбор самолетов, настройка топлива, вооружения, запуск игры). 41sqn_Banks будет это делать как побочный продукт своего проекта, но не скоро.