PDA

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



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

Small_Bee
16.04.2011, 21:31
Собственно появился такой вопрос: Можно ли в скрипте получить как-то доступ с статическим объектам в миссии и их свойствам? Скажем к зданиям и т.п?

naryv
16.04.2011, 23:58
К тем, которые, идут в миссии как объекты(можно по правой кнопке посмотреть) - емнип да, к зданиям стоящим на карте, опять таки емнип - нет.

Small_Bee
17.04.2011, 01:12
Тут собственно почему спрашивал.. Так и не нашел, как этих статиков отследить.
Насколько я понимаю, они не являются AiActor (по крайней мере события на них не реагируют - уничтожен, поврежден и т.д.). Ни в Battle, ни в GamePlay методов никаких похожих тоже вроде не нашел. GamePlay.gpActorByName("StaticName") тоже ничего не дает. (

Jтследить уничтожение статика(ов) удалось только повесив на них триггер.

И еще заметил такую фиговину. Если загрузить миссию через GamePlay.gpPostMissionLoad, скажем с автоколонной, уничтожение автоколонны или машинок из нее - OnActorDead к примеру не вызывают. Загруженные таким же образом самолеты отрабатывают нормально.

Приложил миссии в аттаче. Там стодесятые отрабатывают по статикам (несколько машинок), по их убиению срабатывает триггер и загружает миссию - там новая группа стодесятых отрабатывает "колонну" из одной машинки.. По ее убиении OnActorDead не срабатывает.. ( Чего не так делаю, не въеду. (

naryv
17.04.2011, 02:46
В понедельник посмотрю, емнип, там что-то типа AiGroundGroup для машинок.

tos_62
17.04.2011, 03:11
На каком языке вы разговариваете ?? xD Будет таки какая нибудь обучалка по редактору.. скрипты, триггеры... ??)) Мой нубский вопрос- можно как то отключить френдли фаер у зениток ?? всю статику на земле мне разворочили .. ))

Ilya Kaiten
17.04.2011, 09:22
Можно ли управлять включением- выключением аэродромных огней?

Ин реал прифронтовые аэродромы соблюдали светомаскировку и посадочные огни зажигались по радио запросу-идентификации самолёта, группы.
Убитые генераторы на своём филде также добавили бы задору при посадке вслепую или по скриптованным кострам...

Как заставить ботов на летающих лодках садится на воду и взлетать с воды?

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


Мой нубский вопрос- можно как то отключить френдли фаер у зениток ?? всю статику на земле мне разворочили .. ))
М.б. Вам стОит озадачится углами обстрела ЗА при их размещении?
Мне вспомнилась история из войны на Тихом океане, когда американский авианосец так яростно отбивался от японских самолётов, что крейсер охранения поднял сигнал "Сдаюсь".

tos_62
17.04.2011, 12:25
М.б. Вам стОит озадачится углами обстрела ЗА при их размещении?
Мне вспомнилась история из войны на Тихом океане, когда американский авианосец так яростно отбивался от японских самолётов, что крейсер охранения поднял сигнал "Сдаюсь".
Кхм.. мб.. а каким образом ?? они вроде на 360 вращаются.. Или я дурачок.. ))

Кстати по поводу приводняющихся тоже вопрос интересует..

Ilya Kaiten
17.04.2011, 13:06
Кхм.. мб.. а каким образом ?? они вроде на 360 вращаются.. Или я дурачок.. ))
В вертикальной плоскости на 360?
Ставьте их на возвышенностях, особенно - тяжёлые.

tos_62
17.04.2011, 13:21
В вертикальной плоскости на 360?
Ставьте их на возвышенностях, особенно - тяжёлые.

Нет конечно. Но что делать если возвышенностей нет ?..

Small_Bee
17.04.2011, 21:36
На каком языке вы разговариваете ?? xD Будет таки какая нибудь обучалка по редактору.. скрипты, триггеры... ??)) Мой нубский вопрос- можно как то отключить френдли фаер у зениток ?? всю статику на земле мне разворочили .. ))

Пока этих вещей нет, можно немного начинать изучать синтаксис C#. Собственно основные типы, циклы, конструкции, разобраться что такое интерфейс и что такое класс. Что такое наследование и области видимости. Когда гайд появится, будет намного проще, многое и без подсказок можно будет сделать.

-atas-
18.04.2011, 12:31
Пока этих вещей нет, можно немного начинать изучать синтаксис C#. Собственно основные типы, циклы, конструкции, разобраться что такое интерфейс и что такое класс. Что такое наследование и области видимости. Когда гайд появится, будет намного проще, многое и без подсказок можно будет сделать.

Вот это или другую мурзилку посоветуете? http://simple-cs.ru/csharp.aspx

Здесь интереснее? http://www.realcoding.net/article/view/1748

Mirnyi
18.04.2011, 18:19
Интереснее всего - msdn, имея при этом visual c# express и тренируясь на примерах.
P.S.
Интересно. А на vbasic скрипты не подцепятся?

naryv
18.04.2011, 19:40
Сорри, суматошный день сегодня, толком не посмотрел ничего:(

Тут собственно почему спрашивал.. Так и не нашел, как этих статиков отследить.
Насколько я понимаю, они не являются AiActor (по крайней мере события на них не реагируют - уничтожен, поврежден и т.д.). Ни в Battle, ни в GamePlay методов никаких похожих тоже вроде не нашел. GamePlay.gpActorByName("StaticName") тоже ничего не дает. (

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


И еще заметил такую фиговину. Если загрузить миссию через GamePlay.gpPostMissionLoad, скажем с автоколонной, уничтожение автоколонны или машинок из нее - OnActorDead к примеру не вызывают. Загруженные таким же образом самолеты отрабатывают нормально.

Приложил миссии в аттаче. Там стодесятые отрабатывают по статикам (несколько машинок), по их убиению срабатывает триггер и загружает миссию - там новая группа стодесятых отрабатывает "колонну" из одной машинки.. По ее убиении OnActorDead не срабатывает.. ( Чего не так делаю, не въеду. ( Вроде всё нормально работает - машинку когда застрелили - сообщение "Dead :0_Chief" выскочило.

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


Интересно. А на vbasic скрипты не подцепятся? нет

Geier
18.04.2011, 20:38
Нарыв, что можно сделать с перезарядкой?

Mirnyi
18.04.2011, 20:45
нет
Недоработочка :)

Small_Bee
18.04.2011, 21:27
Вот это или другую мурзилку посоветуете? http://simple-cs.ru/csharp.aspx
Здесь интереснее? http://www.realcoding.net/article/view/1748

"Мурзилок" таких дофига на самом деле, это уже дело вкуса - что лучше пойдет, то и читайте. MSDN штука просто незаменимая, но имхо, для новичка будет сильно замороченная. Кстати можно и на ты. :)

2 nariv

Насчет машинок в колонне наверное недоглядел, сорри...

Статики было бы хорошо как-то вытянуть, ибо получается, что "ресурсы" хранить негде.. Можно конечно закрывать их оптом по триггеру и загружать миссии с ними, но имхо, как-то не кошерно... А так разные снарядные ящики, бочки и грузы просто "высшим разумом" для этого предназначены. :) Конечно если бы и здания (по крайней мере те, что ручками ставятся), можно было отследить, было бы вообще кучеряво. :)

2 Mirmiy

Чой то у меня такой чувство, что когда таки AddIn`ы включат, его на VB.NET таки можно будет нарисовать, имхо... Все ж таки все оно суть CLR.. А со скриптами да, тут уже конкретный язык рулит..

Mirnyi
18.04.2011, 21:32
Чой то у меня такой чувство, что когда таки AddIn`ы включат, его на VB.NET таки можно будет нарисовать, имхо... Все ж таки все оно суть CLR.. А со скриптами да, тут уже конкретный язык рулит..
Ну по аддинам-то даже сомнения нет :)
Это просто так был вопрос - из любопытства. Тем более, что Basic этот иначе как сижуалбейсик уже никто и не называет. Чуть другой синтаксис и всё :)

naryv
18.04.2011, 22:41
Нарыв, что можно сделать с перезарядкой?С какой?


Недоработочка :) Ну, что поделать:)


Статики было бы хорошо как-то вытянуть, ибо получается, что "ресурсы" хранить негде.. Можно конечно закрывать их оптом по триггеру и загружать миссии с ними, но имхо, как-то не кошерно... А так разные снарядные ящики, бочки и грузы просто "высшим разумом" для этого предназначены. :) Конечно если бы и здания (по крайней мере те, что ручками ставятся), можно было отследить, было бы вообще кучеряво. :)
Я, как времени побольше будет, посмотрю, что да как с ними можно делать, но когда точно - не могу сказать, а то наобещал на сегодня, а посмотреть мельком только вечером смог и то 10 минут:(. "Ручные" домики, емнип, это обычные стационарные объекты, так что с ними можно всё, что и с обычными статиками делать.

andreus
19.04.2011, 12:13
СКАЖИТЕ ПОЖАЛУЙСТА ЕСТЬ КАКАЯ НИБУТЬ ИНСТРУКЦИЯ К ПОЛНОМУ РЕДАКТОРУ А ТО БЕЗ СТО ГРАМ НИКАК НЕ РАЗОБРАТСЯ
ОЧЕНЬ ИНТЕРЕСУЕТ ВОПРОС КАК НА ДОКФАЙТОВСКУЮ КАРТУ ПОСТАВИТЬ ФИЛД И ЧТОБ ПРИ ЗАПУСКЕ СЕРВЕРНОЙ ИГРЫ МОЖНО ВЫБРАТЬ ХОТЬ КАКОЙТО САМОЛЬ И ЛЮДИ МОГЛИ ПОДКЛЮЧИТСЯ И ПОЛЕТАТЬ ВМЕСТИ?
Я ПОЛЬЗОВАЛСЯ РЕДАКТОРОМ В ПЕРВОМ ИЛЕ ИВСЕ БЫЛО ДОСТУПНО И ПОНЯТНО, А ЗДЕСЬ ВСЕ ЗАШИФРОВАНО

Вестник
19.04.2011, 13:04
Глаза взорвались

ilia-sk
19.04.2011, 22:26
СКАЖИТЕ ПОЖАЛУЙСТА ЕСТЬ КАКАЯ НИБУТЬ ИНСТРУКЦИЯ К ПОЛНОМУ РЕДАКТОРУ А ТО БЕЗ СТО ГРАМ НИКАК НЕ РАЗОБРАТСЯ
ОЧЕНЬ ИНТЕРЕСУЕТ ВОПРОС КАК НА ДОКФАЙТОВСКУЮ КАРТУ ПОСТАВИТЬ ФИЛД И ЧТОБ ПРИ ЗАПУСКЕ СЕРВЕРНОЙ ИГРЫ МОЖНО ВЫБРАТЬ ХОТЬ КАКОЙТО САМОЛЬ И ЛЮДИ МОГЛИ ПОДКЛЮЧИТСЯ И ПОЛЕТАТЬ ВМЕСТИ?
Я ПОЛЬЗОВАЛСЯ РЕДАКТОРОМ В ПЕРВОМ ИЛЕ ИВСЕ БЫЛО ДОСТУПНО И ПОНЯТНО, А ЗДЕСЬ ВСЕ ЗАШИФРОВАНО

Пока нету инструкции, пока все на уровне нет для дот, шарп для чайников, рефлексоров, масдайстудий..... скоро тут на форуме (судя по всему сами пользователи выложат инструкцию). но так как было в 1-м иле тут видимо не будет. зато возможностей море - смотри, приезжаеш в автосервис - тебе дают падьемник, набор напильников, отверток, спецуху и даже подскажут че крутить надо.... что ты...!

Small_Bee
19.04.2011, 23:32
В общем со статиками так пока и не разобрался, но дошла одна маленькая вещь.. Как до жирафа.. Надо сильно забыть концепцию миссии из ила, т.к. тут как таковой миссии (с точки зрения Ила) не существует. Есть "битва", а в ее рамках выполняются различные миссии.

Миссия вообще умеет может загружать сама себя. Технически это конечно не так, но выглядит именно так. :) Т.е. из миссии мы приказываем через GamePlay.gpPostMissionLoad() загрузить в битву еще одну миссию, а что это за миссия - не важно. Походу общими для всех миссий является объект Battle и наверное GamePlay... Каждая миссия загружается под новым номером.

Скажем у меня есть одна миссия-хост (так сказать, "точка входа"). По OnBattleStarted() она загружает стартовый набор миссий (скажем одна - красные танки, вторая синие танки, едут навстречу). И в каждой из этих миссий отслеживается OnActorDead(). Если была уничтожена группа (она одна все равно), миссия загружает себя снова, сразу или по таймеру. Если помер танчик, то через несколько сек. убираем его трупик через Destroy(), что бы не мешался. Получается "бесконечная" стенка-на-стенку. :) Но миссия-хост понятия не имеет, что там творится. Вот в чем затык. (

Что делать со старыми, "сёгранными" кар... миссиями? Или если на круглосуточном сервере скажем рано или поздно счетчик выйдет за MAXINT?
Что есть поле MissionNumberListener? Пробовал присваивать номер свежезагруженной миссии - вообще всякие события вызывать перестало (в этой миссии).

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

Кстати интересная особенность (возвращаясь все к той же машинке из колонны). Похоже события миссии должны срабатывать только для своих "объектов".. Но они работают и для другой миссии - частично для "продвинутой" наземки и полностью для самолетов. Частично - имеется ввиду, что когда загружается новая миссия с акторами, в "старой" на каждого свежесозданного актора срабатывает OnActorCreated(), но никакой внятной инфы из параметров выдрать нельзя. shortName = "NONAME", actor не является ни группой, ни наземкой, вообще ничем походу... Хотя если в одной миссии поставить триггер "Враги прилетели", то если эта "анонимная" наземка из другой миссии туда заезжает, тригер срабатывает... Или я совсем уже запутался. :)

-atas-
20.04.2011, 01:29
Но миссия-хост понятия не имеет, что там творится. Вот в чем затык.

Я конечно кроме бейсика и алгоритмов ничего не проходил, но мне кажется, отслеживать OnActorDead() и делать Destroy() нужно в миссии-хосте, т.к. только она и есть на сервере. Т.е. каждой под-миссии свой .сs файл совсем не обязателен и даже поначалу вреден, т.к. слишком ветвит скрипт основной миссии.

Допустим: запущена миссия, которая определила стартовые аэродромы, дала общий брифинг, запустила один основной скрипт.

Основной скрипт делает:
Через 5 минут подгрузили новые цели: синие бомбят аэродром, красные топят транспорты. (Это уже в момент подгрузки стало частью хост-миссии.)

По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.

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

По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.

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

По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.

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

По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.

Там где нужно добавить ограничения по времени, ограничение на количество одновременно проистекающих "подмиссий" и др.

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

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

Где не прав, поправьте.

Small_Bee
20.04.2011, 01:39
Я конечно кроме бейсика и алгоритмов ничего не проходил, но мне кажется, отслеживать OnActorDead() и делать Destroy() нужно в миссии-хосте, т.к. только она и есть на сервере. Т.е. каждой под-миссии свой .сs файл совсем не обязателен и даже поначалу вреден, т.к. слишком ветвит скрипт основной миссии.

Допустим: запущена миссия, которая определила стартовые аэродромы, дала общий брифинг, запустила один основной скрипт.

Основной скрипт делает:
Через 5 минут подгрузили новые цели: синие бомбят аэродром, красные топят транспорты. (Это уже в момент подгрузки стало частью хост-миссии.)

По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.

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

По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.

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

По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.

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

По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.

Там где нужно добавить ограничения по времени, ограничение на количество одновременно проистекающих "подмиссий" и др.

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

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

Где не прав, поправьте.

Юмор в том, что наземка при гибели не вызывает OnActorDead в миссии-хосте. Только "родная"... Возможно так и задумано, возможно баг. Вообще наземку можно стартовать и по скрипту (ставить в свойствах "Старт по скрипту" прикрепить к группе экшен и из скрипта этот экшен запускать). НО, снова юмор. Такая галка для наземки как-то глючно работает, плюс наземные группы с такой галкой в начале миссии не создаются, но и появляться тоже упорно не желают. С самолетами этот номер проходит на ура, кстати. Я в соседней теме выложил миссию, можете поэкспериментировать.
Вообще я так и предполагал сделать. Миссия-хост, в ней свои переменные - ресурсы, состояния и т.д., и она всем остальным крутит. но.. Наземка "скриптом" не стартует, только через загрузку другой миссии, отследить состояние наземки из другой миссии тоже не могу.. Вот так вот. (((

Интерфейс и прочее... возможно когда разрешат аддоны делать... Пока его прикрутить чего-то не вышло (((

ilia-sk
20.04.2011, 02:21
Возможно попробовать стоит такой принцип - раз обьекты подгруженные к баталии в субмисии не контролируются из другой субмисии, то собственно, все родные для субмиссии объекты должны контролироваться скриптом этой субмисии, то есть по логическому завершению этой саммой мисии дестроится как по гибели так и по достижению цели.

-atas-
20.04.2011, 11:02
Юмор в том, что наземка при гибели не вызывает OnActorDead в миссии-хосте. Только "родная"... Возможно так и задумано, возможно баг.

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

Эта ветка с вопросами, думаю будут и ответы )


зы. проблема только статиков касается или всей наземки?

naryv
20.04.2011, 11:30
В общем со статиками так пока и не разобрался,
Ну, в общем как я и говорил, сейчас статики - мишура и акторами не являются, интерфейса для доступа к ним нет, посмотрим, может быть в будущем сделаем.


но дошла одна маленькая вещь.. Как до жирафа.. Надо сильно забыть концепцию миссии из ила, т.к. тут как таковой миссии (с точки зрения Ила) не существует. Есть "битва", а в ее рамках выполняются различные миссии. Миссия вообще умеет может загружать сама себя. Технически это конечно не так, но выглядит именно так. :) Т.е. из миссии мы приказываем через GamePlay.gpPostMissionLoad() загрузить в битву еще одну миссию, а что это за миссия - не важно. Походу общими для всех миссий является объект Battle и наверное GamePlay... Каждая миссия загружается под новым номером. Да, всё так.


Скажем у меня есть одна миссия-хост (так сказать, "точка входа"). По OnBattleStarted() она загружает стартовый набор миссий (скажем одна - красные танки, вторая синие танки, едут навстречу). И в каждой из этих миссий отслеживается OnActorDead(). Если была уничтожена группа (она одна все равно), миссия загружает себя снова, сразу или по таймеру. Если помер танчик, то через несколько сек. убираем его трупик через Destroy(), что бы не мешался. Получается "бесконечная" стенка-на-стенку. :) Но миссия-хост понятия не имеет, что там творится. Вот в чем затык. (

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

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


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


Кстати интересная особенность (возвращаясь все к той же машинке из колонны). Похоже события миссии должны срабатывать только для своих "объектов".. Но они работают и для другой миссии - частично для "продвинутой" наземки и полностью для самолетов. Частично - имеется ввиду, что когда загружается новая миссия с акторами, в "старой" на каждого свежесозданного актора срабатывает OnActorCreated(), но никакой внятной инфы из параметров выдрать нельзя. shortName = "NONAME", actor не является ни группой, ни наземкой, вообще ничем походу... Хотя если в одной миссии поставить триггер "Враги прилетели", то если эта "анонимная" наземка из другой миссии туда заезжает, тригер срабатывает... Или я совсем уже запутался. :) надо посмотреть, тут я не помню.

Small_Bee
20.04.2011, 12:32
Ну, в общем как я и говорил, сейчас статики - мишура и акторами не являются, интерфейса для доступа к ним нет, посмотрим, может быть в будущем сделаем.


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


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

О, супер, походу то что надо, вечером попробую..



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

Эта ветка с вопросами, думаю будут и ответы )


зы. проблема только статиков касается или всей наземки?


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

Vik1243
20.04.2011, 16:34
1.Готовые программы, оттранслированные в машинный код, выполняются значительно быстрее скриптов, которые интерпретируются из исходного кода динамически при каждом исполнении. Поэтому скриптовые языки не применяются для написания программ, требующих оптимальности и быстроты исполнения. Но из-за простоты они часто применяются для написания небольших, одноразовых («проблемных») программ.
а для чего нужно сторонним людям ковырять готовую прогу...

Mirnyi
20.04.2011, 16:55
Думаю, что в данном случае это не совсем скрипт. Просто класс компилируется во время исполнения и становится частью всей большой программы.
А ковырять всю программу приходится чтобы этот класс заставить работать так, как хочется - т.е., понимать как он встроится в игру и что из него можно в игре сделать.

ilia-sk
20.04.2011, 17:13
1.Готовые программы, оттранслированные в машинный код, выполняются значительно быстрее скриптов, которые интерпретируются из исходного кода динамически при каждом исполнении. Поэтому скриптовые языки не применяются для написания программ, требующих оптимальности и быстроты исполнения. Но из-за простоты они часто применяются для написания небольших, одноразовых («проблемных») программ.
а для чего нужно сторонним людям ковырять готовую прогу...

так скрипт к миcсии и есть одноразовый («проблемный») программ :)

Small_Bee
20.04.2011, 17:31
1.Готовые программы, оттранслированные в машинный код, выполняются значительно быстрее скриптов, которые интерпретируются из исходного кода динамически при каждом исполнении. Поэтому скриптовые языки не применяются для написания программ, требующих оптимальности и быстроты исполнения. Но из-за простоты они часто применяются для написания небольших, одноразовых («проблемных») программ.
а для чего нужно сторонним людям ковырять готовую прогу...

Это к чему? Вообще в С#, как правильно выше заметили, есть такое понятие как "динамическая компиляция", не надо путать это с тем же PHP или JS. К тому же в C# все классы\сборки умеют хранить в метаданных исчерпывающую информацию о себе самих. Так что к "ковырянию" это тоже отношения не имеет. Есть такое понятие как "рефлексия" или "отражение".

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


так скрипт к миcсии и есть одноразовый («проблемный») программ :)

При чем тут проблемный? или одноразовый? :)

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

Грубо говоря, .NET приложение может само себя написать, скомпилировать и запустить на выполнение. :)

ilia-sk
20.04.2011, 17:31
При чем тут проблемный? или одноразовый? :)

:) я к тому, что использование скрипта в миссии себя оправдывает безусловно, но факт, что в редактор можно былобы по больше сервиса для простых смертных :)

Small_Bee
20.04.2011, 17:35
:) я к тому, что использование скрипта в миссии себя оправдывает безусловно, но факт, что в редактор можно былобы по больше сервиса для простых смертных :)

Никакой юзер-интерфейс не обеспечит такого функционала, который может полноценный язык, не говоря уже о том, сколько времени и сил уйдет на его написание и отладку. Причем сложность его будет сравнима с каким ни будь про-инжинир, учить надо будет отдельно в институтах. Базовые возможности существующий интерфейс предоставляет, а скрипт если и ограничивает фантазию, то не очень сильно. К тому же С# сам по себе очень простой язык, как в освоении, так и использовании. Для повседневных задач, я бы сказал, не сложнее HTML`a (во загнул). :)

ilia-sk
20.04.2011, 17:38
Все верно.... скрипты это гуд.
Я возможно заблуждаюсь, но я всегда считал что NET приложение строго говоря компилируется в маш. коды при первом запуске у пользователя в его системе фреймворком.... ну хз конечно.

Small_Bee
20.04.2011, 17:53
Все верно.... скрипты это гуд.
Я возможно заблуждаюсь, но я всегда считал что NET приложение строго говоря компилируется в маш. коды при первом запуске у пользователя в его системе фреймворком.... ну хз конечно.

Собственно так и есть - IL в машинный код.

Mirnyi
20.04.2011, 17:59
Все верно.... скрипты это гуд.
Я возможно заблуждаюсь, но я всегда считал что NET приложение строго говоря компилируется в маш. коды при первом запуске у пользователя в его системе фреймворком.... ну хз конечно.

Нет.
.NET приложение компиллируется (обычно) как обычно - программистом, написавшим это приложение. Просто, для его выполнения, нужна "песочница", называемАя .NETFRAMEWORK.
Но может и динамически компиллировать исходники и прямо на лету их подгружать.
В бесплатной visualstudio (express) прекрасный интерфейс и куча сервиса для простых пользователей.
Изобретать скриптовый язык нафиг не надо. Тем более, что столько возможностей он никогда не обеспечит.
С другой стороны, совершенно не понятно почему, используя .net, надо было заниматься динамической компилляцией, а не подсовывать вместо текстового файла, скомпиллированную длл-ку - оно бы и в плане отладки было удобнее.
И почему совершенно не используются события и делегаты, а организовано всё через абстрактные классы а не интерфейсы?
К тому же, нет доступа к объектам в миссии, а всё взаимодействие через классы-посредники.
Не знаю - может, в этом какой-то смысл разработчики увидели, мне пока не доступный..., но странно всё это выглядит.

Small_Bee
20.04.2011, 18:11
Нет.
.NET приложение компиллируется (обычно) как обычно - программистом, написавшим это приложение. Просто, для его выполнения, нужна "песочница", называемАя .NETFRAMEWORK.
Но может и динамически компиллировать исходники и прямо на лету их подгружать.
В бесплатной visualstudio (express) прекрасный интерфейс и куча сервиса для простых пользователей.
Изобретать скриптовый язык нафиг не надо. Тем более, что столько возможностей он никогда не обеспечит.
С другой стороны, совершенно не понятно почему, используя .net, надо было заниматься динамической компилляцией, а не подсовывать вместо текстового файла, скомпиллированную длл-ку - оно бы и в плане отладки было удобнее.
И почему совершенно не используются события и делегаты, а организовано всё через абстрактные классы а не интерфейсы?
К тому же, нет доступа к объектам в миссии, а всё взаимодействие через классы-посредники.
Не знаю - может, в этом какой-то смысл разработчики увидели, мне пока не доступный..., но странно всё это выглядит.

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


Классов для скриптов там всего три если не ошибаюсь - собственно AMission, Player и ABattle, остальное интерфейсы.
Событий да, не хватает, имхо...

ilia-sk
20.04.2011, 18:36
Нет.
.NET приложение компиллируется (обычно) как обычно - программистом, написавшим это приложение. Просто, для его выполнения, нужна "песочница", называемАя .NETFRAMEWORK.
Но может и динамически компиллировать исходники и прямо на лету их подгружать.
В бесплатной visualstudio (express) прекрасный интерфейс и куча сервиса для простых пользователей.

А я вот всегда думал... что оно вот типа так:
http://habrahabr.ru/blogs/net/109117/

"по структуре .NET программы, для тех кто не знаком с разработкой под данный Framework: весь код, написанный на любом .NET языке (C#, Visual Basic, F#, Delphi.NET) компилируется в особый Intermediate Language, называемый обычно IL или MSIL. Это что-то типа ассемблера, только весьма умного и обладающего весьма мощными инструкциями. И это, в принципе, такой же равноправный язык как и C#, только синтаксис похуже (а возможности больше). Кроме того, в программе на .NET активно используются метаданные, т.е. вся информация о классах, метода, пропертях, атрибутах и всём остальном сохранена в исполняемом файле.
Т.е. на самом деле, декомпиляция программы не очень верное понятие в данном случае. Она и так вся в открытом виде лежит, а инструменты в виде Reflector'а занимаются тем, что приводят конструкции MSIL к соответствующим конструкциям C# или другого языка, повышая читабельность кода."

Mirnyi
20.04.2011, 19:03
Да ладно, нормально выглядит. Имхо посредники (хз, мож и посредники, не слишком силен) для того, что если в кишках что поменяется, не пришлось скрипты заново переписывать.
Так для этого и нужны интерфейсы - всё, что за ним - переписывай хоть с нуля, хоть каждый день, а интерфейс остаётся и всё, что работает через него, тоже остаётся.
Это и есть почти тот же абстрактный класс.
В интерфейс миссии вынеси несколько методов для получения ссылок на объекты в этой миссии.
В интерфейсах объектов определи все их игровые события, свойства и методы, доступные из пользовательского кода.
Дальше в скрипте определяем делегаты только тех событий, которые хотим отследить (имея подсказку прямо в студии при написании скрипта).
Объекты (что родные, что пользовательские) наследуются от всех необходимых интерфесов, часть из которых используются только ядром, а часть - могут использоваться пользователем. И при создании нового объекта достаточно просто реализовать всё необходимое.
В этом суть ооп и структурированности, им обеспечиваемой.

Mirnyi
20.04.2011, 19:07
А я вот всегда думал... что оно вот типа так:

Ну так и есть.
IL считай "ассемблером для "песочницы"" :)
Вот эта "песочница" и обрабатывает откомпиллированную программу.

ilia-sk
20.04.2011, 19:14
Ребята, а подскажите скрипт к мисии должен из одного *.cs файла состоять или можно разбить на несколько таковых файлов? Ну ради того чтоб свой добавить к чужому?

Mirnyi
20.04.2011, 19:44
Если я правильно понимаю, то файл скрипта определяется по имени, совпадающим с именем миссии. Поэтому должен быть один. А вот можно ли в одном файле прописать несколько классов, наследуемых от AMission (просто скопировать определение класса из другого скрипта)?

Small_Bee
20.04.2011, 21:26
Если я правильно понимаю, то файл скрипта определяется по имени, совпадающим с именем миссии. Поэтому должен быть один. А вот можно ли в одном файле прописать несколько классов, наследуемых от AMission (просто скопировать определение класса из другого скрипта)?

Не вижу области применения для такого решения. :) Другие свои классы можно в том же файле объявлять и описывать, и они работают - проверил уже. Но, даже если мы объявим статический класс со статическими полями же, из другого скрипта миссии его видно не будет. :)

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

Пока мне реально не хватает только доступа к статикам.

Small_Bee
24.04.2011, 23:53
Появился такой вопрос: Как в скрипте вытянуть тип самолета? В смысле не бомбер/истребитель, а скажем He-111 или G.50. Ну и касательно наземки тоже. GetType() не помогает - походу реальный класс экземпляра динамический? Даже базовый тип и тот с нечитаемым именем... (

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

-atas-
25.04.2011, 02:43
Как убрать разбитые/разрушенные статики? Они сволочи с миссией то подгружается, их раздолбят, а они радостно чадят до посинения.. И ничего им сделать не могу... Или они как-то по времени сами уйдут?

Немного не об этом, но может поможет. Doghouse писал, что airport.cpp убирет с аэродромов разбитые самолеты. Может его расковырять, посмотреть. Если ему радиус на полкарты задать, может он и статики уберет.

naryv
25.04.2011, 16:35
Появился такой вопрос: Как в скрипте вытянуть тип самолета? В смысле не бомбер/истребитель, а скажем He-111 или G.50. Ну и касательно наземки тоже. В ближайших патчах будет InternalTypeName() для самолётов и наземки.

И еще в догонку. Как убрать разбитые/разрушенные статики? Они сволочи с миссией то подгружается, их раздолбят, а они радостно чадят до посинения.. И ничего им сделать не могу... Или они как-то по времени сами уйдут? И схожий вопрос.. Миссию мы загрузить можем, а вот выгрузить... Можно это как-то сделать? Скажем что бы убрала все за собой при выгрузке. Это сняло бы проблему со статиками. Горят до ~20 минут. Выгрузить - это сложно, миссия же может по скрипту кого-то нарожать, что-то в себя подгрузить и т.д. Скорее всего будет доступ к статическим объектам, но не прямо сейчас , чуть позже.

-atas-
26.04.2011, 01:23
Как сделать так, чтобы танкеры рождались не по одному, а сразу группой?

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

Geniok
26.04.2011, 01:54
Такой вопрос возник, как определить, имеется ли самолет какой-либо группы в данный момент или нет?

Поясню. У немцев названия группы содержат знаки (|, ||, |||, |V, V, V|) и так далее. Но, при написании скрипта игра подобные знаки игнорирует.
С англичанами проблем нет, у них обозначения цифровые, например 218Sqn. А вот у немцев обозначения типа JG51_| игра в упор не видит. Может стоит заменить | на 1, || на 2, ||| на 3, |V на 4 и т.д. ?

Small_Bee
26.04.2011, 12:09
Вооружить танкеры зенитками не удалось. Не нашел где выбрать тип загрузки - зенитки. Подскажите, кто разобрался.
В свойствах ставишь галку "Показать скин" (что бы 3д картинка была), там выше картинки несколько выпадающий списков, в одном из них можно выбрать зенитки или пукшу.

naryv
26.04.2011, 13:07
Такой вопрос возник, как определить, имеется ли самолет какой-либо группы в данный момент или нет?

Поясню. У немцев названия группы содержат знаки (|, ||, |||, |V, V, V|) и так далее. Но, при написании скрипта игра подобные знаки игнорирует.
С англичанами проблем нет, у них обозначения цифровые, например 218Sqn. А вот у немцев обозначения типа JG51_| игра в упор не видит. Может стоит заменить | на 1, || на 2, ||| на 3, |V на 4 и т.д. ? Вот так в игре записывается -"BoB_LW_JG53_I" - "I" латинская

-atas-
27.04.2011, 01:20
Прошу помочь со скриптом для миссии http://www.sukhoi.ru/forum/showthread.php?t=68112&p=1607576&viewfull=1#post1607576

Проблема:
При отсутствии адекватного количеству ботов игроков на сервере, количество ботов увеличивается при загрузке скриптом новых суб-миссий, что со временем делает миссию неинтересной для игроков из-за большого количества ботов. Заранее сокращать количество ботов в миссии не хотелось бы, т.к. не известно будет на сервере 5 игроков или 50.

Некоторые идеи решения задачи:


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

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

Тут в соседних ветках и на западном форуме обсуждается проблема корректного уничтожения акторов.

1) Есть мысль для покинутых самолетов после выхода игрока отключать элероны, а через минуты 3 и руль высоты (или ломать двигатель), а еще через минут 5 уже дестроить его после падения. Можно давать рули на ввод в штопор и клинить в таком положении? Или давать полное отклонение элеронов и т.п.

2) Для просто ботов (в которые игрок не садился) после последнего вейпойнта отсчитывать минут 20-30 и тоже постепено выводить из строя управление и двигатель, а уже после падения дестроить. Но нужно это делать поочередно для каждого самолета в группе, чтобы не было "массового самоубийста" и желательно рандомизировать повреждения. Наверное, это сложновато всё заскриптовать.

Вот скрипт уничтожения акторов после выхода игрока адаптированный для многоместных самолетов http://www.sukhoi.ru/forum/showthread.php?t=67964&p=1606538&viewfull=1#post1606538 Но тому, кто гонялся за этим игроком очень неприятно видеть, что самолет исчезает в никуда, но и за ботом гоняться тоже не интересно.

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

Планировалось ли как-то решать эту проблему штатными средствами игры?

Geniok
27.04.2011, 01:40
Вот так в игре записывается -"BoB_LW_JG53_I" - "I" латинская

А 5 как писать, буква V ?
I - это буква I ?
Если да, то почему-то все равно не выходит.
Завтра проверю еще раз, отпишусь.

С Уважением!

zaltys
27.04.2011, 10:21
naryv,

Можно ли заставить экипаж прыгать с парашютом из самолета? Если нет, может быть, мы можем получить AiPerson.BailOut () в следующем патче?

naryv
27.04.2011, 10:53
Прошу помочь со скриптом для миссии http://www.sukhoi.ru/forum/showthread.php?t=68112&p=1607576&viewfull=1#post1607576

Проблема:
При отсутствии адекватного количеству ботов игроков на сервере, количество ботов увеличивается при загрузке скриптом новых суб-миссий, что со временем делает миссию неинтересной для игроков из-за большого количества ботов. Заранее сокращать количество ботов в миссии не хотелось бы, т.к. не известно будет на сервере 5 игроков или 50.
Ну, можно, например, в зависимости от количества игроков на сервере загружать миссии с разным количеством ботов

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


А 5 как писать, буква V ?
I - это буква I ?
Если да, то почему-то все равно не выходит.
Завтра проверю еще раз, отпишусь. Да,всё так , 1 - латинская буква "I", 5 -латинская "V". Должно работать - выше строчка - это как раз имя группы, из игры.


naryv,

Можно ли заставить экипаж прыгать с парашютом из самолета? Если нет, может быть, мы можем получить AiPerson.BailOut () в следующем патче?Если повредить самолёт, они попрыгают из него. В ближайших патчах вряд-ли, потом- может быть, только зачем?

zaltys
27.04.2011, 11:24
Если повредить самолёт, они попрыгают из него. В ближайших патчах вряд-ли, потом- может быть, только зачем?

Люди не любят, когда боты продолжают летать в самолетах, которые были оставлены игроками. Однако, они также не любят, когда самолет исчезает в воздухе (.OnPlaceLeave() + AiAircraft.Destroy()). Было бы лучше, если бы удалось заставить экипаж покинуть самолет, когда последний игрок покидает его.

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

-atas-
27.04.2011, 12:00
Люди не любят, когда боты продолжают летать в самолетах, которые были оставлены игроками. Однако, они также не любят, когда самолет исчезает в воздухе (.OnPlaceLeave() + AiAircraft.Destroy()). Было бы лучше, если бы удалось заставить экипаж покинуть самолет, когда последний игрок покидает его.

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

+ 1 Это было бы элегантным решением. Часто покидают при повреждении двигателя. Топливо обрезать?

Вот можно перебрать
part.NamedDamageTypes.AirbrakeDriveFailure
part.NamedDamageTypes.AirbrakeHosePerforated
part.NamedDamageTypes.AirbrakePistonFailure
part.NamedDamageTypes.ChunkLargeDamage
part.NamedDamageTypes.ChunkSmallDamage
part.NamedDamageTypes.CockpitDamageFlag00 ... part.NamedDamageTypes.CockpitDamageFlag14
part.NamedDamageTypes.ControlsAileronsDisabled
part.NamedDamageTypes.ControlsElevatorDisabled
part.NamedDamageTypes.ControlsGenericKickdown
part.NamedDamageTypes.ControlsRudderDisabled
part.NamedDamageTypes.ElecBatteryFailure
part.NamedDamageTypes.ElecGeneratorFailure
part.NamedDamageTypes.ElecIlluminationFailure
part.NamedDamageTypes.ElecMasterCompassFailure
part.NamedDamageTypes.ElecPrimaryFailure
part.NamedDamageTypes.ElecPriNavigationFailure
part.NamedDamageTypes.ElecSecNavigationFailure
part.NamedDamageTypes.ElecSecondaryFailure
part.NamedDamageTypes.ElecTransceiverFailure
part.NamedDamageTypes.ElecWeaponryFailure

// Engine Damages Engine0 - Engine7
part.NamedDamageTypes.Eng0CarbControlsFailure
part.NamedDamageTypes.Eng0CarbFailure
part.NamedDamageTypes.Eng0CompressorFailure
part.NamedDamageTypes.Eng0CompressorGovernorFailure
part.NamedDamageTypes.Eng0CompressorSeizure
part.NamedDamageTypes.Eng0CylinderHeadExtinguished
part.NamedDamageTypes.Eng0CylinderHeadFire
part.NamedDamageTypes.Eng0ExhaustHeadFailure
part.NamedDamageTypes.Eng0FuelLinePerforated
part.NamedDamageTypes.Eng0FuelPumpFailure
part.NamedDamageTypes.Eng0FuelSecondariesFire
part.NamedDamageTypes.Eng0GovernorFailure
part.NamedDamageTypes.Eng0GovernorSeizure
part.NamedDamageTypes.Eng0IntakeBurnt
part.NamedDamageTypes.Eng0IntercoolerBurnt
part.NamedDamageTypes.Eng0Magneto0Failure
part.NamedDamageTypes.Eng0Magneto1Failure
part.NamedDamageTypes.Eng0OilGasketLeak
part.NamedDamageTypes.Eng0OilLineBroken
part.NamedDamageTypes.Eng0OilPumpFailure
part.NamedDamageTypes.Eng0OilRadiatorPerforated
part.NamedDamageTypes.Eng0OilSecondariesExtinguished
part.NamedDamageTypes.Eng0OilSecondariesFire
part.NamedDamageTypes.Eng0OilTankPerforated
part.NamedDamageTypes.Eng0Plug00Failure - part.NamedDamageTypes.Eng0Plug17Failure
part.NamedDamageTypes.Eng0PropBlade1Broken - part.NamedDamageTypes.Eng0PropBlade4Broken
part.NamedDamageTypes.Eng0PropControlBroken
part.NamedDamageTypes.Eng0ThrottleControlBroken
part.NamedDamageTypes.Eng0TotalFailure
part.NamedDamageTypes.Eng0TotalSeizure
part.NamedDamageTypes.Eng0TretiaryControlBroken
part.NamedDamageTypes.Eng0WaterJacketBroken
part.NamedDamageTypes.Eng0WaterLineBroken
part.NamedDamageTypes.Eng0WaterPumpFailure
part.NamedDamageTypes.Eng0WaterRadiatorPerforated
part.NamedDamageTypes.Eng0WaterTankPerforated

part.NamedDamageTypes.EngineLargeDamage
part.NamedDamageTypes.EngineSmallDamage
part.NamedDamageTypes.FuelPumpFailure

// Tanks 0 - 7
part.NamedDamageTypes.FuelTank0Exploded
part.NamedDamageTypes.FuelTank0Fire
part.NamedDamageTypes.FuelTank0HosePerforated
part.NamedDamageTypes.FuelTank0LargeLeak
part.NamedDamageTypes.FuelTank0PumpFailure
part.NamedDamageTypes.FuelTank0SmallLeak
part.NamedDamageTypes.FuelTank0TinyLeak

part.NamedDamageTypes.HydraulicsEmergencyFailure
part.NamedDamageTypes.HydraulicsPistonOpened
part.NamedDamageTypes.HydraulicsPrimaryHosePerforated
part.NamedDamageTypes.HydraulicsPumpFailure
part.NamedDamageTypes.HydraulicsTankPerforated
part.NamedDamageTypes.LandingFlapsDriveFailure
part.NamedDamageTypes.LandingFlapsHosePerforated
part.NamedDamageTypes.LandingFlapsKinematicFailure1
part.NamedDamageTypes.LandingFlapsKinematicFailure2
part.NamedDamageTypes.LandingFlapsPistonFailure1
part.NamedDamageTypes.LandingFlapsPistonFailure2
part.NamedDamageTypes.LifeKeeperPartLargeDamage
part.NamedDamageTypes.LifeKeeperPartSmallDamage


// Weapondamages 00 - 11
part.NamedDamageTypes.Machinegun00BeltBroken
part.NamedDamageTypes.Machinegun00Charged
part.NamedDamageTypes.Machinegun00Failure
part.NamedDamageTypes.Machinegun00Jammed
part.NamedDamageTypes.Machinegun00LineDamaged


part.NamedDamageTypes.PartLargeDamage
part.NamedDamageTypes.PartSmallDamage
part.NamedDamageTypes.PneumaticsCompressorFailure
part.NamedDamageTypes.PneumaticsPrimaryContainerPerforated
part.NamedDamageTypes.PneumaticsPrimaryHosePerforated
part.NamedDamageTypes.PneumaticsSecondaryContainerPerforated
part.NamedDamageTypes.PneumaticsSecondaryHosePerforated
part.NamedDamageTypes.UndercarriageDownLockFailureC
part.NamedDamageTypes.UndercarriageDownLockFailureL
part.NamedDamageTypes.UndercarriageDownLockFailureR
part.NamedDamageTypes.UndercarriageDriveDamaged
part.NamedDamageTypes.UndercarriageHosePerforated
part.NamedDamageTypes.UndercarriageKinematicFailureC
part.NamedDamageTypes.UndercarriageKinematicFailureL
part.NamedDamageTypes.UndercarriageKinematicFailureR
part.NamedDamageTypes.UndercarriageShockFailureC
part.NamedDamageTypes.UndercarriageShockFailureL
part.NamedDamageTypes.UndercarriageShockFailureR
part.NamedDamageTypes.UndercarriageUpLockFailureC
part.NamedDamageTypes.UndercarriageUpLockFailureL
part.NamedDamageTypes.UndercarriageUpLockFailureR
part.NamedDamageTypes.WeaponLargeDamage
part.NamedDamageTypes.WeaponSmallDamage
part.NamedDamageTypes.WheelBrakesFailureL
part.NamedDamageTypes.WheelBrakesFailureR
part.NamedDamageTypes.WheelBrakesHosePerforated
part.NamedDamageTypes.WheelBrakesTotalFailure

part.NamedDamageTypes.MaxValue
part.NamedDamageTypes.Nil

http://forum.1cpublishing.eu/showthread.php?t=22184

Small_Bee
27.04.2011, 12:02
Люди не любят, когда боты продолжают летать в самолетах, которые были оставлены игроками. Однако, они также не любят, когда самолет исчезает в воздухе (.OnPlaceLeave() + AiAircraft.Destroy()). Было бы лучше, если бы удалось заставить экипаж покинуть самолет, когда последний игрок покидает его.

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

Ломай ему все управление - элероны высоту и направление.. Тыц (http://www.sukhoi.ru/forum/showthread.php?t=68369&p=1592454&viewfull=1#post1592454) Тем более внешне никак не заметно.

-atas-
27.04.2011, 12:31
Ломай ему все управление - элероны высоту и направление.. Тыц (http://www.sukhoi.ru/forum/showthread.php?t=68369&p=1592454&viewfull=1#post1592454) Тем более внешне никак не заметно.

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

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



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

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

Mirnyi
27.04.2011, 13:25
naryv,
А может подскажешь как добраться до maddox.game.GameServerDef?
В смысле подключить унаследованный класс. Желательно - к дедикейту.

Geniok
27.04.2011, 14:11
Уважаемый naryv, есть очень большая просьба. Нельзя ли сделать так, чтобы игра игнорировала знаки "=" в файлах ini ?

То есть сейчас имеем файл campaings.ini:
"[Main]
campaign_pk
campaign_gb
campaign_de

[campaign_gb]
folder campaign_gb
title Cliffs Of Dover
image Poster.bmp

[campaign_de]
folder campaign_de
title Adler Angriff
image Poster.bmp

[campaign_pk]
folder campaign_pk
title День Орла
image Poster.bmp
"

А надо чтобы можно было написать так:
"[Main]
campaign_pk=
campaign_gb
campaign_de

[campaign_gb]
folder campaign_gb
title Cliffs Of Dover
image Poster.bmp

[campaign_de]
folder campaign_de
title Adler Angriff
image Poster.bmp

[campaign_pk=]
folder = campaign_pk
title = День Орла
image = Poster.bmp
"

-atas-
27.04.2011, 15:21
Прошу уточнить:

public class Mission : AMission
{


public override void OnTickGame()
{

if (Time.tickCounter() % 108000 == 18000) // 60-10
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmGroundv1_0.mis");
GamePlay.gpHUDLogCenter("Protect friendly shipping in the channel near France!");
}

if (Time.tickCounter() % 81000 == 63000) // 45-35
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmBombersv1_0.mis");
GamePlay.gpHUDLogCenter("Intel: Enemy bombers are heading to blue airfields!");
}


if(Time.tickCounter() % 81000 == 81000) // 45-45
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmBombersv1_0a.mis");
GamePlay.gpHUDLogCenter("Intel: Enemy bombers are heading to red airfields in France!");
}


}



}

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

2я миссия загрузится через 35 минут с начала хост-миссии (и будет повторяться с момента своей 1й загрузки каждые 45 мин.

3я миссия загрузится через 45 минут с начала хост-миссии и будет повторяться с момента своей 1й загрузки каждые 45 мин.

Всё так или временные циклы по-другому отсчитываются?

upd. Если увеличить радиус airport.cpp до 10000, будет ли это убирать обломки с земли/самолеты на вынужденной во всем радиусе действия? Чем грозит такое увеличение радиуса? Каков верхний предел? 50000, 100000 будет работать?

naryv
27.04.2011, 18:57
Люди не любят, когда боты продолжают летать в самолетах, которые были оставлены игроками. Однако, они также не любят, когда самолет исчезает в воздухе (.OnPlaceLeave() + AiAircraft.Destroy()). Было бы лучше, если бы удалось заставить экипаж покинуть самолет, когда последний игрок покидает его.

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



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

public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded(missionNumber, shortName, aircraft);
Timeout(5, () =>
{
aircraft.Destroy();
});
} через 5 секунд после крашлэндинга уничтожится.


naryv,
А может подскажешь как добраться до maddox.game.GameServerDef?
В смысле подключить унаследованный класс. Желательно - к дедикейту. Пока не могу, не знаю, постараюсь после патча выложить dll с доступом к GameSingleDef , и позже узнать как к серверу подключиться.


Уважаемый naryv, есть очень большая просьба. Нельзя ли сделать так, чтобы игра игнорировала знаки "=" в файлах ini ?

То есть сейчас имеем файл campaings.ini:
"[Main]
campaign_pk
campaign_gb
campaign_de

А надо чтобы можно было написать так:
"[Main]
campaign_pk=
campaign_gb
campaign_de

" если честно не понял, зачем так надо.


Прошу уточнить:

public class Mission : AMission
{ public override void OnTickGame()
{
if (Time.tickCounter() % 108000 == 18000) // 60-10
{}
if (Time.tickCounter() % 81000 == 63000) // 45-35
{}
if(Time.tickCounter() % 81000 == 81000) // 45-45
{}
}
}

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

2я миссия загрузится через 35 минут с начала хост-миссии (и будет повторяться с момента своей 1й загрузки каждые 45 мин.

3я миссия загрузится через 45 минут с начала хост-миссии и будет повторяться с момента своей 1й загрузки каждые 45 мин.

Всё так или временные циклы по-другому отсчитываются? первые два правильно, 3-й нет, "%" это остаток от деления, х % 81000 == 81000 никогда не будет, если ничего не путаю, надо так : f(Time.tickCounter() % 81000 == 80999)


upd. Если увеличить радиус airport.cpp до 10000, будет ли это убирать обломки с земли/самолеты на вынужденной во всем радиусе действия? Чем грозит такое увеличение радиуса? Каков верхний предел? 50000, 100000 будет работать? airport.cpp не убирает самолёты и обломки, он должен машинки к севшим самолётам подвозить, но не уверен что работает, это очень старый скрипт, как реликт скорее всего остался.

Geniok
28.04.2011, 01:49
если честно не понял, зачем так надо.

Для оффлайн кампаний. Создаем свою кампанию. Устанавливается через инсталятор. ВСЕ инсталяторы, что я пробовал при редактировании ini-файлов сами ставят знак "=".

То есть если я в инсталяторе пишу Title ля-ля-ля, то при установке получаю Title = ля-ля-ля. А игра знаки "=" не понимает, приходится править потом ini-файл вручную.
Пр удалении кампании та же ситуация. Деинсталятор не находит в ini-файле ключей, соответственно ничего не удаляет. Опять приходится все чистить ручками. Если бы игра игнорировала знак "=", то любую кампанию можно было бы легко как установить, так и удалить.

С Уважением!

Mirnyi
28.04.2011, 07:52
Пока не могу, не знаю, постараюсь после патча выложить dll с доступом к GameSingleDef , и позже узнать как к серверу подключиться.
После беты? :)

-atas-
28.04.2011, 11:03
Несколько вопросов:
1) Каким образом можно "перекрасить" филд, т.е. отдать его от синих красным, например, по срабатыванию триггера?
Если делать это загрузкой новой подмиссии, в ней должны присутствовать все старые точки спауна или только одна точка спуна, которая меняется с синего на красный? Исчезнет ли старая синяя точка спауна с аэродрома, если туда погрузится красная?

2) Старая линия фронта тоже исчезнет, если загрузить новую линию фронта в подмиссии?

3) Как видоизменить код, чтобы надписи в момент подгрузки под-миссий были разные для синей и для красной стороны?

// loads my sub-missions
public override void OnTickGame()
{

if (Time.tickCounter() % 72000 == 18000) // 40-10
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmGroundv1_0.mis");
GamePlay.gpHUDLogCenter("Protect friendly shipping in the channel near France!");
}

if (Time.tickCounter() % 72000 == 71999) // 40-40
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmBombersv1_0.mis");
GamePlay.gpHUDLogCenter("Intel: Enemy bombers are heading to blue airfields!");
}

if (Time.tickCounter() % 72000 == 45000) // 40-25
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/128BoF/128BoFsmBombersv1_0a.mis");
GamePlay.gpHUDLogCenter("Intel: Enemy bombers are heading to red airfields in France!");
}

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

- в чат игры каждые 10 минут пишем: "Press Shift-S to see current mission objectives! Нажмите Shift-S, чтобы посмотреть текущие цели миссии!" (Shift-S не занят по умолчанию по-моему?)
- при нажатии клиентом Shift-S выводим на экран последнюю надпись из предыдущего пункта (3), причем разную для разных сторон

Какой код добавить в скрипт, чтобы это происходило?

Текущая миссия и скрипт здесь http://www.sukhoi.ru/forum/showthread.php?t=68112&page=2
Хочется уже дать игрокам осмысленные задачи, чтобы они могли влиять на результаты миссий на сервере.

kvach
28.04.2011, 12:26
Господа, а можно ли сделать так чтоб не выдавать самолет игроку, пока он не приземлился или его не сбили (разбился), ну и плюс удаление ероплана без игрока (в случае выхода с сервера, удачной или вынужденной посадки) и только после этого новый ероплан

naryv
28.04.2011, 19:31
Для оффлайн кампаний. Создаем свою кампанию. Устанавливается через инсталятор. ВСЕ инсталяторы, что я пробовал при редактировании ini-файлов сами ставят знак "=".
Понятно. Пока про "=" не готов ответить, пока наверное стоит просто предложить игрокам вставлять секцию в инишник, без инсталятора.


После беты? :) Не успею, после релиза скорее.


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


3) Как видоизменить код, чтобы надписи в момент подгрузки под-миссий были разные для синей и для красной стороны? смотреть армию игрока и выдавать ему соответствующее сообщение


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

- в чат игры каждые 10 минут пишем: "Press Shift-S to see current mission objectives! Нажмите Shift-S, чтобы посмотреть текущие цели миссии!" (Shift-S не занят по умолчанию по-моему?)
- при нажатии клиентом Shift-S выводим на экран последнюю надпись из предыдущего пункта (3), причем разную для разных сторон

Какой код добавить в скрипт, чтобы это происходило?

Текущая миссия и скрипт здесь http://www.sukhoi.ru/forum/showthread.php?t=68112&page=2
Хочется уже дать игрокам осмысленные задачи, чтобы они могли влиять на результаты миссий на сервере. перехватывать кнопки, не получится, можно вот так, например :

public override void OnPlaceEnter(Player player, AiActor actor, int placeIndex)
{
base.OnPlaceEnter(player, actor, placeIndex);
AiAircraft aircraft = actor as AiAircraft;

if (aircraft != null)
switch (aircraft.Army())
{
case 1:
if (aircraft.Type() == AircraftType.Bomber)
{ GamePlay.gpHUDLogCenter(new Player[] {player},"Red Bomber, Bomb it all, hitler caput"); }
else { GamePlay.gpHUDLogCenter(new Player[] { player }, "Red Fighter, fight them all"); }
break;
case 2:
if (aircraft.Type() == AircraftType.Bomber)
{ GamePlay.gpHUDLogCenter(new Player[] { player }, "Das bomber!"); }
else { GamePlay.gpHUDLogCenter(new Player[] { player }, "Das jager!"); }
break;

}
}

public override void OnAircraftTookOff(int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftTookOff(missionNumber, shortName, aircraft);

if (GamePlay.gpPlayer().Place() != aircraft)
return;

switch (aircraft.Army())
{
case 1:
if (aircraft.Type() == AircraftType.Bomber)
{ GamePlay.gpHUDLogCenter(new Player[] { GamePlay.gpPlayer() }, "Red Bomber, Bomb it all, hitler caput"); }
else { GamePlay.gpHUDLogCenter(new Player[] { GamePlay.gpPlayer() }, "Red Fighter, fight them all"); }
break;
case 2:
if (aircraft.Type() == AircraftType.Bomber)
{ GamePlay.gpHUDLogCenter(new Player[] { GamePlay.gpPlayer() }, "Das bomber!"); }
else { GamePlay.gpHUDLogCenter(new Player[] { GamePlay.gpPlayer() }, "Das jager!"); }
break;

}
} при занятии самолёта игроком - ему напишется задание в зависимости от стороны и типа самолёта - бомбер/нет - это первая функция, и после взлёта - по той же логике - вторая. Можно с таймаутом сообщение показывать.

Small_Bee
28.04.2011, 21:49
не готов точно ответить, можно попробовать подгружать миссию с одной точкой линии фронта на интересующем аэродроме.

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

Вот и еще одно пожелание нарисовалось :)
Было бы чудесно, если бы флажки тоже попали в отслеживаемую статику, а еще лучше, что бы их можно было прикрепить к какой-ни-будь технике/кораблику. :)

-atas-
29.04.2011, 12:03
Спасибо за ответы.



перехватывать кнопки, не получится

В Арма2 при заходе на сервер с миссией Warfare (битва за ресурсы) клиент сразу получает кнопку вызова меню (с клавиатуры), которого в самой игре нет, т.е. она назначена в миссии. Кнопка вызывает командное меню, по которому идет навигация кнопками 1-10 (как у нас переговоры). Это меню строительства объектов, управления ресурсами, голосования за командира, выбора целей, то есть всего необходимого в режиме "битва за ресурсы". Всё это есть в миссии, моды ставить не нужно. Как планируется реализовать режим "битва за ресурсы", анонсированный Олегом, если миссия не может перехватывать нажатия клавиатуры?

Small_Bee
29.04.2011, 12:09
Спасибо за ответы.



В Арма2 при заходе на сервер с миссией Warfare (битва за ресурсы) клиент сразу получает кнопку вызова меню (с клавиатуры), которого в самой игре нет, т.е. она назначена в миссии. Кнопка вызывает командное меню, по которому идет навигация кнопками 1-10 (как у нас переговоры). Это меню строительства объектов, управления ресурсами, голосования за командира, выбора целей, то есть всего необходимого в режиме "битва за ресурсы". Всё это есть в миссии, моды ставить не нужно. Как планируется реализовать режим "битва за ресурсы", анонсированный Олегом, если миссия не может перехватывать нажатия клавиатуры?

