• Страница 1 из 1
  • 1
Ограничение передвижения юнитов в маркере
Paramit
Среда, 18.02.2015, 18:22
Пост №: 1
Нужен скрипт/тригер. Который определенным юнитам или стороне, запретит нахождение в маркере. Пробовал через тригер. Не удалось, помогите,позязя. Пробовал через файл конфига, не удалось. Не могу понять как реализовать это на платформе вмт
Автор темы
 
Zealot
Среда, 18.02.2015, 18:49
Пост №: 2
Есть такой скрипт, запускается из 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
Спасибо, Зиалотушка. 3 дня мозг страдал. Огромное благодарносте!
Автор темы
 
DrSl1m
Пятница, 27.02.2015, 16:37
Пост №: 4
Попробовал провернуть обратную схему с данным скриптом.
Т.е. использовал этот скрипт для ограничения зоны перемещения любым игрокам через 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
Пост №: 5
Цитата DrSl1m ()
Выше приведен последний пример моих попыток, но какие варианты я не пробовал, возникает конфликт скриптов и юнит с именем VIP, находясь в триггерах viptr1 или viptr2, погибал от  скрипта "rearea" (хотя текст и таймер относились ко второму "vipzone").
Как мне добиться того, чтобы первый скрипт ("rearea.sqf") работал для всех, а ("vipzone.sqf") только для юнита VIP?
Дело в том, что скрипт использует глобальные переменные и поэтому на одной машине 2 копии скрипта запускать нельзя. Т.е. нужно в init.sqf сконфигурировать условия и парметры скрипта так, чтобы у игрока который VIP он запускался с одними параметрами, а у игрока, который не VIP запускался с другими параметрами. Ну или везде в тексте одного из скриптов поменять имена глобальных переменных.

Цитата DrSl1m ()
и одновременно использовать его с целью установки необходимого времени нахождения в триггере для достижения победы, где в скрипте поменял:
Вот так лучше не делать и завести отдельный триггер или скрипт, просто для избежания путаницы.

 
DrSl1m
Понедельник, 09.03.2015, 22:08
Пост №: 6
Цитата 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
Пост №: 7
Можно ли завязать выполнение скрипта за 2мя объектами?
Чтобы ограничение срабатывало при условии, что 2 определенных юнита находятся в зоне одновременно, не связанных стороной или группой.

 
Zealot
Понедельник, 16.03.2015, 23:31
Пост №: 8
Цитата DrSl1m ()
Можно ли завязать выполнение скрипта за 2мя объектами?
Чтобы ограничение срабатывало при условии, что 2 определенных юнита находятся в зоне одновременно, не связанных стороной или группой.
Не совсем понял. Скрипт ограничивает одного конкретного игрока. Скрипт можно запускать только для конкретных бойцов с помощью условий в init.sqf, тогда он будет работать только для конкретных бойцов, и остальные смогут свободно пермещаться.

 
DrSl1m
Вторник, 17.03.2015, 16:47
Пост №: 9
Цитата Zealot ()
Не совсем понял. Скрипт ограничивает одного конкретного игрока. Скрипт можно запускать только для конкретных бойцов с помощью условий в init.sqf, тогда он будет работать только для конкретных бойцов, и остальные смогут свободно пермещаться.
Я уже выкрутился, правда не совсем как хотел. Добавил в самом rearea.sqf, в условия возвращения true в безопасной зоне, нахождение в зоне еще одного бойца. Т.о. триггер срабатывает при условии нахождения в нём только 2х, определенных, бойцов. Правда не смог добиться того, чтобы таймер и предупреждения высвечивались у обоих.
Сообщение отредактировал DrSl1m - Вторник, 17.03.2015, 16:47

 
Zealot
Пятница, 20.03.2015, 08:19
Пост №: 10
Цитата DrSl1m ()
Я уже выкрутился, правда не совсем как хотел. Добавил в самом rearea.sqf, в условия возвращения true в безопасной зоне, нахождение в зоне еще одного бойца. Т.о. триггер срабатывает при условии нахождения в нём только 2х, определенных, бойцов. Правда не смог добиться того, чтобы таймер и предупреждения высвечивались у обоих.
Вообще чтобы это сделать надо переопределить функцию zlt_check_cond, чтобы она возвращала True если все эти условия выполнены (т.е. оба юнита в зоне), причем она должна возвращать True сразу для обоих юнитов.

 
DrSl1m
Четверг, 26.03.2015, 15:58
Пост №: 11
Есть ли способ выводить параметр MAX_TIME_OUT на экран в формате 00:00 или просто в минутах?
 
Zealot
Четверг, 26.03.2015, 18:23
Пост №: 12
Цитата 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
Пост №: 13
Спасибо, всё работает!
 
Zealot
Среда, 01.04.2015, 09:00
Пост №: 14
Самый последний вариант скрипта можно найти по ссылке:

http://u.to/2kSeDA

 
Zealot
Четверг, 08.10.2015, 15:07
Пост №: 15
Переписал скрипт и исправил ошибки
https://gist.githubusercontent.com/Zealot1....ea2.sqf

внимание! добавился дополнительный параметр при вызове скрипта
- 5 параметр - может ли игрок находиться в зоне которая явно не помечена триггером как разрешенная (true - по умолчанию)

 
  • Страница 1 из 1
  • 1
Поиск: