Перейти к содержимому


Фотография

Вопросы по скриптингу

Arma3 как плотформа для созда Скритпы

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 1486

#341 OFFLINE   Ave_Ursus

Ave_Ursus

    Мл.сержант

  • Пользователи
  • 125 сообщений
  • Откуда:spb
  • Отряд:ex AS

Отправлено 05 June 2016 - 10:31

Дорогой коллективный разум, мне снова нужна твоя помощь.

Задача - развесить server-side нное количество триггеров по случайным точкам карты.

есть скрипт вызывающийся из инита сервера, генерящий рандомные координаты.

Кусок отвечающий за создание триггеров:

for _i=1 to блаблабла
//В цикле генерируем триггеры


trg = createTrigger ["EmptyDetector", _pos,true];
trg setTriggerArea [_radPosRadius, _radPosRadius, 0, false];
trg setTriggerActivation ["GUER", "PRESENT", true];
trg setTriggerStatements ["(vehicle player) in thisList", "ATH_current_rad_level = 2; ", "ATH_current_rad_level = 0;"];


}; Закончили циклиться.
по сути всё что мне нужно при заходе игрока в триггер значение переменной ATH_current_rad_level (определена в ините клиентов. Дефолтное значение 0.) должно меняться на, допустим 2, по деактивации триггера - снова 0.
 
Сижу с этой дурью всю ночь....Ниработает =(

Сообщение отредактировал Ave_Ursus: 05 June 2016 - 10:31

  • 0

#342 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 05 June 2016 - 10:35

Ave_Ursus, 1) попробуй изменить сторону активации на any
2) vehicle player in thisList - не факт что техника активировала триггер
  • 0

#343 OFFLINE   Ave_Ursus

Ave_Ursus

    Мл.сержант

  • Пользователи
  • 125 сообщений
  • Откуда:spb
  • Отряд:ex AS

Отправлено 05 June 2016 - 10:41

Ave_Ursus, 1) попробуй изменить сторону активации на any
2) vehicle player in thisList - не факт что техника активировала триггер

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

UPD. Попробовал поменять условие на 

trg setTriggerActivation ["ANY", "PRESENT", true];
trg setTriggerStatements ["player in thisList", "ATH_current_rad_level = 2;", "ATH_current_rad_level = 0;"];
Без изменений. 

Сообщение отредактировал Ave_Ursus: 05 June 2016 - 11:13

  • 0

#344 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 05 June 2016 - 11:32

Ave_Ursus, а вы их хоть как-то визуализировать для себя, что бы было точно видно, что вы вошли в зону триггера?
  • 0

#345 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 05 June 2016 - 12:10

Ave_Ursus, чтобы работала активация, заданная с помощью setTriggerActivation, первый параметр, передаваемый в setTriggerStatements, должен быть "this". Также отмечу, что переменная player на сервере не определена.

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


Сообщение отредактировал Schatten: 05 June 2016 - 12:55

  • 0

#346 OFFLINE   Ave_Ursus

Ave_Ursus

    Мл.сержант

  • Пользователи
  • 125 сообщений
  • Откуда:spb
  • Отряд:ex AS

Отправлено 05 June 2016 - 12:24

Ave_Ursus, а вы их хоть как-то визуализировать для себя, что бы было точно видно, что вы вошли в зону триггера? 

Угумс, маркеры спавню в центре триггера.

Ave_Ursus, чтобы работала активация, заданная с помощью setTriggerActivation, первый параметр, передаваемый в setTriggerStatements, должен быть "this". Также отмечу, что переменная player на сервере не определена.
Тут надо или создавать глобальные триггеры, затем передавать их игрокам и настраивать на их отслеживание, либо с сервера передавать игрокам координаты, в которых буду создаваться локальные триггеры.

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

 

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

Скорее всего сейчас переделаю вот под эту схему:

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

  • 0

#347 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 05 June 2016 - 12:42

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

