ka3ant1p

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

Вопрос

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

8 ответов на этот вопрос

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

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

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

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

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

 

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

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

 

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

А если триггер на стороне клиента, то надо делать через 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.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

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

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

 

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

 

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

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

Изменено пользователем ka3ant1p (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

 

вот так:

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас