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


Фотография

Безопасная зона / Защита базы


Лучший Ответ Sa-Matra , 22 November 2015 - 13:12

Терпеть не могу триггеры, но все-таки решил попробовать помочь. То что я привел выше это решение достаточно сложное (но более гибкое), но в принципе тут можно одним триггером и 2д редактором обойтись.
 
CONDITION:

!(thisList isEqualTo (thisTrigger getVariable ["oldList", []]))
ON ACT:
thisTrigger setVariable ["oldList", +thisList];
thisTrigger call {
	_list = [];
	{
		_list pushBack _x;
		{
			if!(_x in _list) then {_list pushBack _x};
		} forEach crew _x;
	} forEach list _this;
	
	{
		_x allowDamage false;
	} forEach _list;

	{
		_x allowDamage true;
	} forEach ((_this getVariable ["oldSafeList", []]) - _list);

	_this setVariable ["oldSafeList", _list];
};
Вкратце что происходит, триггер активируется когда меняется thisList (сравнивается старый thisList хранящийся в oldList), по активации создается список всех юнитов и техниики в thisList (oldSafeList), им ставится allowDamage false, потом разнице между старым oldSafeList и oldSafeList ставится allowDamage true чтобы техника и юниты вне триггера стали снова смертными.

(Для тех кто найдет тему в гугле, в А2 работать не будет, ибо там нет isEqualTo и pushBack, хотя их можно заменить на альтернативы) Перейти к сообщению


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

#1 OFFLINE   Cast

Cast

    Ефрейтор

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

Отправлено 21 November 2015 - 16:05

Пробовал с разных форумов через триггер сделать с помощью HandleDamage (вообще не работает) и {_x allowdamage false} foreach vehicle (все становится даже за пределами триггера бессмертным). 

Задача в целом такая: только в зоне триггера техника и люди неуязвимы. Как это правильно составить? Или каким модулем это можно сделать (вроде бы все перебрал)?


Сообщение отредактировал Cast: 21 November 2015 - 16:06

  • 0

#2 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 21 November 2015 - 17:05

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


  • 0

#3 OFFLINE   Cast

Cast

    Ефрейтор

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

Отправлено 21 November 2015 - 18:01

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

 

Пока что не работает сам триггер. Если так: {_x allowdamage false} foreach vehicle в поле активации, то покинув область машина все равно бессмертна. Как это исправить?


  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 21 November 2015 - 18:42

 

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

 
Пока что не работает сам триггер.

 

