Делаю сброс техники по вызову с помощью осветительной ракеты. Мне нужно, что бы самолёт сбрасывал технику Максимально точно, в месте где находится ракета через пару секунд после активации триггера. От этого зависит, будет сброшена машина или лодка.
Влепил в небо триггер, вписал в его активацию это
({_x == "F_40mm_Green"} count thisList) > 0 или это ({(toLower (typeOf _x)) in ["F_40mm_Green"]} count thisList) > 0
НЕ РАБОТАЕТ.
Самое обидное, что я когда-то давно уже делал подобную активацию, но забыл как, а источники утеряны.
Дальше, уже в самом скрипте, мне нужно знать, где именно находится ракета, что бы задать на эту позицию Вэйпоинт для самолёта.
Тут мне, увы, не хватает навыка.
И последнее, узнать находится ли ракета над водой.
Думаю нужно что-то типа:
(getposATL raketa) > (getposASL raketa)
Но это не точно.
Буду очень благодарен, Всем кто поможет!

Активация триггера на снаряд + узнать позицию снаряда

Лучший Ответ Ibragim , 16 December 2021 - 15:53
Ошибка выдается по следующей причине:
Ты не заспавнил код, а запустил в том же блоке обработчика события.
Среда блока кода в обработчике внепланировачная, т.е. в ней циклы не работают.
Если ты стоишь в триггере, то снаряд с первой попытки проходит ожидание в цикле и идет дальше без ошибки, как будто бы цикла и не было.
Если же ты выходишь из триггера, то цикл ожидания со второй попытки выдает ошибку, потому что внепланировачная среда не допускает цикличную проверку.
Свой код поставь в блок, который ты заспавнишь и перенесешь в него тебе нужный параметр. Заспавненный блок позволяет использовать циклы ожидания:
[_projectile] spawn // Спавн нового блока кода с возможностью использовать циклы { params ["_projectile"]; If (typeof _projectile == "F_40mm_Green") then { _zhdat_do = time + 5; waituntil { _projectile inarea trg // Попала в зону триггера or time > _zhdat_do // 5 секунд прошло без попадания в зону триггера, пролетела мимо }; if (time > _zhdat_do) exitWith { // пролетела мимо триггера, выход из цикла без результата }; // Попала в зону триггера WPplane1 = getPosATL _projectile; If (surfaceIsWater WPplane1) then {hint "a"} else {hint "b"}; }; };Перейти к сообщению

#1
OFFLINE
Отправлено 15 December 2021 - 18:15
#2
OFFLINE
Отправлено 16 December 2021 - 08:56
Ты используешь поиск объекта в триггере, который определяет присутствие юнитов. Поэтому и не работает.
Вначале определи в скрипте саму ракету, для этого используй обработчик события выстрела
_tvoyUnit addEventHandler ["FiredMan", { params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle"]; // спавни цикл ожидания отсюда }];
Затем заспавни из обработчика цикл, ожидающий появления ракеты в зоне триггера, который прекратится через несколько секунд. Используй команду
:_projectile inArea _tvoyTrigger;
Для определения позиции маршрутной точки используй все ту же переменную _projectile.
_pozicijaWP = getPosATL _projectile;
Для определения позиции над водой она или нет, используй команду surfaceIsWater:
_isOnWater = surfaceIsWater position _projectile;
#3
OFFLINE
Отправлено 16 December 2021 - 14:27
Ты используешь поиск объекта в триггере, который определяет присутствие юнитов. Поэтому и не работает.
и его параметр _projectile.
Вначале определи в скрипте саму ракету, для этого используй обработчик события выстрела_tvoyUnit addEventHandler ["FiredMan", { params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle"]; // спавни цикл ожидания отсюда }];Затем заспавни из обработчика цикл, ожидающий появления ракеты в зоне триггера, который прекратится через несколько секунд. Используй команду
:_projectile inArea _tvoyTrigger;Для определения позиции маршрутной точки используй все ту же переменную _projectile.
_pozicijaWP = getPosATL _projectile;Для определения позиции над водой она или нет, используй команду surfaceIsWater:
_isOnWater = surfaceIsWater position _projectile;
Пока что пытаюсь понять принцип работы в вакууме (виртуальная реальность).
От части разобрался, но лишь от части. У меня получилась вот такое:
player addEventHandler ["FiredMan", { params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle"]; If (typeof _projectile == "F_40mm_Green") then { waituntil {_projectile inarea trg}; WPplane1 = getPosATL _projectile; If (surfaceIsWater WPplane1) then {hint "a"} else {hint "b"}; }; }];
Но присутствует проблема. Если стреляющий находится внутри триггера, все вроде ок, и работает без ошибок. НО, если стреляющий вне триггера, то в момент выстрела ракетой вылезает ошибка в {_projectile #inarea trg} При этом скрипт продолжает выполнение и выводит таки hint "b".
Самостоятельно решить не выходит. И я не знаю как прекращать циклы. Может я вообще не в ту сторону начал копаться.
И наверное сразу стоило упомянуть, наверняка это важно. Миссия кооперативная и с респаунами. Так что этот кусок кода будет лежать в "onPlayerRespawn.sqf"
#4
OFFLINE
Отправлено 16 December 2021 - 15:53 Лучший Ответ
Ошибка выдается по следующей причине:
Ты не заспавнил код, а запустил в том же блоке обработчика события.
Среда блока кода в обработчике внепланировачная, т.е. в ней циклы не работают.
Если ты стоишь в триггере, то снаряд с первой попытки проходит ожидание в цикле и идет дальше без ошибки, как будто бы цикла и не было.
Если же ты выходишь из триггера, то цикл ожидания со второй попытки выдает ошибку, потому что внепланировачная среда не допускает цикличную проверку.
Свой код поставь в блок, который ты заспавнишь и перенесешь в него тебе нужный параметр. Заспавненный блок позволяет использовать циклы ожидания:
[_projectile] spawn // Спавн нового блока кода с возможностью использовать циклы { params ["_projectile"]; If (typeof _projectile == "F_40mm_Green") then { _zhdat_do = time + 5; waituntil { _projectile inarea trg // Попала в зону триггера or time > _zhdat_do // 5 секунд прошло без попадания в зону триггера, пролетела мимо }; if (time > _zhdat_do) exitWith { // пролетела мимо триггера, выход из цикла без результата }; // Попала в зону триггера WPplane1 = getPosATL _projectile; If (surfaceIsWater WPplane1) then {hint "a"} else {hint "b"}; }; };
#5
OFFLINE
Отправлено 16 December 2021 - 17:11
Ошибка выдается по следующей причине:
Ты не заспавнил код, а запустил в том же блоке обработчика события.Среда блока кода в обработчике внепланировачная, т.е. в ней циклы не работают.
Если ты стоишь в триггере, то снаряд с первой попытки проходит ожидание в цикле и идет дальше без ошибки, как будто бы цикла и не было.
Если же ты выходишь из триггера, то цикл ожидания со второй попытки выдает ошибку, потому что внепланировачная среда не допускает цикличную проверку.
Свой код поставь в блок, который ты заспавнишь и перенесешь в него тебе нужный параметр. Заспавненный блок позволяет использовать циклы ожидания:[_projectile] spawn // Спавн нового блока кода с возможностью использовать циклы { params ["_projectile"]; If (typeof _projectile == "F_40mm_Green") then { _zhdat_do = time + 5; waituntil { _projectile inarea trg // Попала в зону триггера or time > _zhdat_do // 5 секунд прошло без попадания в зону триггера, пролетела мимо }; if (time > _zhdat_do) exitWith { // пролетела мимо триггера, выход из цикла без результата }; // Попала в зону триггера WPplane1 = getPosATL _projectile; If (surfaceIsWater WPplane1) then {hint "a"} else {hint "b"}; }; };
Большое спасибо! Вы\ты очень мне помог\ли.
В принципе я понял всё, кроме принципа работы команды spawn.
Если разжевать мне простыми словами принцип её работы, это наверняка очень поможет мне в будущем.
#6
OFFLINE
Отправлено 16 December 2021 - 18:46
Если по-простому, то существует планировщик, который запускает скрипты, останавливает один, продолжает другой и так далее. Планировщик признает работу циклов, потому что он вправе остановить скрипт и продолжить его, когда придет его очередь снова. Поэтому скрипты в планировщике по сути не очень влияют на ФПС. А есть скрипты, которые запускаются вне планировщика и игра по сути останавливается на долю секунды, пока этот скрипт не закончит свою работу. Эти скрипты проигрывают циклы только один раз, потому, что если они зациклятся, игра не продолжится, а будет ждать, пока этот скрипт прекратится.
Чтобы запустить что-то в планировщике, используй
Чтобы запустить в обход планировщика, используй .