Если не ошибаюсь, все это можно будет реализовать с помощью доп. библиотеки на стороне клиента.

-atas-
29.04.2011, 13:21
Если не ошибаюсь, все это можно будет реализовать с помощью доп. библиотеки на стороне клиента.

Коммюнити очень маленькое + моды не все будут ставить = разделение онлайна. Такая библиотека должна входить в стим-версию имхо.

Как онлайн-миссию тестить прямо из редактора? Много времени занимает бегание по меню, чтобы сервер стартонуть (((

Крайняя бета вылетает при попытке разместить объект "аэродром". Пришлось откатиться на Стим.

Покрытие аэродрома как-то выбирается? Один раз аэродром отрендерился с аэродромной травкой, другой раз просто поле с пшеницей ) Бетонку как выбрать?

Как можно объекты сгруппировать и группу сохранить в файл? Объект аэродром в файл не сохраняется кстати.

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

Подскажите, пожалуйста, при размещении объекта "аэродром" поверх зашитого в карту аэродрома, при спауне на стоянках в онлайне будут использованы аэродромные пункты аэродрома карты или вновь созданного?

Возможен ли "старт на стоянке", если не создавать аэродромные пункты, а просто поставить аэродром?

Mirnyi
29.04.2011, 17:36
Тут в том проблема, что даже если так сделать, обратно вернуть никак не получится... Старый флажок то никуда не денется.

Вот и еще одно пожелание нарисовалось :)
Было бы чудесно, если бы флажки тоже попали в отслеживаемую статику, а еще лучше, что бы их можно было прикрепить к какой-ни-будь технике/кораблику. :)

Нужен прямой доступ ко всем объектам, с возможностью в любое время узнать его состояние или уничтожить.
В идеале - просто добавить объект и подключиться к событиям произвольных объектов.
Через подгрузку миссии вариант не нравится тем, что подгружается и скрипт, и из старой миссии объекты новой недоступны, и из новой объекты старой.
Нужен глобальный класс битвы, с доступом к любым объектам и с доступом из него в любой скрипт загруженной миссии и с обратным доступом.
И не только к объектам, но и к игрокам (онлайн).
Возможно, это решится когда удастся задействовать GameServerDef.
В любом случае, скрипты, не поддающиеся отладке - это не тот инструмент, которым можно сделать серьёзный проект (можно, но геморройно)

Small_Bee
29.04.2011, 18:00
Нужен прямой доступ ко всем объектам, с возможностью в любое время узнать его состояние или уничтожить.
В идеале - просто добавить объект и подключиться к событиям произвольных объектов.
Через подгрузку миссии вариант не нравится тем, что подгружается и скрипт, и из старой миссии объекты новой недоступны, и из новой объекты старой.
Нужен глобальный класс битвы, с доступом к любым объектам и с доступом из него в любой скрипт загруженной миссии и с обратным доступом.
И не только к объектам, но и к игрокам (онлайн).
Возможно, это решится когда удастся задействовать GameServerDef.
В любом случае, скрипты, не поддающиеся отладке - это не тот инструмент, которым можно сделать серьёзный проект (можно, но геморройно)

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

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

-atas-
29.04.2011, 18:48
Каким скриптом можно уничтожить всех акторов в миссии перед ее перезагрузкой (и ручной и плановой)?

Какие варианты запуска такого скрипта существуют? Можно ли запускать из командной строки сервера, из консоли игры, или только основным скриптом миссии по времени?

Вопрос неоднократно задавался на форуме 1С владельцами серверов, также связан вот с этим багом http://www.sukhoi.ru/forum/showthread.php?t=68697&p=1610136&viewfull=1#post1610136

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

Small_Bee
29.04.2011, 19:43
Каким скриптом можно уничтожить всех акторов в миссии перед ее перезагрузкой (и ручной и плановой)?

Не тестировал, но можно попробовать так



foreach (int army in GamePlay.gpArmies())
{
foreach (AiAirGroup group in GamePlay.gpAirGroups(army))
{
if (ActorName.MissionNumber(group.Name()).Equals(MissionNumber))
{
AiActor[] members = group.GetItems();
for (int i = members.Length - 1; i > -1; i--)
{
(members[i] as AiAircraft).Destroy();
}
}
}
foreach (AiGroundGroup group in GamePlay.gpGroundGroups(army))
{
if (ActorName.MissionNumber(group.Name()).Equals(MissionNumber))
{
AiActor[] members = group.GetItems();
for (int i = members.Length - 1; i > -1; i--)
{
(members[i] as AiGroundActor).Destroy();
}
}
}
}


Миссия удаляет только "своих" акторов. Если надо грохнуть всех, убираем строки, выделенные синим.

naryv
29.04.2011, 20:00
Тут в том проблема, что даже если так сделать, обратно вернуть никак не получится... Старый флажок то никуда не денется.

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




Крайняя бета вылетает при попытке разместить объект "аэродром". Пришлось откатиться на Стим. да, спасибо, нашли исправили, в патче должно быть


Покрытие аэродрома как-то выбирается? Один раз аэродром отрендерился с аэродромной травкой, другой раз просто поле с пшеницей ) Бетонку как выбрать? Не знаю, после выходных постараюсь узнать, у меня бетонка родилась :)


Как можно объекты сгруппировать и группу сохранить в файл? Объект аэродром в файл не сохраняется кстати.[COLOR="Silver"] Выделить группу объектов с <Alt>, потом правой кнопкой мыши -> сохранить в файл.


Подскажите, пожалуйста, при размещении объекта "аэродром" поверх зашитого в карту аэродрома, при спауне на стоянках в онлайне будут использованы аэродромные пункты аэродрома карты или вновь созданного?

Возможен ли "старт на стоянке", если не создавать аэродромные пункты, а просто поставить аэродром? Не знаю, надо смотреть, у меня сейчас игры нет.

Small_Bee
29.04.2011, 20:14
При подгрузке линии фронта в миссии - старая должна удаляться, полностью замещаясь новой.


А, если так, то вопрос с динамической линией фронта можно считать решенным. :)

Mirnyi
01.05.2011, 11:29
Не успею, после релиза скорее.
В связи с отложенным релизом ничего по срокам не изменилось?:ups:

-atas-
01.05.2011, 13:37
Не знаю, надо смотреть, у меня сейчас игры нет.

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

Если нет аэродромных пунктов, старт на стоянке происходит по внутреннему кругу аэродрома, если не создана полоса и по внешнему кругу, если полоса создана.

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


А, если так, то вопрос с динамической линией фронта можно считать решенным. :)

Остается вопрос как поменять синий респаун с синими самолетами на красный респаун с красными самолетами при передвижке линии фронта. Надеюсь, респауны тоже заменяются. Пока не проверял, т.к осваиваю триггеры.

-atas-
03.05.2011, 11:28
Выделить группу объектов с <Alt>, потом правой кнопкой мыши -> сохранить в файл.


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

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

-atas-
05.05.2011, 12:34
При подгрузке линии фронта в миссии - старая должна удаляться, полностью замещаясь новой.

Каким образом при этом можно :
- "перекрасить" точки спауна, например, с синего на красный?
- заменить синие зенитки на аэродроме на красные, если не все были уничтожены в миссии?
- заменить список доступных крафтов на спауне с синих на красные?

Информация нужна для 1го этапа работ над следующей миссией http://www.sukhoi.ru/forum/showthread.php?t=68774&p=1613505&viewfull=1#post1613505

Mirnyi
05.05.2011, 14:19
naryv,
когда же мы увидим подключенную длл?

naryv
05.05.2011, 20:14
Каким образом при этом можно :
- "перекрасить" точки спауна, например, с синего на красный?
- заменить синие зенитки на аэродроме на красные, если не все были уничтожены в миссии?
- заменить список доступных крафтов на спауне с синих на красные?

Информация нужна для 1го этапа работ над следующей миссией http://www.sukhoi.ru/forum/showthread.php?t=68774&p=1613505&viewfull=1#post1613505

Вот, сделал пример по передвижению линии фронта, перекраске спаунов и т.д.
133765
. Карта кресты и круги. При пролёте над аэродромом - он перекрашивается в цвет пролетевшего самолёта, линия фронта двигается, точки спауна на аэродромах становятся нового цвета. При пролёте противника над истребительными аэродромами - срабатывает триггер рождающий самолёт цвета начального аэродрома(над кругом пролетает синий - рождается спит, над крестом красный родит мессера, это чтобы одна сторона не проиграла совсем - всегда есть возможность вернуть захваченные дромы). На выделенном сервере проверял - работает как и на не выделенном. Проблема с неработающими скриптами на выделенном сервере может быть, если папка cache c атрибутом readonly - скрипт не может скомпилиться, сообщение об этом появляется в консоли сервера.

-atas-
05.05.2011, 21:36
Вот, сделал пример по передвижению линии фронта, перекраске спаунов и т.д.
133765
. Карта кресты и круги. При пролёте над аэродромом - он перекрашивается в цвет пролетевшего самолёта, линия фронта двигается, точки спауна на аэродромах становятся нового цвета. При пролёте противника над истребительными аэродромами - срабатывает триггер рождающий самолёт цвета начального аэродрома(над кругом пролетает синий - рождается спит, над крестом красный родит мессера, это чтобы одна сторона не проиграла совсем - всегда есть возможность вернуть захваченные дромы). На выделенном сервере проверял - работает как и на не выделенном. Проблема с неработающими скриптами на выделенном сервере может быть, если папка cache c атрибутом readonly - скрипт не может скомпилиться, сообщение об этом появляется в консоли сервера.

Спасибо большое, буду разбираться понемногу, если осилю )

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

И зенитки оставшиеся мешают - вступают в перестрелку с родившимися новыми зенитками другой стороны. Придется спаунить танки, чтобы закатать зенитки в землю, а вот со спауном что делать, непонятно, он не перекрашивается. Ставить 2 разноцветных спауна рядом тоже не очень хорошо, т.к. пилоты будут в них путаться,. Может быть, можно включить в редактор такой объект как "ластик", при подгрузке которого все юниты предыдущих суб-миссий в его радиусе будут дестроиться?

Новый спаун на новом месте при подгрузке карты тоже не появляется. А это было бы полезно.

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

naryv
06.05.2011, 00:39
Спасибо большое, буду разбираться понемногу, если осилю ) постараюсь ответить, если вопросы возникнут:)


А только средствами полного редактора с скриптом подгрузки миссий нельзя филд перекрасить? Не владеющим С# гораздо проще нарисовать новую диспозицию в новой миссии и подгрузить ее. Проверил, линия фронта при подгрузке миссии двигается, а старый спаун остается неизменным. можно, конечно, если миссию умеем подгружать - в принципе скрипт здесь так и делает.

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


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

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


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


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

Vetochka
06.05.2011, 10:48
А что происходит с именами групп? Проигрываю одну и ту же миссию, получаю имя группы (например, убитого самолета) в одних случаях получается имя как прописано в миссии, в других на том же самом самолете имя группы становится NoName. Игрок всегда определяется правильно.
Cтартануть группу по action.Do() тоже получается как-то загадочно. В одной и той же миссии, не трогая ни саму миссию, ни скрипта, то стартует, то не стартует. Гарантированно лечится заходом в полный редактор, переназначением имени группы и переназначением стартуемой группы в действиях.
Подскажите как это лечить?
Миссии для оффлайна.

-atas-
06.05.2011, 10:48
постараюсь ответить, если вопросы возникнут:)

Пока не осилил, т.е. понимать процентов на 60 понимаю, но написать такое для другого спауна и другого триггера не смогу. Так что остается пока только редактор и его триггеры. Триггеры пока откладываем в сторону пока они не работают вместе со скриптом подгрузки миссии в миссию. Без него никак (


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


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

Удалось в редакторе поставить новый спаун на старый, но старый не удаляется, т.е. другая сторона в этой точке карты тоже может выбрать свои самолеты. Как средствами редактора удалить старый спаун? Он же уже подгружен в миссию, нужен инструмент, чтобы его дестроить. Его перенос в тыл вроде бы не помогает, он остается на месте.


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


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


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

Да, в этом вопрос: как чистить старый спаун и как чистить зенитки средствами полного редактора и подгрузки карт.

-------------------

Еще вопросы:
Сейчас делается миссия, состоящая из 3-4 карт с баталиями за аэродромы и их переходом от стороны к стороне. Каким образом в полном редакторе можно установить объект точно в одни и те же координаты на нескольких картах/миссиях? Тесты показали, что если, например зенитки стоят на одном месте на всех картах, то при загрузке подмиссий они не дублируются а замещаются (или возрождаются). Если на новой карте объект чуть сдвинут (случайно, например), то старый не исчезает. Когда зениток несколько десятков, опознать одну в тексте файла миссии не представляется возможным.

В будущем (через пару месяцев) подмиссий может быть несколько десятков и сотен. Нужен инструмент (скрипт) для пакетной обработки файлов миссий: добавления объекта или стирания объекта из миссии сразу для всех подмиссий миссии. Как для одной точки, так и в определенном радиусе.

Бывает проблематично довести танки до цели из-за отсутствия мостов. Можно включить в редактор саперов и пантонные переправы?
Танки по умолчанию идут слишком плотной колонной и врезаются в подбитый передний танк. Почему им нельзя задать боевой порядок как для самолетов? Желательно увеличить интервалы по умолчанию, чтобы успевали объехать препятствие. Либо проблема в том, что в бою танки трогаются только вперед и не могут объехать, ттогда как на марше 1 раз объезжали вставшего лидера, причем грамотно и с обеих сторон, т.е. этот модуль кода есть в игре.

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

Small_Bee
06.05.2011, 12:29
А что происходит с именами групп? Проигрываю одну и ту же миссию, получаю имя группы (например, убитого самолета) в одних случаях получается имя как прописано в миссии, в других на том же самом самолете имя группы становится NoName. Игрок всегда определяется правильно.
Cтартануть группу по action.Do() тоже получается как-то загадочно. В одной и той же миссии, не трогая ни саму миссию, ни скрипта, то стартует, то не стартует. Гарантированно лечится заходом в полный редактор, переназначением имени группы и переназначением стартуемой группы в действиях.
Подскажите как это лечить?
Миссии для оффлайна.

Имхо, группа, которая стартует скриптом (с помощью действия скажем), по сути относится уже к другой миссии. Попробуй во-первых, назначит переменной MissionNumberListener значение -1, примерно вот так:


public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
}

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

Во вторых, имя группы состоит из собственно имени группы и префикса "принадлежности к миссии" (номер миссии с двоеточием). Получить правильно полное имя группы (например для использования в GamePlay.gpActorByName()) можно примерно вот так:


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
string fullName = ActorName.Full(missionNumber, shortName);
}

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

-atas-
06.05.2011, 15:15
Чем отличаются "тревога" и "ожидание" в свойствах группы самолетов?

Машинки с car.cpp по чужой территории не ездят, просто стоят на месте?

Есть ли сплайновая дорога без столбов на которой работает car.cpp ? Машины врезаются в столбы, останавливаются, думают, снова врезаются...

Пролет цели по критерию GroundArmy может вызвать вылет группы самолетов своей стороны или только вражеской?

Vetochka
06.05.2011, 15:45
Имхо, группа, которая стартует скриптом...

Спасибо. Бум пробовать.

Vetochka
07.05.2011, 22:56
Можно ли какой-то командой во время миссии пересадить игрока в другой самолет?

naryv
08.05.2011, 15:14
Пока не осилил, т.е. понимать процентов на 60 понимаю, но написать такое для другого спауна и другого триггера не смогу. Так что остается пока только редактор и его триггеры. Триггеры пока откладываем в сторону пока они не работают вместе со скриптом подгрузки миссии в миссию. Без него никак ( Как не работают? В примере выше ведь и скрипт и триггеры вместе работают.


Удалось в редакторе поставить новый спаун на старый, но старый не удаляется, т.е. другая сторона в этой точке карты тоже может выбрать свои самолеты. Как средствами редактора удалить старый спаун? Он же уже подгружен в миссию, нужен инструмент, чтобы его дестроить. Его перенос в тыл вроде бы не помогает, он остается на месте.в редакторе никак, скриптом вот так:

foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces())
{
if (bp != null)
bp.destroy();

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




Еще вопросы:
Сейчас делается миссия, состоящая из 3-4 карт с баталиями за аэродромы и их переходом от стороны к стороне. Каким образом в полном редакторе можно установить объект точно в одни и те же координаты на нескольких картах/миссиях? Тесты показали, что если, например зенитки стоят на одном месте на всех картах, то при загрузке подмиссий они не дублируются а замещаются (или возрождаются). Если на новой карте объект чуть сдвинут (случайно, например), то старый не исчезает. Когда зениток несколько десятков, опознать одну в тексте файла миссии не представляется возможным.в редакторе точно поставить, емнип, никак, в тексте файла миссии скопировать можно. насчёт опознания - они веди поименованы все, смотрим в редакторе "объекты миссии", находим нужную в файле миссии и копируем координаты.


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


Бывает проблематично довести танки до цели из-за отсутствия мостов. Можно включить в редактор саперов и пантонные переправы?
Танки по умолчанию идут слишком плотной колонной и врезаются в подбитый передний танк. Почему им нельзя задать боевой порядок как для самолетов? Желательно увеличить интервалы по умолчанию, чтобы успевали объехать препятствие. Либо проблема в том, что в бою танки трогаются только вперед и не могут объехать, ттогда как на марше 1 раз объезжали вставшего лидера, причем грамотно и с обеих сторон, т.е. этот модуль кода есть в игре.сапёров пока нет, подумаем. В бою, вообще должны препятствия объезжать, возможно не успели.



Чем отличаются "тревога" и "ожидание" в свойствах группы самолетов? не знаю, во вторник посмотрю.


Машинки с car.cpp по чужой территории не ездят, просто стоят на месте? ездят вроде, им цвет территории не важен, но уточню.


Есть ли сплайновая дорога без столбов на которой работает car.cpp ? Машины врезаются в столбы, останавливаются, думают, снова врезаются... есть невидимая дорога(в англ. варианте Generic road, в русской не помню как переведено)- она вообще никак не отображается, машинка просто по заданному ей маршруту едет. Разные рулёжки и взлётки тоже без столбов.


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


Можно ли какой-то командой во время миссии пересадить игрока в другой самолет? во вторник посмотрю, а зачем так, против его воли, если не секрет:)? Про имена групп Small_Bee всё правильно написал, должно работать.

-atas-
08.05.2011, 15:34
Спасибо за ответы, разбираюсь.

zaltys
08.05.2011, 17:16
1) Как написать в консол? Я вижу System.Console.WriteLine () в некоторых миссиях кампании, но это не работает. Может быть мне нужно запустить игру в режиме отладки? Как это сделать?
2) OnAircraftLanded (), OnAircraftCrashLanded (), OnAircraftLanded (), IsAirborne () не работают для самолета игрока в мультиплеере. Должно так быть?

Small_Bee
08.05.2011, 22:54
Можно ли какой-то командой во время миссии пересадить игрока в другой самолет?



AiActor actor = GamePlay.gpActorByName(ActorName.Full(MissionNumber, "BoB_LW_LG2_I.01"));
if (actor is AiAirGroup && GamePlay.gpPlayer() != null)
{
Player player = GamePlay.gpPlayer();
foreach (AiAircraft airc in (actor as AiAirGroup).GetItems())
{
bool isFound = false;
for (int i = 0; i < airc.Places(); i++)
{
if (airc.ExistCabin(i))
{
if (airc.CrewFunctionPlace(i).Equals(CrewFunction.Pilot))
{
player.PlaceEnter(airc, i);
isFound = true;
break;
}
}
}
if (isFound) break;
}
}


Находим группу, в цикле перебираем самолеты группы и сажаем игрока в первый же самолет, где есть кабина пилота.

Vetochka
09.05.2011, 15:39
....

Еще раз спасибо :)



во вторник посмотрю, а зачем так, против его воли, если не секрет:)? Про имена групп Small_Bee всё правильно написал, должно работать.
Конечно, не секрет. :) Для оффлайн миссий. Сюжет - игрок возвращается без б/к на поврежденном самолете, пока садится техники готовят новый самолет, после посадки игрок перебегает в этот новый самолет и снова в бой :)

-atas-
11.05.2011, 12:27
Как не работают? В примере выше ведь и скрипт и триггеры вместе работают.


В полном редакторе в меню есть раздел триггеров и скриптов. Так вот, если там задать триггеры и действия для них, они будут работать до тех пор, пока к миссии не добавлен скрипт в текстовом файле. Эта проблема с примерами некорректной работы миссий была уже изложена здесь: http://www.sukhoi.ru/forum/showthread.php?t=68596&p=1612758&viewfull=1#post1612758

Естественно, юзеру вроде меня удобнее использовать встроенные в редактор триггеры, чем просить кого-то написать скрипт, содержащий триггеры, который я даже не смогу отладить. Однако, использовать триггеры редактора пока не удается из-за:
1) больше 3-4х триггеров в миссии не работает (описано в багрепортах)
2) триггеры не работают вместе со скриптом подгрузки миссий и уничтожения ботов (описано в багрепортах).

По этим причинам работа с триггерами редактора отложена о лучших времен.

-atas-
12.05.2011, 09:28
На сервере Repka №1 возникла проблема: бомбардировщики после посадки на аэродроме очень долго не исчезают (или часто виден экипаж без самолета), размер миссии постоянно растет, и время ее загрузки вырастает до неприемлемых 2-3 минут. Также через 3-4 часа работы возникают микрофризы, лаги, фпс падает (см. http://www.sukhoi.ru/forum/showthread.php?t=68697&p=1619325&viewfull=1#post1619325 )

Скрипт прекрасно уничтожает ботов в покинутых самолетах, но не уничтожает успешно севших на аэродромах. Также есть сомнения, что работает с самолетами на вынужденной (наблюдал вращающийся на брюхе Ю-88). Внизу часть кода выделена красным.


// v.1_17_00. bot-destroying script based on one by oreva

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

public class Mission : AMission
{

// loading sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
}

if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
}

/////////////////////////////////////////////////////////////////////////////////////

if (Time.tickCounter() % 135000 == 9000) // 135000=75 min repeat. 9000=5 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
// GamePlay.gpHUDLogCenter("mis1 loaded!");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Help is needed at D4!");
});

}

if (Time.tickCounter() % 135000 == 54000) // ; 135000=75 min repeat, 54000 - 30 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_ground01.mis");
// GamePlay.gpHUDLogCenter("mis2 loaded");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
});

Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to C4!");
});
}

if (Time.tickCounter() % 135000 == 99000) // 135000 == 99000 = 75 min repeat, 55 min delay
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
// GamePlay.gpHUDLogCenter("mis3 loaded!");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Friendly aircrafts are under attack at D2!");
});
}
}

// destroys aircraft abandoned by a player. script by oreva
private bool isAiControlledPlane (AiAircraft aircraft)
{
if (aircraft == null)
{
return false;
}

Player [] players = GamePlay.gpRemotePlayers ();
foreach (Player p in players)
{
if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
{
return false;
}
}

return true;
}

private void destroyPlane (AiAircraft aircraft) {
if (aircraft != null) {
aircraft.Destroy ();
}
}

private void explodeFuelTank (AiAircraft aircraft)
{
if (aircraft != null)
{
aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded);
}
}

private void destroyAiControlledPlane (AiAircraft aircraft) {
if (isAiControlledPlane (aircraft)) {
destroyPlane (aircraft);
}
}

private void damageAiControlledPlane (AiActor actor) {
if (actor == null || !(actor is AiAircraft)) {
return;
}

AiAircraft aircraft = (actor as AiAircraft);

if (!isAiControlledPlane (aircraft)) {
return;
}

if (aircraft == null) {
return;
}

aircraft.hitNamed (part.NamedDamageTypes.ControlsElevatorDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsAileronsDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsRudderDisabled);
aircraft.hitNamed (part.NamedDamageTypes.FuelPumpFailure);
aircraft.hitNamed (part.NamedDamageTypes.Eng0TotalFailure);
aircraft.hitNamed (part.NamedDamageTypes.Eng1TotalFailure);

/***Timeout (240, () =>
{explodeFuelTank (aircraft);}
);
* ***/

Timeout (300, () =>
{destroyPlane (aircraft);}
);
}

//////////////////////////////////////////////////////////////////////////////////////////////////

public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex)
{
base.OnPlaceLeave (player, actor, placeIndex);
Timeout (1, () =>
{damageAiControlledPlane (actor);}
);
}

public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded (missionNumber, shortName, aircraft);
Timeout (300, () =>
{ destroyPlane(aircraft); }
);
}
public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftLanded(missionNumber, shortName, aircraft);
Timeout(300, () =>
{ destroyPlane(aircraft); }
);
}

}

Как изменить скрипт, чтобы он уничтожал и приземлившиеся самолеты через 5 минут?

Аналогичная проблема существует так же с танкерами, танками, дымами.
Можно было бы для танкеров, танков и дымов использовать аналогичный скрипт(см. ниже), но исполняемый только минут через 50 после подгрузки подмиссии? Как он будет выглядеть? Можно его включить в основной скрипт или придется плодить скрипты для каждой подмиссии (чего не хотелось бы)?


foreach (int army in GamePlay.gpArmies())
{
foreach (AiAirGroup group in GamePlay.gpAirGroups(army))
{
if (ActorName.MissionNumber(group.Name()).Equals(MissionNumber))
{
AiActor[] members = group.GetItems();
for (int i = members.Length - 1; i > -1; i--)
{
(members[i] as AiAircraft).Destroy();
}
}
}
foreach (AiGroundGroup group in GamePlay.gpGroundGroups(army))
{
if (ActorName.MissionNumber(group.Name()).Equals(MissionNumber))
{
AiActor[] members = group.GetItems();
for (int i = members.Length - 1; i > -1; i--)
{
(members[i] as AiGroundActor).Destroy();
}
}
}
}

Спасибо за помощь.

cFobos
13.05.2011, 23:02
1) А можно ли задать для игрока условие "автопересадки" в другой самолёт, после выполнения задания, без выхода в меню?
Т.е чтобы скажем выполнили задачи истребителя - оказались в бомбордировщике.
2) А можно ли задать для юнитов скриптовые маршруты зацикленные до бесконечности? Например чтобы поезд нарезал круги по рельсам и п.р до конца миссии.

-atas-
14.05.2011, 11:18
1) А можно ли задать для игрока условие "автопересадки" в другой самолёт, после выполнения задания, без выхода в меню?
Т.е чтобы скажем выполнили задачи истребителя - оказались в бомбордировщике.

Читайте тему выше:
http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1616450&viewfull=1#post1616450



2) А можно ли задать для юнитов скриптовые маршруты зацикленные до бесконечности? Например чтобы поезд нарезал круги по рельсам и п.р до конца миссии.

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

zaltys
14.05.2011, 16:54
Скрипт прекрасно уничтожает ботов в покинутых самолетах, но не уничтожает успешно севших на аэродромах.

Нет, он разрушает даже самолеты, которые приземлились на аэродроме, но эти самолеты должны быть созданы в той же миссии. Потому что вы создаете самолеты в других миссиях, скрипт не может получить OnPlaneLanded() и OnPlaneCrashLanded() для этих самолетов. Есть 2 решения:

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


public override void Init(maddox.game.ABattle battle, int missionNumber)
{
base.Init(battle,missionNumber);
MissionNumberListener=-1; //Listen to events of every mission
}

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




aircraft.hitNamed (part.NamedDamageTypes.Eng0TotalFailure);
aircraft.hitNamed (part.NamedDamageTypes.Eng1TotalFailure);


Этот код дает вам много ошибок типа "Out of bounds", потому что он пытается убить второго двигателя и на самолете с одним двигателем.

Попробуйте изменить эти строки на:


int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
for (int i=0; i<iNumOfEngines; i++)
{
aircraft.hitNamed ((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes),"Eng"+i.ToString()+"TotalFailure"));
}

-atas-
14.05.2011, 17:05
Спасибо большое!!! Завтра потестирую в оффлайне и загружу на сервер. Вставлять MissionNumberListener=-1, как понимаю, лучше в начало файла?

Out of bounds мы получали по-моему именно для 2х-моторных 110х емнип (и только для них). Но в любом случае исправим.

Не подскажете, как корабли, танки, дымы минут через 50 - 75 убрать после их загрузки подмиссией?

zaltys
14.05.2011, 17:56
Аналогичная проблема существует так же с танкерами, танками, дымами.
Можно было бы для танкеров, танков и дымов использовать аналогичный скрипт(см. ниже), но исполняемый только минут через 50 после подгрузки подмиссии? Как он будет выглядеть?

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


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);

