Kodiak попробовал. В консоль написало, но его не кикнуло. Как правильно это сделать?
http://forum.1cpublishing.eu/showpos...46&postcount=7Nothing special, just for testing i tried (Tester was 30sec delay Trigger) :
public override void OnTrigger(int missionNumber, string shortName, bool active)
{
base.OnTrigger(missionNumber, shortName, active);
if ("Tester".Equals(shortName) && active)
{
System.Console.WriteLine("kick Kodiak");
}
}
I also tried "\r\n" and "\n". I get the message kick Kodiak in console, thats all
So the simply way doesn't exist
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Я, конечно не эксперт... Но, по-моему, console.writeline тут нам не поможет
Это вывод в stdout, а нам нужна запись в stdin, если я правильно понимаю задачу
Нужно искать класс и метод, который обрабатывает input в консоли сервера и в него передавать строку "kick Kodiak"...
Нам поможет только naryv![]()
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Как можно узнать к какой строке скрипта относится ошибка
Каким образом их расшифровывать самостоятельно?Код:[22:43:03] ================================================= [22:43:03] System.NullReferenceException: Object reference not set to an instance of an object. [22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.JKbi78CdjsN(X2gm2Hr3Eswyj0blEYg , Boolean , String , String , String , String , Tuple3f , Tuple3f , Tuple3f , Single ) [22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.YBOi7ZxcXEW(D9b3NxnuyuLyLO34x8C ) [22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.oN0isvENAcV(D9b3NxnuyuLyLO34x8C , Boolean ) [22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.N5risyW927P(D9b3NxnuyuLyLO34x8C ) [22:43:03] at R91QoZjZ7ddcPNI42YN.CT4GbdjmtXCCwbuMTmW.netInput(D9b3NxnuyuLyLO34x8C ) [22:43:03] at 4oJSpAkF4ydQeQ505nZ.FBRfvmkapO7g2DdMggm.c48QfoHY4L2(Object ) [22:43:03] at NCas604dIJxONptaMSB.Dyj7wo4KItdTK2rJaTL.RWkX76dcAE(Object ) [22:43:03] =================================================
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Никак. Не факт, что это в скрипте. Такой ошибке стабильно предшествует появление нового самолета. Т.е. после самого появления - не всегда, а перед этой ошибкой - всегда. По крайней мере в чат уходит что-то вроде "Новая красная/синяя группа появилась".
--- Добавлено ---
Похоже именно так. В общем внешнюю утилитку сделаю.
А скрипт из консоли может читать? Например, переменные скрипта менять-какие-либо было бы полезно для отладки.
Код:string line = System.Console.ReadLine();
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
Подскажите, как не напортачить.
Как проверить несколько триггеров в одном цикле OnTrigger?
Если обе проверки вложить во все циклы и расположить подряд, их как-то разделять нужно, например
if();
if else ();
else {};
break;
Или просто подряд перечислить?
if();
if();
if();
break;
Или сделать отдельно 3 цикла проверок,
if( циклы )
if( циклы )
if( циклы )
Так будет работать? (это 2й вариант).Код:for (int j = 1; j < 3 ; j++) // Army { for (int i = 0; i < attackSector.Length ; i++) { for (int k = 0; k < Submission1.Length ; k++) { // air missions string str = (j).ToString() + "_" + attackSector[i].ToString() + "_air" + (k).ToString() ; // + missionType[0].ToString() if (str.Equals(shortName1)) { } // ground missions if (str.Equals(shortName2)) { } // sea missions if (str.Equals(shortName3)) { } break; } } } }
Еще более важный вопрос, что происходит, если в процессе перебора цикла срабатывает новый триггер и начинается новый перебор. Оба перебора отработатся последовательно и корректно? В "танковых битвах" возрождение по тригеру работало несколько раз, но потом танки переставали рождаться по какой-то причине.
break; кстати правильно используется?
...зелёные горят.
----------------------
i7-860@3.8, 4GB, ati4890-2GB, 1680x1050, Win7-64.
После break закрывающая фигурная скобка - лишняя.
Наличие 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 вызывается подмиссия с конвоем движущихся кораблей. При старте выделенного сервера и появлении первого игрока на аэродроме (не в воздухе) корабли стоят на месте и не двигаются, возможно другая техника тоже в спящем режиме. При появлении в воздухе/взлете процесс движения начинается. С чем это связано?