А у меня работает.
Создаём локальный триггер у каждого игрока (https://arma3.ru/for...vki/#entry56154) и настраиваем его так:

_trigger setTriggerStatements [
	"this",
	"player allowDamage false",
	"player allowDamage true"
];

  • 0

#5 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 21 November 2015 - 18:50

~


Сообщение отредактировал SteelRat: 21 November 2015 - 18:59

  • 0

#6 OFFLINE   Cast

Cast

    Ефрейтор

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

Отправлено 21 November 2015 - 19:29

_trigger setTriggerStatements [
	"this",
	"player allowDamage false",
	"player allowDamage true"
];

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

 

_position а эта переменная устанавливает триггер на позиции игрока?


  • 0

#7 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 21 November 2015 - 19:41

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

Согласен, пока затрудняюсь помочь.
 

_position а эта переменная устанавливает триггер на позиции игрока?

Зависит от того, какие координаты были присвоены этой переменной.


  • 0

#8 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 22 November 2015 - 00:08

 

_trigger setTriggerStatements [
	"this",
	"player allowDamage false",
	"player allowDamage true"
];

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

 

_position а эта переменная устанавливает триггер на позиции игрока?

 

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

Попробовать параметр by = "VEHICLE"

Это должно активироваться и на технике и на игроках с ботами.

Если не прокатит, то попробовать это

Side': "ANY"


Сообщение отредактировал SteelRat: 22 November 2015 - 00:11

  • 0

#9 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 22 November 2015 - 11:16

Попробовать параметр by = "VEHICLE"
Это должно активироваться и на технике и на игроках с ботами.

А по-моему в этом случае триггер будет реагировать только на то, что к нему было прикреплено с помощью команды triggerAttachVehicle.

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

К технике внутри триггера можно обратиться через массив thisList. Если же техника покинула пределы триггера, то как к ней обратиться? Очевидно, нужен ещё один массив и какой-то алгоритм для отслеживания техники, покинувшей пределы триггера.


Сообщение отредактировал Schatten: 22 November 2015 - 11:24

  • 0

#10 OFFLINE   Cast

Cast

    Ефрейтор

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

Отправлено 22 November 2015 - 11:22

 

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

 

Попробовать параметр by = "VEHICLE"

Это должно активироваться и на технике и на игроках с ботами.

Если не прокатит, то попробовать это

Side': "ANY"

 

 

Вот так получилось, но не срабатывает деактивация... 

_trg = createTrigger ["safeZone", safe];  \\ safe - машина для эксперементов
_trg setTriggerArea [10, 10, 0, false];
_trg setTriggerActivation ["any", "PRESENT", true];
_trg setTriggerStatements ["this", "{_x allowdamage false} foreach thisList", "{_x allowdamage true} foreach thisList"];

Пытался найти что то на форумах разных. Если честно, там все делается через скрипт и как  то очень замудренно. Неужели нельзя в деактивации что то придумать...


  • 0

#11 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 22 November 2015 - 11:26

не срабатывает деактивация...

Это потому что переменная thisList недоступна в "On deact."
 

Неужели нельзя в деактивации что то придумать...

Можно и нужно.


  • 0

#12 OFFLINE   Sa-Matra

Sa-Matra

    Ефрейтор

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

Отправлено 22 November 2015 - 12:07

Я делаю так:

1) Для безопасной зоны создается Location

2) На всю игровую технику (и юнитов) вешается HandleDamage

3) В HandleDamage проверяется находится ли объект внутри локации (локация может быть эллипсом, квадратом, повернута, т.д.)

 

Самая большая сложность тут вешать на всю технику HandleDamage, от миссии зависит. Если спавн всего под контролем, то не сложно, если солянка из скриптов, придется копаться. Вообще прямо на всю вешать не обязательно, только на ту которой это самое бессмертие в безопасной зоне нужно.


Сообщение отредактировал Sa-Matra: 22 November 2015 - 12:08

  • 1

#13 OFFLINE   Cast

Cast

    Ефрейтор

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

Отправлено 22 November 2015 - 12:38

Я делаю так:

1) Для безопасной зоны создается Location

2) На всю игровую технику (и юнитов) вешается HandleDamage

3) В HandleDamage проверяется находится ли объект внутри локации (локация может быть эллипсом, квадратом, повернута, т.д.)

 

Самая большая сложность тут вешать на всю технику HandleDamage, от миссии зависит. Если спавн всего под контролем, то не сложно, если солянка из скриптов, придется копаться. Вообще прямо на всю вешать не обязательно, только на ту которой это самое бессмертие в безопасной зоне нужно.

 

Можешь написать пример? 

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

 тут как то все запутанно(( Скриптов никаких нету больше. Я пытался сделать миссию чисто на модулях) Спавнится техника всегда на одном месте


  • 0

#14 OFFLINE   Sa-Matra

Sa-Matra

    Ефрейтор

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

Отправлено 22 November 2015 - 13:12   Лучший Ответ

Терпеть не могу триггеры, но все-таки решил попробовать помочь. То что я привел выше это решение достаточно сложное (но более гибкое), но в принципе тут можно одним триггером и 2д редактором обойтись.
 
CONDITION:
!(thisList isEqualTo (thisTrigger getVariable ["oldList", []]))
ON ACT:
thisTrigger setVariable ["oldList", +thisList];
thisTrigger call {
	_list = [];
	{
		_list pushBack _x;
		{
			if!(_x in _list) then {_list pushBack _x};
		} forEach crew _x;
	} forEach list _this;
	
	{
		_x allowDamage false;
	} forEach _list;

	{
		_x allowDamage true;
	} forEach ((_this getVariable ["oldSafeList", []]) - _list);

	_this setVariable ["oldSafeList", _list];
};
Вкратце что происходит, триггер активируется когда меняется thisList (сравнивается старый thisList хранящийся в oldList), по активации создается список всех юнитов и техниики в thisList (oldSafeList), им ставится allowDamage false, потом разнице между старым oldSafeList и oldSafeList ставится allowDamage true чтобы техника и юниты вне триггера стали снова смертными.

(Для тех кто найдет тему в гугле, в А2 работать не будет, ибо там нет isEqualTo и pushBack, хотя их можно заменить на альтернативы)

Сообщение отредактировал Sa-Matra: 22 November 2015 - 13:14

  • 3

#15 OFFLINE   Cast

Cast

    Ефрейтор

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

Отправлено 22 November 2015 - 13:36

Терпеть не могу триггеры, но все-таки решил попробовать помочь. То что я привел выше это решение достаточно сложное (но более гибкое), но в принципе тут можно одним триггером и 2д редактором обойтись.
 
CONDITION:

!(thisList isEqualTo (thisTrigger getVariable ["oldList", []]))
ON ACT:
thisTrigger setVariable ["oldList", +thisList];
thisTrigger call {
	_list = [];
	{
		_list pushBack _x;
		{
			if!(_x in _list) then {_list pushBack _x};
		} forEach crew _x;
	} forEach list _this;
	
	{
		_x allowDamage false;
	} forEach _list;

	{
		_x allowDamage true;
	} forEach ((_this getVariable ["oldSafeList", []]) - _list);

	_this setVariable ["oldSafeList", _list];
};
Вкратце что происходит, триггер активируется когда меняется thisList (сравнивается старый thisList хранящийся в oldList), по активации создается список всех юнитов и техниики в thisList (oldSafeList), им ставится allowDamage false, потом разнице между старым oldSafeList и oldSafeList ставится allowDamage true чтобы техника и юниты вне триггера стали снова смертными.

(Для тех кто найдет тему в гугле, в А2 работать не будет, ибо там нет isEqualTo и pushBack, хотя их можно заменить на альтернативы)

 

 

Дополню в параметрах триггера:

сторона - Кто угодно (Any)

Повторять.

 

Все сработало. Спасибо) только где тут HandleDammage?))


  • 1

#16 OFFLINE   Sa-Matra

Sa-Matra

    Ефрейтор

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

Отправлено 22 November 2015 - 13:39

Дополню в параметрах триггера:
сторона - Кто угодно (Any)
Повторять.
 
Все сработало. Спасибо) только где тут HandleDammage?))

Написал выше что с HandleDamage и Location'ом все-таки слишком сложно будет, поэтому решил сделать простое но менее гибкое решение через триггер.
  • 0

#17 OFFLINE   Cast

Cast

    Ефрейтор

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

Отправлено 22 November 2015 - 13:47

Я делаю так:

1) Для безопасной зоны создается Location

2) На всю игровую технику (и юнитов) вешается HandleDamage

3) В HandleDamage проверяется находится ли объект внутри локации (локация может быть эллипсом, квадратом, повернута, т.д.)

 

А тут все просто выглядело) Ну да ладно. Главное, что триггер работает


Сообщение отредактировал Cast: 22 November 2015 - 13:48

  • 0

#18 OFFLINE   Dimon UA

Dimon UA

    Ст.сержант

  • Пользователи
  • 304 сообщений
  • Откуда:Севастополь

Отправлено 23 November 2015 - 00:38

ну еще можно сделать с помощью функции CBA_fnc_inArea.


  • 0

#19 OFFLINE   Cast

Cast

    Ефрейтор

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

Отправлено 26 November 2015 - 09:37

ну еще можно сделать с помощью функции CBA_fnc_inArea.

 

Как работает эта функция? на Бис Вики не находит ее даже...


  • 0

#20 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 26 November 2015 - 10:20

 

ну еще можно сделать с помощью функции CBA_fnc_inArea.

 
Как работает эта функция? на Бис Вики не находит ее даже...

 


Естественно, поскольку эта функция принадлежит дополнению CBA. Поэтому и смотреть её описание нужно на сайте, посвящённом CBA:

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

.


  • 1




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