Глобальность созданного триггера определяется последним параметром, передаваемом в createTrigger. И глобальные, и локальные триггеры можно создавать как на стороне игрока, так и на стороне сервера. НО! Глобальные триггеры со стороны игрока лучше не создавать, поскольку они не будут удаляться при его отключении.
Условие активации проверяется там, где оно было задано. Если создать глобальный триггер, передать управление над ним игроку и настроить его - то у игрока.
 

Уже придумал костыли - положил за край карты десяток заранее созданных триггеров и просто передвигаю их по нужным координатам, но не красиво. опять же лишние ресурсы кушает на проверку не используемых триггеров.
Скорее всего сейчас переделаю вот под эту схему:

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

Сложно сказать, что лучше: создавать глобальные триггеры на сервере и передавать контроль над ними игрокам, или локальные триггеры у игроков.

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


Сообщение отредактировал Schatten: 05 June 2016 - 13:00

  • 0

#348 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 05 June 2016 - 13:08

Ave_Ursus, чтобы работала активация, заданная с помощью setTriggerActivation, первый параметр, передаваемый в setTriggerStatements, должен быть "this"

Вовсе не обязательно, это нужно если вы хотите именно только условие активации триггера использовать, если нужно по активации юнита в зоне, то достаточно "unit1 in thisList"

Ave_Ursus, можно полную версию скрипта?

PS Это работает как часы:
_trg = createTrigger ["EmptyDetector", getPos player];
_trg setTriggerArea [5, 5, 0, false];
_trg setTriggerActivation ["ANY", "PRESENT", true];
_trg setTriggerStatements ["player in thisList", "hint '1'", "hint '2'"];

Сообщение отредактировал vlad333000: 05 June 2016 - 13:09

  • 1

#349 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 05 June 2016 - 13:10

 

Ave_Ursus, чтобы работала активация, заданная с помощью setTriggerActivation, первый параметр, передаваемый в setTriggerStatements, должен быть "this"

Вовсе не обязательно, это нужно если вы хотите именно только условие активации триггера использовать, если нужно по активации юнита в зоне, то достаточно "unit1 in thisList"

 

Согласен. Но Ave_Ursus задаёт условие активации с помощью setTriggerActivation, а потом "затирает" его с помощью setTriggerStatements. Зачем тогда использовать setTriggerActivation?
Ave_Ursus, если нужно, чтобы триггер активировался не только по условию, заданному с помощью setTriggerActivation, то нужно в setTriggerStatements передать такой первый параметр:

this and {<дополнительное условие>}

Сообщение отредактировал Schatten: 05 June 2016 - 13:12

  • 0

#350 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 05 June 2016 - 13:14

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

Объект триггера глобален (Если не задано обратно), проверка условия всегда локальна, команды настройки триггера всегда имеют локальный эффект

Ave_Ursus, чтобы работала активация, заданная с помощью setTriggerActivation, первый параметр, передаваемый в setTriggerStatements, должен быть "this"

Вовсе не обязательно, это нужно если вы хотите именно только условие активации триггера использовать, если нужно по активации юнита в зоне, то достаточно "unit1 in thisList"

Согласен. Но Ave_Ursus задаёт условие активации с помощью setTriggerActivation, а потом "затирает" его с помощью setTriggerStatements. Зачем тогда использовать setTriggerActivation?
Ave_Ursus, если нужно, чтобы триггер активировался не только по условию, заданному с помощью setTriggerActivation, то нужно в setTriggerStatements передать такой первый параметр:
this and {<дополнительное условие>}

Activation используется не только для активации триггера, но и для получения объектов в данной зоне, что и представляет собой переменная thisList - то что и хотел он
  • 0

#351 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 05 June 2016 - 13:18

Это работает как часы:

_trg = createTrigger ["EmptyDetector", getPos player];
_trg setTriggerArea [5, 5, 0, false];
_trg setTriggerActivation ["ANY", "PRESENT", true];
_trg setTriggerStatements ["player in thisList", "hint '1'", "hint '2'"];

