ToxaBes2 / ADR-Spec-Ops

Annex Done Right: Spec Ops (TEHGAM 1)
https://tehgam1.com
MIT License
10 stars 4 forks source link

Кривая оборона (оборона закончилась) #30

Closed Horizon1959 closed 8 years ago

Horizon1959 commented 8 years ago

Опять косяк с обороной. Поэтапно расписываю.

  1. Убили большую часть ботов
  2. взорвали технику
  3. побежали на командный пункт противника (вышка с ящиками)
  4. забежали на вышку
  5. нажали на модную коробку
  6. пошло сообщение командного пункта
  7. пошло сообщения о захвате основной точки
  8. пошло сообщение об обороне основной точки
  9. прошла пара минут, боты высадились из вертолёта
  10. вышка пропала, почти все игроки, стоявшие на ней, погибли
  11. оборона закончилась успешно (примерно 23:18)
12st commented 8 years ago

Немного дополню. Захватили КП, началась оборона, но на карте не появился синий триггер обороны. Боты высадились начали двигаться к нам. Примерно через 2-3 минуты прошло сообщение об успешной обороне и боты отдеспавнились в следующую секунду заспавнилась доп задание "Конвой".

ToxaBes2 commented 8 years ago

Теперь оборона учитывает количество оставшихся ботов, если их мало то оборона не стартует (т.к. не к кому присылать подкрепление).

12st commented 8 years ago

Вновь повторилась эта ситуация, но теперь ботов в триггере было около 50-60. Боты также появились стали двигаться на точку при этом внутри триггера оставались боты с основы, "симптомы" такие же как и в предыдущий раз. Оборонялся в куполе, купол пропал, сразу словил пулю, появилось сообщение: "противник занял наши позиции", в следующие 2 секунды боты пропали и в течении 5 секунд появилась спец операция "Конвой"(в прошлый раз при таком завершении обороны тоже была она, может просто совпадение)

malashin commented 8 years ago

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 Вот эта переменная не используется нигде.

ToxaBes2 commented 8 years ago

Здесь ожидание наличия переменой, а не проверка на false. Возможно переменная существует с прошлой обороны и завершает новую.

Спасибо, из-за этого первая оборона проходит нормально, а все остальные сразу завершаются. Только проверка верная, именно на существование. Нужно просто в конце добавить уничтожение переменной.

Вот эта переменная не используется нигде.

Остатки былой роскоши, почищу.

malashin commented 8 years ago

Помимо этого есть один момент который меня напрягает. В подавляющем большинстве случаев оборона будет вестись с места выполнения задачи, то есть КП противника. Боты же идут в центр основы и проверки расстояния идут от центра основы. Если КП на краю основы, выйдя из КП, можно провалить задание.

Идеальное решение было бы проверять есть ли игроки на основе и если их нет, то давать минуту на то, чтобы вернутся, сообщая об этом.

ToxaBes2 commented 8 years ago

Я даю 2 минуты на то чтобы вернуться в зону.

malashin commented 8 years ago

Я про quality of life изменения.

Если триггер понял, что игроков больше нет, то стоит сказать игрокам, что точку мы теряем и дать некоторое время в неё вернуться. Так всем будут ясны причины проигрыша и дано время на исправление ситуации. Игроки знают почему проиграли и винят только себя.

Сейчас же всё очень внезапно происходит. Каждые 20 секунд проверка идет, кто-то вышел из триггера или на подлете уже и вдруг проиграли.

malashin commented 8 years ago

Плюс есть еще момент с телами игроков. Раньше если хотя бы один игрок лежит раненый в триггере, то проигрыш не засчитывался. У тебя эта проблема не решена, вроди бы.

ToxaBes2 commented 8 years ago

Я про quality of life изменения.

А, понял, сделаю.

Плюс есть еще момент с телами игроков

Игрок мертв ~1сек, после этого он жив но обездвижен. Посмотрим как проверка состояния скажется на производительности. Если не сильно будет тормозить - применю.

ToxaBes2 commented 8 years ago

Изменения:

Для тестов поставил оборону после каждой основы.

malashin commented 8 years ago

https://github.com/ToxaBes/ADR-Spec-Ops/blob/master/co30_ADR_Spec_Ops.Altis/mission/main/missions/AOdefend.sqf#L60-L66 Здесь тоже стоит captive проверить.

malashin commented 8 years ago

Есть еще смысл в этих циклах делать exitWith, так как нам одного человека достаточно и продолжать цикл смысла нет.

ToxaBes2 commented 8 years ago

Здесь тоже стоит captive проверить.

Представь что в начале обороны все погибли (например забегая в зону обороны и ища укрытие), и кто-то остался лежать. В твоем случае оборона завалится сразу. В моем случае будет еще 140 сек времени добраться до зоны.

Есть еще смысл в этих циклах делать exitWith, так как нам одного человека достаточно и продолжать цикл смысла нет.

exitWith убрал после ряда тестов - в некоторых случаях выполнение выходит не из текущей области видимости (цикл по игрокам), а из основной области видимости (текущий sqf файл) что неприемлемо по понятным причинам. Похоже что БИСы не осилили нормальную реализацию автоматического завершения текущей/создания новой области видимости и видимо поэтому они ввели команды прямого управления контекстом: breakTo и breakOut. В случае если exitWith работает в "основном" контексте (верхний уровень выполнения в sqf файле), то команда всегда отрабатывает "верно".

В итоге обернул все в

if (!_inside) then {...};

В этом случае после первой удачной проверки вся остальная логика пропускается и имеем в худшем случае перебор 29 элементов в цикле, что не критично. И работает без сбоев.

malashin commented 8 years ago

У меня проблем с 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_...

ToxaBes2 commented 8 years ago

Вот этот код никогда не тупил

Возможно из-за того что вызов идет внутри call. Немного странно вызывать блокирующий все что можно call ради нормальной работы exitWith.

Плюс говорят, что лучше такую структуру использовать вместо switch case

if таки быстрее чем switch, и использование switch/case+exitWith тут не оправдано вообще никак. Мало того, у меня не последовательные, а вложенные if-ы, что тоже ускоряет процесс. В итоге на малых размерах массивов (а у нас макс 29 элементов) скорость цикла практически не отличается.

malashin commented 8 years ago

Возможно из-за того что вызов идет внутри 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 зашла.

ToxaBes2 commented 8 years ago

exitWith должен выходить из forEach.

Должен. Но сделай цикл который будет запускаться каждый 120 сек с выходом по forEach и записью в лог. Затем запусти миссию на Linux сервере на пару суток. С большой вероятностью у тебя скрипт прекратит писать в лог уже на первые сутки т.к. будет выход не из цикла а из скрипта.

Я про этот switch

А, теперь понял. В данным случае будет сомнительный выигрыш между switch и call/if/exitWith на фоне времени работы QS_fnc_defendAO функции.

12st commented 8 years ago

Нашли небольшой баг, десантные тару во время обороны не удаляются, а продолжают висеть над точкой.

12st commented 8 years ago

Также грузовики с пехотой приехали пустыми.

ToxaBes2 commented 8 years ago

Нашли небольшой баг, десантные тару во время обороны не удаляются, а продолжают висеть над точкой.

Арма не может рассчитать маршрут до след путевой точки. В итоге тарушки зависают на какое-то время на месте, потом летят дальше. 1 в 1 ситуация с машинами на спецоперации Конвой.

Также грузовики с пехотой приехали пустыми.

Потому что высадили пехоту на границе зоны или немного внутри. Тоже самое могут делать ифриты, высадить пару чел и ехать патрулировать втроем.