Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
ka3ant1p

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

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

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


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

Рекомендованные сообщения

  • 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.

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

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

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


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





  • 0

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

 

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

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

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

 

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

 

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

 

 

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

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


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

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

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

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

 

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

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

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


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

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

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

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

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


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

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

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

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

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

 

вот так:

 

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.