//Ground objects will die after 50 min when counted from their birth
if (actor is AiGroundActor)
Timeout (3000, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

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


Вставлять MissionNumberListener=-1, как понимаю, лучше в начало файла?

В методе Init (). Он выполняется, когда миссия начинается. Нет никакой разницы, в каком порядке методы определены в классе, так что вы можете поместить его в начале, конце или середине.


Out of bounds мы получали по-моему именно для 2х-моторных 110х емнип (и только для них). Но в любом случае исправим.

Давайте брать пример. Игрок покидает Spitfire в воздухе, скрипт пытается сделать некоторые повреждения. Spitfire имеет только один двигатель, поэтому скрипт успешно убивает двигателя № 1. Тогда скрипт продолжается, и пытается убить двигатель № 2, которой не существует, и в результате появляется ошибка "Out of bounds".

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

-atas-
14.05.2011, 23:11
Если объекты создаются только во время загрузки миссий, мы можем уменьшить эту проблему до: объекты должны умереть после минут XXX от их создания. Тогда, мы можем использовать:

Спасибо еще раз!!! Завтра будем внедрять.

zaltys
15.05.2011, 11:12
Периодические загрузки миссии без использования TickCounter():


//Runs once, when mission is loaded
public override void Init(maddox.game.ABattle battle, int missionNumber)
{
base.Init(battle,missionNumber);
//Planned missions
MissionLoader(30,10,"missions/Multi/Dogfight/bombers1.mis"); // 10s from main mission start and repeatedly every 30s
MissionLoader(100,60,"missions/Multi/Dogfight/bombers2.mis"); // 60s from main mission start and repeatedly every 100s
}

public void MissionLoader(int period, int offset, string mission)
{
if (offset > 0)
Timeout(offset, () => {MissionLoader(period,0,mission);});
else
{
GamePlay.gpPostMissionLoad(mission);
Timeout(period, () => {MissionLoader(period,0,mission);});
}
}

-atas-
15.05.2011, 15:49
Периодические загрузки миссии без использования TickCounter():

Спасибо, а как туда отложенные по времени текстовые сообщения вставить как здесь:


// v.1_17_00. bot-destroying script based on one by oreva

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

public class Mission : AMission
{

// loading sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
}

if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
}

/////////////////////////////////////////////////////////////////////////////////////

if (Time.tickCounter() % 135000 == 9000) // 135000=75 min repeat. 9000=5 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
// GamePlay.gpHUDLogCenter("mis1 loaded!");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Help is needed at D4!");
});

}

if (Time.tickCounter() % 135000 == 54000) // ; 135000=75 min repeat, 54000 - 30 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_ground01.mis");
// GamePlay.gpHUDLogCenter("mis2 loaded");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
});

Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to C4!");
});
}

if (Time.tickCounter() % 135000 == 99000) // 135000 == 99000 = 75 min repeat, 55 min delay
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
// GamePlay.gpHUDLogCenter("mis3 loaded!");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Friendly aircrafts are under attack at D2!");
});
}
}

// destroys aircraft abandoned by a player. script by oreva
private bool isAiControlledPlane (AiAircraft aircraft)
{
if (aircraft == null)
{
return false;
}

Player [] players = GamePlay.gpRemotePlayers ();
foreach (Player p in players)
{
if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
{
return false;
}
}

return true;
}

private void destroyPlane (AiAircraft aircraft) {
if (aircraft != null) {
aircraft.Destroy ();
}
}

private void explodeFuelTank (AiAircraft aircraft)
{
if (aircraft != null)
{
aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded);
}
}

private void destroyAiControlledPlane (AiAircraft aircraft) {
if (isAiControlledPlane (aircraft)) {
destroyPlane (aircraft);
}
}

private void damageAiControlledPlane (AiActor actor) {
if (actor == null || !(actor is AiAircraft)) {
return;
}

AiAircraft aircraft = (actor as AiAircraft);

if (!isAiControlledPlane (aircraft)) {
return;
}

if (aircraft == null) {
return;
}

aircraft.hitNamed (part.NamedDamageTypes.ControlsElevatorDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsAileronsDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsRudderDisabled);
aircraft.hitNamed (part.NamedDamageTypes.FuelPumpFailure);
aircraft.hitNamed (part.NamedDamageTypes.Eng0TotalFailure);
aircraft.hitNamed (part.NamedDamageTypes.Eng1TotalFailure);

/***Timeout (240, () =>
{explodeFuelTank (aircraft);}
);
* ***/

Timeout (300, () =>
{destroyPlane (aircraft);}
);
}

//////////////////////////////////////////////////////////////////////////////////////////////////

public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex)
{
base.OnPlaceLeave (player, actor, placeIndex);
Timeout (1, () =>
{damageAiControlledPlane (actor);}
);
}

public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded (missionNumber, shortName, aircraft);
Timeout (300, () =>
{ destroyPlane(aircraft); }
);
}
public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftLanded(missionNumber, shortName, aircraft);
Timeout(300, () =>
{ destroyPlane(aircraft); }
);
}

}

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

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

-atas-
15.05.2011, 18:43
public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);

//Ground objects will die after 50 min when counted from their birth
if (actor is AiGroundActor)
Timeout (3000, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

Можно ли каким-то образом исключить отсюда артиллерию? Т.е. чтобы зенитки оставались.

zaltys
15.05.2011, 19:05
Можно ли каким-то образом исключить отсюда артиллерию? Т.е. чтобы зенитки оставались.


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);
//Ground objects (except AA Guns) will die after 50 min when counted from their birth
if (actor is AiGroundActor)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout (3000, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

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


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);
HUDmsg("Actor "+actor.Name()+" was created.");
//Ground objects (except ones created in main mission) will die after 50 min when counted from their birth
if (actor is AiGroundActor && missionNumber > 0)
Timeout (3000, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

-atas-
15.05.2011, 19:22
Спасибо большое! Возьмем 1й вариант, т.к. в подмиссиях иногда зенитки немного добавляем, где нужно.

Противотанковые пушки удалятся? (их лучше удалять, хотя не так принципиально пока их мало у нас совсем).

upd. Вот так получилось. Тестируем. Спасибо за помощь.


// v.1_17_04. script by oreva, zaltys, small_bee

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

public class Mission : AMission
{

// loading sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
}

if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
}

///////////////////////

if (Time.tickCounter() % 162000 == 9000) // 162000=90 min repeat. 9000=5 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
// GamePlay.gpHUDLogCenter("mis1 loaded!");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 500, () =>
{
GamePlay.gpHUDLogCenter("Attention! Help is needed at D4!");
});

}

if (Time.tickCounter() % 162000 == 63000) // ; 162000=90 min repeat, 63000 - 35 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis");
// GamePlay.gpHUDLogCenter("mis2 loaded");

double initTime = 0.0;
Timeout(initTime += 500, () =>
{
GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
});

Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Friendly ships are under attack at C4!");
});
}

if (Time.tickCounter() % 162000 == 117000) // 162000 == 117000 = 90 min repeat, 65 min delay
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
// GamePlay.gpHUDLogCenter("mis3 loaded!");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to D2!");
});
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////

// destroys aircraft abandoned by a player.
private bool isAiControlledPlane (AiAircraft aircraft)
{
if (aircraft == null)
{
return false;
}

Player [] players = GamePlay.gpRemotePlayers ();
foreach (Player p in players)
{
if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
{
return false;
}
}

return true;
}

private void destroyPlane (AiAircraft aircraft) {
if (aircraft != null) {
aircraft.Destroy ();
}
}

private void explodeFuelTank (AiAircraft aircraft)
{
if (aircraft != null)
{
aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded);
}
}

private void destroyAiControlledPlane (AiAircraft aircraft) {
if (isAiControlledPlane (aircraft)) {
destroyPlane (aircraft);
}
}

private void damageAiControlledPlane (AiActor actor) {
if (actor == null || !(actor is AiAircraft)) {
return;
}

AiAircraft aircraft = (actor as AiAircraft);

if (!isAiControlledPlane (aircraft)) {
return;
}

if (aircraft == null) {
return;
}

aircraft.hitNamed (part.NamedDamageTypes.ControlsElevatorDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsAileronsDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsRudderDisabled);
aircraft.hitNamed (part.NamedDamageTypes.FuelPumpFailure);

int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
for (int i = 0; i < iNumOfEngines; i++)
{
aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
}

/***Timeout (240, () =>
{explodeFuelTank (aircraft);}
);
* ***/

Timeout (300, () =>
{destroyPlane (aircraft);}
);
}

//////////////////////////////////////////

public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex)
{
base.OnPlaceLeave (player, actor, placeIndex);
Timeout (1, () =>
{damageAiControlledPlane (actor);}
);
}

public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded (missionNumber, shortName, aircraft);
Timeout (300, () =>
{ destroyPlane(aircraft); }
);
}
public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftLanded(missionNumber, shortName, aircraft);
Timeout(300, () =>
{ destroyPlane(aircraft); }
);
}


//////////////////////////////////////////////////////////////////////////////////////////////////

//Listen to events of every mission
public override void Init(maddox.game.ABattle battle, int missionNumber)
{
base.Init(battle, missionNumber);
MissionNumberListener = -1; //Listen to events of every mission
}

//////////////////////////////////////////////////////////////////////////////////////////////////

//Ground objects (except AA Guns) will die after 55 min when counted from their birth

public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
//Ground objects (except AA Guns) will die after 55 min when counted from their birth
if (actor is AiGroundActor)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

/****
//Ground objects will die after 55 min when counted from their birth

public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);

//Ground objects will die after 55 min when counted from their birth
if (actor is AiGroundActor)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}
****/
}

zaltys
15.05.2011, 20:00
Противотанковые пушки удалятся? (их лучше удалять, хотя не так принципиально пока их мало у нас совсем).

Возможно, да. Я думаю, PT оружие будет maddox.game.world.AiGroundActorType.Artillery. Это список актеров наземных объектов:


Unknown,
Medic,
Motorcycle,
ArmoredCar,
Tractor,
Car,
Amphibian,
SPG,
Tank,
Bus,
LightTruck,
Truck,
Trailer,
Balloon,
Generator,
Predictor,
Radar,
RadioBeacon,
RadioBeamProjector,
Listener,
AmmoComposition,
ContainerShort,
ContainerLong,
Artillery,
AAGun,
Plane,
EngineWagon,
FreightWagon,
PassengerWagon,
ShipMisc,
ShipTransport,
ShipSmallWarship,
ShipDestroyer,
ShipCruiser,
ShipBattleship,
ShipCarrier,
ShipSubmarine,
Bridge,
House

Если вы хотите сохранить артиллерийских орудий и зенитных орудий, вам необходимо изменить так:


if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun &&
(actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.Artillery)

-atas-
15.05.2011, 21:09
Спасибо! Поднял тестовую Repka #3 с этим скриптом.

-atas-
16.05.2011, 10:51
Подскажите, пожалуйста, танкеры вот таким образом по сплайнновой дороге, которая просто "дорога" (это невидимый путь?) будут бегать?
[NPC]
18_Chief Ship.Tanker_Medium1 gb /posx 264072.63/posy 205404.94 /script car.cpp/target 0_SplineRoad /sleep 0/skill 2/slowfire 10/tow00_00 1_Static
19_Chief Ship.Tanker_Medium1 de /posx 258181.84/posy 208404.95 /script car.cpp/target 1_SplineRoad /sleep 0/skill 2/slowfire 10/tow00_00 2_Static

Что означают параметры /sleep 0/skill 2/slowfire 10 ?
Какие для них предельные значения?

-atas-
16.05.2011, 23:18
Прошу проверить часть скрипта, рандомно загружающую одну из 3х подмиссий, на предмет ошибки. не работает, миссии не грузит.
Заранее благодарствую.



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

public class Mission : AMission
{


// loading sub-missions
public override void OnTickGame()
{

if (Time.tickCounter() % 54000 == 12600) // 54000=30 min repeat. 12600=7 min delay.
{
// randomly selects 1 of several submissions
Random RandomIncident = new Random();

switch (RandomIncident.Next(1, 3))
{
case 1:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
// GamePlay.gpHUDLogCenter("mis1 loaded!");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!");
});
break;
case 2:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis");
// GamePlay.gpHUDLogCenter("mis2 loaded");

double initTime = 0.0;
Timeout(initTime += 500, () =>
{
GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
});

Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!");
});
break;
case 3:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
// GamePlay.gpHUDLogCenter("mis3 loaded!");

double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to E2/D3!");
});
break;
}
}

///////////////////////

//loads small submissions w/o messages

if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
}

if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
}
}
}

upd. fixed http://www.sukhoi.ru/forum/showthread.php?t=68774&p=1621945&viewfull=1#post1621945



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

Подскажите, как можно настраивать GamePlay.gpHUDLogCenter , чтобы писать мельче, другим цветом (ярко-синим, например) и внизу экрана. Как можно возврат каретки / перенос вставить, менять длительность показа?

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

Small_Bee
18.05.2011, 22:11
Несколько вопросов возникло

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

2. Можно ли отключить в чате сообщения о появлении самолетов в таком-то квадрате, а также сообщения кто куда упал и кто ему в этом помог?

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

4. Было бы классно добавить в онлайне что-то вроде таблицы с игроками (по кнопке S который), но содержимое такого окна мог бы регулировать сервер или миссия.

naryv
19.05.2011, 01:17
Подскажите, как можно настраивать GamePlay.gpHUDLogCenter , чтобы писать мельче, другим цветом (ярко-синим, например) и внизу экрана. Как можно возврат каретки / перенос вставить, менять длительность показа?
GamePlay.gpHUDLogCenter("",123); 123 - длительность показывания, ещё можно показывать определённым игрокам сообщение , по остальным вопросам - пока никак, возможно позже добавится более широкое управление.

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


Несколько вопросов возникло

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


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

3. И присоединяюсь к вопросу - было бы неплохо для HUD сообщения регулировать его позицию и цвет, а также сделать его многострочным (у меня не получилось). И аналогично, регулировать цвет сообщения в чате (по примеру сообщений о повреждениях).насчёт худ-а согласен, надо что-то придумывать, а цвет сообщений в чате вроде и так настраивается, при настройке инфоокна.


4. Было бы классно добавить в онлайне что-то вроде таблицы с игроками (по кнопке S который), но содержимое такого окна мог бы регулировать сервер или миссия.ага, это планируется вроде.

Small_Bee
19.05.2011, 12:39
...в настройке инфоокна, емнип это сообщения сервера - убрать и не будут показываться. Или как сделать чтобы сам сервер не писал их?


Да, именно сервер. Сейчас он работает как хороший разведчик - скажем я хочу поднять "108-й со старшими офицерами", а сервер красным услужливо подсказывает, что такое дело там-то и там-то появилось.



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

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

naryv
19.05.2011, 13:07
Да, именно сервер. Сейчас он работает как хороший разведчик - скажем я хочу поднять "108-й со старшими офицерами", а сервер красным услужливо подсказывает, что такое дело там-то и там-то появилось. угу, понятно, надо наверное фильтр сделать с настройками из сервера.

Аналогично, что бы из миссии можно было задать цвет - скажем сообщение не настолько важное, что бы писать его перед носом большими красными буквами, но тем не менее достаточно полезное для того, что бы его выделить. К тому же чат можно промотать, что бы посмотреть, что приходило ранее, в отличие от HUD сообщений. ясно, в принципе к чату надо доступ наверное сделать серверу, это решит часть вопросов.
По поводу локали игрока - нельзя, но если SayToGroup() использовать с уже существующими сообщениями - они на языке игрока будут.

-atas-
19.05.2011, 18:01
В режиме с включенными маркерами(иконками) самолетов можно ли как-то убрать с сервера (или скриптом) стрелки по краям экрана или сделать их абсолютно прозрачными для клиентов?

Можно ли настроить дальность, отображаемую сторону (свои/чужие) и цвет иконок самолетов?

cFobos
20.05.2011, 00:16
Подскажите плз, как вращать обьекты в редакторе?

Small_Bee
20.05.2011, 00:44
Подскажите плз, как вращать обьекты в редакторе?

цифровые клавиши на нампаде.

naryv
20.05.2011, 01:42
В режиме с включенными маркерами(иконками) самолетов можно ли как-то убрать с сервера (или скриптом) стрелки по краям экрана или сделать их абсолютно прозрачными для клиентов? как в Ил-е будет - если кабина включена - стрелочек нет, если выключена - есть/

Можно ли настроить дальность, отображаемую сторону (свои/чужие) и цвет иконок самолетов? тут опять как в Иле- всё было через mp_dotrange настраивается.

cFobos
20.05.2011, 02:09
А можно ли сделать иконки для наземных целей? :-)

naryv
20.05.2011, 02:23
А можно ли сделать иконки для наземных целей? :-)так они есть на карте.+ в файле миссии, емнип, можно переопределить - показывать другую иконку.

cFobos
20.05.2011, 03:19
так они есть на карте.+ в файле миссии, емнип, можно переопределить - показывать другую иконку.

Я имею ввиду помечать наземку на экране, как самолёты (когда стоит соотв. галка в реализме).

zaltys
20.05.2011, 09:14
OnAircraftLanded (), OnAircraftCrashLanded (), OnAircraftLanded (), IsAirborne () не работают для самолета игрока в мультиплеере. Должно так быть?

Коррекция. OnAircraftLanded () и OnAircraftTookOff () не работают для самолетов, которые были порождены в AIBirthPlace. Можем ли мы ожидать изменений в этом?

naryv
20.05.2011, 13:25
Я имею ввиду помечать наземку на экране, как самолёты (когда стоит соотв. галка в реализме). посмотрел сейчас только у пушек иконки показываются, с техникой позже будут иконки.


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

zaltys
20.05.2011, 13:58
будем смотреть, не приходят эти ивенты почему-то...

AiAircraft.IsAirborne () не работает тоже. Очень важная функция.

-atas-
22.05.2011, 14:13
Относятся ли корабли к AiGroundActor?

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


//Ground objects (except AA Guns) will die after 55 min when counted from their birth

public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
//Ground objects (except AA Guns) will die after 55 min when counted from their birth
if (actor is AiGroundActor)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

Картина на сервере через 3-4 часа работы
https://lh4.googleusercontent.com/_SFUSvzV-UZg/TdjfUKArvZI/AAAAAAAABA8/VtHaur3Ztvk/2011-05-21_00016.jpg

Полный код скрипта
http://forum.1cpublishing.eu/showpost.php?p=283765&postcount=41

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

zaltys
22.05.2011, 16:07
naryv,

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

Vetochka
22.05.2011, 23:15
Как в текущем патче (1.01.14588) заставить ботов-истребителей гарантированно вступить в бой с другими истребителями? У меня они теперь игнорируют даже команду "Вступит в бой с истребителями" с указанием приоритетной группы для атаки. По рации кричат, что атакуем, но пролетают спокойно мимо и далее летят по своим контрольным точкам.

cFobos
23.05.2011, 00:37
посмотрел сейчас только у пушек иконки показываются, с техникой позже будут иконки.

будем смотреть, не приходят эти ивенты почему-то...

Позже - это значит в следующем патче?
А можно сдетать так, чтобы по ним и Логи шли?
Сейчас логи идут по принципу намемка=самолёт. Т.е если скажем ПВО убило самолёт - это документируется в логах сервера. Но вот обратный процесс, штурмовка и бобрёшка никак не видны. Кроме того нет логов "наземка=наземка", т.е никаких данных по скажем уничтожению танками топливохранилищь на уровне логов сервера нет. Это очень мешает работе. Если это возможно, пожалуйста поправьте.

-atas-
23.05.2011, 08:49
Вот таким образом корабли уничтожит, или уж если игра их к AiGroundActor не причисляет, то и (actor as AiGroundActor).Type() и maddox.game.world.AiGroundActorType.ShipTransport не заработает для кораблей?


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);
//Ground objects (except AA Guns) will die after 55 min when counted from their birth
if (actor is AiGroundActor ||
(actor as AiGroundActor).Type() = maddox.game.world.AiGroundActorType.ShipMisc ||
(actor as AiGroundActor).Type() = maddox.game.world.AiGroundActorType.ShipTransport)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout (3300, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

Geniok
23.05.2011, 13:45
Вопрос такой, есть ли возможность из кода скрипта изменять количество сбитых самолетов, обозначенных на киле? Сейчас это доступно в настройках самого самолета, хотелось бы делать это динамически.
И еще такой вопрос, как у нас обстоят дела с динамическим износом самолета (и его скина соответственно тоже)? Он есть, его нет, или его надо прописывать в скрипте, есть доступные функции для этого?

Trident
24.05.2011, 00:57
Как в текущем патче (1.01.14588) заставить ботов-истребителей гарантированно вступить в бой с другими истребителями? У меня они теперь игнорируют даже команду "Вступит в бой с истребителями" с указанием приоритетной группы для атаки. По рации кричат, что атакуем, но пролетают спокойно мимо и далее летят по своим контрольным точкам.

попробуй выбрать "охота"

naryv
24.05.2011, 19:02
Относятся ли корабли к AiGroundActor?
да, корабль - это AiGroundActor и AiGroundGroup ,с типом Ship , всех кораблей страны найти можно так :

foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
{
if (gg.Type == AiGroundGroupType.Ship)
{// тут делаем с ними что нам нужно, например
if (gg != null)
(gg as AiGroundActor).Destroy(); // уничтожаем
}
}



naryv,

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


Как в текущем патче (1.01.14588) заставить ботов-истребителей гарантированно вступить в бой с другими истребителями? У меня они теперь игнорируют даже команду "Вступит в бой с истребителями" с указанием приоритетной группы для атаки. По рации кричат, что атакуем, но пролетают спокойно мимо и далее летят по своим контрольным точкам. попробуйте, как ув. Trident написал поставить им "охоту", с "вступить в бой" будем разбираться.


Позже - это значит в следующем патче? скорее всего - да.

А можно сдетать так, чтобы по ним и Логи шли?
Сейчас логи идут по принципу намемка=самолёт. Т.е если скажем ПВО убило самолёт - это документируется в логах сервера. Но вот обратный процесс, штурмовка и бобрёшка никак не видны. Кроме того нет логов "наземка=наземка", т.е никаких данных по скажем уничтожению танками топливохранилищь на уровне логов сервера нет. Это очень мешает работе. Если это возможно, пожалуйста поправьте. это сейчас уже можно, например в скрипте миссии:


public override void OnActorDead(int missionNumber, string shortName, AiActor actor, System.Collections.Generic.List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);

GamePlay.gpLogServer(null, "{0} actor dead, 1st killer is {1} ", new object[] { actor.Name(),damages[0].initiator.Actor.Name()});
}

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


Вопрос такой, есть ли возможность из кода скрипта изменять количество сбитых самолетов, обозначенных на киле? Сейчас это доступно в настройках самого самолета, хотелось бы делать это динамически.
И еще такой вопрос, как у нас обстоят дела с динамическим износом самолета (и его скина соответственно тоже)? Он есть, его нет, или его надо прописывать в скрипте, есть доступные функции для этого? тут как выяснилось - ситуация такая - в движке параметры физ. износа есть и учитываются, но при загрузке миссии сейчас не подгружаются. Сделаем следующее - расширим интерфейс самолёта так, что в скрипте миссии можно будет прочитать повреждения на этот износ влияющие, а потом для следующей миссии эти параметры (ну или с какой-то обработкой - например техники что-то починили) можно будет подгрузить, так-же как и количество сбитых. Так подойдёт? Визуальный износ и сейчас из миссии подгружается, если я ничего не путаю. - строчка Aging0 74 - 74% износ 0-го самолёта, в описании группы:

[BoB_RAF_F_FatCat_Early.03]
Flight0 1 2 3 4 5 6
Flight1 11 12 13 14 15 16
Class Aircraft.SpitfireMkIIa
Formation VIC3
CallSign 26
Fuel 100
Weapons 1
Skill 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3
Aging0 74
Skin0 Standard_41A.jpg
Serial0 145 с остальными самолётами так-же, только индекс меняется.

-atas-
24.05.2011, 22:49
Вопросы по поводу CTF_cross_roundel миссии.

При открытии подмиссий в полном редакторе не появляются ни танки, ни самолеты, ни точки маршрута (открывается чистая карта), хотя в тексте миссии они есть, если открыть ее блокнотом. Почему это происходит?

Я правильно понимаю, что чтобы скрипт работал на другой карте, достаточно в нем поменять координаты MissionMarker?

Обязательно ли MissionMarker должны стоять на аэродромах или можно их ставить в любую точку, перенеся на эту точку радиус триггеров changearmy? Не будет ли скрипт создавать в этих местах BirthPlace_? Хотелось бы повоевать за населенные пункты тоже, не только за аэродромы. BirthPlace в этом случае, оказываясь за линией фронта будут менять сторону или необходимо, чтобы их координаты совпадали с MissionMarker?

Можно ли увеличить количество MissionMarker до 8-12 без внесения изменений в скрипт, а только внеся их координаты вначале скрипта? В идеале, конечно желательно, чтобы скрипт сам считывал первоначальные координаты маркеров из главного файла миссии, чтобы создателю миссии даже не приходилось открывать скрипт, а просто создать подмиссии, назвав их по соответствующей схеме.

Как следствие возникнет вопрос не только изменения цвета MissionMarker, но и их движения. Можно ли, например 1 раз в 5 минут рассчитывать новые положения MissionMarker по координатам танковых групп и скоплений арты\ААА? Скажем, танковая группа является маркером пока она не уничтожена более, чем на 50%? Тогда линия фронта будет двигаться автоматически за танками, а филды перекрашиваться, как только они попадут за линию фронта. Создателю миссий останется только нарисовать подмиссии с техникой и назвать триггеры по определенной схеме, не вникая в основной скрипт.

Пока необходимость знания C# является препятствием для создания миссий. Например, создатель миссий известного сервера Синдикат не имеет представления о программировании, как и большинство других в этом разделе http://forum.1cpublishing.eu/forumdisplay.php?f=203 . Учитывая это, желательно предложить коммюнити набор готовых скриптов, которые сами будут считывать данные из файлов миссий, созданных в редакторе и обеспечивать определенный функционал (движение ЛФ, перекрас филдов, генерация вейпойнтов...), чтобы создатель миссий мог просто забросить несколько таких скриптов в папку с миссией в зависимости от потребностей и заполнить небольшой mission.ini с их списком и необходимыми вводными данными, не открывая сами скрипты в Студии. Т.е. желательно разделить труд программистов и создателей миссий с помощью удобных инструментов.

cFobos
24.05.2011, 22:52
да, корабль - это AiGroundActor и AiGroundGroup ,с типом Ship , всех

скорее всего - да.
это сейчас уже можно, например в скрипте миссии:


Искреннее спасибо вам!

naryv
25.05.2011, 01:14
Вопросы по поводу CTF_cross_roundel миссии.

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

[PARTS]
core.100
bob.100
[MAIN]
MAP Land$Online_Cross_v_Roundel
BattleArea 6000 6000 26000 26000 1000
TIME 16
WeatherIndex 0
CloudsHeight 1000
BreezeActivity 10
ThermalActivity 10


Я правильно понимаю, что чтобы скрипт работал на другой карте, достаточно в нем поменять координаты MissionMarker? да, верно


Обязательно ли MissionMarker должны стоять на аэродромах или можно их ставить в любую точку, перенеся на эту точку радиус триггеров changearmy? нет, конечно не обязательно, аэродромы я для наглядности сделал. В принципе - триггер и маркер могут не совпадать, но мне кажется так удобнее.

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

Хотелось бы повоевать за населенные пункты тоже, не только за аэродромы. BirthPlace в этом случае, оказываясь за линией фронта будут менять сторону или необходимо, чтобы их координаты совпадали с MissionMarker? в общем случае нет, не необходимо, в этом скрипте т.к. маркеры совпадают с БП - я брал армию из маркеров, чтобы сделать как Вы хотите - надо загрузку разделить - сначала по триггеру загружаем новые маркеры фронта, а после их загрузки - уничтожаем все bP и загружаем их в новой миссии - координаты берём из массива с bP, а армию - через такую ф-цию :
GamePlay.gpFrontArmy(bP.Pos().x, bP.Pos().y) - после загрузки маркеров линия фронта пересчитается - и эта ф-ция выдаст на чьей территории стоят наши bP. Дальше генерируем миссию с bP и загружаем её.


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

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


Как следствие возникнет вопрос не только изменения цвета MissionMarker, но и их движения. Можно ли, например 1 раз в 5 минут рассчитывать новые положения MissionMarker по координатам танковых групп и скоплений арты\ААА? Скажем, танковая группа является маркером пока она не уничтожена более, чем на 50%? Тогда линия фронта будет двигаться автоматически за танками, а филды перекрашиваться, как только они попадут за линию фронта. Создателю миссий останется только нарисовать подмиссии с техникой и назвать триггеры по определенной схеме, не вникая в основной скрипт.с группами можно, конечно - для этого не нужен будет массив с маркерами - просто пробегаем по всем AiGroundGroup с их страной и генерируем миссию с фронтмаркерами с координатами в этих группах - для такого подхода и триггеры не нужны, разве только, чтобы новые атакующие силы спаунить при уничтожении предыдущих. Со скоплениями артиллерии хуже - она в группы не входит, там надо позамороченнее как-то определять куда маркер ставить.


Пока необходимость знания C# является препятствием для создания миссий. Например, создатель миссий известного сервера Синдикат не имеет представления о программировании, как и большинство других в этом разделе http://forum.1cpublishing.eu/forumdisplay.php?f=203 . Учитывая это, желательно предложить коммюнити набор готовых скриптов, которые сами будут считывать данные из файлов миссий, созданных в редакторе и обеспечивать определенный функционал (движение ЛФ, перекрас филдов, генерация вейпойнтов...), чтобы создатель миссий мог просто забросить несколько таких скриптов в папку с миссией в зависимости от потребностей и заполнить небольшой mission.ini с их списком и необходимыми вводными данными, не открывая сами скрипты в Студии. Т.е. желательно разделить труд программистов и создателей миссий с помощью удобных инструментов. ну, тут, наверное, можно посоветовать только собирать удачные куски скриптов где-то, чтобы создатель миссий подбирал скрипты подходящие для его задач и вставлял его в свои миссии, как Вы понимаете, этот движок настолько мощный, что можно создать скрипт практически на все случаи жизни и сделать это сотней способов - мы сами просто не сможем сделать большим такой набор - большая надежда на заинтересованное сообщество. Насчёт вышеописанного, постараюсь по этим моментам скрипт накидать, но не обещаю быстро.

Да, кстати, сегодня заглянул на жёлтый форум, есть негугловый перевод описания к миссии с захватом аэродромов:

There are four airfields on the map. They are your primary capture locations.
An aircraft is considered captured once the opposing sides armor enters its perimeter. The airfield perimeter is defended with artillery and flak. Once attacking armor is destroyed, a new group of armor will be spawned to continue the assault. Destroyed artillery and flak are not restored.
Once an airfield is captured, the front line will move and the airfield will change sides allowing the new owner to spawn there. Defending artillery will also spawn for the new owner, while the old owner will spawn an attacking armor group. Finally, capturing an airfield will spawn an AI-controlled aircraft group for the enemy, attacking both air and ground targets.
Capturing the most airfields is the overall objective for this mode.
The score system is simple. Capturing an airfield awards 10 points to the victorious side. Defending an airfield, that is, destroying an enemy armor group, awards 1 point. может иностранцам попонятнее будет.

и ещё в скрипте некритичную ошибку нашёл, ф-ция FindOurAirfield(int army, AiActor actor) должна так выглядеть:

internal AiAirport FindOurAirfield(int army, AiActor actor)
{
AiAirport result = null;
Point3d attackerPos = actor.Pos();
AiAirport[] airports = GamePlay.gpAirports();

if (airports != null)
{
foreach (AiAirport airport in airports)
{
if (GamePlay.gpFrontArmy(airport.Pos().x, airport.Pos().y) == army)
{
if (result != null)
{
if (result.Pos().distance(ref attackerPos) > airport.Pos().distance(ref attackerPos))
result = airport;
}
else result = airport;
}
}
}
return result;
}



Искреннее спасибо вам! да не за что :)

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

Да, можно и так! Очень бы помогло.
По визуалке все понял, спасибо!
Как я понял на лету можно менять не только ее, но и все остальное что прописано в примере тоже?

naryv
25.05.2011, 02:11
По визуалке все понял, спасибо!
Как я понял на лету можно менять не только ее, но и все остальное что прописано в примере тоже?тут смотря что имеется ввиду под "на лету" - это просто кусок из миссии в котором описана группа самолётов. Если Вы этот кусок генерируете сами и потом подгружаете сгенерённую миссию - тогда да, конечно миссия подгрузится со всеми теми изменениями, которые Вы внесли. Если имелась ввиду возможность менять эти параметры у уже загруженных и летящих самолётов - тогда нет, менять номера, кол-во топлива, оружие и т.д. у уже летящих самолётов нельзя.

Vetochka
25.05.2011, 07:34
попробуйте, как ув. Trident написал поставить им "охоту", с "вступить в бой" будем разбираться.

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

naryv
25.05.2011, 10:59
В общем интересная фишка получилась с ботами. Никакие типы задания для истребителей не заставляли их начать атаковать, даже добавление бомбера с заданием его эскортировать.
Решение было найдено методом тыка. В миссии присутствовал садящийся при старте хуряшка, садился он на другом конце карты. Стоило его убрать - боты сразу стали себя вести адекватно. :D Действительно, странно:). Хорошо, что начали вести себя адекватно, но с неадекватами всё равно разбираться будем :)

-atas-
25.05.2011, 12:16
А как можно суб-скрипт загружать из скрипта, на загружая .mis файл суб-миссии? Хочется разбивать большие скрипты на тематические кусочки, чтобы править только те, которые нужно.

naryv
25.05.2011, 13:27
А как можно суб-скрипт загружать из скрипта, на загружая .mis файл суб-миссии? Хочется разбивать большие скрипты на тематические кусочки, чтобы править только те, которые нужно. не знаю, скорее всего никак, ну или создавать пустые подмиссии в которых будут только нужные куски скрипта, но как это будет работать - не знаю

Geniok
25.05.2011, 13:33
тут смотря что имеется ввиду под "на лету" - это просто кусок из миссии в котором описана группа самолётов. Если Вы этот кусок генерируете сами и потом подгружаете сгенерённую миссию - тогда да, конечно миссия подгрузится со всеми теми изменениями, которые Вы внесли. Если имелась ввиду возможность менять эти параметры у уже загруженных и летящих самолётов - тогда нет, менять номера, кол-во топлива, оружие и т.д. у уже летящих самолётов нельзя.

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

Еще один вопрос возник, возможно ли скрытие кода скрипта от пользователя? В связи с опасностью его изменения и использования в плохих целях.

-atas-
25.05.2011, 13:47
По отзывам бомберов скрипт, который используется на Repka, а также был растиражирован на Синдикат и другие серверы повреждает многоместные самолеты не только при покидании игроком, как было задумано, но и при переходе игрока на место штурмана или стрелка. Как бы это можно было поправить для совместимости с многоместными машинами?

(Еще говорят у 110х нет ботов-стрелков в онлайне, но это видимо к скрипту не относится).

Выделено синим.

// v.1_17_05. script by FG28_Kodiak, ZaltysZ, Oreva, Small_Bee

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

public class Mission : AMission
{

int LastMissionLoaded = 0;

double initTime;

// loading sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 45000 == 9000) // 45000=25 min repeat. 9000=5 min delay.
{
// randomly selects 1 of several submissions excluding the recent one

Random RandomIncident = new Random();
int CurrentMissionSelected;

do
{
CurrentMissionSelected = RandomIncident.Next(1, 4);
}
while (LastMissionLoaded == CurrentMissionSelected);

LastMissionLoaded = CurrentMissionSelected;

switch (CurrentMissionSelected)

{
case 1:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
//GamePlay.gpHUDLogCenter("Intel: Enemy activity is expected at E3!");
//600
initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
//600+600
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!");
});
break;
case 2:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis");
//GamePlay.gpHUDLogCenter("Intel: Cover your shipping at C4!");
//500
initTime = 0.0;
Timeout(initTime += 450, () =>
{
GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
});
//500+300
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!");
});
break;
case 3:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
//GamePlay.gpHUDLogCenter("Intel: Enemy activity is expected at E2!");
//600
initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
});
//600+300
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! All fighters please proceed to E2/D3!");
});
break;
}
}

///////////////////////

//loads small submissions w/o messages

if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
}

if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////

// destroys aircraft abandoned by a player.
private bool isAiControlledPlane (AiAircraft aircraft)
{
if (aircraft == null)
{
return false;
}

Player [] players = GamePlay.gpRemotePlayers ();
foreach (Player p in players)
{
if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
{
return false;
}
}

return true;
}

private void destroyPlane (AiAircraft aircraft) {
if (aircraft != null) {
aircraft.Destroy ();
}
}

private void explodeFuelTank (AiAircraft aircraft)
{
if (aircraft != null)
{
aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded);
}
}

private void destroyAiControlledPlane (AiAircraft aircraft) {
if (isAiControlledPlane (aircraft)) {
destroyPlane (aircraft);
}
}

private void damageAiControlledPlane (AiActor actor) {
if (actor == null || !(actor is AiAircraft)) {
return;
}

AiAircraft aircraft = (actor as AiAircraft);

if (!isAiControlledPlane (aircraft)) {
return;
}

if (aircraft == null) {
return;
}

aircraft.hitNamed (part.NamedDamageTypes.ControlsElevatorDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsAileronsDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsRudderDisabled);
aircraft.hitNamed (part.NamedDamageTypes.FuelPumpFailure);

int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
for (int i = 0; i < iNumOfEngines; i++)
{
aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
}

/***Timeout (240, () =>
{explodeFuelTank (aircraft);}
);
* ***/

Timeout (300, () =>
{destroyPlane (aircraft);}
);
}

//////////////////////////////////////////

public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex)
{
base.OnPlaceLeave (player, actor, placeIndex);
Timeout (1, () =>
{damageAiControlledPlane (actor);}
);
}

public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded (missionNumber, shortName, aircraft);
Timeout (300, () =>
{ destroyPlane(aircraft); }
);
}
public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftLanded(missionNumber, shortName, aircraft);
Timeout(300, () =>
{ destroyPlane(aircraft); }
);
}


//////////////////////////////////////////////////////////////////////////////////////////////////

//Listen to events of every mission
public override void Init(maddox.game.ABattle battle, int missionNumber)
{
base.Init(battle, missionNumber);
MissionNumberListener = -1; //Listen to events of every mission
}

//////////////////////////////////////////////////////////////////////////////////////////////////

//Ground objects (except AA Guns) will die after 55 min when counted from their birth

public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
//Ground objects (except AA Guns) will die after 55 min when counted from their birth
if (actor is AiGroundActor)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

/****
//Ground objects will die after 55 min when counted from their birth

public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);

//Ground objects will die after 55 min when counted from their birth
if (actor is AiGroundActor)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}
****/
}

naryv
25.05.2011, 17:39
это и надо. подгрузка не во время миссии, а перед ее началом.
Спасибо за консультацию. да не за что:)


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


По отзывам бомберов скрипт, который используется на Repka, а также был растиражирован на Синдикат и другие серверы повреждает многоместные самолеты не только при покидании игроком, как было задумано, но и при переходе игрока на место штурмана или стрелка. Как бы это можно было поправить для совместимости с многоместными машинами? так вот же - http://www.sukhoi.ru/forum/showthread.php?t=68369&p=1608824&viewfull=1#post1608824 скрипт с проверкой в многоместных самолётах. Оттуда проверку можно взять.

Geniok
26.05.2011, 00:42
мне кажется наоборот - с открытым кодом есть возможность проверки - что делает скрипт, с закрытым больше возможностей сделать что-то нехорошее.


С открытым кодом ЛЮБОЙ может туда дописать все что угодно, а потом выдать за оригинальную кампанию(то есть заняться распространением уже своего скрипта под видом оригинального). То есть теоретически любой может получить доступ к чужому ПК.

И еще такой вопрос, МГ имеет возможность помогать тем кто делает Офф-лайн кампании? Помощь нужна такого плана, чтобы сама кампания хранилась на сервере Стима. А то сейчас во-первых при обновлении кэша все нестандартные кампании удаляются. Во-вторых пользователям приходится руками править ini-файлы. Что как бы не есть Юзер-френдли.

И спасибо за консультации.

С Уважением!

naryv
26.05.2011, 14:14
С открытым кодом ЛЮБОЙ может туда дописать все что угодно, а потом выдать за оригинальную кампанию(то есть заняться распространением уже своего скрипта под видом оригинального). То есть теоретически любой может получить доступ к чужому ПК. Такой открытый код можно проверить, а с закрытым - нельзя, т.е. опять же любой возьмёт Вашу кампанию, напишет вместо Вашего скрипта свой - и увидеть это нельзя будет никак.


И еще такой вопрос, МГ имеет возможность помогать тем кто делает Офф-лайн кампании? Помощь нужна такого плана, чтобы сама кампания хранилась на сервере Стима. А то сейчас во-первых при обновлении кэша все нестандартные кампании удаляются. Во-вторых пользователям приходится руками править ini-файлы. Что как бы не есть Юзер-френдли. На стиме, к сожалению, хранить кампании не получится, почему - попробуйте у Лютьера уточнить. А можно детали про удаление нестандартных кампаний? По идее кампания хранящаяся в своей папке не должна удаляться, если удаляется может быть баг какой-то, постараемся исправить.


И спасибо за консультации. всегда пожалуйста :)

2 -atas- вот скрипт для движения ЛФ со списком маркеров для любой карты - при инициализации из основной миссии берутся начальные маркеры, к ним делаются триггеры смены фронта и дальше маркеры переключаются. Я комментарии написал, думаю понятно должно быть как и что там делается.



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


public class Mission : AMission
{
internal class MissionMarker
{
internal double x;
internal double y;
internal int army;
internal MissionMarker(double x, double y, int army) { this.x = x; this.y = y; this.army = army; }
}

private List <MissionMarker> MissionMarkers = new List<MissionMarker> ();

string BPMaxPlanesAllowed = "3"; // количество макс. возможно создаваемых самолётов на спаунточке
string BPSpawnParked = "1"; // рожать ли самолёты на спауне запаркованными 1 - да, 0 - нет
int MissionsCount = 1; // счётчик миссий - для вычисления полных имён стат. объектов, например артиллерии
int NextMissionNum = 2; // флажок номера следующей миссии - для рефреша спаун точек, после смены линии фронта
int ScoreRed = 0; // "счёт"
int ScoreBlue = 0;


private string[] RedPlanesSet = new string[] // описание наборов самолётов на спаунточках разных стран
{ "Aircraft.SpitfireMkIIa",
"Aircraft.SpitfireMkI",
"Aircraft.BlenheimMkIV",
"Aircraft.SpitfireMkIa",
"Aircraft.DH82A",
"Aircraft.HurricaneMkI_dH5-20",
"Aircraft.HurricaneMkI"
};

private string[] BluePlanesSet = new string[]
{ "Aircraft.Bf-110C-7",
"Aircraft.Bf-110C-4",
"Aircraft.Bf-109E-3B",
"Aircraft.Ju-88A-1",
"Aircraft.G50",
"Aircraft.He-111P-2",
"Aircraft.He-111H-2",
"Aircraft.Bf-109E-3",
"Aircraft.BR-20M",
"Aircraft.Ju-87B-2"
};

public ISectionFile triggersFile ; // объявление файла для генерации миссии с триггерами смены линии фронта


public override void Init(ABattle battle, int missionNumber)
{
base.Init(battle, missionNumber);
ISectionFile missFile = GamePlay.gpLoadSectionFile("missions\\Multi\\Dogfight\\xxxxx.mis"); // загружаем в missFile основную миссию, для того, чтобы найти в ней маркеры фронта
triggersFile = GamePlay.gpCreateSectionFile(); //заодно создаём файл для генерации миссии с триггерами
string section, key, value;
string sectionTr, keyTr, valueTr;
section = "FrontMarker";
sectionTr = "Trigger";
int n = missFile.lines(section); // определяем, сколько маркеров фронта в миссии
for (int i = 0 ; i < n; i++)
{ // в этом цикле пробегаем по всем маркерам
key = "FrontMarker"+i.ToString();
if (missFile.exist(section,key)) // проверяем, что маркер есть
{
value = missFile.get(section, key);
string[] strs = value.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries); // и парсим строку с маркером, берём его координаты и страну
if (strs.Length == 3)
{
double x; double.TryParse( strs[0], out x);
double y; double.TryParse( strs[1], out y);
int army; int.TryParse( strs[2], out army);
MissionMarker mMarker = new MissionMarker(x,y,army);
MissionMarkers.Add(mMarker); // добавляем в список маркеров MissionMarkers проверенный маркер

keyTr = "changeArmy" + i.ToString()+"_1"; // попутно на маркере делаем два триггера - для каждой стороны
valueTr = " TPassThrough 3 1 " + strs[0] + " " + strs[1] + " 500"; // "TPassThrough 3" - триггер сработает при заезде в него наземки, "1" красной, strs[0] + " " + strs[1] координаты, "500"- радиус триггера
triggersFile.add(sectionTr, keyTr, valueTr); // сохраняем триггер в файле триггерной миссии
keyTr = "changeArmy" + i.ToString() + "_2"; // то же самое для синей стороны
valueTr = " TPassThrough 3 2 " + strs[0] + " " + strs[1] + " 500";
triggersFile.add(sectionTr, keyTr, valueTr); // сохраняем триггер в файле триггерной миссии
}
}
}

}

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


private void RefreshBirthPlaces()
{
foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces()) // сначала - очистим существующие спауны
{
if (bp != null)
bp.destroy();
}


ISectionFile f = GamePlay.gpCreateSectionFile(); // создаём файл миссии в котором переопределим спауны в соответствии с линиями фронта
string sect;
string key;
string value;


for (int i = 0; i < GamePlay.gpAirports().Length; i++) // сделаем спауны на всех аэродромах карты
{
Point3d airpPos = GamePlay.gpAirports()[i].Pos(); // координаты аэродрома
int armyAtPos = GamePlay.gpFrontArmy(airpPos.x, airpPos.y); // текущая армия в точке с аэродромом
sect = "BirthPlace";
key = "BirthPlace_" + i.ToString(); // дальше заполняем инфо для спаунов
string Country = ".";
if (armyAtPos == 1) Country = "gb";
if (armyAtPos == 2) Country = "de";
value = " " + armyAtPos.ToString() + " " + ((int)airpPos.x).ToString() + " " + ((int)airpPos.y).ToString() + " 0 " + BPMaxPlanesAllowed + " " + BPSpawnParked + " 0 " + Country + " . .";
f.add(sect, key, value);

sect = "BirthPlace" + i.ToString(); // и для каждого заполняем списком разрешённых самолётов
string[] PlaneSet = new string[0];
if (armyAtPos == 1)
PlaneSet = RedPlanesSet;
if (armyAtPos == 2)
PlaneSet = BluePlanesSet;
if (PlaneSet.Length > 0)
for (int j = 0; j < PlaneSet.Length; j++)
{
key = PlaneSet[j];
value = "";
f.add(sect, key, value);
}
}
GamePlay.gpPostMissionLoad(f); // загружаем новые спауны
}

private void DestroyEnemyAtCaptured(int markerNum, int army)
{ // если надо уничтожить всех врагов на захваченном маркере - уничтожаем в этой процедуре
Point3d AirportPos;
AirportPos.x = MissionMarkers[markerNum].x;
AirportPos.y = MissionMarkers[markerNum].y;
AirportPos.z = 1;



foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
{
if (gg != null)
if (gg.Pos().distance(ref AirportPos) < 2000) // 2000 это расстояние от маркера на котором уничтожим врагов
{
string triggerName = gg.Name().Substring(0,gg.Name().IndexOf(":"))+":"+markerNum.ToString()+"_" + army .ToString()+ "_attack";
AiTrigger trigger = GamePlay.gpGetTrigger(triggerName);
if (trigger != null) trigger.Enable = false;
foreach (AiActor ggActor in gg.GetItems())
{ if ((ggActor as AiGroundActor) != null)
(ggActor as AiGroundActor).Destroy();
}
}
}

for (int i = 0; i < MissionsCount; i++)
{
AiGroundActor curActor;
for (int j = 0; j < 10; j++)
{
string nameActor = i.ToString() + ":Static" + j.ToString();
curActor = GamePlay.gpActorByName(nameActor) as AiGroundActor;
if (curActor != null)
{
if ( (curActor.Army() == army) &&
(curActor.Pos().distance(ref AirportPos) < 2000) &&
((curActor.Type() == AiGroundActorType.AAGun)||(curActor.Type() == AiGroundActorType.Artillery) )
)
{
curActor.Destroy();
}
}

}
}
}

internal ISectionFile CreateNewFrontLineMission(int markerNum, int newArmy) // создаём новый файл миссии с фронтмаркерами
{
DestroyEnemyAtCaptured(markerNum, MissionMarkers[markerNum].army); // если надо - уничтожаем врагов
MissionMarkers[markerNum].army = newArmy; // в списке маркеров задаём новую армию на захваченном маркере

ISectionFile f = GamePlay.gpCreateSectionFile();
string sect;
string key;
string value;

for (int i = 0; i < MissionMarkers.Capacity; i++) // и для всего списка маркеров пробегаем и записываем в файл их координаты и армии
{
sect = "FrontMarker";
key = "FrontMarker" + i.ToString();
value = MissionMarkers[i].x.ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat) + " " + MissionMarkers[i].y.ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat) + " " + MissionMarkers[i].army.ToString();
f.add(sect, key, value);
}
return f;
}


public override void OnMissionLoaded(int missionNumber)
{
base.OnMissionLoaded(missionNumber);
MissionsCount++; // счётчик миссий обновляем
if (missionNumber == NextMissionNum) // проверяем флажок номера следующей миссии - для рефреша спаун точек, после смены линии фронта
RefreshBirthPlaces(); // и обновляем спауны если надо
}


public override void OnTrigger(int missionNumber, string shortName, bool active) // обрабатываем триггеры сработавшие
{
base.OnTrigger(missionNumber, shortName, active);

int n = MissionMarkers.Capacity; //пробегаем по списку маркеров, чтобы выяснить - не сработал ли наш триггер на смену линии фронта
for (int i = 0; i < n; i++)
{
for (int j = 1; j < 3; j++)
{
string str = "changeArmy" + i.ToString() + "_" + (j).ToString();
if (str.Equals(shortName)) // если сработал - тогда обрабатываем его - счёт обновляем, пишем что фрмия сменилась
{
if (MissionMarkers[i].army != j)
{
string armyOwner;
if (j == 1)
{
armyOwner = " Red army";
ScoreRed += 10;
}
else
{
armyOwner = " Blue army";
ScoreBlue += 10;
}

GamePlay.gpHUDLogCenter("Front turn to " + armyOwner + " at sector " + GamePlay.gpSectorName(MissionMarkers[i].x, MissionMarkers[i].y).ToString() + "; Red " + ScoreRed.ToString() + ":" + ScoreBlue.ToString() + " Blue");
NextMissionNum = GamePlay.gpNextMissionNumber(); // ставим флажок номера следующей миссии - чтобы после загрузки новых линий фронта пересчитались спауны
GamePlay.gpPostMissionLoad(CreateNewFrontLineMission(i, j)); // грузим миссию с обновлёнными маркерами ЛФ
// ну и можно как в предыдущей версии загрузить подмиссию на изменённый маркер, у меня это были подмиссии с защищающимися артами вида "x_y_defend.mis", где x - номер маркера, y - защищающаяся страна :
GamePlay.gpPostMissionLoad("missions\\Multi\\Dogfight\\CTF_submissions\\" + i.ToString() + "_" + (j).ToString() + "_defend.mis");
}
break;
}

// ну и заодно проверяем не уничтожили ли атакующих из подмиссий в каждой такой подмисси был триггер вида "x_y_attack" срабатывавший на уничтожение атакующей группы
str = i.ToString() + "_" + (j).ToString() + "_attack";
string addStr = " ground group eliminated at sector " + GamePlay.gpSectorName(MissionMarkers[i].x, MissionMarkers[i].y).ToString();
if (str.Equals(shortName)) // соответственно если сработал такой триггер, обрабатываем его , счёт меняем, пишем что группу уничтожили и запускаем ещё одну атакующую миссию
{
if (j == 2)
{
ScoreRed++;
addStr = "Blue" + addStr;
}
else
{
ScoreBlue++;
addStr = "Red" + addStr;
}
GamePlay.gpHUDLogCenter(addStr + ",and the score is Red " + ScoreRed.ToString() + ":" + ScoreBlue.ToString() + " Blue");
GamePlay.gpPostMissionLoad("missions\\Multi\\Dogfight\\CTF_submissions\\" + str + ".mis");
break;
}
// если логика битвы другая , тогда этот блок с проверкой убираем
}
}

}

}

-atas-
26.05.2011, 15:09
2 -atas- вот скрипт для движения ЛФ со списком маркеров для любой карты - при инициализации из основной миссии берутся начальные маркеры, к ним делаются триггеры смены фронта и дальше маркеры переключаются. Я комментарии написал, думаю понятно должно быть как и что там делается.

Спасибо! Будем разбираться.

Триггеры нужно ставить в места где маркеры?
Если некоторые маркеры будут без триггеров, т.е. за них воевать не будем, это нормально?

А баг с захваченными аэродромами примерно когда будет поправлен?

upd. Прочитал. Скрипт сам генерирует триггеры. Т.е. достаточно группам наземки поставить вейпойнты в точках маркеров, чтобы триггеры срабатывали и маркеры перекрашивались. Спасибо еще раз!

А с кораблями будет работать?

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

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


[FrontMarker]
FrontMarker0 193800.67 284451.58 1
FrontMarker1 246980.85 226963.31 1
FrontMarker2 251325.46 210380.54 1
FrontMarker3 275586.66 198279.23 1
FrontMarker4 271565.74 226153.49 2
FrontMarker5 291232.39 290262.39 2
FrontMarker6 280999.42 205308.98 2
FrontMarker7 254422.00 205240.09 1
FrontMarker8 285952.32 187798.51 1
FrontMarker9 297108.99 187924.80 2
FrontMarker10 277191.75 204364.41 2
FrontMarker11 284403.88 203340.48 1
FrontMarker12 284582.39 207814.80 2
FrontMarker13 298579.39 203750.47 2
FrontMarker14 274014.50 214794.12 2

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


