Спасибо за просвещение.
Break внутри проверки условия видимо был изначально. Совсем без break видимо тоже должно работать.
(я убежал, сервер лежит до сих пор без стима)
Спасибо за просвещение.
Break внутри проверки условия видимо был изначально. Совсем без break видимо тоже должно работать.
(я убежал, сервер лежит до сих пор без стима)
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
У меня продолжается взаимная нелюбовь с триггерами.
Есть 2 подмиссии:
1_E3_air0.mis , 1_E3_air1.mis
2я получена путем копирования 1й с изменением самолета с Веллингтона на Бленим. Название группы соответственно осталось прежним.
В подмиссиях есть треиггеры на пролет группы 1_E3_air и 1_E3_air. Сейчас одинаковые, но перед этим пробовал перебирать и триггеры 1_E3_air0 и 1_E3_air1 в цикле с таким же результатом. Триггер создавался в 1й подмиссии, затем копировался во 2ю в блокноте.
1_E3_air TPassThrough 1 gb02.07 53073 33421 2000
1_E3_air TPassThrough 1 gb02.07 53073 33421 2000
В результате при пролете группы из 1й подмиссии триггер не срабатыват ни разу. При пролете группы из 2й подмиссии триггер срабатывает 2-5 раз (на каждый самолет?).
Вопросы: почему 1й триггер не срабатывает?
В каких случаях нужна проверка // && active) ?
В каких случаях добавлять //GamePlay.gpGetTrigger(shortName).Enable = false; ?
Как убрать повторные срабатывания?
Могут ли все триггеры подмиссий иметь одинаковые названия?
При копировании файла миссии нужно ли изменять название группы, чтобы оно было уникальным?
Если включить все триггеры только в миссию-хост, будут ли они срабатывать при пролете групп из подмиссий?
Код:public override void OnTrigger(int missionNumber, string shortName, bool active) { base.OnTrigger(missionNumber, shortName, active); string[] attackSector = { "C5", "D4", "E3" }; // sectors attacked // air missions #region air missions string currMissType = "air"; for (int j = 1; j < 3 ; j++) // Army { for (int i = 0; i < attackSector.Length ; i++) { string str = (j).ToString() + "_" + attackSector[i].ToString() + "_" + currMissType; // +k.ToString(); // + missionType[1].ToString() //string str = i.ToString() + "_" + (j).ToString() + "_gg"; // && active) нужно? if (str.Equals(shortName)) // && active) нужно? // test { sendChatMessageTo(-1, str , null); // test msg if (j == 1) // red win { currBonusLoss = allowed109s - min109s; if (currBonusLoss < 1) currBonusLoss++; allowed109s = min109s; ScoreRed += 1; sendScreenMessageTo(-1, new string[] { "ru" }, "The Allies bombed the Axis' airfield! Limit of available Bf-109E4 is reduced by {0}!", new object[] { currBonusLoss }); sendScreenMessageTo(-1, "Красные разбомбили синий аэродром! Лимит доступных Bf-109E4 снижен на {0}!", new object[] { currBonusLoss }); sendChatMessageTo(-1, new string[] { "ru" }, "The Allies bombed the Axis' airfield! Limit of available Bf-109E4 is reduced by {0}!", new object[] { currBonusLoss }); sendChatMessageTo(-1, "ru", "Красные разбомбили синий аэродром! Лимит доступных Bf-109E4 снижен на {0}!", new object[] { currBonusLoss }); // testing sendScreenAndChatMessageTo( -1, new object[] { currBonusLoss }, "Testing! sendScreenAndChatMessageTo Bf-109E4 is reduced by {0}!", "Тест! sendScreenAndChatMessageTo Bf-109E4 is reduced by {0}!"); } else // blue win { allowedSpit2s = minSpit2s; ScoreBlue += 1; sendScreenMessageTo(-1, new string[] { "ru" }, "The Axis bombed the Allies' airfield! Limit of available Spitfire IIa is reduced by {0}!", new object[] { currBonusLoss }); sendScreenMessageTo(-1, "Синие разбомбили красный аэродром! Лимит доступных Spitfire IIa снижен на {0}!", new object[] { currBonusLoss }); sendChatMessageTo(-1, new string[] { "ru" }, "The Axis bombed the Allies' airfield! Limit of available Spitfire IIa is reduced by {0}!", new object[] { currBonusLoss }); sendChatMessageTo(-1, "ru", "Синие разбомбили красный аэродром! Лимит доступных Spitfire IIa снижен на {0}!", new object[] { currBonusLoss }); } // это нужно? //GamePlay.gpGetTrigger(shortName).Enable = false; break; } } } #endregion }
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
В миссии для онлайна можно сделать так, чтобы одни спауны были старт с аэродрома, а другие в воздухе?
Я ни разу еще спауны не использовал, хочу подготовиться заранее )
В той миссии ничего особенного, сделано наспех, только городок мне очень понравился. Хочу отделить обЪекты по разным подмиссиям, чтобы проще было редактировать. Постараюсь сделать две версия города для синих и красных
В коллекции скриптов от Атаса есть такой скрипт от naryv для использования меню:
Попробовал к онлайн-миссии прикрутить, вызов скрипта из хоста. Tab 4 не реагирует на нажатие (скорее всего из-за второго параметра false). Интересует формат команд.Код:using System; using System.Collections; using maddox.game; using maddox.game.world; public class Mission : AMission { private void setMainMenu( Player player ) { GamePlay.gpSetOrderMissionMenu( player, false, 0, new string[] { "1", "2", "3" }, new bool[] { true, false, false } ); } private void setSubMenu( Player player ) { GamePlay.gpSetOrderMissionMenu( player, true, 1, new string[] { "1-1", "1-2", "1-3" }, new bool[] { false, false, false } ); } public override void OnOrderMissionMenuSelected( Player player, int ID, int menuItemIndex ) { if( ID == 0 ) { // main menu if( menuItemIndex == 1 ) { GamePlay.gpHUDLogCenter("Menu selected Loading mission aaa2.mis"); GamePlay.gpPostMissionLoad("missions\\aaa2.mis"); setSubMenu( player ); } } else if( ID == 1 ) { // sub menu setMainMenu( player ); } } public override void OnPlayerConnected( Player player ) { if( MissionNumber == 0 ) { setMainMenu( player ); } } public override void Inited() { if( MissionNumber == 0 ) { setMainMenu(GamePlay.gpPlayer()); } } }
1.1,2,3 - это текст пунктов меню как я понял. Что значит "new bool" - зависит отображается пункт или нет?Код:GamePlay.gpSetOrderMissionMenu( player, false, 0, new string[] { "1", "2", "3" }, new bool[] { true, false, false } );
2. Зачем нужнаа проверка if( MissionNumber == 0 ) точнее как этот номер узнать или задать?
3. MainMenu - это меню, которое вызывается по Tab+4?
SubMenu - вложенных меню может быть сколько угодно уровней?
4. Для онлайна этот скрипт подходит?
5. Несколько раз встречал такую строчку:
Это класс используемый вместо массива, какое преимущество он дает?Код:List<string> CarTypes = new List<string>();
Крайний раз редактировалось podvoxx; 26.10.2011 в 10:59.
вот, пример кооп-миссии онлайновой с выбором места в самолёте из меню http://www.sukhoi.ru/forum/showthrea...=1#post1716159
gpSetOrderMissionMenu( Player player, bool thisSubMenu, int ID, string[] keys, bool[] bSubMenu ); параметры :
Player player - игрок которому выдаётся кастомное меню
bool thisSubMenu - является ли данный набор пунктов подменю
int ID - ID пункта по которому его можно идентифицировать
string[] keys массив строк-пунктов меню
bool[] bSubMenu массив bool показывающий есть ли у каждого пункта подменю
MissionNumber это номер миссии, по умолчанию, каждый скрипт работает только в "своей" миссии, задаётся номер автоматически при подгрузке миссии в битву. Чтобы скрипт "слушал" другие миссии надо задать MissionNumberListener с номером желаемой миссии, или MissionNumberListener= -1, чтобы работать со всеми объектами в битве.
да, и практически да(несколько десятков уровней вложения тестировали, теоретически сколько угодно можно)
должен, по идее.
с List-ом по-моему удобнее и проще работать, легко добавлять, искать значения, размер не надо задавать и тд
Don't happy, be worry
Спасибо, теперь более понятно.
Еще вопрос, вот такая записья является правильной?
Код://Параметры меню string[] descMainMenu; //Описание пунктов главного меню descMainMenu = new string[] { "Тест системы сообщений", "Конвои" }; private void setMainMenu( Player player ) { GamePlay.gpSetOrderMissionMenu( player, true, 0, descMainMenu, new bool[] { false, true } ); }
Ясно. А вариант с list так будет выглядеть?:
Код:List<string> descMainMenu = new List<string>(); descMainMenu.Add("Тест системы сообщений"); descMainMenu.Add("Конвои"); private void setMainMenu( Player player ) { GamePlay.gpSetOrderMissionMenu( player, false, 0, descMainMenu, new bool[] { false, true } ); }
Крайний раз редактировалось podvoxx; 26.10.2011 в 13:34.
Никак.
Что бы миссия не была неизвестной, надо перед ее загрузкой запомнить след. номер (NextMissionNumber или как то так).
Частичное решение состоит в переборе наземных и воздушных групп для всех представленных армий и сверке запомненного номера миссии с номером, заключенном в полном имени юнита (формат примерно такое - номер миссии, двоеточие, shortName). Полное имя получается через AiActor.Name().
Почему частичное? Перебором групп ты не найдешь юнитов, которые групп не имеют (артиллерия и стат. корабли как минимум), т.е. по OnActorCreated надо еще и их запоминать. Похожее решение используется в морском льве.
Домики, ящички и все что в разделе статический и т.д. не удалишь вообще никак.
PS кстати, в голову пришло. возможная причина утечек у меня - удаляются только акторы, а группы нет.. надо проверить это дело.
3. НеактуальноРешено, работает прекрасно
1. С меню разобрался, остались брошенные самолеты. Такой код, если его добавить в хост миссию будет выполнять свою работу в онлайн? Или еще что-то нужно добавить?
2. Если загрузить отдельным скриптом будет работать?
Код://Удаление покинутых самолетов public override void OnPlaceLeave(Player player, AiActor actor, int placeIndex) { base.OnPlaceLeave(player, actor, placeIndex); Timeout(5, () => { AiAircraft CurAircraft = player.Place() as AiAircraft; AiAircraft PrevAircraft = actor as AiAircraft; if (CurAircraft != PrevAircraft) {(actor as AiAircraft).Destroy();} }); } //Удаление разбившихся самолетов public override void OnAircraftCrashLanded(int missionNumber, string shortName, AiAircraft aircraft) { base.OnAircraftCrashLanded(missionNumber, shortName, aircraft); Timeout(10, () => { destroyPlane(aircraft); } ); } //Удаление приземлившихся самолетов public override void OnAircraftLanded(int missionNumber, string shortName, AiAircraft aircraft) { base.OnAircraftLanded(missionNumber, shortName, aircraft); Timeout(10, () => { destroyPlane(aircraft); } ); }
6-7. НеактуальноРешено
4. Как правильно использовать list<> в скриптах? Если делать по msdn выдает ошибки
5. Как получить ник игрока в онлайне, чтобы отправить в чат сервера?
Крайний раз редактировалось podvoxx; 07.11.2011 в 09:35.
8. Такой вопрос. В методе OnBattleStarted вызывается подмиссия с конвоем движущихся кораблей. При старте выделенного сервера и появлении первого игрока на аэродроме (не в воздухе) корабли стоят на месте и не двигаются, возможно другая техника тоже в спящем режиме. При появлении в воздухе/взлете процесс движения начинается. С чем это связано?
Они для игрока находящегося дальше радиуса видимости( ~20км) "спят", игрок о них не получает информацию, для сервера они перемещаются, когда игрок приблизится на расстояние ближе радиуса видимости, они у него на машине "проснутся" и переместятся туда, где они находятся у сервера и дальше будут двигаться синхронно. Сделано это, чтобы не грузить сеть ненужной информацией о дальних объектах и машину-клиента ненужными расчётами. Если в воздухе Вы появляетесь ближе радиуса видимости - кораблики "просыпаются" сразу.
Don't happy, be worry
1) Влияют ли звукоулавливатели и прочие пуазо на зенитки?
2) Можно ли на танкер повесить вторую зенитку..?
Крайний раз редактировалось KG40_Night; 31.10.2011 в 18:07.
..Решено добавлением namespace System.IO
1. Поясните как правильно использовать метод Directory в скриптах. Требуется получить список файлов в папке и название самой папки, игра выдает ошибку. Требуется для динамического меню загрузчика миссий. Т.е. просто помещаем любые миссии в папку, они автоматически появляются в меню.
http://msdn.microsoft.com/ru-ru/library/07wt70x2
Код:string missionPath = Directory.GetCurrentDirectory(); GamePlay.gpHUDLogCenter( "Текущая директория: " + missionPath );
Крайний раз редактировалось podvoxx; 07.11.2011 в 10:00.
1. Присоединяюсь к вопросу, как подключать звукоулавливатели к зениткам и прожекторам?
2. Как получить папку игры в моих документах оптимальным способом? Сейчас делаю так:
В первой строчке получаю папку текущего пользователя, потом к ней добавляю путь от русскоязычной версии игры и это подходит только для win7(?). Как получить адрес папки missions в папке игры в Documents на разных версиях игры и ОС? По умолчанию(GetCurrentDirectory()) рабочим каталогом является папка в стиме куда установлена играКод:string myDoc = Environment.GetFolderPath(Environment.SpecialFolder.Personal);// Documents folder string[] missDirMassive = Directory.GetDirectories(myDoc + "\\1C SoftClub\\il-2 sturmovik cliffs of dover\\missions\\Multi\\Dogfight\\PilotTraining\\Missions");
Крайний раз редактировалось podvoxx; 07.11.2011 в 10:29.
Интересует назначение этих методов, для чего они?
Код:public override void OnPlayerConnected( Player player ) { } public override void Inited() { }
пока нет, постараемся сделать
вообще - да, вручную через файл миссии, практически - лучше так не делать, на это не рассчитывали, и как оно себя поведёт - я не знаю.
вызывается, когда в мультиплеере подключается игрок, можно использовать для выдачи ему заданий и тп
Вызывается в конце Init, можно оверрайдить если что-то нужно сделать после того как миссия была проинициализирована(выставлены битва, номер миссии,MissionNumberListener )
Don't happy, be worry
Спасибо большое за ответы. Есть еще вопросик:
- как корректно установить аэростат на желаемую высоту, а то что то он у меня лишь на земле лежит.