Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • 0
Sign in to follow this  
ka3ant1p

активация триггера

как сделать так что бы триггер активировался только на первого вошедшего в его радиус игрока, а на остальных не срабатывал до тех пор пока есть кто из игроков в триггере, но при покидании всеми игроками триггера и заного попадения в него он активируется повторно?
Приерно так:
игрок 1 вошел в тригер - заспавнил 20 зомби, игрок2 - зашел в триггер - ничего не прозиошло, оба игрока вышли из триггера - зомбаки деспаунились, игрок 1 или игрок2 вновь вошли в тригер - опять заспавнились

Share this post


Link to post
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Добавь глобальную переменную.

Активируй скрипт, при заходе в триггер.

В скрипте, в самом верху проверяй условие -

Если глобальная переменная, фальш - ставим ее в тру, и продолжаем скрипт.

Если она уже тру, - выходим из скрипта.

 

Далее в скрипте, спавни функцию, которая будет периодически смотреть зону.

Если игроков нет - ставить переменную в фальш, и завершать работу.

 

Трабла в том, что это может работать на стороне сервера, как триггер.

А если триггер на стороне клиента, то надо делать через PVAH - добавление публичного события.(Триггер, о котором надо по сути оповещать других игроков, ведь им пох, что у кого то глобальная переменная НА ЛОКАЛЬНОЙ машине, стала в тру).

Т.е. отсылать на сервер сообщение, что триггер уже активен.

И при деактивации, отсылать другое сообщение, - что триггер неактивен.

 

Про переменные небольшая сноска))) -

 

Глобальные переменные:

 

Глобальные на сервере - видны всему серверу(не игрокам, но могут быть им переданы из скрипта, в сообщении).

 

Глобальные на клиенте - видны клиенту(только текущему у которого они инициализировались!), во всех его(клиента) скриптах.

*При желании, состояние переменной можно передать на сервер, с помощью пакета, или всем игрокам с помощью броадкаст сообщения.

 

Локальные переменные:

 

Видны только внутри текущего скрипта, как на сервере, так и на клиентской стороне.

 

Ну и до кучи пример:

 

Запусти этот скрипт на сервере.

 

 

if (isServer) then
{
while {true} do
{
_pos           = [5400,5400,0];
_zombies    =    nearestObjects [_pos, ["zZombie_Base"],100];
_count        =    count _zombies;
diag_log (format["тест: Количество зомби в секторе: %1",_count]);
sleep 5;
};
};
 

 

 

А этот на клиенте:

 

 

while {true} do
{
_zombies    =    nearestObjects [player, ["zZombie_Base"],100];
_count        =    count _zombies;
systemChat(format["тест: Количество зомби в секторе: %1",_count]);
sleep 5;
};
 

 

 

Перемести персонажа, в точку 5400,5400,0

и смотри, что говорит клиент, и что сервер.

 

Пока зм тебя не ударят, ты будешь видеть со стороны сервера, кол-во 0.(в RPT)/

Хотя клиент будет исправно показывать, сколько зм вокруг тебя.

Это если ты один в этой точке.

Почему?

Потому что зм пораждает клиент, а когда они - зм, наносят дамаг, - дамаг идет на сервер, который вносит твоих зм в список существующих, vehicle.

Если с тобой рядом кто то есть, - пакет на сервер отравится сразу, т.к. надо передать данные о зм другому игроку.

Вот такая блядь каша в арме. Привыкай.

Share this post


Link to post
Share on other sites



  • 0

если честно то ты меня немного запутал  :wacko: 

а если сделать так:

вызываю скрипт из триггера,
В скрипте получаю координаты триггера
Добавляю локальную переменную в самое начало со значение фолс, далее проверка от центра тригера по всему радиусе на наличие плееров, если есть то выход если нет то запуск скрипта.

Так же и в скрипте деактивации, делаю проверку если есть игроки то просто прекращение выполнения скрипта, если нету тогда выполнения деспауна
 

Share this post


Link to post
Share on other sites
  • 0

Я чет не понял - триггер, что должен сработать когда никого нет?)))

"если есть то выход если нет то запуск скрипта."

Share this post


Link to post
Share on other sites
  • 0

ты не так просто понял =)

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

В скрипт на деспаун:
проверяем если другие игроке есть в триггере - тогда выходим из скрипта, если нету тогда выполняем деспаун.

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

Share this post


Link to post
Share on other sites
  • 0

На Деспаун можешь забить, они сами исчезнут, когда игрок отойдет от точки. Зачем их деспавнить то?

 

По сути тебе надо

1. Чтобы триггер срабатывал при заходе игрока в него, но только если он еще не работает.

2. Отключался если игрок(и) вышли из зоны триггера.

 

На стороне сервера делай триггер этот.

 

if (isServer) then
    {
        поиск игроков
        если есть хоть 1 игрок
        выполяем действие
        sleep 10;
    };

 

 

Первый раз неверно написал, - забудь))

Share this post


Link to post
Share on other sites
  • 0

сделал проще, выдернул как раз подходящую функцию из zombie_generate.sqf
 

_isNoone = 	{isPlayer _x} count (_position nearEntities [["AllVehicles","CAManBase"],30]) == 0;

оставил там только CAManBase и сделал провеку в скрипте который при активации если _isNoone тогда скрипт запускается
и на деактивацию проверку запускается если _isNoone 

 

то есть игрок (клиент) проверяет есть ли другие игроки в триггере, и исполняет на свой стороне скрипт если игроков нет.

Edited by ka3ant1p (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Замечательно -

Бегут два товарища, рядом друг с другом, забегают в триггер, а он не работает, т.к. по мнению любого из клиентов, - игрок уже есть в триггере, т.к. в nearEntities сто пудово будет его товарищ, который бежит рядом. Ты ведь проверку делаешь по поиску в пределах 30метров, от одного игрока, до другого...

Ну вот если 2 или более человека бегут вместе, каждый из них будет всегда находить другого.

Share this post


Link to post
Share on other sites
  • 0

Замечательно -

Бегут два товарища, рядом друг с другом, забегают в триггер, а он не работает, т.к. по мнению любого из клиентов, - игрок уже есть в триггере, т.к. в nearEntities сто пудово будет его товарищ, который бежит рядом. Ты ведь проверку делаешь по поиску в пределах 30метров, от одного игрока, до другого...

Ну вот если 2 или более человека бегут вместе, каждый из них будет всегда находить другого.

 я его немного переписал просто =)

 

вот так:

 

_position = getPosATL _triger;
_isNoone = {isPlayer _x} count (_position nearEntities [["CAManBase"],_radius]) == 1;

То есть я в скрипте получаю координаты центра триггера, и делаю проверку в радиусе триггера уже есть игрок то скрипт не будет работать

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.