Ограничение передвижения юнитов в маркере
|
|
Paramit
|
Среда, 18.02.2015, 18:22
|
|
Нужен скрипт/тригер. Который определенным юнитам или стороне, запретит нахождение в маркере. Пробовал через тригер. Не удалось, помогите,позязя. Пробовал через файл конфига, не удалось. Не могу понять как реализовать это на платформе вмт
|
|
Автор темы
|
|
|
|
|
Zealot
|
Среда, 18.02.2015, 18:49
|
|
Есть такой скрипт, запускается из init.sqf: Код if (not isDedicated) then { waitUntil {not isNull player}; if (playerSide == west) then { [[trigger1],[trigger2,trigger3], true] execVM "rearea.sqf"; }; }; где [trigger1] - список триггеров в которые можно заходить, можно просто [] если их нет [trigger2,trigger3] - список триггеров в которые нельзя заходить, можно просто [] если их нет true - разрешенные зоны имеют больший приоритет (для организации проходов в запрещенных зонах) В самих триггерах ничего писать не надо, просто поставить на карте, задать имя и поставить активацию от какой угодно стороны. В данном примере скрипт запустится для западной стороны.
Сам скрипт rearea.sqf: Код /* запускать из init.sqf:
if (not isDedicated) then { waitUntil {not isNull player}; if (playerSide == west) then { [[trigger1],[trigger2,trigger3], true] execVM "rearea.sqf"; }; };*/
#define MAX_TIME_OUT 20 if (isDedicated) exitWith {};
// триггеры в которых должен находиться человек
// 1 - триггеры разрешенной зоны zlt_ra_allowed = _this select 0; // 2 - триггеры запрещенной зоны zlt_ra_restricted = _this select 1; // 3 - true если разрешенные зоны имеют больший приоритет zlt_ra_priority = _this select 2;
zlt_fnc_notify3 = { [ format["<t size='0.75' color='#ffff00'>%1</t>",_this], 0,1,5,0,0,301] spawn bis_fnc_dynamicText; };
// возвращает True в безопасной зоне zlt_check_cond = { _ret = true; private ["_zones","_return"]; if (zlt_ra_priority) then {_zones = [zlt_ra_restricted,zlt_ra_allowed]; _return = [false,true]; } else {_zones = [zlt_ra_allowed, zlt_ra_restricted]; _return = [true, false];}; { if ((vehicle player) in list _x) then {_ret = (_return select 0)}; } foreach (_zones select 0); { if ((vehicle player) in list _x) then {_ret = (_return select 1)}; } foreach (_zones select 1); _ret };
_timeOutZone = 0;
waitUntil {sleep 0.34; time > 0};
while {alive player} do { if ([] call zlt_check_cond) then { if (_timeOutZone != 0) then { _timeOutZone = 0; ("Вы вернулись в безопасную зону.") call zlt_fnc_notify3;
};
} else { _timeOutZone = _timeOutZone + 3; format ["У вас %1 сек на возвращение назад в безопасную зону!", 0 max (MAX_TIME_OUT - _timeOutZone)] call zlt_fnc_notify3; if (_timeOutZone > MAX_TIME_OUT) then { hint "Вас расстрелял боевой вертолет врага!"; sleep 1.; player setDamage 1;
};
};
sleep 3.0;
};
|
|
|
|
Paramit
|
Среда, 18.02.2015, 20:04
|
|
Спасибо, Зиалотушка. 3 дня мозг страдал. Огромное благодарносте!
|
|
Автор темы
|
|
|
|
|
DrSl1m
|
Пятница, 27.02.2015, 16:37
|
|
Попробовал провернуть обратную схему с данным скриптом. Т.е. использовал этот скрипт для ограничения зоны перемещения любым игрокам через 4 триггера, где в ините: Код if (playerSide == west) then { заменил на: Код if (vehicle player == player) then { и одновременно использовать его с целью установки необходимого времени нахождения в триггере для достижения победы, где в скрипте поменял: Код if (_timeOutZone > MAX_TIME_OUT) then { hint "Вас расстрелял боевой вертолет врага!"; sleep 1.; player setDamage 1; на: Код if (_timeOutZone > MAX_TIME_OUT) then { hint "Вы продержались!"; sleep 1.; [west, "Задание выполнено!"] call WMT_fnc_EndMission; Само собой в ините теперь 2 кода для запуска, ссылающихся на 2 разных sqf: Код if (not isDedicated) then { waitUntil {not isNull player}; if (vehicle player == player) then { [[],[TR1,TR2,TR3,TR4], false] execVM "rearea.sqf"; }; };
if (not isDedicated) then { waitUntil {not isNull player}; if (vehicle player == VIP) then { [[],[viptr1, viptr2], false] execVM "vipzone.sqf"; }; }; Выше приведен последний пример моих попыток, но какие варианты я не пробовал, возникает конфликт скриптов и юнит с именем VIP, находясь в триггерах viptr1 или viptr2, погибал от скрипта "rearea" (хотя текст и таймер относились ко второму "vipzone"). Как мне добиться того, чтобы первый скрипт ("rearea.sqf") работал для всех, а ("vipzone.sqf") только для юнита VIP?
|
|
|
|
Zealot
|
Пятница, 27.02.2015, 17:29
|
|
Цитата DrSl1m ( ) Выше приведен последний пример моих попыток, но какие варианты я не пробовал, возникает конфликт скриптов и юнит с именем VIP, находясь в триггерах viptr1 или viptr2, погибал от скрипта "rearea" (хотя текст и таймер относились ко второму "vipzone"). Как мне добиться того, чтобы первый скрипт ("rearea.sqf") работал для всех, а ("vipzone.sqf") только для юнита VIP? Дело в том, что скрипт использует глобальные переменные и поэтому на одной машине 2 копии скрипта запускать нельзя. Т.е. нужно в init.sqf сконфигурировать условия и парметры скрипта так, чтобы у игрока который VIP он запускался с одними параметрами, а у игрока, который не VIP запускался с другими параметрами. Ну или везде в тексте одного из скриптов поменять имена глобальных переменных.
Цитата DrSl1m ( ) и одновременно использовать его с целью установки необходимого времени нахождения в триггере для достижения победы, где в скрипте поменял: Вот так лучше не делать и завести отдельный триггер или скрипт, просто для избежания путаницы.
|
|
|
|
DrSl1m
|
Понедельник, 09.03.2015, 22:08
|
|
Цитата Zealot ( ) Дело в том, что скрипт использует глобальные переменные и поэтому на одной машине 2 копии скрипта запускать нельзя. Т.е. нужно в init.sqf сконфигурировать условия и парметры скрипта так, чтобы у игрока который VIP он запускался с одними параметрами, а у игрока, который не VIP запускался с другими параметрами. Получается, что в ините будет один код, который: при условии А вызывает "rearea.sqf" для всех и при условии B вызывает "vipzone.sqf" для VIP?
Добавлено (27.02.2015, 17:42) --------------------------------------------- Цитата Zealot ( ) Вот так лучше не делать и завести отдельный триггер или скрипт, просто для избежания путаницы. Да я уже запутался, хотя, вроде и понимаю о чем ты.
Добавлено (28.02.2015, 12:34) --------------------------------------------- Изменил глобальные переменные второго скрипта. Всё работает. Спасибо!
Сообщение отредактировал DrSl1m - Понедельник, 16.03.2015, 17:23
|
|
|
|
DrSl1m
|
Понедельник, 16.03.2015, 17:24
|
|
Можно ли завязать выполнение скрипта за 2мя объектами? Чтобы ограничение срабатывало при условии, что 2 определенных юнита находятся в зоне одновременно, не связанных стороной или группой.
|
|
|
|
Zealot
|
Понедельник, 16.03.2015, 23:31
|
|
Цитата DrSl1m ( ) Можно ли завязать выполнение скрипта за 2мя объектами? Чтобы ограничение срабатывало при условии, что 2 определенных юнита находятся в зоне одновременно, не связанных стороной или группой. Не совсем понял. Скрипт ограничивает одного конкретного игрока. Скрипт можно запускать только для конкретных бойцов с помощью условий в init.sqf, тогда он будет работать только для конкретных бойцов, и остальные смогут свободно пермещаться.
|
|
|
|
DrSl1m
|
Вторник, 17.03.2015, 16:47
|
|
Цитата Zealot ( ) Не совсем понял. Скрипт ограничивает одного конкретного игрока. Скрипт можно запускать только для конкретных бойцов с помощью условий в init.sqf, тогда он будет работать только для конкретных бойцов, и остальные смогут свободно пермещаться. Я уже выкрутился, правда не совсем как хотел. Добавил в самом rearea.sqf, в условия возвращения true в безопасной зоне, нахождение в зоне еще одного бойца. Т.о. триггер срабатывает при условии нахождения в нём только 2х, определенных, бойцов. Правда не смог добиться того, чтобы таймер и предупреждения высвечивались у обоих.
Сообщение отредактировал DrSl1m - Вторник, 17.03.2015, 16:47
|
|
|
|
Zealot
|
Пятница, 20.03.2015, 08:19
|
|
Цитата DrSl1m ( ) Я уже выкрутился, правда не совсем как хотел. Добавил в самом rearea.sqf, в условия возвращения true в безопасной зоне, нахождение в зоне еще одного бойца. Т.о. триггер срабатывает при условии нахождения в нём только 2х, определенных, бойцов. Правда не смог добиться того, чтобы таймер и предупреждения высвечивались у обоих. Вообще чтобы это сделать надо переопределить функцию zlt_check_cond, чтобы она возвращала True если все эти условия выполнены (т.е. оба юнита в зоне), причем она должна возвращать True сразу для обоих юнитов.
|
|
|
|
DrSl1m
|
Четверг, 26.03.2015, 15:58
|
|
Есть ли способ выводить параметр MAX_TIME_OUT на экран в формате 00:00 или просто в минутах?
|
|
|
|
Zealot
|
Четверг, 26.03.2015, 18:23
|
|
Цитата DrSl1m ( ) Есть ли способ выводить параметр MAX_TIME_OUT на экран в формате 00:00 или просто в минутах? В скрипте нужно заменить
Код format ["У вас %1 сек на возвращение назад в безопасную зону!", 0 max (MAX_TIME_OUT - _timeOutZone)] call zlt_fnc_notify3; на format ["У вас %1 сек на возвращение назад в безопасную зону!",[0 max (MAX_TIME_OUT - _timeOutZone),"MM:SS"] call BIS_fnc_secondsToString] call zlt_fnc_notify3;
|
|
|
|
DrSl1m
|
Пятница, 27.03.2015, 13:22
|
|
Спасибо, всё работает!
|
|
|
|
Zealot
|
Среда, 01.04.2015, 09:00
|
|
Самый последний вариант скрипта можно найти по ссылке:
http://u.to/2kSeDA
|
|
|
|
Zealot
|
Четверг, 08.10.2015, 15:07
|
|
Переписал скрипт и исправил ошибки https://gist.githubusercontent.com/Zealot1....ea2.sqf
внимание! добавился дополнительный параметр при вызове скрипта - 5 параметр - может ли игрок находиться в зоне которая явно не помечена триггером как разрешенная (true - по умолчанию)
|
|
|
|