Создавать глобальные триггеры со стороны игрока, как я уже писал, - плохая практика.
 

 

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

Объект триггера глобален (Если не задано обратно), проверка условия всегда локальна, команды настройки триггера всегда имеют локальный эффект

 

А из того, что я написал, это не следует?
 

 

Ave_Ursus задаёт условие активации с помощью setTriggerActivation, а потом "затирает" его с помощью setTriggerStatements. Зачем тогда использовать setTriggerActivation?

Activation используется не только для активации триггера, но и для получения объектов в данной зоне, что и представляет собой переменная thisList - то что и хотел он

 

Спасибо за информацию.


Сообщение отредактировал Schatten: 05 June 2016 - 13:23

  • 0

#352 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 05 June 2016 - 13:23

Schatten, добавить false и синхронизировать их позиции и размеры :)
  • 0

#353 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 05 June 2016 - 13:28

Schatten, добавить false и синхронизировать их позиции и размеры :)

Всё-таки лучше сделать так, как сделано во втором куске кода здесь, поскольку там триггер активируется только игроком, а в вашем случае кем угодно (даже животными).


Сообщение отредактировал Schatten: 05 June 2016 - 13:42

  • 0

#354 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 05 June 2016 - 13:52

Schatten, в моем случае триггер активируется только если игрок войдёт в триггер и никак больше
  • 0

#355 OFFLINE   Ave_Ursus

Ave_Ursus

    Мл.сержант

  • Пользователи
  • 125 сообщений
  • Откуда:spb
  • Отряд:ex AS

Отправлено 05 June 2016 - 13:55

В данный момент выглядит так:

серверсайд

private ["_radPointsValue","_i","_radPosType","_radPosRadius","_pos","_r","_theta","_position","_posy","_posx","_trg","_markerName"];
// _radPointsValue - количество горячих зон на карте
// _radPosType тип горячей зоны - влияет на уровень РАД/с
// _radPosRadius - радиус горячей зоны
_radPointsValue = floor random 10 + 1;
diag_log format ["_radPointsValue = %1",_radPointsValue];
for "_i" from 1 to _radPointsValue do
{
_radPosType = floor random 3 + 1;
_radPosRadius = floor random 50 + 1;
_r = random 1500;
_theta = random 360;
_position = getMarkerPos "3km center";
_posx = _position select 0;
_posy = _position select 1;
_pos = [_posx+_r*Cos(_theta),_posy+_r*Sin(_theta),0];
diag_log format ["_radPosType = %1, _radPosRadius=%2, _pos=%3",_radPosType,_radPosRadius,_pos];
[_radPosType,_radPosRadius,_pos,_i] remoteExec ["ATH_createRadiationSpot",0,true]; 
};

Клиентсайд

/**
 * ATH_Client_fnc_createRadiationSpot.sqf
 * Athena Mod
 * Создаёт "горячую зону" по параметрам переданным с сервера
 */


 private ["_radPosType","_radPosRadius","_pos","_i","_markerName","_mrk"];
_radPosType = _this select 0;
_radPosRadius = _this select 1;
_pos = _this select 2;
_i = _this select 3;
diag_log format ["_radPosType = %1, _radPosRadius=%2, _pos=%3, _i=%4",_radPosType,_radPosRadius,_pos,_i];


// приходит вот это: [_radPosType,_radPosRadius,_pos,_i] remoteExec ["ATH_createRadiationSpot",0,true];
switch (_radPosType) do 
{
    case 1: 
{
trg = createTrigger ["EmptyDetector", _pos,false];
trg setTriggerArea [_radPosRadius, _radPosRadius, 0, false];
trg setTriggerActivation ["ANY", "PRESENT", true];
trg setTriggerStatements ["player in thisList", "ATH_current_rad_level = 1;", "ATH_current_rad_level = 0;"];
_markerName = format["%1_marker",_i];
_mrk = createMarkerLocal [_markerName, _pos];
_mrk setMarkerColorLocal "ColorRed";
_mrk setMarkerTypeLocal "Mil_dot";
_mrk setMarkerTextLocal "Rad zone";
};
    case 2: 
{
trg = createTrigger ["EmptyDetector", _pos,false];
trg setTriggerArea [_radPosRadius, _radPosRadius, 0, false];
trg setTriggerActivation ["ANY", "PRESENT", true];
trg setTriggerStatements ["player in thisList", "ATH_current_rad_level = 2;", "ATH_current_rad_level = 0;"];
_markerName = format["%1_marker",_i];
_mrk = createMarkerLocal [_markerName, _pos];
_mrk setMarkerColorLocal "ColorRed";
_mrk setMarkerTypeLocal "Mil_dot";
_mrk setMarkerTextLocal "Rad zone";
};
case 3: 
{
trg = createTrigger ["EmptyDetector", _pos,false];
trg setTriggerArea [_radPosRadius, _radPosRadius, 0, false];
trg setTriggerActivation ["ANY", "PRESENT", true];
trg setTriggerStatements ["player in thisList", "ATH_current_rad_level = 3;", "ATH_current_rad_level = 0;"];
_markerName = format["%1_marker",_i];
_mrk = createMarkerLocal [_markerName, _pos];
_mrk setMarkerColorLocal "ColorRed";
_mrk setMarkerTypeLocal "Mil_dot";
_mrk setMarkerTextLocal "Rad zone";
};
};
Согласен. Но Ave_Ursus задаёт условие активации с помощью setTriggerActivation, а потом "затирает" его с помощью setTriggerStatements. Зачем тогда использовать setTriggerActivation?

 

Чёрт... точно.. Это мой первый раз с триггерами =)

Накосячил.


  • 0

#356 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 05 June 2016 - 13:59

vlad333000, я имел ввиду, что в вашем решении условие активации, заданное с помощью setTriggerStatements, проверяется при появлении в зоне действия триггера кого угодно, а в моём решении - только игрока.

 

 

Согласен. Но Ave_Ursus задаёт условие активации с помощью setTriggerActivation, а потом "затирает" его с помощью setTriggerStatements. Зачем тогда использовать setTriggerActivation?

Чёрт... точно.. Это мой первый раз с триггерами =)
Накосячил.

 

Если vlad333000 прав, а я так думаю, то можно оставить так, как было.


Сообщение отредактировал Schatten: 05 June 2016 - 14:08

  • 0

#357 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 05 June 2016 - 14:08

Schatten, вы что курили?
Ave_Ursus, теперь забудьте это:




Согласен. Но Ave_Ursus задаёт условие активации с помощью setTriggerActivation, а потом "затирает" его с помощью setTriggerStatements. Зачем тогда использовать setTriggerActivation?


Я вам обоим повторю еще раз если не доперло: полная активация триггера и setTriggerActivations это две разные вещи!!!
setTriggerActivation устанавливает так сказать "дефолтную" активацию триггера и передает ее результат в две переменные: this (Истина или Ложь "дефолтного" условия) и thisList (Объекты в зоне триггера удовлетворяющие условие). Без задания этого "дефолтного" условия у вас попросту не будет правильно опеределена переменная thisList
Идем дальше, setTriggerStatements, а точнее ее первый параметр это и есть необходимое и достаточное условие активации триггера! Если вы пишите: this, то триггера активируется только если выполнится "дефолтное" условие, если вы пишете там что угодно, отличное от этого, то это не ломает логику и триггер активирует по выполнению этого условия и даже если не было активировано "дефолтное" услови


