Это будет хорошо, если сделаете. :) А пока будем определять взлет по высоте и скорости.
Вид для печати
На всякий случай дубль http://www.sukhoi.ru/forum/showthrea...=1#post1669388
Как-то можно в одиночной миссии установить новое игровое время? Или сделать пропуск какого-то временного участка?
Например, миссия началась в 10:00 игрового времени, полетали, постреляли, вдруг произошло какое-то событие, после которого установилось игровое время 12:00. Такое возможно?
Да, системное время желательно не трогать :)
Visual studio 2010.
Качать отсюда:
http://www.microsoft.com/visualstudi...csharp-express
Только ты не по адресу обращаешься :) У нас тут много программистов, а мои интуитивно-обрывочные школьные знания и знания моего соавтора кампаний явно малы, чтобы еще кому-то чего-то объяснять.
Я могу подробно объяснить как ликвидировать или зарегистрировать ООО или на что в суде напирать, чтобы доказать свои правоту :D
@ naryv
Накропал как мог http://www.sukhoi.ru/forum/showthrea...=1#post1671559
А что конкретно не получается? Флажок? Сторона? Аэродром? Самолет?
Бывает, что в настройках сложности запрещают выбор стороны. Нужно там 4 галочки снять справа внизу.
А, ну и миссию сначала запустить нужно, а потом самолет создавать ;)
Я запускал срвер из интерфейса и летал. Просто с настройками что-то.
--- Добавлено ---
Это точки где спаунятся самолеты на аэродроме. Один из объектов аэродрома в редакторе. В настройках клавиш в игре (не в редакторе) нужно назначить клавишу для команды branch (ветвление), чтобы оставлять рулежки мжду этими точками.
2 точки кажется должны находиться на ВПП, чтобы боты туда выруливали. Посмотри как в миссии с Р3 они поставлены красиво.
Возник вопрос следующего плана.
1. В каких единицах возвращается значение по запросу Z_VelocityIAS и подобные? Получал с subtype=-1. Значение в среднем ниже на 2,36, если ориентироваться по прибору в км/ч на 500-х метрах.
2. Так как не совсем ясно, в каких единицах возвращается значение по вопросу выше, пробовал получать по Z_VelocityMach. Стало похоже на правду, но возник еще вопрос: конкретное значение ск. звука зависит от температуры воздуха?
В общем, коротко говоря, мне надо получить TAS и IAS в понятных единицах измерения.
Если создавать свой новый аэродром, то самолеты будут рождаться на его окружности (внутренней если нет ВПП и внешней, если создать ВПП) если не создать аэродромные точки. Самолеты вероятно рождаются на том аэродроме, ближе к центру которого расположена точка спауна. Радиус окружности можно кстати отредактировать в файле миссии в блокноте, чтобы сделать его меньше, чем предусмотрено редактором.
Маркеры видимо можно поставить в редакторе, потом открыть миссию в блокноте и скопировать координаты в файл .section
Черный экран - это возможно нехватка памяти или глюки драйверов или директ-Х. Никогда такого не было. Все 4 галки снять нужно, может из-за них.
так я же тебе даже прямую ссылку давал на тему о выделенном сервее, там все вроде разжевано...
самый простой (но не самый удобный и быстрый способ) запускаешь выделенный сервер. потом входишь в стим, свойств игры и в параметрах запуска удаляешь команду -server запускаешь игру и сам к себе присоединяешься.
но лучше написать cmd-файл для запуска сервера.
Это через триггеры не сделаешь. Триггер "уничтожение группы" вроде как работает только для групп, запущенных в первой миссии, а на группу, которая уже запущена скриптом триггер первой миссии не срабатывает. Возможно я чего-то не догнала.
Так что либо делать загрузку миссий как предлагает Женя, по идеи триггер, приписанный в загружаемой миссии должен работать. Но я не проверяла.
Либо вот так:
Вот этот скрипт по идеи должен работать. Как танкер тонет, то рождается новый в начальной точке.
Проверить не могу, т.к. БзБ нет под рукой.
По любому нужно писать скрипт.Код:public class Mission : AMission
{
// ------------
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> initiatorList)
{
if (shortName.IndexOf("0_Chief", 0) > 0) //0_Chief краткое имя корабля, см. в файле миссии в разделе [Chiefs]
{
AiAction action = GamePlay.gpGetAction("a1"); //a1 - действие по рождению танкера, которое прописывается в редакторе
if (action != null)
{
action.Do();
}
}
}
}
Именно так. Но с триггерами все просто.
Внутри AMission дописываем следующее:
Код:public class Mission : AMission
{
// ------здесь скрипт, который уже был, его не трогать. Вставлять дописанное перед последней скобкой скрипта
// ----- вставлять отсюда -----------------
public override void OnTrigger(int missionNumber, string shortName, bool active)
{
AiAction action;
if ("tname1".Equals(shortName) && active) //tmane1 - имя 1-го триггера
{
GamePlay.gpGetTrigger(shortName).Enable = false;
action = GamePlay.gpGetAction("aname1"); //aname1 - имя действия 1, которое вызывается по срабатыванию 1-го триггера
if (action != null)
{
action.Do();
}
}
if ("tname2".Equals(shortName) && active) //tmane2 - имя 2-го триггера
{
GamePlay.gpGetTrigger(shortName).Enable = false;
action = GamePlay.gpGetAction("aname2"); //aname2 - имя действия 2, которое вызывается по срабатыванию 2-го триггера
if (action != null)
{
action.Do();
}
}
// аналогично можно вставлять сколько удодно триггеров и привязывать к ним действия
}
// ------------ до сюда
} // а это последняя скобка скрипта :)
Можно ещё проще :так все триггеры будут запускать одноимённые экшены, не надо на каждый триггер код писать.Код:
public override void OnTrigger(int missionNumber, string shortName, bool active)
{
base.OnTrigger(missionNumber, shortName, active);
AiAction action = GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName));
if (action != null)
action.Do();
}
а в чём "скрип"? Может быть MissionNumberListener неверно установлен? Напомню, на всякий случай - по умолчанию каждая миссия "слышит" только свои события, т.е. если управляющий скрипт у нас в первой запущенной миссии, она не узнает о событии вызванном триггером или актором в подгруженной другой миссии. Чтобы скрипт "слышал" все события - надо установить параметр MissionNumberListener в -1 , вот так:
, теперь такая миссия "слышит" события во всех дозагруженных миссиях .Код:public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
}
В свое время я просто не знал, что такой код можно вставить в скрипт, чтобы триггеры заданные в редакторе работали вместе со скриптом брошенным в папку миссии. Т.е. одноименные триггеры заданные в редакторе у меня срабатывали пока у миссии не было скрипта, а как только у миссии появлялся любой скрипт, то почему-то триггеры, заданные в редакторе, но не прописанные в скрипте переставали работать.
Можно было бы это устранить, чтобы не обязательно было в скрипт вставлять этот код, а было бы достаточно задать триггер и акшн в редакторе. andersbravers не даст соврать, скрипты для картодела это что-то совсем непонятное и отталкивающее на первом этапе. andersbravers например сделал больше недели назад миссию для Р1, а оказалось, что триггеры заданные в редакторе в ней не работают, т.к. не прописаны в скрипте. Т.е. на тестовой карте без скрипта триггеры работают, а когда переносишь их в миссию со скриптом триггеры перестают работать. Непорядок :)
Понятно. Ну тут получается так - если создателю миссии достаточно просто триггеров и средств редактора, без скриптов - тогда связка триггер-экшн работает без скрипта. Ну а если планируется использовать скрипт - тогда надо написать, что делать с этой связкой в миссии - т.к. управление игровыми событиями переходит к скрипту, предполагается, что если создатель миссии пишет скрипт, он сможет записать и вышеописанную конструкцию, либо свою обработку реакции миссии на триггер:).
Есть еще 3я категория пользователей, достаточно многочисленная, которая триггеры пишет в редакторе, а потом скачивает с форума какой-нибудь скрипт с нужным функционалом и бросает его в папку с миссией. Важно, чтобы все, что было создано в редакторе не переставало при этом работать, включая триггеры и экшны.
PS. Кстати, на продолжение темы танковых битв для Репки2 можно надеяться? Не к спеху, просто когда -нибудь?
@ naryv
А можно ли только триггерами задать непрерывное возрождение группы или группа может возобновлятся только один раз?
У меня получалось, но не до бесконечности. Т.е. в какой-то момент возрождение почему-то сбивалось. Поэтому надежнее запускать группы по времени все-таки с определенным интервалом на случай, если триггер вдруг не сработает. А внутри интервала уже можно возрождать триггером.
ну тогда надо кусочек, что я выше привёл вставить в скрипт - тогда триггеры отработают как и задумывалось в редакторе:)
да, я начал делать, но сейчас очень плотно с патчем занят, чуть посвободнее буду - продолжу
честно говоря не пробовал, наверное надо поставить триггер уничтоженной группы на группу, и экшн, который будет рождать её-же. Правда не уверен, что она не посчитается уже рождённой, надо пробовать.
попробовал, без скрипта не получится. Дело в том, что рождённые по скрипту группы создаются уже в новой миссии а триггер работает по имени основной миссии+имя группы. В общем надо скриптом грузить миссию в которой стоит триггер на уничтожение объекта из миссии. И по этому триггеру опять грузить эту миссию, так получится бесконечный цикл уничтожения-восстановления группы.
нет, триггеры и экшены сделаны для общих задач, всё узкоспециализированное - только скриптами.
Триггер 123TankerDestroyed, например, ты все равно задаешь в редакторе в подмиссии 123.mis. А дейстивие "загрузить подмиссию 123.mis" при срабатывании триггера 123TankerDestroyed прописываешь в главном скрипте миссии.
Чтобы читать скрипты советую за 2 вечера просмотреть вот эту книжку http://www.hse.ru/ru/news/25546368.html или что-то с таким же содержанием в интернете. Потом прочитать все скрипты из выложенных ранее миссий. Многие вопросы отпадут.
не так, не важно кто потопит корабль, при его потоплении, миссия с кораблём загрузится снова - вот пример: Вложение 139719 в миссии ship.mis танкер плывёт и есть триггер на его уничтожение, в основной миссии ship_respawn эта миссия грузится при старте и при потоплении танкера, по триггеру ship_Destroy из миссии ship, будет грузиться каждый раз при уничтожении танкера.
в этом же примере группа штук атакует баржи, т.к. target не указан - боты сами разбирают себе цели.
Вау! это решит многие проблемы.
В каком радиусе и как долго бомберы будут искать себе цели? Т.е. если танкеры только что родились где-то далеко, бомберы полетят их искать в их направлении или как долго будут ждать их подхода?
Тот же вопрос, если бомберам будет указана 3я точка маршрута с посадкой, будут ли они искать цель в каком-то радиусе или ждать ее какое-то время?
Просто есть идея возрождать танкеры по триггеру, а бомберы по времени и они могут рождаться и подходить к точке рандеву совсем не одновременно.
ps. Если танкеры и бомберы рождаются в разных подмиссиях, бомберы про танкеры будут "знать", будут их искать?
по времени... по времени было бы круто когда неизвестно по какому. каждый раз какое-то случайное бы.. от 25 до 45 минут. было бы интереснее, жизненнее. то вот на подходе атака, а то вот уже вот, вражеский берег близко, и тут летять!! летять наши!!!
5 км
если это крайняя точка маршрута - будут летать ждать.
цель поищут в 5 км, если не найдут - бомбы кидают в молоко и на посадку.
тогда лучше ставить бомбардировку конечной точкой маршрута, а по TaskComplite - у - отправлять их на аэродром.
если таргет не указан - бомберы про корабли не знают, но когда те появятся в 5 км - "увидят", не важно из какой миссии. Можете поэкспериментировать на примере выше - в основной миссии с барж перенаправьте бомберов в район куда приходит танкер.
да, забыл написать, что просто в missions положить надо. Ничего со слэшами делать не нужно. Насчёт барж - они для того чтобы показать как бомберы разбирают цели, подгружается после уничтожения - танкер, он идёт от круглого острова на юг, никаких барж в скрипте нет.
Галки не нужно. Корабль грузится в начале, потому что в скрипте есть строка, которая подмиссию грузит в начале. Но если его не грузить в начале, то триггер же никогда не сработает, потому что уничтожать будет нечего :) Что бы что-то уничтожить нужно это сначала загрузить. Логично?
Скрипт лучше читать перед запуском. Там обычно 50% понятно интуитивно по названию функций.
ну, это логично - если меняете баржи на танкеры - получатся танкеры:)
нет, танкер в ship.mis не рождается экшеном, вся миссия подгружается в основную. Если галку поставите - он не родится, никакой команды на спаун ему никто не отдаст. Галка - не нужна.
так и должно быть.
правильно, я же написал - первый танкер грузится при старте основной миссии, вот здесь:. Можно загрузить его не на старте а по таймеру, например. Надпись выскакивает показывающая что триггер отработал.Код:public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;
GamePlay.gpPostMissionLoad("missions\\ship.mis");
}
Чтобы миссия с танкером подгрузилась не на старте - надо сделать какое-нибудь условие, например поставить триггер на уничтожение баржи, и потом , в скрипте, написать, что при срабатывании этого триггера - надо загрузить эту ship.mis , как здесь:только вместо "ship_Destroed" своё название триггера поставить. Что - то типа такого :Код:public override void OnTrigger(int missionNumber, string shortName, bool active)
{
base.OnTrigger(missionNumber, shortName, active);
if ("ship_Destroed".Equals(shortName) && active)
{
GamePlay.gpHUDLogCenter("Ship destroed. New ship spawn");
GamePlay.gpPostMissionLoad("missions\\ship.mis");
}
}
"barzha_Destroed" - это название вашего триггераКод:public override void OnTrigger(int missionNumber, string shortName, bool active)
{
base.OnTrigger(missionNumber, shortName, active);
if ("ship_Destroed".Equals(shortName) && active)
{
GamePlay.gpHUDLogCenter("Ship destroed. New ship spawn");
GamePlay.gpPostMissionLoad("missions\\ship.mis");
}
if ("barzha_Destroed".Equals(shortName) && active)
{
GamePlay.gpHUDLogCenter("Ship destroed. New ship spawn");
GamePlay.gpPostMissionLoad("missions\\ship.mis");
}
}
для этого самый простой способ - разнести все кораблики по подмиссиям - т.е. один кораблик - одна подмиссия, и при уничтожении кораблика - грузить снова подмиссию с ним.
--- Добавлено ---
5 барж к респауну танкера отношения не имеют! Их можно выкинуть из миссии вообще, я их вставил, чтобы показать как задавать цель бомберам.
Вот, как выше писал - каждый танкер из своей миссии грузится, никаких больше барж:) : Вложение 139736 положить в missions, старые файлы заменить, загружаются 4 подмиссии в каждой идёт танкер, соответственно 4 штуки идут от круглого острова на юг, при уничтожении какого-то из них опять подгрузится миссия с уничтоженным и он начнёт свой скорбный путь заново:)
@andersbravers
Может anders ты подскажешь.
--- Добавлено ---
Спасибо!
@ naryv
А как сделать, чтобы новые корабли на обломки не наезжали или по крайней мере не рождались внутри обломков?
Этот вопрос уже был по статическим кораблям, зениткам и проч. Т.е. если новы объект рождается на месте обломков обломки надо бы убрать. ИМХО лучше в коде игры, чтобы каждый объект в скрипте не прописывать.
Пока это не возможно, что добавить в скрипт , чтобы при приближении к обломкам возродившегося танкера идущего по тому же маршруту их убирать? Или для начала не рождать танкер в обломках? В идеале можно рядом рождать, а обломки уничтожать через час, например, чтобы сервер не грузили. Или обломки за час сами исчезнут? Некоторые суда садятся на мель после бомбардировки и не исчезают.
Пересечение объектов некрасиво смотрится. В коде бы "защиту от дурака" вставить. В моей миссии то же самое было.
Нет, нельзя, корабль уже является "группой" состоящей из отдельных частей связанных вместе.
Я бы рождал новые после таймаута, например, так:
новый корабль загрузится соответственно через три минуты, не будет один в другом рождаться.Код:base.OnTrigger(missionNumber, shortName, active);
if ("ship_Destroed".Equals(shortName) && active)
{
GamePlay.gpHUDLogCenter("Ship destroed. New ship will be spawn 3 minutes later");
Timeout(180, () => {
GamePlay.gpPostMissionLoad("missions\\ship.mis");
});
}
да по идее обломки через какое-то время должны исчезать сами, минут 20 по-моему.
за час должны бы исчезнуть уже. На мель не садятся, просто недобитые - плавучесть сохранилась, если пробоины мелкие - заполнятся трюмы могут и несколько часов до потопления, хотя так редко бывает.
есть временная задержка на прогнозирование наземкой своего пути - поэтому в колонне часто в подбитого кто-то врезается, не успевает среагировать. Иначе все ресурсы уйдут на обнаружение наземкой новых препятствий у себя на пути, а так они "видят" препятствие если оно стоит уже какое-то время, секунд 10 вроде.
см. выше, пример с таймаутом, время таймаута задаётся в секундах.
Рестарт битвы на сервере надо делать battle Stop и battle Start . Ну или можно по всем объектам пробежать и дестроить их, тогда с карты можно не уходить, самолёты тоже можно оставить, а потом загрузить первую миссию.
да, конечно ввести переменные для счёта и по разным событиям их изменять, я в миссиях которые раньше выкладывал показывал как.
На Репках и Синдикате от battle Stop и battle Start пришлось отказаться, т.к. вылезали ошибки notDestroyedActor, которые как-то глючили, не помню уже. Видимо остается 2й вариант - дестроить всех акторов кроме игроков, написать на экране о победе\поражении, счет +1, и о том, что "Миссия перезагружена, проверьте карту" :) Чтобы те кто в воздухе на аэродром противника не садились.
--- Добавлено ---
В бою это каждый раз происходит. Их бы клином или уступом развернуть заранее. Можно везде кроме мостов и населенных пунктов. И тольлько на мостах и в городах пусть в колонно перестраиваются. Антуражнее будет и ресурсов не больше.
--- Добавлено ---
В прошлой миссии с Р1 по 3-4 корабля недотопленных в цепочку собирались. Выкладывал ссылку на галерею багов Р1 в теме про баги.
Сейчас то же самое получится в новой миссии. Через 30-40 минут новый корабль может врезаться в недотопленный прошлый корабль. Или триггер не сработает пока корабль ко дну не пошел совсем? ИИ капитанов на судах нет, чтобы обходить обломки как танки хотя бы?
Надо, даже обязательно надо, четко отслеживать момент, что бы не рождалось наземки больше, чем уничтожалось.
Например, это делается так - миссия-хост загружает (назовем все миссии, отличные от стартовой - слейвами) слейв только один раз. И слейв сам себя контролирует. В случае с колоннами чуть сложнее, в случае с танкерами - слейв самостоятельно отслеживает состояние своего танкера (найти его не проблема, по-умолчанию миссия вызывает методы только для своих объектов), и, по условию, перед тем как загрузить сама себя, принудительно танкер уничтожает. Точно также и танки - перед загрузкой самой себя слейв прибивает все свои объекты. Тогда не будет лишних обломков и битва не будет зарастать мусором.
Недостаток такого подхода очевиден, слейв ничего не знает о событиях в масштабе битвы. За исключением, конечно, прямого приказа слушать все события. Но все равно он ничего не знает о пользовательских данных хоста (счет и т.д). Это можно обойти чуть более сложным методом:
1. Именовать объекты в миссии таким способом, что бы хост точно знал, к какой миссии какой объект относится. Перед загрузкой нового слейва убиваем все объекты старые прямо из хоста. Имена объектов можно менять прямо в файле (имена подчиняются определенным правилам правда).
2. Любой актор в полном имени содержит в начале номер миссии к которой принадлежит. Загружаем слейв, реагируем на OnMissionLoaded - в параметре передается номер свежей миссии. Все, мы можем выборочно убивать объекты по номеру. Далее загрузили следующую, и т.д.
3. Если не ошибаюсь, можно получить доступ к номеру, который будет присвоен следующей загруженной миссии. Тогда перез загрузкой новой миссии просто запоминаем этот номер. Далее как во втором пункте.
Идея всего вышеописанного - обязательно убирать за собой перед повторной загрузкой. Тогда и танкеры не будут упираться в своих предшественников.
Подскажите, с команд скрипта можно влиять на управление самолета игрока? Ну допустив взять и отклонить на определенный угол элерон или руль высоты, т.е. я задам в скрипте значение переменной которое отклонит руль на 5 едениц. Если можно то какие параметры или классы (не знаю как назвать) за это отвечают, пример в коде былбы кстати.