Closed Horizon1959 closed 8 years ago
Немного дополню. Захватили КП, началась оборона, но на карте не появился синий триггер обороны. Боты высадились начали двигаться к нам. Примерно через 2-3 минуты прошло сообщение об успешной обороне и боты отдеспавнились в следующую секунду заспавнилась доп задание "Конвой".
Теперь оборона учитывает количество оставшихся ботов, если их мало то оборона не стартует (т.к. не к кому присылать подкрепление).
Вновь повторилась эта ситуация, но теперь ботов в триггере было около 50-60. Боты также появились стали двигаться на точку при этом внутри триггера оставались боты с основы, "симптомы" такие же как и в предыдущий раз. Оборонялся в куполе, купол пропал, сразу словил пулю, появилось сообщение: "противник занял наши позиции", в следующие 2 секунды боты пропали и в течении 5 секунд появилась спец операция "Конвой"(в прошлый раз при таком завершении обороны тоже была она, может просто совпадение)
https://github.com/ToxaBes/ADR-Spec-Ops/blob/master/co30_ADR_Spec_Ops.Altis/mission/main/missions/AOattack.sqf#L232 Здесь ожидание наличия пременой, а не проверка на false. Возможно переменная существует с прошлой обороны и завершает новую.
https://github.com/ToxaBes/ADR-Spec-Ops/blob/master/co30_ADR_Spec_Ops.Altis/mission/main/missions/AOdefend.sqf#L110 Вот эта переменная не используется нигде.
Здесь ожидание наличия переменой, а не проверка на false. Возможно переменная существует с прошлой обороны и завершает новую.
Спасибо, из-за этого первая оборона проходит нормально, а все остальные сразу завершаются. Только проверка верная, именно на существование. Нужно просто в конце добавить уничтожение переменной.
Вот эта переменная не используется нигде.
Остатки былой роскоши, почищу.
Помимо этого есть один момент который меня напрягает. В подавляющем большинстве случаев оборона будет вестись с места выполнения задачи, то есть КП противника. Боты же идут в центр основы и проверки расстояния идут от центра основы. Если КП на краю основы, выйдя из КП, можно провалить задание.
Идеальное решение было бы проверять есть ли игроки на основе и если их нет, то давать минуту на то, чтобы вернутся, сообщая об этом.
Я про quality of life изменения.
Если триггер понял, что игроков больше нет, то стоит сказать игрокам, что точку мы теряем и дать некоторое время в неё вернуться. Так всем будут ясны причины проигрыша и дано время на исправление ситуации. Игроки знают почему проиграли и винят только себя.
Сейчас же всё очень внезапно происходит. Каждые 20 секунд проверка идет, кто-то вышел из триггера или на подлете уже и вдруг проиграли.
Плюс есть еще момент с телами игроков. Раньше если хотя бы один игрок лежит раненый в триггере, то проигрыш не засчитывался. У тебя эта проблема не решена, вроди бы.
Я про quality of life изменения.
А, понял, сделаю.
Плюс есть еще момент с телами игроков
Игрок мертв ~1сек, после этого он жив но обездвижен. Посмотрим как проверка состояния скажется на производительности. Если не сильно будет тормозить - применю.
Изменения:
Для тестов поставил оборону после каждой основы.
https://github.com/ToxaBes/ADR-Spec-Ops/blob/master/co30_ADR_Spec_Ops.Altis/mission/main/missions/AOdefend.sqf#L60-L66 Здесь тоже стоит captive проверить.
Есть еще смысл в этих циклах делать exitWith, так как нам одного человека достаточно и продолжать цикл смысла нет.
Здесь тоже стоит captive проверить.
Представь что в начале обороны все погибли (например забегая в зону обороны и ища укрытие), и кто-то остался лежать. В твоем случае оборона завалится сразу. В моем случае будет еще 140 сек времени добраться до зоны.
Есть еще смысл в этих циклах делать exitWith, так как нам одного человека достаточно и продолжать цикл смысла нет.
exitWith убрал после ряда тестов - в некоторых случаях выполнение выходит не из текущей области видимости (цикл по игрокам), а из основной области видимости (текущий sqf файл) что неприемлемо по понятным причинам. Похоже что БИСы не осилили нормальную реализацию автоматического завершения текущей/создания новой области видимости и видимо поэтому они ввели команды прямого управления контекстом: breakTo и breakOut. В случае если exitWith работает в "основном" контексте (верхний уровень выполнения в sqf файле), то команда всегда отрабатывает "верно".
В итоге обернул все в
if (!_inside) then {...};
В этом случае после первой удачной проверки вся остальная логика пропускается и имеем в худшем случае перебор 29 элементов в цикле, что не критично. И работает без сбоев.
У меня проблем с exitWith не было никогда. Да и используются они повсеместно. Может опять что-то с линуксом связанное.
Вот этот код никогда не тупил: https://github.com/ToxaBes/ADR-Spec-Ops/blob/master/co30_ADR_Spec_Ops.Altis/functions/fn_actionMagRepack.sqf#L31-L42
Плюс говорят, что лучше такую струткуру использовать вместо switch case, по какой-то неведомой причине так быстрее в Арме. http://killzonekid.com/arma-scripting-tutorials-scopes/ https://community.bistudio.com/wiki/Code_Optimisation#If_Else_If_Else_If_Else_...
Вот этот код никогда не тупил
Возможно из-за того что вызов идет внутри call. Немного странно вызывать блокирующий все что можно call ради нормальной работы exitWith.
Плюс говорят, что лучше такую структуру использовать вместо switch case
if таки быстрее чем switch, и использование switch/case+exitWith тут не оправдано вообще никак. Мало того, у меня не последовательные, а вложенные if-ы, что тоже ускоряет процесс. В итоге на малых размерах массивов (а у нас макс 29 элементов) скорость цикла практически не отличается.
Возможно из-за того что вызов идет внутри call. Немного странно вызывать блокирующий все что можно call ради нормальной работы exitWith.
call создает scope, у тебя уже создан scope внутри forEach. exitWith должен выходить из forEach.
if таки быстрее чем switch, и использование switch/case+exitWith тут не оправдано вообще никак.
Я про этот switch https://github.com/ToxaBes/ADR-Spec-Ops/blob/master/co30_ADR_Spec_Ops.Altis/mission/main/missions/AOdefend.sqf#L33-L52
call {
if () exitWith {};
if () exitWith {};
};
Говорят быстрее. Но это мелочь, просто речь про exitWith зашла.
exitWith должен выходить из forEach.
Должен. Но сделай цикл который будет запускаться каждый 120 сек с выходом по forEach и записью в лог. Затем запусти миссию на Linux сервере на пару суток. С большой вероятностью у тебя скрипт прекратит писать в лог уже на первые сутки т.к. будет выход не из цикла а из скрипта.
Я про этот switch
А, теперь понял. В данным случае будет сомнительный выигрыш между switch и call/if/exitWith на фоне времени работы QS_fnc_defendAO функции.
Нашли небольшой баг, десантные тару во время обороны не удаляются, а продолжают висеть над точкой.
Также грузовики с пехотой приехали пустыми.
Нашли небольшой баг, десантные тару во время обороны не удаляются, а продолжают висеть над точкой.
Арма не может рассчитать маршрут до след путевой точки. В итоге тарушки зависают на какое-то время на месте, потом летят дальше. 1 в 1 ситуация с машинами на спецоперации Конвой.
Также грузовики с пехотой приехали пустыми.
Потому что высадили пехоту на границе зоны или немного внутри. Тоже самое могут делать ифриты, высадить пару чел и ехать патрулировать втроем.
Опять косяк с обороной. Поэтапно расписываю.