Вопрос к naryv, наверное. Сейчас при разработке миссии приходится прибегать к локализации сообщений и более гибкой настройке параметров(иначе миссия будет только на одном языке) - куда отправлять это сообщение(например "Chat", "ChatAndScreen" и "Screen"), отправить определенным игрокам, всем или определенной армии или просто перевести текст, никуда не отправляя(для пункта меню к примеру). Также нужен вариант отправки сообщения без перевода как есть(но с аналогичным локализации примером). Сам перевод сообщений берется из текстового или xml-файлов. Для этого приходится в сам скрипт миссии добавлять большой кусок кода, но тогда появляется проблема - в скрипты подмиссий его тоже придется добавлять и вообще в любой скрипт, где используется локализация и отправка сообщений. В GamePlay.gpLogServer и GamePlay.gpHUDLogCenter не проводится проверка на null емнип и вообще эти команды в чистом виде неудобны(обычно используют введение дополнительных параметров, указаны выше).
Есть другой способ - отдельный класс в своей сборке dll, которая подключается к каждому скрипту, где необходимо. Этот вариант лучше.
Возможно ли введение нового класса для отправки/локализации сообщений с указанными выше параметрами в игру? Необходимость - для любой серьезной миссии на сервере.
Есть еще одна необходимость - хранилище переменных разных типов, доступное из скриптов подмиссий и хост-миссии. Это реализовано в командере от Small_Bee с примером.
Ну и кроме этого, возможно встроить проверку на null(это самая частая и не всегда очевидная ошибка, возникающая казалось бы при добавленных везде проверках) куда-нибудь поглубже в код, чтобы не заниматься этим в каждом скрипте?
П.С. Если потребуется, могу более подробно объяснить и привести примеры кода
И пара дополнительных вопросов, более важных, т.к. их нельзя решить самим пользователям. Первое - это контроль над статиками. Проблема известная. Имеем много отлично проработанных наземных статических объектов и возможность создавать миссию нон-стоп, но не имеем возможности объединить их, т.к. учитывать и перезагружать статитики невозможно. Из-за это нынешние миссии мало чем отличаются от старых иловских. Есть наземка(причем посчитать можно только нестатики), длительность миссии несколько часов. Никакой линии фронта в нормальном виде или даже захватываемых аэродромов нет до сих пор в онлайне. Даже цель - завод/склад толком не организовать. Старые иловские костыли в виде машинок не работают. Потому-что если поставить живые - они разъезжаются сквозь стены в разные стороны несмотря на таймаут. Статические машинки - ничем не отличаются от зданий. Приходится ставить ПТ-пушки. Но это тоже плохой вариант, т.к. артиллерия имеет ИИ и отбирает лишние ресурсы у сервера. К тому же если приедут вражеские танки захватить склад - его продукция начнет стрелять по ним.
Вторая проблема - нельзя из подмиссии загружать здания/окопы. Т.е. к примеру если команда "построила" аэродром, то он будет без ангаров и красот, обычное поле с зенитками. Или к примеру создаем объект завод, который загружается в подмиссии. Все здания/цеха приходится в ручную копировать в файл хост-миссии. Если бы возможность грузить такие объекты из подмиссий была - можно было бы сделать полноценные сменяемые аэродромы или опорные пункты, играющие роль линии фронта. Или строящиеся динамически оборону, склады, переправы.
Велась/проводится ли какая-то работа по работе со статиками в ближайшем патче?
Крайний раз редактировалось podvoxx; 31.05.2012 в 09:36.
С транслятором, думаю можно сделать, что то типа функции возвращающей строку на указанном языке из файла-словаря, подойдёт такой вариант? С хранилищем не знаю, есть ли необходимость, тем более что Small_Bee уже сделал его. С проверкой на null нет, не получится.
В принципе добавили три события - на убитого статика, здание и взрыв бомбы, с именами и координатами думаю для учёта поможет, не загружающиеся статики надо посмотреть, не знаю пока. Но это всё возможно будет только в финальной версии патча.
Don't happy, be worry
У Small_Bee dll, которая работает только с выделенным сервером. Однако сингл-миссии и кампании тоже нужно локализовывать(я добавил свою сборку, но это все-таки неудобно) . К тому же свою dll приходится прописывать в референсах, копировать в папку игры, добавлять нэймспэйс - не очень удобно. К стати о добавлении dll - хорошо бы какую-нибудь папку в папке с игрой сделать для пользовательских сборок, сейчас они помещаются либо в корень, либо в parts/core.
По транслятору можно как-то так:
Задаем путь к папке с файлами локализации. У Small_Bee каждый язык в отдельном .txt-файле, вполне удобно. Кодиак на желтом выкладывал вариант с xml-файлом и всеми языками в нем.
Далее перевод нужного текста по метке(параметры: путь к папке с файлами локализации, метка для перевода текста, язык перевода). Т.е. метод возвращает текст перевода. Если перевод не найден - возвращается то же, что было отправлено.Код:string langFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "\\1C SoftClub\\il-2 sturmovik cliffs of dover\\missions\\Single\\LocalizationExample\\localization\\";
Ну и отправка сообщения, 3 метода(или же еще один параметр добавить, отвечающий за адресатов). Для армии, определенным игрокам и всем игрокам.Код:public static string getTranslate(string langFolderPath, string msgKey, string langName)
target лучше как-то по другому сделать, наверное. Он имеет три варианта - Чат, Экран, Чат и экран.Код:public static void SendMessageToAll(string msgKey, string target, params object[] args) public static void SendMessageToArmy(string msgKey, int army, string target, params object[] args) public static void SendMessageToPlayers(string msgKey, Player[] players, string target, params object[] args)
Причем по назначению метод(ToAll, ToArmy,ToPlayers) должен сам фильтровать игроков и быть универсальным для выделенного, сингла и кампании, ну и проверять на null конечно)).
Это все очевидные вещи конечно, думаю разберетесь. А на будущее неплохо бы доработать HUD сообщения с возможность задавания цвета, расположения, величины шрифта(и самого шрифта), времени отображения, а также одновременного отображения нескольких худ-сообщений(Таким образом можно отображать где-нибудь в уголке параметры, счет в миссии, кол-во доступных самолетов и т.п.)
По хранилищу - вещь нужная для обмена данными между подмиссиями, но в принципе если сложно/долго сделать - можем пользоваться своими сборками.
Спасибо, хорошая новость А удалять статики можно будет подобно "живым" объектам?
Было бы просто замечательно, мы уже особо не торопимся)
И с желтого просили передать за статики )) :
FG28_Kodiak
Give him a big kiss from me!
Крайний раз редактировалось podvoxx; 31.05.2012 в 13:37.
Тестировал наземку и отправлял в чат тип техники, т.е. groundActor.Type(). Иногда кроме обычных тракторов и танчиков появлялся тип Unknown. Это что за тип такой?(на null проверка проводится)
И по корабликам вопрос интересует - http://www.sukhoi.ru/forum/showthrea...=1#post1850412
А вот свежее подтверждение проблемы со статиками с картинками - http://www.sukhoi.ru/forum/showthrea...=1#post1850601
Крайний раз редактировалось podvoxx; 31.05.2012 в 15:24.
Вопрос к naryv
NOT Destroyed actor
При перезагрузке карты на сервере появляются такие сообщения, как это исправить?
http://www.sukhoi.ru/forum/showthrea...=1#post1850768
И в чем отличие команд f и file в консоли?
Крайний раз редактировалось podvoxx; 01.06.2012 в 10:37.
Сделал так - прписываем путь к словарю(может быть xml или SectionFile ), потом строку для перевода передаём в функцию, которая возвращает на заданном языке строку-перевод, либо оригинал, если перевода нет.
тут не понял, ведь указывается уже кому отправляется сообщение.
сейчас нет, только ивенты о смерти, но посмотрим.
Проверил загрузку стационарных объектов в подмиссии - грузится, надо конкретизировать что именно не загружается.
неизвестный тип, ни к кому из заданных не относится, или не указан в базе объектов.
емнип нельзя.
эммм на картинке разрушенный ангар, в чём именно проблема?
Это стационарные объекты, стат. камеры и т.п. которые не были убиты в миссии остаются в следующую.
сейчас ни в чём, в Ил-е отличались, сейчас работают одинаково.
Don't happy, be worry
Указывается для армии, массива игроков и для всех игроков?
Просто если нельзя удалить объект, то миссию придется перезагружать. И на месте этого объекта другой не поставить(например поменять синий аэродром на красный с соответствующими статиками)
Я видимо запутал в понятиях. Под статиками имел в виду не только из группы "Статический" в редакторе, но и "Здания и сооружения" - вот они не грузятся в подмиссиях
Хотелось бы об их убиении тоже получать сообщения. Сейчас там стоят пушки. Ангар взрывается, пушки заваливает, их почти не достать после этого. Их вообще не должно там быть по-хорошему(к тому же они "живые" и при приближении вражеской наземки начнут стрелять).
В общем нужно чтобы при уничтожении здания обрабатывалось событие соответствующее, чтобы не запихивать в него пушки или вагончики, а достаточно было бы самого здания. Ну и чтобы они могли перезагружаться на карте нормально для организации войны нон-стоп с динамической линией фронта и складами/заводами
А зачем они в следующей? И как это влияет на работу миссии и сервера?
Крайний раз редактировалось podvoxx; 01.06.2012 в 14:37.
для массива, а этот массив уже делается таким как автор хочет.
да, это понятно.
Да, здания не грузятся.
да, так и сделано, при уничтожении здания соответствующий ивент происходит.
не знаю точно, возможно, чтобы не перезагружать лишний раз.
да никак по идее, просто стационарные объекты которых не убили остануться .
Don't happy, be worry
Просто обычно используются три таких массива - армия, все игроки, произвольный массив игроков. И собрать такие массивы не так просто. Например если отправлять сообщения всем в чат и на экран одновременно нужно обязательно исключать Server из массива адресатов, иначе при отправке HUD на выделенном появляется ошибка. Это часть проблемы универсальности - нужно сначала определить что за тип игры, отсортировать, потом проверять на null и так для все трех вышеуказанных основных типов сообщений. И это будет засорять каждый скрипт, где есть отправка сообщений. Вот такой кусок примерно:
При том, что обычно используются только эти три типа(они покрывают все потребности) - SendMessageToAll, SendMessageToArmy и произвольные массив - SendMessageToPlayersКод:public static void SendMessageToAll(string langFolderPath, string msgKey, string target, params object[] args) { List<Player> players = new List<Player>(); List<Player> playersScreen = new List<Player>(); if (target == "Chat") { if (GamePlay.gpPlayer() != null) players.Add(GamePlay.gpPlayer()); if (GamePlay.gpRemotePlayers() != null) players.AddRange(GamePlay.gpRemotePlayers()); if (players.ToArray() != null) { send(langFolderPath, players.ToArray(), msgKey, target, args); } } else if (target == "Screen") { if (GamePlay.gpPlayer() != null) if (GamePlay.gpPlayer().Name().ToString() != "Server") { players.Add(GamePlay.gpPlayer()); } if (GamePlay.gpRemotePlayers() != null) players.AddRange(GamePlay.gpRemotePlayers()); if (players.ToArray() != null) { send(langFolderPath, players.ToArray(), msgKey, target, args); } } else if (target == "ChatAndScreen") { // Chat if (GamePlay.gpPlayer() != null) players.Add(GamePlay.gpPlayer()); if (GamePlay.gpRemotePlayers() != null) players.AddRange(GamePlay.gpRemotePlayers()); if (players.ToArray() != null) { send(langFolderPath, players.ToArray(), msgKey, "Chat", args); } //Screen if (GamePlay.gpPlayer() != null) if (GamePlay.gpPlayer().Name().ToString() != "Server") { playersScreen.Add(GamePlay.gpPlayer()); } if (GamePlay.gpRemotePlayers() != null) playersScreen.AddRange(GamePlay.gpRemotePlayers()); if (playersScreen.ToArray() != null) { send(langFolderPath, playersScreen.ToArray(), msgKey, "Screen", args); } } } public static void SendMessageToArmy(string langFolderPath, string msgKey, int army, string target, params object[] args) { List<Player> players = new List<Player>(); List<Player> acceptedPlayers = new List<Player>(); if (GamePlay.gpPlayer() != null) players.Add(GamePlay.gpPlayer()); if (GamePlay.gpRemotePlayers() != null) players.AddRange(GamePlay.gpRemotePlayers()); if (players != null) { foreach (Player player in players) { if (player.Army() == army) acceptedPlayers.Add(player); } if (acceptedPlayers.Count > 0) { send(langFolderPath, acceptedPlayers.ToArray(), msgKey, target, args); } } } public static void SendMessageToPlayers(string langFolderPath, string msgKey, Player[] players, string target, params object[] args) { if (players != null) { send(langFolderPath, players, msgKey, target, args); } }
Это не планируется менять? Просто для миссий, где загрузка подмиссий меняется от каких-то условий невозможно предусмотреть все постройки в хост миссии. И вообще получается окопы где-то в хостмиссии, артиллерия в подмиссии и еще неизвестно, появится ли она на карте(в зависимости от условий). Это не дает воспользоваться возможностями игры по организации динамической войны.
И еще вопрос. По мультиплеерным аддинам будут изменения в новом патче?
Это уход в частности, думаю вряд-ли будем делать.
Поменять нельзя, это связано с сетевым кодом и механизмом работы домиков. Как вариант - можно в стационарные объекты добавить здания нужные для подгрузки в таких миссиях(только надо список таких зданий).
По идее должен быть пример, показывающий как делать такие аддины.
Don't happy, be worry
Но тогда придется все равно использовать отдельную сборку, чтобы не засорять одинаковым кодом скрипты.
По сути нужен метод, который будет собирать либо всех игроков, либо определенной армии в зависимости от задачи.
Все ангары, промышленные здания и окопы можно перенести в статические. Остальное не помню, посмотрю сегодня. А так будет идеальное решение.
И спасибо за ответы и доработку
Кто может подсказать, написать мнуал, как сделать в полном редакторе миссию для теста набивки лент. 1 противник бот самый простой летящий по прямой и за ним с превышением в 500 м мы. В редакторе я полный бот.
Метод проб и находок ни кто не отменял).Кто может подсказать, написать мнуал, как сделать в полном редакторе миссию для теста набивки лент. 1 противник бот самый простой летящий по прямой и за ним с превышением в 500 м мы. В редакторе я полный бот.
Для начала нужно добиться появления своего самолета и себя в нем.
1. Загрузить карту по-проще.
2. Самолет выбирается в "объектах", затем клик на карте ЛКМ и "инсерт" - появится кружок, т.е. самолет. Это не все, дальше нужно еще раз кликнуть и инсертнуть - появится следующая точка маршрута, соединенная линией - т.е. куда он будет лететь.
3. Изучить все менюшки во всех вкладках в свойствах этого самолета, найти галку "самолет игрока" или "игрок", не помню, и поставить ее.
4. Найти меню с набивкой и набить).
5. Сохранить миссию как "летчик снайпер - 1!!"
6. Запустить ее, убедиться, что самолет, патроны и пилот функционируют нормально.
---
Все, после этого создать противников труда не составит.
Сведение в редакторе не выставляется!!!!, только в настройках самолета в основном меню игры.
P8P67EVO/i5 2500K 3.30GHz/8Gb/6950 2Gb/600W/DELL U2410 1920x1200/Directroad HOTAS металл-холлы/TrackIR5 ClipPro/Win7x64
На карте можно нажать только правой и то предлагает "вставить из файла". Я просто тупо не могу добавить объект на карту.
На клавиатуре(компьютерной), над стрелками, есть кнопка "Insert". Объекты на карту добавляются ее нажатием.На карте можно нажать только правой и то предлагает "вставить из файла". Я просто тупо не могу добавить объект на карту.
P8P67EVO/i5 2500K 3.30GHz/8Gb/6950 2Gb/600W/DELL U2410 1920x1200/Directroad HOTAS металл-холлы/TrackIR5 ClipPro/Win7x64
ОМГ. Спасибо aeros ! Я даже как то не подумал что в редакторе можно только клавой вставлять.
В меню игры:
-настройки
-реализм
-пересаживание между самолетами - экспериментируй.
Параметры реализма миссии, создаваемой в СР выставляются в общих "настройках". Убрать маркеры в созданной миссии я смог только там. То есть одна и та же миссия может быть и хардкорной и нубской без ковыряния СР. Пересаживания не пробовал.
P8P67EVO/i5 2500K 3.30GHz/8Gb/6950 2Gb/600W/DELL U2410 1920x1200/Directroad HOTAS металл-холлы/TrackIR5 ClipPro/Win7x64
Заметил, что моя радиостанция не сообщает об атаке наземки, вопрос такой.
Есть подмиссия, в ней такой код:
При значении MissionNumberListener = -1 подмиссия будет слушать другие подмиссии, загруженные из хостмиссии? Или только те подмиссии, что она сама загружает?Код:public override void OnBattleStarted() { base.OnBattleStarted(); MissionNumberListener = -1; }