private void DestroyEnemyAtCaptured(int markerNum, int army)
{ // если надо уничтожить всех врагов на захваченном маркере - уничтожаем в этой процедуре
Point3d AirportPos;
AirportPos.x = MissionMarkers[markerNum].x;
AirportPos.y = MissionMarkers[markerNum].y;
AirportPos.z = 1;


Думаю, будет полезнее уничтожать врагов на перекрашенном аэродроме. Это будет более юзер-френдли для тех, кто захочет там отспауниться. Например, если кто-то только что присоединился к серверу.

У маркеров врагов можно не уничтожать - пусть отвоевывают его обратно, если смогут.

Geniok
26.05.2011, 16:13
Такой открытый код можно проверить, а с закрытым - нельзя, т.е. опять же любой возьмёт Вашу кампанию, напишет вместо Вашего скрипта свой - и увидеть это нельзя будет никак.

Только вот кто этой проверкой будет заниматься?!



На стиме, к сожалению, хранить кампании не получится, почему - попробуйте у Лютьера уточнить. А можно детали про удаление нестандартных кампаний? По идее кампания хранящаяся в своей папке не должна удаляться, если удаляется может быть баг какой-то, постараемся исправить.

При установке патча, если пользователь сделал проверку кэша, то все "левые" файлы, которые есть в папке с игрой, удаляются.
Так как кампании находятся в папке, куда установлена игра, то файл campaings.ini заменяется на стандартный, где прописаны только стандартные кампании. Все папки, которые не идут вместе с игрой тоже удаляются. Так что возможны такие ситуации: поставил патч-ставь кампанию снова, прописывай в файлах все снова, начинай проходить все снова. Это очень неудобно и у пользователей были с этим проблемы.
Мне кажется любая кампания по своему принципу должна быть "plug and play", а не как сейчас, все делается с помощью костылей, даже приходится 2 установочных файла распространять, для 86-х и 64-х систем.

С Уважением, Евгений.

naryv
26.05.2011, 19:06
А баг с захваченными аэродромами примерно когда будет поправлен? Имеете ввиду не обновление спаун точек? Если да, то в следующем патче скорее всего. В принципе можно сейчас скриптом менять армию игроку на 0 и возвращать стоявшую раньше и в самолёт его засовывать снова, но это корявое решение.


upd. Прочитал. Скрипт сам генерирует триггеры. Т.е. достаточно группам наземки поставить вейпойнты в точках маркеров, чтобы триггеры срабатывали и маркеры перекрашивались. Спасибо еще раз! да, всё правильно.


А с кораблями будет работать? да , только для кораблей надо "TPassThrough 4" а не "TPassThrough 3" ставить. Ну или "TPassThrough 2" для армии вообще.


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



Думаю, будет полезнее уничтожать врагов на перекрашенном аэродроме. Это будет более юзер-френдли для тех, кто захочет там отспауниться. Например, если кто-то только что присоединился к серверу.

У маркеров врагов можно не уничтожать - пусть отвоевывают его обратно, если смогут. тогда надо этот дестрой в RefreshBirthPlaces запихнуть, чтобы когда по аэродромам бежал цикл на них дестроил всё.


Только вот кто этой проверкой будет заниматься?! сам пользователь, тут других вариантов нет, насколько я понимаю:(.


При установке патча, если пользователь сделал проверку кэша, то все "левые" файлы, которые есть в папке с игрой, удаляются.
Так как кампании находятся в папке, куда установлена игра, то файл campaings.ini заменяется на стандартный, где прописаны только стандартные кампании. Все папки, которые не идут вместе с игрой тоже удаляются. Так что возможны такие ситуации: поставил патч-ставь кампанию снова, прописывай в файлах все снова, начинай проходить все снова. Это очень неудобно и у пользователей были с этим проблемы.
Мне кажется любая кампания по своему принципу должна быть "plug and play", а не как сейчас, все делается с помощью костылей, даже приходится 2 установочных файла распространять, для 86-х и 64-х систем.
Спасибо за описание. Я правильно понимаю, что сами добавленные файлы кампаний стим не трогал, вернув только инишник стандартный? Если так, то решение есть, попозже оформим его и озвучу, ок?

zaltys
26.05.2011, 20:22
naryv,

У меня есть идея. Было бы хорошо иметь возможность ввести любое количество мета-данных для каждого объекта в редакторе миссий. То есть диалог объекта должен содержать отдельную вкладку с сеткой строк, где пользователь должен иметь возможность ввести несколько пар типа [имя, значение] (в примере: ["AutoDespawn", "1 "]). Все эти мета-данные должны быть доступны позже в скрипте (например, AiAircraft.getMeta (). Value("AutoDespawn") и так далее).

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

Small_Bee
26.05.2011, 20:30
naryv,

У меня есть идея. Было бы хорошо иметь возможность ввести любое количество мета-данных для каждого объекта в редакторе миссий. То есть диалог объекта должен содержать отдельную вкладку с сеткой строк, где пользователь должен иметь возможность ввести несколько пар типа [имя, значение] (в примере: ["AutoDespawn", "1 "]). Все эти мета-данные должны быть доступны позже в скрипте (например, AiAircraft.getMeta (). Value("AutoDespawn") и так далее).

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

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

naryv
26.05.2011, 21:14
naryv,

У меня есть идея. Было бы хорошо иметь возможность ввести любое количество мета-данных для каждого объекта в редакторе миссий. То есть диалог объекта должен содержать отдельную вкладку с сеткой строк, где пользователь должен иметь возможность ввести несколько пар типа [имя, значение] (в примере: ["AutoDespawn", "1 "]). Все эти мета-данные должны быть доступны позже в скрипте (например, AiAircraft.getMeta (). Value("AutoDespawn") и так далее).

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

Geniok
26.05.2011, 23:08
Спасибо за описание. Я правильно понимаю, что сами добавленные файлы кампаний стим не трогал, вернув только инишник стандартный? Если так, то решение есть, попозже оформим его и озвучу, ок?

Были отзывы и о том, что сами папки с кампаниями удалялись. Я смогу проверить в выходные, отпишусь что конкретно меняет Стим.

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



сам пользователь, тут других вариантов нет, насколько я понимаю:(.


То есть по сути дела никто. :(
Единственный вариант выходит хранить миссии на сервере и запускать выделенный сервер. Получается офф-лайн постепенно умирает и переходит в он-лайн. Жаль.

-atas-
26.05.2011, 23:40
ок, передам, но когда будет и будет ли - не знаю. Сейчас, емнип через tag можно что-то похожее делать.

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

Вообще АрмА очень продвинута в плане удобства для разработки миссий и адд-онов 3ми лицами. Разработчикам было бы здорово в ней разобраться, с ней поиграться. Как делается, например мод ACE, как миссии работают вроде Warfare (интерфейс в файле миссии содержится и скачивается с сервера и т.п), как картоделы адд-оны в миссии добавляют.
Благодаря такому удобству вот это все сделано коммюнити. http://www.armaholic.com/
Скрипты у них кстати не на С#, а на специальном скриптовом языке, более читаемом для обывателя, хотя могу здесь ошибаться.

-atas-
27.05.2011, 18:25
Если можно по серверу:
- в списке забаненных 0 после имени что означает? "name 3GIAP_Atas 0"
- ban PATTERN [<pattern>] это для использования ? и * вместо символов или чего-то другого?
- после перезагрузки сервера необходимо загрузить сохраненный заранее файл ban LOAD banned.txt или сервер сам внутри сохраняет список тоже?

-atas-
27.05.2011, 21:42
да, корабль - это AiGroundActor и AiGroundGroup ,с типом Ship , всех кораблей страны найти можно так :

foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
{
if (gg.Type == AiGroundGroupType.Ship)
{// тут делаем с ними что нам нужно, например
if (gg != null)
(gg as AiGroundActor).Destroy(); // уничтожаем
}
}


Тогда получается, что уничтожаем через 55 минут после рождения так?


//Ships will die after 55 min when counted from their birth
public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
foreach (AiGroundGroup gg in GamePlay.gpGroundGroups(army))
{
if (gg.Type == AiGroundGroupType.Ship)
{// тут делаем с ними что нам нужно, например
Timeout (3300, () =>
{ if (gg != null)
(gg as AiGroundActor).Destroy(); // уничтожаем
}
}
}
}
OnActorCreated относится к акторам, а gg.Type к группам. Актор он же каждый по отдельности создается OnActorCreated, тогда зачем их всех перебирать foreach ? Перебор foreach пойдет только по созданной группе или по всем, что есть на карте уже? Если так, тогда они все и уничтожатся через 55 минут, а этого не нужно.

upd.
А так не будет работать? Похожим скриптом машинки уничтожаются нормально.


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);
//ships will die after 55 min when counted from their birth
if ((actor as AiGroundActor).Type() == maddox.game.world.AiGroundActorType.Ship)
Timeout (3300, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

Small_Bee
27.05.2011, 22:07
Вот так попробуй


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
if (actor is AiGroundGroup)
{
if ((actor as AiGroundGroup).Type() == AiGroundGroupType.Ship)
{
Timeout(3300, () =>
{
if (actor != null)
{
(actor as AiGroundActor).Destroy(); // уничтожаем
}
}
);

}
}
}

-atas-
27.05.2011, 22:42
так вот же - http://www.sukhoi.ru/forum/showthread.php?t=68369&p=1608824&viewfull=1#post1608824 скрипт с проверкой в многоместных самолётах. Оттуда проверку можно взять.

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

В том скрипте проверка:

public void _DespawnEmptyPlane(AiActor actor)
{
if (actor == null)
{ return; }

Player[] Players = GamePlay.gpRemotePlayers();

bool PlaneIsEmpty = true;

foreach (Player i in Players)
{
if ((i.Place() as AiAircraft) == (actor as AiAircraft))
{
PlaneIsEmpty = false;
break;
}
}

В нашем текущем скрипте (http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1627122&viewfull=1#post1627122) проверка:

private bool isAiControlledPlane (AiAircraft aircraft)
{
if (aircraft == null)
{
return false;
}

Player [] players = GamePlay.gpRemotePlayers ();
foreach (Player p in players)
{
if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
{
return false;
}
}

return true;
}

Не могу увидеть разницы.
p.Place () is AiAircraft должно подтвердить, что ирок все еще в самолете, если даже он сел на место штурмана?
Или не выполняется условие p.Place () as AiAircraft) == aircraft?

Как правильно?

Полный код http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1627122&viewfull=1#post1627122

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


Вот так попробуй

Спасибо. А в чем разница, искать их как группы или как акторов? Должно быть все равно, так как:


Сообщение от naryv Посмотреть сообщение
да, корабль - это AiGroundActor и AiGroundGroup ,с типом Ship

Просто интересно разобраться, почему нужно их искать через foreach (http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1626549&viewfull=1#post1626549) и почему (с чего всё началось (http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1625135&viewfull=1#post1625135)) этот скрипт всё кроме кораблей уничтожает, если корабли тоже AiGroundActor?


//Ground objects (except AA Guns) will die after 55 min when counted from their birth

public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
//Ground objects (except AA Guns) will die after 55 min when counted from their birth
if (actor is AiGroundActor)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}

Small_Bee
27.05.2011, 22:52
Спасибо. А в чем разница, искать их как группы или как акторов? Должно быть все равно, так как...

Неверно. Деталь в методе Type(). Для AiGroundActor он возвращает AiGroundActorType, для AiGroundGroup - AiGroundGroupType.
В первом случае проверки другие, и их целая пачка:
ShipMisc,
ShipTransport,
ShipSmallWarship,
ShipDestroyer,
ShipCruiser,
ShipBattleship,
ShipCarrier,
ShipSubmarine

Акторов у нас 39 типов, а групп всего 6.

-atas-
27.05.2011, 23:48
Статические корабли тоже к группе ship относятся или у статиков своя иерархия?

Как 2 проверки в один метод вставить? Так не работает.


public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
//Ground objects (except AA Guns) will die after 55 min when counted from their birth
if (actor is AiGroundActor)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);

// Destroying ships

if (actor is AiGroundGroup)
{
if ((actor as AiGroundGroup).Type() == AiGroundGroupType.Ship)
{ // 3300
Timeout(3300, () =>
{
if (actor != null)
{
(actor as AiGroundActor).Destroy(); // уничтожаем
}
}
);

}
}
}

Small_Bee
28.05.2011, 14:10
Вот это работает:



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)
{
Timeout(10, () =>
{
if (item != null)
{
(item as AiCart).Destroy(); // уничтожаем
}
}
);
}
}
}
}

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

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

К статикам, к сожалению, на этот момент мы вообще доступ получить никак не можем. Так что они пока только в виде интерьера. Хотя триггер на них реагирует (там где процент уничтожения), если статику назначена какая-то армия.

-atas-
30.05.2011, 19:00
2 -atas- вот скрипт для движения ЛФ со списком маркеров для любой карты - при инициализации из основной миссии берутся начальные маркеры, к ним делаются триггеры смены фронта и дальше маркеры переключаются. Я комментарии написал, думаю понятно должно быть как и что там делается.

Атакующие миссии можно в самом начале загрузить 1 раз вот таким образом? (Возможно пару оборонительных тоже для начала придется загрузить.)


public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1; // ставим MissionNumberListener = -1 , чтобы основная миссия "слышала" все триггеры и события в битве
GamePlay.gpPostMissionLoad(triggersFile); // подгружаем миссию с триггерами созданую раньше, в Init
// загружаем атакующие миссии. Как их грузить 1 раз, а не каждый цикл?
GamePlay.gpPostMissionLoad("missions\\Multi\\Dogfight\\BoF2\\sub\\0_2_attack.mis");
GamePlay.gpPostMissionLoad("missions\\Multi\\Dogfight\\BoF2\\sub\\2_1_attack.mis");

RefreshBirthPlaces(); // и запускаем рефреш спаунов - чтобы они рассчитались
}

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

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


Вот это работает:

Спасибо, будем внедрять.

naryv
30.05.2011, 23:09
Если можно по серверу:
- в списке забаненных 0 после имени что означает? "name 3GIAP_Atas 0"
- ban PATTERN [<pattern>] это для использования ? и * вместо символов или чего-то другого?
- после перезагрузки сервера необходимо загрузить сохраненный заранее файл ban LOAD banned.txt или сервер сам внутри сохраняет список тоже?
тут не знаю, скорее всего всё должно быть как в Ил-2


Тогда получается, что уничтожаем через 55 минут после рождения так?
OnActorCreated относится к акторам, а gg.Type к группам. Актор он же каждый по отдельности создается OnActorCreated, тогда зачем их всех перебирать foreach ? Перебор foreach пойдет только по созданной группе или по всем, что есть на карте уже? Если так, тогда они все и уничтожатся через 55 минут, а этого не нужно. у меня foreach был чтобы уничтожить все кораблики, в какой-то момент, я просто не понял, что Вы на onActorCreated его вешали:) в таком случае никаких foreach-ей не надо, конечно, ну да Small_Bee уже написал всё.


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


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

-atas-
31.05.2011, 13:40
2 -atas- вот скрипт для движения ЛФ со списком маркеров для любой карты - при инициализации из основной миссии берутся начальные маркеры, к ним делаются триггеры смены фронта и дальше маркеры переключаются.

Нарисовали подмиссии для карты с Repka #1, но возникла проблеммка: Филды не перекрашиваются, ЛФ не двигается.
По достижению красными танками красного филда в D3 срабатывает тригер, пишется сообщение о захвате. Далее красные танки дестроились на своем же филде, пришлось эту часть скрипта выключить.
После этого красные танки проезжают маркер на синем филде в D3. Триггер не срабатывает, маркер не перекрашивается. Затем эти танки доезжают до синего филда в D4, триггер не срабатывает.

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

Синие танки, атакующие Е3 и затем F3 не вызывают срабатывание триггера.

Миссию можно прогонять в оффлане с ускорением времени. Тестировалось именно так. Миссия во вложении.
135263

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

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

135264

(Часть кода отключена, но будет включаться позже. Если сразу увидите нестыковки, буду благодарен за совет.)

naryv
31.05.2011, 18:56
Нарисовали подмиссии для карты с Repka #1, но возникла проблеммка: Филды не перекрашиваются, ЛФ не двигается.
По достижению красными танками красного филда в D3 срабатывает тригер, пишется сообщение о захвате. Далее красные танки дестроились на своем же филде, пришлось эту часть скрипта выключить.
После этого красные танки проезжают маркер на синем филде в D3. Триггер не срабатывает, маркер не перекрашивается. Затем эти танки доезжают до синего филда в D4, триггер не срабатывает.

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

Синие танки, атакующие Е3 и затем F3 не вызывают срабатывание триггера.

Миссию можно прогонять в оффлане с ускорением времени. Тестировалось именно так. Миссия во вложении.
135263

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

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

135264

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

PS спаунточки в начальной миссии не нужны - они всё равно при старте битвы удалятся.

-atas-
31.05.2011, 19:43
Вы отключили уничтожение танков на маркере, поэтому получается такая ситуация - синие приезжают к маркеру, он срабатывает перекрашивая маркер, но поскольку там же находятся красные - тут же срабатывает обратный триггер и перекрашивает маркер опять в красный, происходит это достаточно быстро - счёт начисляется и тем и другим но смена ЛФ происходит незамеченной.

Там синие и красные атакуют разные направления, на одном филде не встречаются. Но на будущее, конечно надо бы такие ситуации исключить, т.к. могут встретиться. В принципе нормально, если маркер меняет цвет несколько раз подряд, т.к. резервы могут подтягиваться в зону действия тригера по очереди. Если так, пусть воюют до конца честно, а дестроить врагов нужно только в радиусе спауна, чтобы не обижали игроков при спауне на захваченном филде. На маркере пусть все идет естественным путем, как в жизни. Может быть его нейтральным делать на время боя или таймаут ввести перед перекрашиванием, или красить в цвет стороны, которой в радиусе присутствует больше (проверять раз в 5 минут, например).

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

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

naryv
01.06.2011, 13:53
Там синие и красные атакуют разные направления, на одном филде не встречаются. Но на будущее, конечно надо бы такие ситуации исключить, т.к. могут встретиться. В принципе нормально, если маркер меняет цвет несколько раз подряд, т.к. резервы могут подтягиваться в зону действия тригера по очереди. Если так, пусть воюют до конца честно, а дестроить врагов нужно только в радиусе спауна, чтобы не обижали игроков при спауне на захваченном филде. На маркере пусть все идет естественным путем, как в жизни. Может быть его нейтральным делать на время боя или таймаут ввести перед перекрашиванием, или красить в цвет стороны, которой в радиусе присутствует больше (проверять раз в 5 минут, например).

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

PS. я как-то писал о баге, что при сохранении миссии триггер на проезд синей наземки сбрасывается на проезд красной наземки (спорадически наблюдается, как и британские взрыватели к немецким бомбам). Возможно, это он вылезает: приезжает красная группа, а срабатывает синий триггер, который уничтожает красные танки, но перед этим они успевают перекрасить филд снова в красный, т.к. триггера там 2. Видимо нужен таймаут на перекрашивание маркера и филдов: если за пару минут враги не приехали, перекрасить, если приехали, отсчитывать заново и проверять чья взяла каждые 2-5 минут.
Ух, вроде разобрался в чём дело :) миссия, конечно, головусворачивающая по количеству всего что там есть :). Значит основная проблема с некорректно срабатывающими триггерами - это армии заданные в миссии, вот эти строчки в файле основной миссии:
Army 1 gb
Army 2 de

вариантов решения проблемы сейчас 2 - либо эти строчки удалить совсем(наверное более предпочтительный), либо дополнить ещё одной вот так:
Army 0 nn
Army 1 gb
Army 2 de

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

Соответственно уничтожение танков на маркере в скрипте можно включить назад, свои танки не должны больше убиваться. Ещё нашёл свой косяк в скрипте - везде MissionMarkers.Capacity лучше заменить на MissionMarkers.Count, а то эксепшны будут сыпаться.
Теперь по самой миссии - вот этот кусок

[NPC]
10_Chief Armor.SdKfz_222 de /posx 271412.66/posy 205413.17 /npc_count 4/target Spawn3 - Attack D3 /num_units 4
16_Chief Armor.Guy_Mk_IA gb /posx 277976.34/posy 195607.69 /script baseAntiAir.cpp/npc_count 4/target BirthPlace_0 - Attack D3 /num_units 4
7_Chief Armor.Beaverette_III gb /posx 273296.41/posy 200605.77 /script baseAntiAir.cpp/npc_count 4/num_units 4
17_Chief Armor.SdKfz_222 gb /posx 287501.72/posy 202349.14 /script baseAntiAir.cpp/npc_count 4/target BirthPlace_5 - Attack D3 /num_units 4
0_Chief Armor.Guy_Mk_IA gb /posx 272533.38/posy 200932.58 /script baseAntiAir.cpp/npc_count 8/num_units 8
1_Chief Armor.SdKfz_222 gb /posx 276254.53/posy 191791.23 /script baseAntiAir.cpp/npc_count 4/target BirthPlace_01 - Attack D3 /num_units 4 почти весь неправильный - скрипт baseAntiAir.cpp для прожекторов, не для техники, техника рождаться не будет, и очень возможны глюки различные , с таргетами для наземки тоже неправильно, в случае техники таргет будет работать на сплайновой дороге если скрипт car.cpp назначен NPC группе.
Ну и в целом всё сразу сделано много и сложно, очень сложно отладить так - лучше кусочками делать - поставили пушки, пустили пару групп танчиков - если корректно отработали - дальше уже добавляем усложняем и т.д. а то сразу куча объектов все по своему работают и сложно понять кто что и почему делает :). А так, без строчек с армиями прогнал - вроде всё перекрашивается как надо.

-atas-
01.06.2011, 14:12
Спасибо, будем тестировать.
Миссия взята целиком с Repka #1, а там за 2 месяца обучения редактору много чего налеплено. Заново собирать с нуля времени нет.

baseAntiAir.cpp иногда удачно расставляет машинки вокруг аэродрома, но нестабильно. Иногда нужно группу машин в качестве пво использовать. На будущее может пригодиться.

-atas-
01.06.2011, 17:17
Ситуация: в начале загружаем 2 "_defend" подмиссии. Путь атакующей группы противника проходит через маркер противника, который мы атакуем. Если нам удается захватить маркер противника, то триггер загружающий "_attack" подмиссии противника перестает срабатывать, т.е. противник перестает атаковать наш маркер. Хотя по логике если "_defend" подмиссия запущена, атаки должны продолжаться пока маркер не будет захвачен.

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

if (gg.Pos().distance(ref AirportPos) < 2000) // 2000 это расстояние от маркера на котором уничтожим врагов
{
string triggerName = gg.Name().Substring(0, gg.Name().IndexOf(":")) + ":" + markerNum.ToString() + "_" + army.ToString() + "_attack";
AiTrigger trigger = GamePlay.gpGetTrigger(triggerName);
if (trigger != null) trigger.Enable = false;

Либо когда группа проезжает через перекрашивающийся маркер, она дестроится скриптом и это уничтожение не вызывает срабатывание триггера.

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

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

-atas-
02.06.2011, 18:45
FG28_Kodiak с желтого форума 1С, неплохо на мой неискушенный взгляд разбирающийся в С#, изъявляет желание написать add-in/мод для интерфейса онлайна, показывающий после выбора филда список припаркованных на нем самолетов с возможностью выбора их из списка. Мод необходим для совместных полетов сосквадников на одном самолете в полном реале без иконок самолетов на карте. При выключенных иконках занять место в уже созданном самолете практически невозможно, т.к его на карте не видно. (Это кто придумал? :) )

Вопрос: каким образом этот код интерфейса можно подключить к БзБ? MuxaHuk на желтом форуме писал, что даже каждый сервер может иметь свой интерфейс и передавать его клиенту. Как это реализовать на практике в общих чертах?

Small_Bee
03.06.2011, 00:26
FG28_Kodiak с желтого форума 1С, неплохо на мой неискушенный взгляд разбирающийся в С#, изъявляет желание написать add-in/мод для интерфейса онлайна, показывающий после выбора филда список припаркованных на нем самолетов с возможностью выбора их из списка. Мод необходим для совместных полетов сосквадников на одном самолете в полном реале без иконок самолетов на карте. При выключенных иконках занять место в уже созданном самолете практически невозможно, т.к его на карте не видно. (Это кто придумал? :) )

Вопрос: каким образом этот код интерфейса можно подключить к БзБ? MuxaHuk на желтом форуме писал, что даже каждый сервер может иметь свой интерфейс и передавать его клиенту. Как это реализовать на практике в общих чертах?

В общих чертах там не расскажешь. Но мне кажется, все будет отшень карашо.:)
шепотом: кнопки работают )))

-atas-
03.06.2011, 11:11
шепотом: кнопки работают )))

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

MuxaHuk
03.06.2011, 13:45
Интерфейс компилится в dll, которая передаётся с сервера на клиент. Пока не могу предоставить примеров, но это обычный интерфейс на WPF.
Надо что бы Илья Шевченко выделил время для программистов для создания примеров :)

Small_Bee
03.06.2011, 13:53
В какую сторону копать? Уже мало кто что-то делает для БзБ из 3х лиц, надо бы поддержать человека по полной программе, чтобы не ушел.]


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

zaltys
03.06.2011, 14:11
Интерфейс компилится в dll, которая передаётся с сервера на клиент. Пока не могу предоставить примеров, но это обычный интерфейс на WPF.
Надо что бы Илья Шевченко выделил время для программистов для создания примеров :)

naryv ранее сказал, что это вряд ли возможно изолировать скрипти от остальной системы. Возможно ли изоляция для такой DLL на стороне клиента?

Travinski
03.06.2011, 16:50
Не слышно ни чего про редактор ландшафта ? Есть ли возможность сделать-разнообразить театр действий ?

Geniok
05.06.2011, 13:06
Вопрос знатокам.
Делаю небольшой АддОн для БЗБ.
Содержание файла SimpleEditor.xml:

<?xml version="1.0" encoding="utf-8"?>
<addin>
<game server="false" name="Simple Editor">
<assembly type="AddOn.SimpleEditor.Campaigns" path="$home/ClientAddIns/AddIns/AddOn/SimpleEditor.dll"/>
<title text="Simple Editor"/>
<title_ru text="Простой редактор"/>
<title_cs text="Simple Editor"/>
<title_de text="Simple Editor"/>
<title_fr text="Simple Editor"/>
<title_it text="Simple Editor"/>
<title_es text="Simple Editor"/>
<title_pl text="Simple Editor"/>
</game>
</addin>

Как видно на скриншоте пункт в меню появляется.
Но реакции на нажатие нет никакой.
Как должно быть организовано взаимодействие между dll и игрой?

Small_Bee
05.06.2011, 18:32
Вопрос знатокам.
Делаю небольшой АддОн для БЗБ.
Содержание файла SimpleEditor.xml:

<?xml version="1.0" encoding="utf-8"?>
<addin>
<game server="false" name="Simple Editor">
<assembly type="AddOn.SimpleEditor.Campaigns" path="$home/ClientAddIns/AddIns/AddOn/SimpleEditor.dll"/>
<title text="Simple Editor"/>
<title_ru text="Простой редактор"/>
<title_cs text="Simple Editor"/>
<title_de text="Simple Editor"/>
<title_fr text="Simple Editor"/>
<title_it text="Simple Editor"/>
<title_es text="Simple Editor"/>
<title_pl text="Simple Editor"/>
</game>
</addin>

Как видно на скриншоте пункт в меню появляется.
Но реакции на нажатие нет никакой.
Как должно быть организовано взаимодействие между dll и игрой?

На пальцах не объяснишь, давай почту, вышлю рабочий исходник.

Geniok
05.06.2011, 20:42
ответил в личку

-atas-
06.06.2011, 12:43
А так, без строчек с армиями прогнал - вроде всё перекрашивается как надо.

Еще раз спасибо, с мелкими вопросами типа пересчет счета и изменение логики атак пытаюсь сам разобраться.

У меня просьба на будущее. В версии скрипта для островной карты "кресты и круги" была часть, генерирующая вейпойнты для бомбардировщиков.

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

- группа танков захватила маркер
- на маркере генерится оборона из противотанковой артиллерии и немного ПВО для прикрытия арты
- если потери группы танков больше 50% на захваченном маркере генерится новая подмиссия с танками (подкрепление)
- старые и новые танки выдвигаются на сгенеренные вейпойнты
- вейпойнты генерятся, например, по алгоритму:
- если между танками и одним из своих маркеров есть маркер противника, если он не за водной преградой, захватываем его (чтобы в тылу не оставлять незахваченные территории).
- если в радиусе расстояния до этого маркера есть вражеская наземка - атакуем сначала наземку,
Если потери больше 50%, начинаем новый цикл.
Если нет:
- берем координаты 2х ближайших ключевых объектов из числа аэродромов и городов на территории противника
- создаем конечный вейпойнт в точке с координатами посередине между этими пунктами (чтобы в города и на аэродромы не въезжать), если там суша и не остров
- если в радиусе расстояния до этого вейпойнта есть вражеская наземка - атакуем сначала наземку,
- проверяем, есть ли в радиусе маркер противника, захватываетм его
Если потери больше 50%, начинаем новый цикл.
Если нет:
- едем к конечному вейпойнту, захватываем его, ставим на нем маркер линии фронта своего цвета

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

Может возникнуть проблемка с непроходимостью некоторых участков карты для танков, пока ИИ не выведен на достаточный уровень. Мосты бывают непроходимы для танков. Говорят, реки можно пересекать без мостов по сплайн-дорогам. Против застревания в населенных пунктах можно запретить танкам приближаться к домикам (ставить объездные вейпойнты), и предусмотреть, что если группа не находится на конечном вейпойнте или в бою и при этом не двигается 5 минут, ставить промежуточный вейпойнт где-то сзади и сбоку (чтобы объехать препятствие). В крайнем случае дестроить совсем застрявшую группу и создавать новую с новым маршрутом.

Тем временем постараемся запутить на Repka миссию с подмиссиями нарисованными вручную, что сильно ограничивает регион действий.

MuxaHuk
07.06.2011, 14:16
naryv ранее сказал, что это вряд ли возможно изолировать скрипти от остальной системы. Возможно ли изоляция для такой DLL на стороне клиента?
Не надо изолировать, игра сама изолирует весь пользовательский код внутри виртуальной оболочки, за пределы которой выйти невозможно, нельзя испортить файлы на компьютере клиента, нельзя скачать файлы. Вообщем не получится принести вред и получить запретную информацию.

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


Вопрос знатокам.
Делаю небольшой АддОн для БЗБ.
В данном официальном релизе игры специально отключена возможность АддОнов. Это не из-за нелюбви к пользователям, а в связи с тем, что готовится к выпуску SDK, которое откроет возможность АддОнов.

naryv
07.06.2011, 18:42
Еще раз спасибо, с мелкими вопросами типа пересчет счета и изменение логики атак пытаюсь сам разобраться.

У меня просьба на будущее. В версии скрипта для островной карты "кресты и круги" была часть, генерирующая вейпойнты для бомбардировщиков.

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

- группа танков захватила маркер
- на маркере генерится оборона из противотанковой артиллерии и немного ПВО для прикрытия арты
- если потери группы танков больше 50% на захваченном маркере генерится новая подмиссия с танками (подкрепление)
- старые и новые танки выдвигаются на сгенеренные вейпойнты
- вейпойнты генерятся, например, по алгоритму:
- если между танками и одним из своих маркеров есть маркер противника, если он не за водной преградой, захватываем его (чтобы в тылу не оставлять незахваченные территории).
- если в радиусе расстояния до этого маркера есть вражеская наземка - атакуем сначала наземку,
Если потери больше 50%, начинаем новый цикл.
Если нет:
- берем координаты 2х ближайших ключевых объектов из числа аэродромов и городов на территории противника
- создаем конечный вейпойнт в точке с координатами посередине между этими пунктами (чтобы в города и на аэродромы не въезжать), если там суша и не остров
- если в радиусе расстояния до этого вейпойнта есть вражеская наземка - атакуем сначала наземку,
- проверяем, есть ли в радиусе маркер противника, захватываетм его
Если потери больше 50%, начинаем новый цикл.
Если нет:
- едем к конечному вейпойнту, захватываем его, ставим на нем маркер линии фронта своего цвета

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

Может возникнуть проблемка с непроходимостью некоторых участков карты для танков, пока ИИ не выведен на достаточный уровень. Мосты бывают непроходимы для танков. Говорят, реки можно пересекать без мостов по сплайн-дорогам. Против застревания в населенных пунктах можно запретить танкам приближаться к домикам (ставить объездные вейпойнты), и предусмотреть, что если группа не находится на конечном вейпойнте или в бою и при этом не двигается 5 минут, ставить промежуточный вейпойнт где-то сзади и сбоку (чтобы объехать препятствие). В крайнем случае дестроить совсем застрявшую группу и создавать новую с новым маршрутом.

Тем временем постараемся запутить на Repka миссию с подмиссиями нарисованными вручную, что сильно ограничивает регион действий.
Сорри, у меня сейчас времени совсем нет чтобы рабочий скрипт с этими условиями написать :( .
Вообще наземке путь так задаётся :
у AiGroup есть ф-я SetWay(AiWayPoint[] way) которая пускает группу по пути. Чтобы самому не забивать маршрут, есть ф-я GamePlay.gpFindPath(GP.Point2d a, double ra, GP.Point2d b, double rb, PathType type, int army) , где a - начальная точка пути, b - конечная ra и rb - радиусы, в которых точка считается достигнутой, PathType для наземки PathType.GROUND , ну а army - армия группы. Чтобы пустить группу по маршруту, соответственно надо узнать точки (начальная - Pos() нашей группы), начать считать маршрут

IRecalcPathParams cur_rpp = GamePlay.gpFindPath(тут наши параметры пути);
т.к. путь ищется в отдельном потоке, в OnTickGame() надо проверять статус маршрута:
if (cur_rpp.State == RecalcPathState.SUCCESS)
GroundGroup.SetWay(cur_rpp.Path); // если посчитался, тогда командуем группе двигаться

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

Small_Bee
07.06.2011, 21:05
т.к. путь ищется в отдельном потоке, в OnTickGame() надо проверять статус маршрута:

О, а вот за вот это спасибо, теперь ясно. Я то я совсем залип со статусом WAITING. :)

-atas-
07.06.2011, 21:50
В данном официальном релизе игры специально отключена возможность АддОнов. Это не из-за нелюбви к пользователям, а в связи с тем, что готовится к выпуску SDK, которое откроет возможность АддОнов.

А когда он планируется к выходу +- "2 недели"?

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


О, а вот за вот это спасибо, теперь ясно. Я то я совсем залип со статусом WAITING. :)

Я правильно понимаю, что есть написанный генератор маршрутов? Можно посмотреть?

Small_Bee
07.06.2011, 21:59
Я правильно понимаю, что есть написанный генератор маршрутов? Можно посмотреть?

Не, неправильно. Пока все мое ковыряние сводится к исследованиям всякого разного. :)

Geniok
08.06.2011, 01:45
В данном официальном релизе игры специально отключена возможность АддОнов. Это не из-за нелюбви к пользователям, а в связи с тем, что готовится к выпуску SDK, которое откроет возможность АддОнов.

Как так отключена если он у меня есть и работает?!
Может мы просто разное имеем ввиду?

MuxaHuk
08.06.2011, 12:03
Как так отключена если он у меня есть и работает?!
Может мы просто разное имеем ввиду?
По последней информации моя информация была устаревшей :) забудьте мои слова

-atas-
26.06.2011, 15:08
Интерфейс компилится в dll, которая передаётся с сервера на клиент. Пока не могу предоставить примеров, но это обычный интерфейс на WPF.
Надо что бы Илья Шевченко выделил время для программистов для создания примеров :)

А что нужно сделать, чтобы эта dll скачалась и выполнилась на клиенте? Назвать ее так же как и миссию или этого не достаточно? На западе хотят сделать миссию, которая бы перехватывала команды клавиатуры: дать игроку меню заданий, чтобы он сам выбирал из списка. Это тоже в dll нужно компилить и аналогично будет скачиваться с сервера или как-то по-другому?

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

BigREPA
27.06.2011, 13:42
Хочу разместить оборонный заказ.
Т.к. судя по всему МГ такой инструмент не предусмотрела (и это, блин, для сетевой игры), а он крайне нужен онлайну, короче я про то, что можно ли из миссии как то работать с "пингом" пилота, ограничивать максимальный, или потоньше, смотреть "скачет" он у него или нет - и на основе этой информации выводить сообщения, лично ему, всем и как апофеоз кикать его?

Oleg_Tr
27.06.2011, 13:51
Хочу разместить оборонный заказ.
Т.к. судя по всему МГ такой инструмент не предусмотрела (и это, блин, для сетевой игры), а он крайне нужен онлайну, короче я про то, что можно ли из миссии как то работать с "пингом" пилота, ограничивать максимальный, или потоньше, смотреть "скачет" он у него или нет - и на основе этой информации выводить сообщения, лично ему, всем и как апофеоз кикать его?Вообще то, при выборе сервера для игры стоит посмотривать на пинг. Ну не пойду же я на сервер с пингом 300 мс, если есть 70-80, как на репке.

naryv
27.06.2011, 14:06
Хочу разместить оборонный заказ.
Т.к. судя по всему МГ такой инструмент не предусмотрела (и это, блин, для сетевой игры), а он крайне нужен онлайну, короче я про то, что можно ли из миссии как то работать с "пингом" пилота, ограничивать максимальный, или потоньше, смотреть "скачет" он у него или нет - и на основе этой информации выводить сообщения, лично ему, всем и как апофеоз кикать его? напомните завтра, пожалуйста.

Geniok
27.06.2011, 21:58
Такой вот вопрос образовался. До последнего патча все миссии запускались без проблем. В том числе и снегерированые с помощью "Простого редактора". После установки патча ни одна миссия в офф-лайне не запускается (даже те, что идут с самой игрой в комплекте или сделанные через полный редактор), вылетает вот такое окно (скин прилагаю). После удаления "Простого редактора" все становится на свои места.
В патче что-нибудь меняли в области взаимодействия со сторонними Аддонами?
Что посоветуете делать в подобной ситуации?

naryv
27.06.2011, 23:20
Такой вот вопрос образовался. До последнего патча все миссии запускались без проблем. В том числе и снегерированые с помощью "Простого редактора". После установки патча ни одна миссия в офф-лайне не запускается (даже те, что идут с самой игрой в комплекте или сделанные через полный редактор), вылетает вот такое окно (скин прилагаю). После удаления "Простого редактора" все становится на свои места.
В патче что-нибудь меняли в области взаимодействия со сторонними Аддонами? да, емнип, меняли что-то для более простого подключения сторонних кампаний со своими обработчиками, в ридми наверное забыли дописать, как теперь работает

Что посоветуете делать в подобной ситуации? завтра постараюсь написать, что и как с этим делать.

naryv
28.06.2011, 13:07
да, емнип, меняли что-то для более простого подключения сторонних кампаний со своими обработчиками, в ридми наверное забыли дописать, как теперь работает
завтра постараюсь написать, что и как с этим делать.
Вот пример, как сделать свою кампанию:
136504
кладётся всё в корень игры, в AddIns, соответственно добавляется tst.campaign.xml в которой прописан пункт в меню и путь к обработчику кампании, который в parts кладётся(дописывать в исходный campaign.xml больше ничего не надо, игра сканирует все xml в папке AddIns), в папке mission будут собственно файлы кампании, в parts\tst\src\Campaign исходники, TstMission.cs - базовый класс для миссии, TstCampaign.cs - обработчик кампании. При работе кампании в "Моих документах\папка игры\mission" создастся папка "tst" в которой будет инишник с состоянием прохождения, ну и всё что нужно для процесса и статистики туда можно писать. Т.о. не надо менять никакие исходные конфиги для своих кампаний, стим не будет при проверке кэша и обновлениях ничего затирать, и инсталяторам не надо мудрить с перезаписью.

По поводу ошибки которая у Вас вылезает - не понятно пока. Как Вы миссии делаете и запускаете?

Geniok
28.06.2011, 14:06
По поводу ошибки которая у Вас вылезает - не понятно пока. Как Вы миссии делаете и запускаете?

Судя по вашему ответу вы не поняли в чем проблема. Я не про миссии и кампании речь веду. Файл "campaign.xml" не менял и менять не собирался.
Просто включаю стандартную миссию (одну их тех, что идет с самой игрой, в "быстром редакторе") и получаю такую ошибку. Ошибка есть только при установленном "простом редакторе" вот отсюда: http://www.sukhoi.ru/forum/showthread.php?t=69933&page=1 (который опять же написан мною, и у него отдельный xml-файл)

Если его удалить, то все работает нормально.

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

naryv
28.06.2011, 15:51
Судя по вашему ответу вы не поняли в чем проблема. Я не про миссии и кампании речь веду. Файл "campaign.xml" не менял и менять не собирался. я понял, просто параллельно показал, что менялось и как пользоваться новым механизмом. Вы, если не ошибаюсь, как раз и интересовались насчёт кампаний, которые бы не портились стимом.


Просто включаю стандартную миссию (одну их тех, что идет с самой игрой, в "быстром редакторе") и получаю такую ошибку. Ошибка есть только при установленном "простом редакторе" вот отсюда: http://www.sukhoi.ru/forum/showthread.php?t=69933&page=1 (который опять же написан мною, и у него отдельный xml-файл)

Если его удалить, то все работает нормально.

Пошаговая отладка ничего не дает, потому что ошибка возникает именно при загрузке миссии, то есть когда работа моего "простого редактора" уже закончена.
Появилась эта проблема с последнего беты-патча и само-собой осталась в релизе. ну я же не могу знать, как и что Вы в "простом редакторе" делаете, редактор я поставил, мне он пишет "No Map in mission file", поэтому и спросил - как Вы миссии делаете и запускаете?

Geniok
28.06.2011, 16:18
я понял, просто параллельно показал, что менялось и как пользоваться новым механизмом. Вы, если не ошибаюсь, как раз и интересовались насчёт кампаний, которые бы не портились стимом.

Ааа, теперь понятно! Д, был такой вопрос от меня.
Спасибо за разъяснение.



ну я же не могу знать, как и что Вы в "простом редакторе" делаете, редактор я поставил, мне он пишет "No Map in mission file", поэтому и спросил - как Вы миссии делаете и запускаете?

Обычная генерация по условиям. Также как в полном редакторе это делается.
Саму миссию запускаю строкой: this.singleGame.game.PagePush(this.singleGame.game.PageGet("SingleMissGame"), "имя миссии.mis");

После установки редактора стандартные миссии запускаются у вас, капании, которые идут с игрой?

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

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

У другого человека было то же самое, 2-3 раза запуск нормальный, на четвертый запуск ошибка идет. Никакая миссия в Офф-лайне не запускается вообще.

Geniok
28.06.2011, 22:33
Наконец-то нашел в чем дело!
Уважаемый nariv, у вас небольшой баг получается.
Объясню, в чем дело.
Когда я у себя на компьютере компилирую "SimpleEditor.dll", то помимо ее в папку "il-2 sturmovik cliffs of dover\ClientAddIns\AddIns\AddOn" попадают также файлы "core.dll, gamePages.dll, gamePlay.dll, gameWorld.dll, part.dll, partBob.dll", то есть те файлы, которые включены в сборку в VisualStudio. Раньше это проблем не создавало. Но, теперь получается так, что по каким-то причинам игра начинает при запуске "цеплять" их, а не те файлы, что находятся в "il-2 sturmovik cliffs of dover\parts\core". А так как в патче их меняли, происходит сбой при загрузке любой миссии.
Повторюсь, что вышеуказанные файлы там просто лежат и нигде не прописаны к загрузке. Но игра их "цепляет" сама.

Я их конечно оттуда удалю, но не получится ли так, что игра будет цеплять любую dll, лежащую в папке "\ClientAddIns\AddIns\AddOn" ?

Small_Bee
28.06.2011, 23:19
Наконец-то нашел в чем дело!
Уважаемый nariv, у вас небольшой баг получается.
Объясню, в чем дело.
Когда я у себя на компьютере компилирую "SimpleEditor.dll", то помимо ее в папку "il-2 sturmovik cliffs of dover\ClientAddIns\AddIns\AddOn" попадают также файлы "core.dll, gamePages.dll, gamePlay.dll, gameWorld.dll, part.dll, partBob.dll", то есть те файлы, которые включены в сборку в VisualStudio. Раньше это проблем не создавало. Но, теперь получается так, что по каким-то причинам игра начинает при запуске "цеплять" их, а не те файлы, что находятся в "il-2 sturmovik cliffs of dover\parts\core". А так как в патче их меняли, происходит сбой при загрузке любой миссии.
Повторюсь, что вышеуказанные файлы там просто лежат и нигде не прописаны к загрузке. Но игра их "цепляет" сама.

Я их конечно оттуда удалю, но не получится ли так, что игра будет цеплять любую dll, лежащую в папке "\ClientAddIns\AddIns\AddOn" ?

Для этих сборок ставь Copy local = false. И вся проблема.

Geniok
29.06.2011, 03:16
Для этих сборок ставь Copy local = false. И вся проблема.

Да я уже по-другому сделал. Дело не в том что в папке еще dll есть.
Просто интересно почему игра цепляет сторонние библиотеки, которые нигде не прописаны.

naryv
29.06.2011, 10:29
Наконец-то нашел в чем дело! Вот и хорошо! :)


Да я уже по-другому сделал. Дело не в том что в папке еще dll есть.
Просто интересно почему игра цепляет сторонние библиотеки, которые нигде не прописаны. насколько я понял, они в using прописаны, поэтому Ваша dll берёт те, которые в её папке лежат, совсем "левые" dll не должна брать, но посмотрим.


Для этих сборок ставь Copy local = false. И вся проблема. ага:)

Geniok
29.06.2011, 10:58
насколько я понял, они в using прописаны, поэтому Ваша dll берёт те, которые в её папке лежат, совсем "левые" dll не должна брать, но посмотрим.


Так и раньше были прописаны. Хотя, все может быть. Но на всякий случай гляньте, мало ли что...

С Уважением, Евгений!

naryv
29.06.2011, 13:46
Еще раз спасибо, с мелкими вопросами типа пересчет счета и изменение логики атак пытаюсь сам разобраться.

У меня просьба на будущее. В версии скрипта для островной карты "кресты и круги" была часть, генерирующая вейпойнты для бомбардировщиков.

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

- группа танков захватила маркер
- на маркере генерится оборона из противотанковой артиллерии и немного ПВО для прикрытия арты
- если потери группы танков больше 50% на захваченном маркере генерится новая подмиссия с танками (подкрепление)
- старые и новые танки выдвигаются на сгенеренные вейпойнты
- вейпойнты генерятся, например, по алгоритму:
- если между танками и одним из своих маркеров есть маркер противника, если он не за водной преградой, захватываем его (чтобы в тылу не оставлять незахваченные территории).
- если в радиусе расстояния до этого маркера есть вражеская наземка - атакуем сначала наземку,
Если потери больше 50%, начинаем новый цикл.
Если нет:
- берем координаты 2х ближайших ключевых объектов из числа аэродромов и городов на территории противника
- создаем конечный вейпойнт в точке с координатами посередине между этими пунктами (чтобы в города и на аэродромы не въезжать), если там суша и не остров
- если в радиусе расстояния до этого вейпойнта есть вражеская наземка - атакуем сначала наземку,
- проверяем, есть ли в радиусе маркер противника, захватываетм его
Если потери больше 50%, начинаем новый цикл.
Если нет:
- едем к конечному вейпойнту, захватываем его, ставим на нем маркер линии фронта своего цвета

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

Может возникнуть проблемка с непроходимостью некоторых участков карты для танков, пока ИИ не выведен на достаточный уровень. Мосты бывают непроходимы для танков. Говорят, реки можно пересекать без мостов по сплайн-дорогам. Против застревания в населенных пунктах можно запретить танкам приближаться к домикам (ставить объездные вейпойнты), и предусмотреть, что если группа не находится на конечном вейпойнте или в бою и при этом не двигается 5 минут, ставить промежуточный вейпойнт где-то сзади и сбоку (чтобы объехать препятствие). В крайнем случае дестроить совсем застрявшую группу и создавать новую с новым маршрутом.

Тем временем постараемся запутить на Repka миссию с подмиссиями нарисованными вручную, что сильно ограничивает регион действий.
Собственно написал:
136566

Как работает - расставляем на карте маркеры, добавляем скрипт и всё - можно миссию запускать. Что делает скрипт: при инициализации битвы собирает все маркеры, приписывает к ним триггеры на переключение. В точке каждого маркера ставит артиллерию развёрнутую к ближайшему вражескому маркеру. От всех маркеров рождает группы танков, которые едут к ближнему вражьему маркеру или ближней вражьей группе(что ближе будет). Если на маркер приехали - перекрашиваем его и обновляем спаунточки, ну как и раньше. Если группу танков убили - рождаем от ближайшего к месту гибели своего маркера новую группу. Для примера в архиве миссия с уже расставленными маркерами, карта большая, в скрипте постарался всё закомментировать, если что-то захочется поменять, должно быть более менее понятно, если не понятно - постараюсь ответить:). Попробуйте, если есть желание.

-atas-
29.06.2011, 14:41
Собственно написал:

Большое спасибо! У меня в ближайшие пару месяцев нет возможности заниматься созданием миссий, к сожалению, но берусь выложить миссию на западном форуме. Там есть 2 человека, делающих миссии.

Возможно, BigRepa попробует имеющуюся миссию на сервере Repka.

BigREPA
29.06.2011, 14:49
Как я понимаю, ее просто "поставить" нельзя? это шаблон, его нужно настроить?

naryv
29.06.2011, 15:51
Большое спасибо! У меня в ближайшие пару месяцев нет возможности заниматься созданием миссий, к сожалению, но берусь выложить миссию на западном форуме. Там есть 2 человека, делающих миссии.

Возможно, BigRepa попробует имеющуюся миссию на сервере Repka. ок


Как я понимаю, ее просто "поставить" нельзя? это шаблон, его нужно настроить? можно просто ставить - это миссия со скриптом сразу рабочая, оба файла положить в missions\Multi\Dogfight и грузить сервером MF_any2.mis . Если меняется папка или имя миссии, тогда надо в скрипте в public override void Init(ABattle battle, int missionNumber)
во второй строчке ISectionFile missFile = GamePlay.gpLoadSectionFile("missions\\Multi\\Dogfight\\MF_any2.mis"); исправить путь и имя. А менять уже можно по желанию, если что-то не устраивает или хочется добавить.

BigREPA
29.06.2011, 17:23
Не увидел в скрипте "Aircraft.Bf-109E-1" - добавил :)

Запустится на #2 в 19-00

adonys
29.06.2011, 19:19
How can one make an Ai aircraft say something to the group, like in using a SayToGroup with custom messages (others than the ones from IL2 CoD) like function, please?

Refuel, repair, rearm (set actor's aircraft's fuel, ammo, health levels)?

Do damage to a random part of a plane (not using the limited Switch construction, which only allows damage to the parts listed in it, therefore a limited number)?

-atas-
30.06.2011, 01:45
Попробуйте, если есть желание.

Некоторые моменты не совсем корректно работают. Комментарии в теме Сервер Repka (по поводу Repka #2) http://www.sukhoi.ru/forum/showthread.php?t=68774&p=1647360#post1647360

naryv
30.06.2011, 01:50
Не увидел в скрипте "Aircraft.Bf-109E-1" - добавил :)

Запустится на #2 в 19-00
иконки наверное имеет смысл включить, ну или завтра "разведсводку" добавлю.


How can one make an Ai aircraft say something to the group, like in using a SayToGroup with custom messages (others than the ones from IL2 CoD) like function, please?
Hi, adonys. You can not use SayToGroup with custom messages - only those wich is already in game - with own sound.


Refuel, repair, rearm (set actor's aircraft's fuel, ammo, health levels)?real refuel-rearming procedure takes at least 30 minutes, and our chief aircraft programmer said that it is more real to create new plane after landing then RRR it ...


Do damage to a random part of a plane (not using the limited Switch construction, which only allows damage to the parts listed in it, therefore a limited number)? i'll try answer tomorrow

adonys
30.06.2011, 03:12
I've suspected SayToGroup can't be used with custom messages, but, is there any way I can put (even only text messages), on the screen and appear as being said by actors (I know about the gpHUDLogCenter way, but that is only usable as "server" messages).

Regarding RRR - can we force player's transfer into such a newly spawned plane? (I'm needing it for a single player mission/campaign). And even if RRR it would take 30 minutes, I would still like to now how, please.

Question: How can we change/set/force a new map time for a running mission (like in trying to skip over the night time into the following morning)?

Question: can you detail a little bit the way to use and effect of Follow and Cover way-path waypoints action types, please?

Question: Campaign mission branching. Can you explain it, please?

Request: dynamic way paths. It can be done (in an easier way then generating and over-writing them by hand into a mission file loaded then with a postload function)? This last one is more like a new request for the FMB: can assigning way paths to actor groups be made dynamic (like in not in the static way, using groups name, as it is now, but by having way-paths with unique identifiers and assigning them to groups by specifying the intended way-path unique identifier as a group's property)? And adding a new action AssignWaypathToGroup <group_name> <way-path_name> [<starting_waypoint_number>] :) ? This would be very useful by defining multiple way-paths on a map, and dynamically assigning groups to them, depending on randomly intended objectives..

Request: way-path waypoint new Wait action. A WaitForGroup way-path waypoint action would be very useful in having control on airfield circling while waiting for own group's airplanes to takeoff, or gathering a few groups, then send them together towards an objective. A WaitForGroup would need to have an area defined (in which to circle while waiting), a max waiting time (after which they will proceed to the next waypoint even if the waited groups haven't appeared) and a list of groups to be waited (to enter the waiting circle area)

Thank you for your answers, and time :)

naryv
30.06.2011, 10:53
I've suspected SayToGroup can't be used with custom messages, but, is there any way I can put (even only text messages), on the screen and appear as being said by actors (I know about the gpHUDLogCenter way, but that is only usable as "server" messages). You can use gpLogServer to send messages to selected players chat window, or


Regarding RRR - can we force player's transfer into such a newly spawned plane? (I'm needing it for a single player mission/campaign). And even if RRR it would take 30 minutes, I would still like to now how, please. Small_Bee's script that place player to plain is shown here : http://www.sukhoi.ru/forum/showthread.php?t=68629&p=1616450&viewfull=1#post1616450 . And about RRR - as i said chief programmer decide not to do RRR, so you can't do it, just read plane ammo, fuel, health, not set it.


Question: How can we change/set/force a new map time for a running mission (like in trying to skip over the night time into the following morning)? no, there is no way to change time during mission.


Question: can you detail a little bit the way to use and effect of Follow and Cover way-path waypoints action types, please? Cover type make AI cover ground units at point, them should barrage over this point. Follow is action that make AI just follow target group, no special action.


Question: Campaign mission branching. Can you explain it, please? You can take this archive : http://www.sukhoi.ru/forum/attachment.php?attachmentid=136504&d=1309250431 there is sample showing how to make your own addin - campaign . And if you make such campaign - you can branch mission as you wish at TstCampaign.cs .


Request: dynamic way paths. It can be done (in an easier way then generating and over-writing them by hand into a mission file loaded then with a postload function)? This last one is more like a new request for the FMB: can assigning way paths to actor groups be made dynamic (like in not in the static way, using groups name, as it is now, but by having way-paths with unique identifiers and assigning them to groups by specifying the intended way-path unique identifier as a group's property)? And adding a new action AssignWaypathToGroup <group_name> <way-path_name> [<starting_waypoint_number>] :) ? This would be very useful by defining multiple way-paths on a map, and dynamically assigning groups to them, depending on randomly intended objectives.. http://www.sukhoi.ru/forum/attachment.php?attachmentid=134622&d=1305794840 in this sample is shown how to make dynamic way paths for planes, and here - http://www.sukhoi.ru/forum/attachment.php?attachmentid=136566 sample for ground units.



Request: way-path waypoint new Wait action. A WaitForGroup way-path waypoint action would be very useful in having control on airfield circling while waiting for own group's airplanes to takeoff, or gathering a few groups, then send them together towards an objective. A WaitForGroup would need to have an area defined (in which to circle while waiting), a max waiting time (after which they will proceed to the next waypoint even if the waited groups haven't appeared) and a list of groups to be waited (to enter the waiting circle area) ok, i transferred request to AI programmer hi will look it.


Thank you for your answers, and time :)You are welcome:)

adonys
30.06.2011, 16:22
Do damage to a random part of a plane (not using the limited Switch construction, which only allows damage to the parts listed in it, therefore a limited number)?

i'll try answer tomorrow

I've made something like this:



// Script that triggered an accidental damage to the player plane
// Autor: adonys
// version: 1.1

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