Schatten, ...setTriggerActiovation ["ANY", "PRESENT"... - задаем условие триггеру, что бы он передал нам все объекты находящиеся в его зоне
...setTriggerStatements ["player in thisList"... - проверяем условие нахождения игрока в списке полученном командой выше
Триггер активируется только если игрок войдет в зону и окажется в этом списке!

Сообщение отредактировал vlad333000: 05 June 2016 - 14:09

  • 0

#358 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 05 June 2016 - 14:10

Ave_Ursus, я бы на стороне сервера формировал массив координат и отправлял бы его игроку. Также немного переделал часть клиентского кода:
_markerName = format ["%1_marker", _i];

_mrk = createMarkerLocal [_markerName, _pos];

_mrk setMarkerColorLocal "ColorRed";
_mrk setMarkerTypeLocal "Mil_dot";
_mrk setMarkerTextLocal "Rad zone";

_trg = createTrigger ["EmptyDetector", _pos, false];

_trg triggerAttachVehicle [player];

_trg setTriggerActivation ["VEHICLE", "PRESENT", true];
_trg setTriggerArea [_radPosRadius, _radPosRadius, 0, false];

_triggerStatements = switch (_radPosType) do {
	case 1: {["this", "ATH_current_rad_level = 1;", "ATH_current_rad_level = 0;"]};
	case 2: {["this", "ATH_current_rad_level = 2;", "ATH_current_rad_level = 0;"]};
	case 3: {["this", "ATH_current_rad_level = 3;", "ATH_current_rad_level = 0;"]};
	default {["", "", ""]};
};

_trg setTriggerStatements _triggerStatements;

Сообщение отредактировал Schatten: 05 June 2016 - 14:24

  • 0

#359 OFFLINE   Ave_Ursus

Ave_Ursus

    Мл.сержант

  • Пользователи
  • 125 сообщений
  • Откуда:spb
  • Отряд:ex AS

Отправлено 05 June 2016 - 14:14

Стоп дяденьки, что то не так...

С бесовики 

trigger setTriggerActivation [активируется кем, тип активации, повторяемость]

trigger setTriggerStatements [условие, действие при активации, действие при деактивации]

Parameters:


условие:  activation: 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 - Code that is executed when the trigger is activated. Special variables available here: deactivation: 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 - Code that is executed when the trigger is deactivated. Special variable available here:

Насколько я понимаю без setTriggerStatements жить нельзя. Тогда не понятно что именно я им переопределяю..


  • 0

#360 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 05 June 2016 - 14:16

Schatten, вы что курили?
полная активация триггера и setTriggerActivations это две разные вещи!!!
setTriggerActivation устанавливает так сказать "дефолтную" активацию триггера и передает ее результат в две переменные: this (Истина или Ложь "дефолтного" условия) и thisList (Объекты в зоне триггера удовлетворяющие условие). Без задания этого "дефолтного" условия у вас попросту не будет правильно опеределена переменная thisList
Идем дальше, setTriggerStatements, а точнее ее первый параметр это и есть необходимое и достаточное условие активации триггера! Если вы пишите: this, то триггера активируется только если выполнится "дефолтное" условие, если вы пишете там что угодно, отличное от этого, то это не ломает логику и триггер активирует по выполнению этого условия и даже если не было активировано "дефолтное" услови

Разве я это опровергал?
 

Schatten, ...setTriggerActiovation ["ANY", "PRESENT"... - задаем условие триггеру, что бы он передал нам все объекты находящиеся в его зоне
...setTriggerStatements ["player in thisList"... - проверяем условие нахождения игрока в списке полученном командой выше
Триггер активируется только если игрок войдет в зону и окажется в этом списке!

Зачем этот костыль?
 

Насколько я понимаю без setTriggerStatements жить нельзя. Тогда не понятно что именно я им переопределяю..

Если вас устраивает условие активации, заданное с помощью setTriggerActivation, то первый параметр, который вы отправляете в setTriggerStatements, должен быть "this", если не устраивает - то "this and {<условие>}" или "<условие>".
Посмотрите на это решение. Там меня устраивает условие, заданное с помощью setTriggerActivation, - появление игрока в зоне действия триггера. Поэтому первый параметр, отправляемый в setTriggerStatements, - "this". Если бы мне надо было ещё ограничить высоту, то я написал бы так - "this and {((getPosATL player) select 2) < 20}".


Сообщение отредактировал Schatten: 05 June 2016 - 14:29

  • 1




Яндекс.Метрика