Собственно появился такой вопрос: Можно ли в скрипте получить как-то доступ с статическим объектам в миссии и их свойствам? Скажем к зданиям и т.п?
Вид для печати
Собственно появился такой вопрос: Можно ли в скрипте получить как-то доступ с статическим объектам в миссии и их свойствам? Скажем к зданиям и т.п?
К тем, которые, идут в миссии как объекты(можно по правой кнопке посмотреть) - емнип да, к зданиям стоящим на карте, опять таки емнип - нет.
Тут собственно почему спрашивал.. Так и не нашел, как этих статиков отследить.
Насколько я понимаю, они не являются AiActor (по крайней мере события на них не реагируют - уничтожен, поврежден и т.д.). Ни в Battle, ни в GamePlay методов никаких похожих тоже вроде не нашел. GamePlay.gpActorByName("StaticName") тоже ничего не дает. (
Jтследить уничтожение статика(ов) удалось только повесив на них триггер.
И еще заметил такую фиговину. Если загрузить миссию через GamePlay.gpPostMissionLoad, скажем с автоколонной, уничтожение автоколонны или машинок из нее - OnActorDead к примеру не вызывают. Загруженные таким же образом самолеты отрабатывают нормально.
Приложил миссии в аттаче. Там стодесятые отрабатывают по статикам (несколько машинок), по их убиению срабатывает триггер и загружает миссию - там новая группа стодесятых отрабатывает "колонну" из одной машинки.. По ее убиении OnActorDead не срабатывает.. ( Чего не так делаю, не въеду. (
В понедельник посмотрю, емнип, там что-то типа AiGroundGroup для машинок.
На каком языке вы разговариваете ?? xD Будет таки какая нибудь обучалка по редактору.. скрипты, триггеры... ??)) Мой нубский вопрос- можно как то отключить френдли фаер у зениток ?? всю статику на земле мне разворочили .. ))
Можно ли управлять включением- выключением аэродромных огней?
Скрытый текст:
Как заставить ботов на летающих лодках садится на воду и взлетать с воды?
Скрытый текст:
М.б. Вам стОит озадачится углами обстрела ЗА при их размещении?
Оффтопик:
Мне вспомнилась история из войны на Тихом океане, когда американский авианосец так яростно отбивался от японских самолётов, что крейсер охранения поднял сигнал "Сдаюсь".
Пока этих вещей нет, можно немного начинать изучать синтаксис C#. Собственно основные типы, циклы, конструкции, разобраться что такое интерфейс и что такое класс. Что такое наследование и области видимости. Когда гайд появится, будет намного проще, многое и без подсказок можно будет сделать.
Вот это или другую мурзилку посоветуете? http://simple-cs.ru/csharp.aspx
Здесь интереснее? http://www.realcoding.net/article/view/1748
Интереснее всего - msdn, имея при этом visual c# express и тренируясь на примерах.
P.S.
Интересно. А на vbasic скрипты не подцепятся?
Сорри, суматошный день сегодня, толком не посмотрел ничего:(
Да, статики, это не акторы, у них "мозга" нет, и они для красоты стоят, событий не вызывают, м.б. как-то можно добраться но сегодня не смог покопаться.
Вроде всё нормально работает - машинку когда застрелили - сообщение "Dead :0_Chief" выскочило.
--- Добавлено ---
нет
Нарыв, что можно сделать с перезарядкой?
"Мурзилок" таких дофига на самом деле, это уже дело вкуса - что лучше пойдет, то и читайте. MSDN штука просто незаменимая, но имхо, для новичка будет сильно замороченная. Кстати можно и на ты. :)
2 nariv
Насчет машинок в колонне наверное недоглядел, сорри...
Статики было бы хорошо как-то вытянуть, ибо получается, что "ресурсы" хранить негде.. Можно конечно закрывать их оптом по триггеру и загружать миссии с ними, но имхо, как-то не кошерно... А так разные снарядные ящики, бочки и грузы просто "высшим разумом" для этого предназначены. :) Конечно если бы и здания (по крайней мере те, что ручками ставятся), можно было отследить, было бы вообще кучеряво. :)
2 Mirmiy
Чой то у меня такой чувство, что когда таки AddIn`ы включат, его на VB.NET таки можно будет нарисовать, имхо... Все ж таки все оно суть CLR.. А со скриптами да, тут уже конкретный язык рулит..
С какой?
Ну, что поделать:)
Я, как времени побольше будет, посмотрю, что да как с ними можно делать, но когда точно - не могу сказать, а то наобещал на сегодня, а посмотреть мельком только вечером смог и то 10 минут:(. "Ручные" домики, емнип, это обычные стационарные объекты, так что с ними можно всё, что и с обычными статиками делать.
СКАЖИТЕ ПОЖАЛУЙСТА ЕСТЬ КАКАЯ НИБУТЬ ИНСТРУКЦИЯ К ПОЛНОМУ РЕДАКТОРУ А ТО БЕЗ СТО ГРАМ НИКАК НЕ РАЗОБРАТСЯ
ОЧЕНЬ ИНТЕРЕСУЕТ ВОПРОС КАК НА ДОКФАЙТОВСКУЮ КАРТУ ПОСТАВИТЬ ФИЛД И ЧТОБ ПРИ ЗАПУСКЕ СЕРВЕРНОЙ ИГРЫ МОЖНО ВЫБРАТЬ ХОТЬ КАКОЙТО САМОЛЬ И ЛЮДИ МОГЛИ ПОДКЛЮЧИТСЯ И ПОЛЕТАТЬ ВМЕСТИ?
Я ПОЛЬЗОВАЛСЯ РЕДАКТОРОМ В ПЕРВОМ ИЛЕ ИВСЕ БЫЛО ДОСТУПНО И ПОНЯТНО, А ЗДЕСЬ ВСЕ ЗАШИФРОВАНО
Глаза взорвались
Пока нету инструкции, пока все на уровне нет для дот, шарп для чайников, рефлексоров, масдайстудий..... скоро тут на форуме (судя по всему сами пользователи выложат инструкцию). но так как было в 1-м иле тут видимо не будет. зато возможностей море - смотри, приезжаеш в автосервис - тебе дают падьемник, набор напильников, отверток, спецуху и даже подскажут че крутить надо.... что ты...!
В общем со статиками так пока и не разобрался, но дошла одна маленькая вещь.. Как до жирафа.. Надо сильно забыть концепцию миссии из ила, т.к. тут как таковой миссии (с точки зрения Ила) не существует. Есть "битва", а в ее рамках выполняются различные миссии.
Миссия вообще умеет может загружать сама себя. Технически это конечно не так, но выглядит именно так. :) Т.е. из миссии мы приказываем через GamePlay.gpPostMissionLoad() загрузить в битву еще одну миссию, а что это за миссия - не важно. Походу общими для всех миссий является объект Battle и наверное GamePlay... Каждая миссия загружается под новым номером.
Скажем у меня есть одна миссия-хост (так сказать, "точка входа"). По OnBattleStarted() она загружает стартовый набор миссий (скажем одна - красные танки, вторая синие танки, едут навстречу). И в каждой из этих миссий отслеживается OnActorDead(). Если была уничтожена группа (она одна все равно), миссия загружает себя снова, сразу или по таймеру. Если помер танчик, то через несколько сек. убираем его трупик через Destroy(), что бы не мешался. Получается "бесконечная" стенка-на-стенку. :) Но миссия-хост понятия не имеет, что там творится. Вот в чем затык. (
Что делать со старыми, "сёгранными" кар... миссиями? Или если на круглосуточном сервере скажем рано или поздно счетчик выйдет за MAXINT?
Что есть поле MissionNumberListener? Пробовал присваивать номер свежезагруженной миссии - вообще всякие события вызывать перестало (в этой миссии).
Ну и собственно, пока не придумал, как эти миссии связать в одну кучу. Т.е. у Battle есть список миссий, но он в защищенном поле... облом.. Ивентов у Battle тоже нет. Подозреваю, для этого надо бы рисовать свой собственный Battle, а это будет доступно только в юзер-аддоне? Или есть другой путь?
Кстати интересная особенность (возвращаясь все к той же машинке из колонны). Похоже события миссии должны срабатывать только для своих "объектов".. Но они работают и для другой миссии - частично для "продвинутой" наземки и полностью для самолетов. Частично - имеется ввиду, что когда загружается новая миссия с акторами, в "старой" на каждого свежесозданного актора срабатывает OnActorCreated(), но никакой внятной инфы из параметров выдрать нельзя. shortName = "NONAME", actor не является ни группой, ни наземкой, вообще ничем походу... Хотя если в одной миссии поставить триггер "Враги прилетели", то если эта "анонимная" наземка из другой миссии туда заезжает, тригер срабатывает... Или я совсем уже запутался. :)
Я конечно кроме бейсика и алгоритмов ничего не проходил, но мне кажется, отслеживать OnActorDead() и делать Destroy() нужно в миссии-хосте, т.к. только она и есть на сервере. Т.е. каждой под-миссии свой .сs файл совсем не обязателен и даже поначалу вреден, т.к. слишком ветвит скрипт основной миссии.
Допустим: запущена миссия, которая определила стартовые аэродромы, дала общий брифинг, запустила один основной скрипт.
Основной скрипт делает:
Через 5 минут подгрузили новые цели: синие бомбят аэродром, красные топят транспорты. (Это уже в момент подгрузки стало частью хост-миссии.)
По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.
По тригеру транспорт потоплен, загружаются следующие цели: синим судам выйти в море. Красным вылететь на перехват судов, синие самолеты прикрывают суда.
По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.
По тригеру красный аэродром разбомблен синие начинают бомбить заводы. Красные вылетают на перехват....
По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.
Через 40 минут выступают красные танки, 110е отправляются на штурмовку. И т.д. собрать пакет из 50-100 подмиссий, связанных логически тригерами. Причем как и в жизни эти задания могут происходить одновременно.
По триггеру "посадка + 5 минут" уничтожаем ненужные тушки. По тригеру "умер" + 10 минут уничтожаем тушки ... и т.д.
Там где нужно добавить ограничения по времени, ограничение на количество одновременно проистекающих "подмиссий" и др.
Ко всему этому прикрутить интерфейс в котором игрок может выбрать для себя миссию из ожидающих взлета в данный момент как в WWII Online, занять слот вместе с сосквадниками в соответствующей комнате миссии и через 5 минут появиться вместе с ними на полосе для вылета.
На следующем этапе прикрутить веб- или игровой интерфейс, где командиры сквадов выбирают направления для атаки, распределяют ограниченные ресурсы (самолеты и наземку), выбирают тип атаки (тип миссии) и т.п.
Где не прав, поправьте.
Юмор в том, что наземка при гибели не вызывает OnActorDead в миссии-хосте. Только "родная"... Возможно так и задумано, возможно баг. Вообще наземку можно стартовать и по скрипту (ставить в свойствах "Старт по скрипту" прикрепить к группе экшен и из скрипта этот экшен запускать). НО, снова юмор. Такая галка для наземки как-то глючно работает, плюс наземные группы с такой галкой в начале миссии не создаются, но и появляться тоже упорно не желают. С самолетами этот номер проходит на ура, кстати. Я в соседней теме выложил миссию, можете поэкспериментировать.
Вообще я так и предполагал сделать. Миссия-хост, в ней свои переменные - ресурсы, состояния и т.д., и она всем остальным крутит. но.. Наземка "скриптом" не стартует, только через загрузку другой миссии, отследить состояние наземки из другой миссии тоже не могу.. Вот так вот. (((
Интерфейс и прочее... возможно когда разрешат аддоны делать... Пока его прикрутить чего-то не вышло (((
Возможно попробовать стоит такой принцип - раз обьекты подгруженные к баталии в субмисии не контролируются из другой субмисии, то собственно, все родные для субмиссии объекты должны контролироваться скриптом этой субмисии, то есть по логическому завершению этой саммой мисии дестроится как по гибели так и по достижению цели.
Думаю, либо баг, либо не успели доделать наземку либо как-то по-хитрому делается. Скрипт - это же код программы, насколько я понимаю, какая разница, в каком .cs файле он прописан? Главное, чтобы программа его нашла и выполнила по большому счету. Но вероятно есть тонкости, которых не знаю.
Эта ветка с вопросами, думаю будут и ответы )
зы. проблема только статиков касается или всей наземки?
Ну, в общем как я и говорил, сейчас статики - мишура и акторами не являются, интерфейса для доступа к ним нет, посмотрим, может быть в будущем сделаем.
Да, всё так.
Можно баталию останавливать саму.
это поле, которое показывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - поле в меньше нуля выставить надо.
тут пока не могу сказать, в юзер-аддоне можно свою Battle описывать и миссии загруженные дёргать.
надо посмотреть, тут я не помню.
Это было бы гуд, тем более что артиллерия тоже в статики записалась.
О, супер, походу то что надо, вечером попробую..Цитата:
это поле, которое показывает события какой миссии скрипт миссии слушает - при загрузке миссии в это поле ставится её номер - т.е. она "слышит" только свои события. Если выставить номер другой миссии - будет "слушать" только её, чтобы все миссии слышать - поле в меньше нуля выставить надо.
Походу, с MissionNumberListener много вопросов снимаются. А скрипт отдельной миссии нужен конечно, скажем так одну битву можно будет дополнять сколько хошь новыми интересными миссиями, не ломая старое.
1.Готовые программы, оттранслированные в машинный код, выполняются значительно быстрее скриптов, которые интерпретируются из исходного кода динамически при каждом исполнении. Поэтому скриптовые языки не применяются для написания программ, требующих оптимальности и быстроты исполнения. Но из-за простоты они часто применяются для написания небольших, одноразовых («проблемных») программ.
а для чего нужно сторонним людям ковырять готовую прогу...
Думаю, что в данном случае это не совсем скрипт. Просто класс компилируется во время исполнения и становится частью всей большой программы.
А ковырять всю программу приходится чтобы этот класс заставить работать так, как хочется - т.е., понимать как он встроится в игру и что из него можно в игре сделать.
Это к чему? Вообще в С#, как правильно выше заметили, есть такое понятие как "динамическая компиляция", не надо путать это с тем же PHP или JS. К тому же в C# все классы\сборки умеют хранить в метаданных исчерпывающую информацию о себе самих. Так что к "ковырянию" это тоже отношения не имеет. Есть такое понятие как "рефлексия" или "отражение".
--- Добавлено ---
При чем тут проблемный? или одноразовый? :)
--- Добавлено ---
Грубо говоря, .NET приложение может само себя написать, скомпилировать и запустить на выполнение. :)
Никакой юзер-интерфейс не обеспечит такого функционала, который может полноценный язык, не говоря уже о том, сколько времени и сил уйдет на его написание и отладку. Причем сложность его будет сравнима с каким ни будь про-инжинир, учить надо будет отдельно в институтах. Базовые возможности существующий интерфейс предоставляет, а скрипт если и ограничивает фантазию, то не очень сильно. К тому же С# сам по себе очень простой язык, как в освоении, так и использовании. Для повседневных задач, я бы сказал, не сложнее HTML`a (во загнул). :)
Все верно.... скрипты это гуд.
Я возможно заблуждаюсь, но я всегда считал что NET приложение строго говоря компилируется в маш. коды при первом запуске у пользователя в его системе фреймворком.... ну хз конечно.
Нет.
.NET приложение компиллируется (обычно) как обычно - программистом, написавшим это приложение. Просто, для его выполнения, нужна "песочница", называемАя .NETFRAMEWORK.
Но может и динамически компиллировать исходники и прямо на лету их подгружать.
В бесплатной visualstudio (express) прекрасный интерфейс и куча сервиса для простых пользователей.
Изобретать скриптовый язык нафиг не надо. Тем более, что столько возможностей он никогда не обеспечит.
С другой стороны, совершенно не понятно почему, используя .net, надо было заниматься динамической компилляцией, а не подсовывать вместо текстового файла, скомпиллированную длл-ку - оно бы и в плане отладки было удобнее.
И почему совершенно не используются события и делегаты, а организовано всё через абстрактные классы а не интерфейсы?
К тому же, нет доступа к объектам в миссии, а всё взаимодействие через классы-посредники.
Не знаю - может, в этом какой-то смысл разработчики увидели, мне пока не доступный..., но странно всё это выглядит.
Да ладно, нормально выглядит. Имхо посредники (хз, мож и посредники, не слишком силен) для того, что если в кишках что поменяется, не пришлось скрипты заново переписывать. Для не слишком сложных задач юзаем скрипт - можно по быстрому накидать, плюс сменять что то безболезненно, если хотим что то более глобальное - аддон. Когда то же они заработают. :)
Классов для скриптов там всего три если не ошибаюсь - собственно AMission, Player и ABattle, остальное интерфейсы.
Событий да, не хватает, имхо...
А я вот всегда думал... что оно вот типа так:
http://habrahabr.ru/blogs/net/109117/
"по структуре .NET программы, для тех кто не знаком с разработкой под данный Framework: весь код, написанный на любом .NET языке (C#, Visual Basic, F#, Delphi.NET) компилируется в особый Intermediate Language, называемый обычно IL или MSIL. Это что-то типа ассемблера, только весьма умного и обладающего весьма мощными инструкциями. И это, в принципе, такой же равноправный язык как и C#, только синтаксис похуже (а возможности больше). Кроме того, в программе на .NET активно используются метаданные, т.е. вся информация о классах, метода, пропертях, атрибутах и всём остальном сохранена в исполняемом файле.
Т.е. на самом деле, декомпиляция программы не очень верное понятие в данном случае. Она и так вся в открытом виде лежит, а инструменты в виде Reflector'а занимаются тем, что приводят конструкции MSIL к соответствующим конструкциям C# или другого языка, повышая читабельность кода."
Так для этого и нужны интерфейсы - всё, что за ним - переписывай хоть с нуля, хоть каждый день, а интерфейс остаётся и всё, что работает через него, тоже остаётся.
Это и есть почти тот же абстрактный класс.
В интерфейс миссии вынеси несколько методов для получения ссылок на объекты в этой миссии.
В интерфейсах объектов определи все их игровые события, свойства и методы, доступные из пользовательского кода.
Дальше в скрипте определяем делегаты только тех событий, которые хотим отследить (имея подсказку прямо в студии при написании скрипта).
Объекты (что родные, что пользовательские) наследуются от всех необходимых интерфесов, часть из которых используются только ядром, а часть - могут использоваться пользователем. И при создании нового объекта достаточно просто реализовать всё необходимое.
В этом суть ооп и структурированности, им обеспечиваемой.
Ребята, а подскажите скрипт к мисии должен из одного *.cs файла состоять или можно разбить на несколько таковых файлов? Ну ради того чтоб свой добавить к чужому?
Если я правильно понимаю, то файл скрипта определяется по имени, совпадающим с именем миссии. Поэтому должен быть один. А вот можно ли в одном файле прописать несколько классов, наследуемых от AMission (просто скопировать определение класса из другого скрипта)?
Не вижу области применения для такого решения. :) Другие свои классы можно в том же файле объявлять и описывать, и они работают - проверил уже. Но, даже если мы объявим статический класс со статическими полями же, из другого скрипта миссии его видно не будет. :)
Интерфейсы это хорошо, но решение сделать AMision, Player и ABattle именно классами вполне, имхо, логично. В будущем в аддоне мы сможем наследоваться от этих классов, писать собственную реализацию (скажем для миссии под каждое событие сделать делать соотв запись в базу или лог), а в скрипте наследоваться от собственного класса миссии, просто не забывая вызывать базовую реализацию методов. В случае интерфейса нам бы пришлось каждый раз все заново писать. Тоже самое и для ABattle и Player. Таким образом сделаны миссии для кампании - в скрипте мы наследуемся не от AMission, а от специфичного для кампаний класса.
Пока мне реально не хватает только доступа к статикам.
Появился такой вопрос: Как в скрипте вытянуть тип самолета? В смысле не бомбер/истребитель, а скажем He-111 или G.50. Ну и касательно наземки тоже. GetType() не помогает - походу реальный класс экземпляра динамический? Даже базовый тип и тот с нечитаемым именем... (
И еще в догонку. Как убрать разбитые/разрушенные статики? Они сволочи с миссией то подгружается, их раздолбят, а они радостно чадят до посинения.. И ничего им сделать не могу... Или они как-то по времени сами уйдут? И схожий вопрос.. Миссию мы загрузить можем, а вот выгрузить... Можно это как-то сделать? Скажем что бы убрала все за собой при выгрузке. Это сняло бы проблему со статиками.
В ближайших патчах будет InternalTypeName() для самолётов и наземки.
Горят до ~20 минут. Выгрузить - это сложно, миссия же может по скрипту кого-то нарожать, что-то в себя подгрузить и т.д. Скорее всего будет доступ к статическим объектам, но не прямо сейчас , чуть позже.
Как сделать так, чтобы танкеры рождались не по одному, а сразу группой?
Вооружить танкеры зенитками не удалось. Не нашел где выбрать тип загрузки - зенитки. Подскажите, кто разобрался.
Такой вопрос возник, как определить, имеется ли самолет какой-либо группы в данный момент или нет?
Поясню. У немцев названия группы содержат знаки (|, ||, |||, |V, V, V|) и так далее. Но, при написании скрипта игра подобные знаки игнорирует.
С англичанами проблем нет, у них обозначения цифровые, например 218Sqn. А вот у немцев обозначения типа JG51_| игра в упор не видит. Может стоит заменить | на 1, || на 2, ||| на 3, |V на 4 и т.д. ?