public class Mission : maddox.game.AMission
{
AiAircraft PlayerPlane;

int PlanePartsNr = 117;

private string[] PlanePartsList = new string[]
{ "ElecGeneratorFailure",
"ElecBatteryFailure",
"ElecPrimaryFailure",
"ElecSecondaryFailure",
"ElecMasterCompassFailure",
"ElecWeaponryFailure",
"ElecPriNavigationFailure",
"ElecSecNavigationFailure",
"ElecTransceiverFailure",
"ElecIlluminationFailure",
"HydraulicsPumpFailure",
"HydraulicsPrimaryHosePerforated",
"HydraulicsPistonOpened",
"HydraulicsEmergencyFailure",
"HydraulicsTankPerforated",
"PneumaticsCompressorFailure",
"PneumaticsPrimaryContainerPerforated",
"PneumaticsSecondaryContainerPerforated",
"PneumaticsPrimaryHosePerforated",
"PneumaticsSecondaryHosePerforated",
"ControlsGenericKickdown",
"ControlsElevatorDisabled",
"ControlsAileronsDisabled",
"ControlsRudderDisabled",
"LandingFlapsPistonFailure1",
"LandingFlapsPistonFailure2",
"LandingFlapsKinematicFailure1",
"LandingFlapsKinematicFailure2",
"LandingFlapsDriveFailure",
"LandingFlapsHosePerforated",
"AirbrakeHosePerforated",
"AirbrakeDriveFailure",
"AirbrakePistonFailure",
"WheelBrakesFailureL",
"WheelBrakesFailureR",
"WheelBrakesTotalFailure",
"WheelBrakesHosePerforated",
"UndercarriageShockFailureL",
"UndercarriageShockFailureR",
"UndercarriageShockFailureC",
"UndercarriageUpLockFailureL",
"UndercarriageUpLockFailureR",
"UndercarriageUpLockFailureC",
"UndercarriageDownLockFailureL",
"UndercarriageDownLockFailureR",
"UndercarriageDownLockFailureC",
"UndercarriageKinematicFailureL",
"UndercarriageKinematicFailureR",
"UndercarriageKinematicFailureC",
"UndercarriageHosePerforated",
"UndercarriageDriveDamaged",
"Eng0TotalFailure",
"Eng0TotalSeizure",
"Eng0IntakeBurnt",
"Eng0CompressorFailure",
"Eng0CompressorGovernorFailure",
"Eng0CompressorSeizure",
"Eng0IntercoolerBurnt",
"Eng0CarbFailure",
"Eng0CarbControlsFailure",
"Eng0FuelLinePerforated",
"Eng0FuelPumpFailure",
"Eng0FuelSecondariesFire",
"Eng0Magneto0Failure",
"Eng0Magneto1Failure",
"Eng0OilPumpFailure",
"Eng0OilRadiatorPerforated",
"Eng0OilLineBroken",
"Eng0OilGasketLeak",
"Eng0OilSecondariesFire",
"Eng0OilSecondariesExtinguished",
"Eng0OilTankPerforated",
"Eng0WaterPumpFailure",
"Eng0WaterRadiatorPerforated",
"Eng0WaterLineBroken",
"Eng0WaterTankPerforated",
"Eng0WaterJacketBroken",
"Eng0CylinderHeadFire",
"Eng0CylinderHeadExtinguished",
"Eng0ExhaustHeadFailure",
"Eng0GovernorFailure",
"Eng0GovernorSeizure",
"Eng0ThrottleControlBroken",
"Eng0PropControlBroken",
"Eng0TretiaryControlBroken",
"Eng0PropBlade0Broken",
"Eng0PropBlade1Broken",
"Eng0PropBlade2Broken",
"Eng0PropBlade3Broken",
"Eng0Plug00Failure",
"FuelTank0TinyLeak",
"FuelTank0SmallLeak",
"FuelTank0LargeLeak",
"FuelTank0Fire",
"FuelTank0Exploded",
"FuelTank0HosePerforated",
"FuelTank0PumpFailure",
"Machinegun00Failure",
"Machinegun00BeltBroken",
"Machinegun00Jammed",
"Machinegun00Charged",
"Machinegun00LineDamaged",
"CockpitDamageFlag00",
"CockpitDamageFlag01",
"CockpitDamageFlag02",
"CockpitDamageFlag03",
"CockpitDamageFlag04",
"CockpitDamageFlag05",
"CockpitDamageFlag06",
"CockpitDamageFlag07",
"CockpitDamageFlag08",
"CockpitDamageFlag09",
"CockpitDamageFlag10",
"CockpitDamageFlag11",
"CockpitDamageFlag12",
"CockpitDamageFlag13",
"CockpitDamageFlag14",
};

private string[] PlanePartsListText = new string[]
{ "ElecGeneratorFailure",
"ElecBatteryFailure",
"ElecPrimaryFailure",
"ElecSecondaryFailure",
"ElecMasterCompassFailure",
"ElecWeaponryFailure",
"ElecPriNavigationFailure",
"ElecSecNavigationFailure",
"ElecTransceiverFailure",
"ElecIlluminationFailure",
"Hydraulics Pump failure",
"HydraulicsPrimaryHosePerforated",
"HydraulicsPistonOpened",
"HydraulicsEmergencyFailure",
"HydraulicsTankPerforated",
"PneumaticsCompressorFailure",
"PneumaticsPrimaryContainerPerforated",
"PneumaticsSecondaryContainerPerforated",
"PneumaticsPrimaryHosePerforated",
"PneumaticsSecondaryHosePerforated",
"ControlsGenericKickdown",
"Elevator disabled",
"Ailerons disabled",
"Rudder disabled",
"LandingFlapsPistonFailure1",
"LandingFlapsPistonFailure2",
"LandingFlapsKinematicFailure1",
"LandingFlapsKinematicFailure2",
"LandingFlapsDriveFailure",
"LandingFlapsHosePerforated",
"AirbrakeHosePerforated",
"AirbrakeDriveFailure",
"AirbrakePistonFailure",
"WheelBrakesFailureL",
"WheelBrakesFailureR",
"WheelBrakesTotalFailure",
"WheelBrakesHosePerforated",
"UndercarriageShockFailureL",
"UndercarriageShockFailureR",
"UndercarriageShockFailureC",
"UndercarriageUpLockFailureL",
"UndercarriageUpLockFailureR",
"UndercarriageUpLockFailureC",
"Undercarriage Left down-lock mechanism failure",
"Undercarriage Right down-lock mechanism failure",
"Undercarriage Central down-lock mechanism failure",
"UndercarriageKinematicFailureL",
"UndercarriageKinematicFailureR",
"UndercarriageKinematicFailureC",
"UndercarriageHosePerforated",
"UndercarriageDriveDamaged",
"Engine Total failure",
"Eng0TotalSeizure",
"Eng0IntakeBurnt",
"Eng0CompressorFailure",
"Eng0CompressorGovernorFailure",
"Eng0CompressorSeizure",
"Eng0IntercoolerBurnt",
"Eng0CarbFailure",
"Eng0CarbControlsFailure",
"Eng0FuelLinePerforated",
"Eng0FuelPumpFailure",
"Eng0FuelSecondariesFire",
"Eng0Magneto0Failure",
"Eng0Magneto1Failure",
"Eng0OilPumpFailure",
"Eng0OilRadiatorPerforated",
"Eng0OilLineBroken",
"Eng0OilGasketLeak",
"Oil is on fire",
"Eng0OilSecondariesExtinguished",
"Eng0OilTankPerforated",
"Eng0WaterPumpFailure",
"Eng0WaterRadiatorPerforated",
"Eng0WaterLineBroken",
"Eng0WaterTankPerforated",
"Eng0WaterJacketBroken",
"Eng0CylinderHeadFire",
"Eng0CylinderHeadExtinguished",
"Eng0ExhaustHeadFailure",
"Eng0GovernorFailure",
"Eng0GovernorSeizure",
"Eng0ThrottleControlBroken",
"Eng0PropControlBroken",
"Eng0TretiaryControlBroken",
"PropBlade Broken",
"Eng0PropBlade1Broken",
"Eng0PropBlade2Broken",
"Eng0PropBlade3Broken",
"Engine Plug 0 failure",
"FuelTank0TinyLeak",
"FuelTank0SmallLeak",
"FuelTank0LargeLeak",
"FuelTank0Fire",
"FuelTank0Exploded",
"FuelTank0HosePerforated",
"FuelTank0PumpFailure",
"Machinegun00Failure",
"Machinegun00BeltBroken",
"Machinegun00Jammed",
"Machinegun00Charged",
"Machinegun00LineDamaged",
"103 CockpitDamageFlag00: gunsight",
"104 CockpitDamageFlag01: instruments",
"CockpitDamageFlag02",
"CockpitDamageFlag03",
"CockpitDamageFlag04",
"CockpitDamageFlag05",
"CockpitDamageFlag06",
"CockpitDamageFlag07",
"CockpitDamageFlag08",
"CockpitDamageFlag09",
"CockpitDamageFlag10",
"CockpitDamageFlag11",
"CockpitDamageFlag12",
"CockpitDamageFlag13",
"CockpitDamageFlag14",
};

public override void OnTrigger(int missionNumber, string shortName, bool active)
{
if (("trigger01".Equals(shortName) && active))
{
//GamePlay.gpHUDLogCenter("Trigger Activated!");
DoDamage();
}
GamePlay.gpGetTrigger(shortName).Enable = false;
}

private void DoDamage()
{
PlayerPlane = (AiAircraft)GamePlay.gpPlayer().Place();

Random RandomIncident = new Random();

for (int i = 0; i < 3; i++)
{
int j = (RandomIncident.Next(1,PlanePartsNr) -1);
PlayerPlane.hitNamed ((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes),PlanePartsList[j]));
GamePlay.gpHUDLogCenter(PlanePartsListText[j]);
serverMessage("Failure: "+PlanePartsListText[j]);
}
}

private void serverMessage(string msg)
{
Player pl = GamePlay.gpPlayer();
Player[] players = { pl };
object[] args = { msg };
GamePlay.gpLogServer(players, msg, args);
}

public override void OnAircraftLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
GamePlay.gpHUDLogCenter("Excellent, you've managed to land!");
}

public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
GamePlay.gpHUDLogCenter("You've crash-landed, but you're still alive!");
}

}


I've tested it, and it works, but it is still based on a list of airplane parts (and another for failure messages). Can't it be done in a simpler way, like in a MG function hit-random-airplane-part() ?

Question: How can I verify if an airplane's part was hit, or not?

Question: how AiAircraft.hitLimb(part.LimbNames.<linmb_name>) and AiAircraft.cutLimb(part.LimbNames.<linmb_name>) are working?

Question: how can we check an AirGroup AiAircraft Actor's characteristics (altitude, heading, speed, aircraft's type, etc)?

Request: Also, regarding actor messages, if there's no such a function, to allow custom messages be said by actors (as in SayToGroup), can't such a function be made, please?

Request: if there's no such function to force a mission's time, can't such a function be made, please?

Request: regarding the custom campaigns using the AddIn method, not every campaign designer is also a coder, can't a generic .dll be made, loading campaign's paths ( USER_PATH = "$user/mission/tst/campaign/" and PATH = "$home/parts/tst/mission/campaign/") from an easily editable text/xml file? (I for one don't have the Visual Studio 2010 installed on my PC, so I can't compile those)

Thanks!

naryv
01.07.2011, 00:25
I've made something like this:


I've tested it, and it works, but it is still based on a list of airplane parts (and another for failure messages). Can't it be done in a simpler way, like in a MG function hit-random-airplane-part() ? No, there is no such fuction:) . We planed to brake plane parts not randomly, but according to situation :)


Question: How can I verify if an airplane's part was hit, or not? no way now, may be we'll add it later . Now it is just integral plane health parameter.


Question: how AiAircraft.hitLimb(part.LimbNames.<linmb_name>) and AiAircraft.cutLimb(part.LimbNames.<linmb_name>) are working? hitLimb just damages plane part and cutLimb - cut the part away from plane.


Question: how can we check an AirGroup AiAircraft Actor's characteristics (altitude, heading, speed, aircraft's type, etc)? You can use getParameter function - it gives you big list of characteristics - position of control surfaces, gauges indication, health and so on. Type of plane afair something like "TypedName".


Request: Also, regarding actor messages, if there's no such a function, to allow custom messages be said by actors (as in SayToGroup), can't such a function be made, please? ok, i transfer your request to programmers


Request: if there's no such function to force a mission's time, can't such a function be made, please? no game time is very important parameter, and many things depends on it.



Request: regarding the custom campaigns using the AddIn method, not every campaign designer is also a coder, can't a generic .dll be made, loading campaign's paths ( USER_PATH = "$user/mission/tst/campaign/" and PATH = "$home/parts/tst/mission/campaign/") from an easily editable text/xml file? (I for one don't have the Visual Studio 2010 installed on my PC, so I can't compile those)
ok i'll try compile it. By the way there are some free C# compilers like Visual Studio Express you can use it:)

adonys
01.07.2011, 00:48
Do damage to a random part of a plane (not using the limited Switch construction, which only allows damage to the parts listed in it, therefore a limited number)?

i'll try answer tomorrow.
No, there is no such fuction:) . We planed to brake plane parts not randomly, but according to situation :)

I'm still waiting for that code (only if you had something different in your mind than the way I've did it in the above code), please.


hitLimb just damages plane part and cutLimb - cut the part away from plane.

Yeah, I knew that, but I couldn't make it work (I've tried with the AiAircraft.hitLimb(part.LimbNames.WingL0); and AiAircraft.cutLimb(part.LimbNames.WingL0);, but I couldn't managed it to work). Can you please tell my how?


You can use getParameter function - it gives you big list of characteristics - position of control surfaces, gauges indication, health and so on. Type of plane afair something like "TypedName".

Question: Can you explain this
int personIndex = GamePlay.gpPlayer().PlacePrimary();
if (personIndex < 0)
personIndex = GamePlay.gpPlayer().PlaceSecondary();
AiPerson person = (GamePlay.gpPlayer().Place() as AiCart).Person(personIndex);
if (person.Health <= 0)
return;
if (Campaign != null) {
if (Campaign.battleSuccess != null)
return;
Campaign.battleSuccess = true;
}
GamePlay.gpHUDLogCenter("MISSION COMPLETE"); piece of code, please? it makes no real sense to me. IT's from the official gb campain and can be found in several missions at the end of the inherited OnActorDead function (for example in the "Stuka Intercept.cs" script). It looks like is checking to see if the player is still alive.. yet.. why check a secondary place (I assume PlaceSecondary it's a second seat, like the gunner in a Stuka), as the player is in a single seated aircraft, and why the as AiCart part, instead as AiAircraft? Please have mercy and try to enlighten me :)


Regarding the "CustomSayToAirgroup" function, we need to can put text in mouth of existent actors (AiAircraft or AiCart), or general (for control tower/radar/etc. speaking).

A list of these characteristics would be wonderful, from where can I get the members of the getParameter class, please?

Thank you again for everything, you've been very kind, sir :)

Geniok
01.07.2011, 16:11
Такой вопрос назрел:
Как из кода подключится к тому или иному серверу?
Поясню вопрос, как в настоящий момент реализована функция подключения например на странице выбора серверов.
Пробовал функцию void connectNew(int channel, string address, int port), но что-то не хочет работать.
Ну и сразу вдогонку вопрос, за что отвечает параметр "channel" в ней?

naryv
01.07.2011, 17:58
I'm still waiting for that code (only if you had something different in your mind than the way I've did it in the above code), please. no, i meant that we don't make such a function at all :) . Parts damages just on some conditions like overheat, bullet hit and so on. Your damage code looks good enough, i think it should work.

Yeah, I knew that, but I couldn't make it work (I've tried with the AiAircraft.hitLimb(part.LimbNames.WingL0); and AiAircraft.cutLimb(part.LimbNames.WingL0);, but I couldn't managed it to work). Can you please tell my how? part can be cut away if it presents at this aircraft AiAircraft.cutLimb(part.LimbNames.WingR2) for example works try it :)




Question: Can you explain this
int personIndex = GamePlay.gpPlayer().PlacePrimary();
if (personIndex < 0)
personIndex = GamePlay.gpPlayer().PlaceSecondary();
AiPerson person = (GamePlay.gpPlayer().Place() as AiCart).Person(personIndex);
if (person.Health <= 0)
return;
if (Campaign != null) {
if (Campaign.battleSuccess != null)
return;
Campaign.battleSuccess = true;
}
GamePlay.gpHUDLogCenter("MISSION COMPLETE"); piece of code, please? it makes no real sense to me. IT's from the official gb campain and can be found in several missions at the end of the inherited OnActorDead function (for example in the "Stuka Intercept.cs" script). It looks like is checking to see if the player is still alive.. yet.. why check a secondary place (I assume PlaceSecondary it's a second seat, like the gunner in a Stuka), as the player is in a single seated aircraft, and why the as AiCart part, instead as AiAircraft? Please have mercy and try to enlighten me :)
That code was written as pattern i think (i'm not author:) )- for any type of player controlled unit - single or multicrew, and used in different missions. AiCart - is base class for units that contains "peoples" so it is used instead AiAIrcraft to get Person and its health. And yes, this code checks if the "player" still alive:)



Regarding the "CustomSayToAirgroup" function, we need to can put text in mouth of existent actors (AiAircraft or AiCart), or general (for control tower/radar/etc. speaking). Yes, we discuss it same way.


A list of these characteristics would be wonderful, from where can I get the members of the getParameter class, please? part.ParameterTypes is what you need:)


Thank you again for everything, you've been very kind, sir :) Sorry i was very busy today, and has no time to compile compaign dll :( - i leave for two weeks vacation and should finish a lot of things, sorry again. By the way you can use C#compiler that was installed when you install Framework4 it is called "csc" and can be found in "WINDOWS\Microsoft.NET\Framework\v4.0.30319" folder .


Такой вопрос назрел:
Как из кода подключится к тому или иному серверу?
Поясню вопрос, как в настоящий момент реализована функция подключения например на странице выбора серверов.
Пробовал функцию void connectNew(int channel, string address, int port), но что-то не хочет работать.
Ну и сразу вдогонку вопрос, за что отвечает параметр "channel" в ней? channel - это номер канала по которому связывается сервер с игроком, если не ошибаюсь - у каждого игрока свой канал. А вот как связаться - увы не знаю, сейчас уже спросить не могу :(

Geniok
02.07.2011, 03:20
channel - это номер канала по которому связывается сервер с игроком, если не ошибаюсь - у каждого игрока свой канал. А вот как связаться - увы не знаю, сейчас уже спросить не могу :(

А когда сможете, не могли бы написать?!

adonys
04.07.2011, 18:37
Regarding the "CustomSayToAirgroup" function, we need to can put text in mouth of existent actors (AiAircraft or AiCart), or general (for control tower/radar/etc. speaking).
Yes, we discuss it same way.

As we'll still here, it would be very useful to can also optionally assign an audio file (in whatever IL2 CoD format needs) to this "CustomSayToAirgroup" function too (besides the text only) :)


part.ParameterTypes is what you need:)

I can imagine, but for that, I would need a C# project, with the .dll files from the core folder added to it :P

Thank you, narvy, and have a nice holiday :D !

aeros
04.07.2011, 20:36
Подскажите пожалуйста - с чем связан браузер объектов, кроме самолетов в третьей стороке окна "объект" ни какие объекты не отображаются, инсертом и самолеты на карту не вставляются. С чего начать??

-atas-
04.07.2011, 21:30
Подскажите пожалуйста - с чем связан браузер объектов, кроме самолетов в третьей стороке окна "объект" ни какие объекты не отображаются, инсертом и самолеты на карту не вставляются. С чего начать??

Начать лучше с редактирования чужих готовых миссий, тех что пришли с игрой, например. ПКМ на объекте и выбираете Свойства объекта (properties). Свойства откроются в браузере объектов как раз. Когда разберете десяток чужих миссий все станет понятно более менее.

Все объекты в браузере объектов выбираются. На карте кликнуть нужно сначала, чтобы INS сработал. Или CTRL-ЛКМ.

aeros
05.07.2011, 02:04
-atas-
Спасибо. В том то и дело - что не работает как должно. В Иловском редакторе простенькие миссии я собирал и азы знаю. Здесь же какая-то новая собака зарыта. Невозможно даже выбрать группу объектов в верхней строке чтобы они отображались в нижней(браузер объектов). Выбираешь корабли - внизу перечень самолетов, к примеру.(((

-atas-
05.07.2011, 09:52
Не было такого глюка. Можно проверить кеш, переустановить .net и др. программы из папки.

Vetochka
09.07.2011, 16:07
Подскажите как получить координаты Актора? Где-то проскакивало, но чего-то не могу найти.
....
Все разобрались. Доходчиво разжевано в Радаре от Маленького Пчела :)

Спасибо :)

-atas-
11.07.2011, 11:55
Подскажите как получить координаты Актора? Где-то проскакивало, но чего-то не могу найти.

naryv выкладывал здесь 3 своих миссии. По крайней мере в одной из них точно есть. Что-то вроде getPos и distance тоже.

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


Собственно написал:

Как работает - расставляем на карте маркеры, добавляем скрипт и всё - можно миссию запускать. Что делает скрипт: при инициализации битвы собирает все маркеры, приписывает к ним триггеры на переключение. В точке каждого маркера ставит артиллерию развёрнутую к ближайшему вражескому маркеру. От всех маркеров рождает группы танков, которые едут к ближнему вражьему маркеру или ближней вражьей группе(что ближе будет). Если на маркер приехали - перекрашиваем его и обновляем спаунточки, ну как и раньше. Если группу танков убили - рождаем от ближайшего к месту гибели своего маркера новую группу. Для примера в архиве миссия с уже расставленными маркерами, карта большая, в скрипте постарался всё закомментировать, если что-то захочется поменять, должно быть более менее понятно, если не понятно - постараюсь ответить:). Попробуйте, если есть желание.

Крайнюю версию выложил с описанием на западном форуме http://forum.1cpublishing.eu/showpost.php?p=307600&postcount=9

Тестируем на Repka #2. upd. Комментарии и багрепорты здесь http://www.sukhoi.ru/forum/showthread.php?t=69472

upd2. 18.07.11
Миссия все еще тестируется на Repka #2. После многочасовой работы ни одной группы танков на внешних видах не видно.
Комментарии и багрепорты здесь http://www.sukhoi.ru/forum/showthread.php?t=69472

RC_Politruk
21.07.2011, 16:17
В DamagerScore, который из maddox.game.world есть две числовые переменные (или как это правильно называется) score и time.
Вопросы:
1. Score, если я правильно все понимаю, показывает степень повреждения (кстати, в чем она измеряется?). Если смотреть список инициаторов сбитого самолета (как акторов :) ) по функции OnActorDead (из AMission), то в нем всегда есть сам убитый актор, у которого score больше нуля. Как это понять? Типа повреждения, которые наносятся не напрямую противником, записываются на самого актора. Например, противник повредил систему охлаждения (записано противнику), из-за поврежденной системы охлаждения накрывается двигатель (а это уже пишут самому актору). Или на убитого актора просто записывают очки повреждения от самого падения?

2. Что показывает параметр time? Как я понимаю это время нанесения последнего повреждения для инициатора.

Хотелось бы комментарий по этому поводу, что я правильно понимаю, что нет и как правильно?

-atas-
24.07.2011, 13:14
Крайнюю версию выложил с описанием на западном форуме http://forum.1cpublishing.eu/showpost.php?p=307600&postcount=9

Тестируем на Repka #2. upd. Комментарии и багрепорты здесь http://www.sukhoi.ru/forum/showthread.php?t=69472

upd2. 18.07.11
Миссия все еще тестируется на Repka #2. После многочасовой работы ни одной группы танков на внешних видах не видно.
Комментарии и багрепорты здесь http://www.sukhoi.ru/forum/showthread.php?t=69472

Миссию naryv временно сняли с Repka #2 для разгрузки ресурсов сервера и до возможного исправления отмеченных багов.

adonys
25.07.2011, 23:16
is there any way to load a .cs C sharp script file in a mission already running?

for example, if loading another mission, which has its own script, will this new script be loaded, or not?

Small_Bee
25.07.2011, 23:21
is there any way to load a .cs C sharp script file in a mission already running?

for example, if loading another mission, which has its own script, will this new script be loaded, or not?

Yes, together with mission (any) is loaded also the script with the same name.

naryv
26.07.2011, 17:05
I can imagine, but for that, I would need a C# project, with the .dll files from the core folder added to it :P Hi! Here is list of parameters :
138127


Такой вопрос назрел:
Как из кода подключится к тому или иному серверу?
Спросил, сейчас подключение для клиента недоступно.

Geniok
27.07.2011, 01:00
Спросил, сейчас подключение для клиента недоступно.
А планируется ли реализовать или пока неизвестно?

Small_Bee
27.07.2011, 01:01
Hi! Here is list of parameters :
138127


Спасибо, зело полезно!

red75prime
27.07.2011, 01:44
А есть ли возможность в скрипте миссии получить доступ к интерфейсу IPlayerStat для сбора статистики? Или может быть есть какой-то альтернативный способ?

Когда я попробовал использовать IPlayerStat оказалось, что gamePlay.dll (в которой этот интерфейс описан) даже не подгружается.

naryv
27.07.2011, 11:28
В DamagerScore, который из maddox.game.world есть две числовые переменные (или как это правильно называется) score и time.
Вопросы:
1. Score, если я правильно все понимаю, показывает степень повреждения (кстати, в чем она измеряется?). если не ошибаюсь, score - это степень участия инициатора в демадже, т.е. если игроки вдвоём пилили один самолёт, убили его и нанесли одинаковые повреждения, у score будет по 0.5, если троём с тем же результатом - по 0.3(3) ну и т.д., если поврежедния не одинаковые - то у кого повреждения более значительные, у того и score больше.


Если смотреть список инициаторов сбитого самолета (как акторов :) ) по функции OnActorDead (из AMission), то в нем всегда есть сам убитый актор, у которого score больше нуля. Как это понять? Типа повреждения, которые наносятся не напрямую противником, записываются на самого актора. Например, противник повредил систему охлаждения (записано противнику), из-за поврежденной системы охлаждения накрывается двигатель (а это уже пишут самому актору). Или на убитого актора просто записывают очки повреждения от самого падения? да, на убитого актора записывают оставшийся демадж от падения, если взорвать его в воздухе - ему ничего не запишется. Т.е. мы сломали ему мотор нам записали, допустим 0.6 демаджа, дальше он упал и разбился - ему 0.4 запишут.


2. Что показывает параметр time? Как я понимаю это время нанесения последнего повреждения для инициатора. да, так.


А планируется ли реализовать или пока неизвестно? вроде не планируется, а надо?


Спасибо, зело полезно! пожалуйста:)


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

Когда я попробовал использовать IPlayerStat оказалось, что gamePlay.dll (в которой этот интерфейс описан) даже не подгружается. Этот интерфейс для кампаний, в скрипте миссий не доступен. А альтернативный способ, вот как выше RC_Politruk-у писал - через события ActorDead и DamagerScore можно собрать.

-atas-
27.07.2011, 13:14
да, на убитого актора записывают оставшийся демадж от падения, если взорвать его в воздухе - ему ничего не запишется. Т.е. мы сломали ему мотор нам записали, допустим 0.6 демаджа, дальше он упал и разбился - ему 0.4 запишут.

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

Кстати, после сбития в лог тоже лучше писать имя игрока, управлявшего самолетом, а не ИИ, если игрок вышел до падения. Много недовольства по этому поводу. (Запретить выход из самолета в настройках сложности сервера пока нельзя, как обсуждалось в теме Repka.)

Tairo
27.07.2011, 14:19
да, на убитого актора записывают оставшийся демадж от падения, если взорвать его в воздухе - ему ничего не запишется. Т.е. мы сломали ему мотор нам записали, допустим 0.6 демаджа, дальше он упал и разбился - ему 0.4 запишут.
Извините, но считаю это явной глупостью, требующей незамедлительного исправления. Записывать игроку плюс за то что он сломал собственный самолет? В вышеприведенном примере атакующему должно быть записано 0.6, а атакуемому 0 или -(минус)0.4.
Если продолжить линию... атакуемый долетел до своего филда и сел - атакующему 0.6. (или просто сел живой на любой участок земли) Атакуемый не смог добраться до филда, упал, разбился - атакующему 1.0, так как самолет уничтожен полностью.

Small_Bee
27.07.2011, 14:44
Извините, но считаю это явной глупостью, требующей незамедлительного исправления. Записывать игроку плюс за то что он сломал собственный самолет? В вышеприведенном примере атакующему должно быть записано 0.6, а атакуемому 0 или -(минус)0.4.
Если продолжить линию... атакуемый долетел до своего филда и сел - атакующему 0.6. (или просто сел живой на любой участок земли) Атакуемый не смог добраться до филда, упал, разбился - атакующему 1.0, так как самолет уничтожен полностью.

Как интерпретировать эту информацию, целиком уже зависит от того, кто пишет статистику. Там нет ни плюсов, ни минусов, голая информация, кто сколько сломал.

BOT8
27.07.2011, 20:59
1 Как сделать чтобы боты атакавали не котнкретную цель а рандомно все в районе?
Точка штурмовка района не работает.
2 Как сделать чтобы боты летали моим сторем бизко др к др. Как в ил2 не работает если я ставлю точки близко они ставяться все равно в стороне на 100 или 200м др от друга.
3 Как сделать рулежку для взлета?
4 Почему когда я ставлю скажем 1 мессер е3 против 6 спитфаеров он не атакует их? Даже точка атакавать истребители не помогает.

adonys
29.07.2011, 13:10
is there any way to reference the AiActor when having the AiAircraft (you can do it the other way around using (AiAircraft)AiActor or AiActor as AiAircraft), please?

Vetochka
03.08.2011, 22:28
Возникла некоторая непонятка. Как правильно взлетать?
Вот простенький скрипт. Как какой-нибудь самолет взлетает, то появляется надпись "Взлетел", как садится - "Сел". У меня это работает со всеми самолетами кроме самолета игрока под управлением игрока. Если включить автопилот, то взлет скрипт засчитывает. Соответственно посадка после такого взлета не засчитывается. При старте в воздухе все в порядке, при взлете автопилотом тоже все в порядке.
Что делать с игроком?


public class Mission : AMission
{
public override void OnAircraftTookOff(int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftTookOff(missionNumber, shortName, aircraft);
GamePlay.gpHUDLogCenter("Взлетел.");

}

private void checkLanded(AiAircraft aircraft)
{

GamePlay.gpHUDLogCenter("Сел.");
}

public override void OnAircraftLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
checkLanded(aircraft);
}

public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
checkLanded(aircraft);
}

}

Соответственно .IsAirborne() для самолета игрока всегда ложь.

Geniok
04.08.2011, 12:25
А если вот так попробовать, будет работать?


public class Mission : AMission
{
private void checkLanded(AiAircraft aircraft)
{
if (GamePlay.gpPlayer().Place() == aircraft)
{
GamePlay.gpHUDLogCenter("Сел игрок.");
}
else
{
GamePlay.gpHUDLogCenter("Сел бот.");
}
}

public override void OnAircraftLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
checkLanded(aircraft);
}

public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft)
{
checkLanded(aircraft);
}

}

Ну и со взлетом то же самое.

LevPZ
04.08.2011, 12:43
@ Geniok

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

Vetochka
04.08.2011, 15:45
А если вот так попробовать, будет работать?

Не работает. Собственно изначально писалось для проверки взлета игрока иряда действий когда взлетит, а здесь выложено без чего-либо "лишнего". Т.е. проблема в том, что для самолета игрока в принципе OnAircraftTookOff не вызывается, а параметр .IsAirborne() всегда ложь. Соответственно раз не взлетал, то и сесть не может, т.е. OnAircraftLanded тоже не вызывается, когда садится игрок. Просто такое впечатление, что состояние "в воздухе" включается когда при взлете выполняется ряд операций, например, получение разрешения на взлет, отрыв, уборка шасси и еще что-то.

Vetochka
04.08.2011, 16:38
Vetochka, вы на яве пишите? Просто давно слышал, что ил на яве написан. Так для сэбэ.
Это вроде бы С#.

naryv
04.08.2011, 18:01
Возникла некоторая непонятка. Как правильно взлетать?
Вот простенький скрипт. Как какой-нибудь самолет взлетает, то появляется надпись "Взлетел", как садится - "Сел". У меня это работает со всеми самолетами кроме самолета игрока под управлением игрока. Если включить автопилот, то взлет скрипт засчитывает. Соответственно посадка после такого взлета не засчитывается. При старте в воздухе все в порядке, при взлете автопилотом тоже все в порядке.
Что делать с игроком?

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

Geniok
04.08.2011, 18:46
@ Geniok

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

Привет!
Да, я помню этот разговор.
Я имел ввиду как будто бы "скрипт" зашитый в самом коде игры. Конечно это не 100% факт, а только мое личное мнение, основанное на наблюдениях. Ну например как самолеты все становятся неуправляемыми при достижении определенной скорости. Я лично на 100% уверен что это сделано по скрипту вида: "Если скорость самолета больше, чем максимальная, начинаем хаотически двигать всеми управляемыми поверхностями".
Например при выходе игры лично разгонял мессер до 1000 км и ничего ему не было. Потом подняли хай, ввели вот этот "скрипт" и до 1000 уже просто не разгонишь, сильно болтает, хотя поверхности не отваливаются по-прежнему.
Так что пользователи увы изменить ничего не смогут, только разработчики, у них есть доступ к исходникам. Почему в Оффе и в он_лайне разные "законы" поведения, тоже к ним. К скриптам миссии это отношения не имеет.

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


Vetochka, вы на яве пишите? Просто давно слышал, что ил на яве написан. Так для сэбэ.
Ил не совсем на Яве. Если совсем быть точным, он является смесью явы и С++.