Jump to content


Photo

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


Best Answer 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, хотя их можно заменить на альтернативы) Go to the full post


  • Please log in to reply
22 replies to this topic

#1 OFFLINE   Cast

Cast

    Ефрейтор

  • Пользователи
  • 58 posts

Posted 21 November 2015 - 16:05

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

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


Edited by Cast, 21 November 2015 - 16:06.

  • 0

#2 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1797 posts
  • Откуда:Тбилиси, Грузия

Posted 21 November 2015 - 17:05

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


  • 0

#3 OFFLINE   Cast

Cast

    Ефрейтор

  • Пользователи
  • 58 posts

Posted 21 November 2015 - 18:01

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

 

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


  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1797 posts
  • Откуда:Тбилиси, Грузия

Posted 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 posts
  • Откуда:РФ

Posted 21 November 2015 - 18:50

~


Edited by SteelRat, 21 November 2015 - 18:59.

  • 0

#6 OFFLINE   Cast

Cast

    Ефрейтор

  • Пользователи
  • 58 posts

Posted 21 November 2015 - 19:29

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

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

 

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


  • 0

#7 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1797 posts
  • Откуда:Тбилиси, Грузия

Posted 21 November 2015 - 19:41

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

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

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

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


  • 0

#8 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 22 November 2015 - 00:08

 

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

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

 

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

 

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

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

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

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

Side': "ANY"


Edited by SteelRat, 22 November 2015 - 00:11.

  • 0

#9 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1797 posts
  • Откуда:Тбилиси, Грузия

Posted 22 November 2015 - 11:16

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

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

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

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


Edited by Schatten, 22 November 2015 - 11:24.

  • 0

#10 OFFLINE   Cast

Cast

    Ефрейтор

  • Пользователи
  • 58 posts

Posted 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

    Капитан

  • Пользователи
  • 1797 posts
  • Откуда:Тбилиси, Грузия

Posted 22 November 2015 - 11:26

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

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

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

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


  • 0

#12 OFFLINE   Sa-Matra

Sa-Matra

    Ефрейтор

  • Пользователи
  • 97 posts

Posted 22 November 2015 - 12:07

Я делаю так:

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

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

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

 

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


Edited by Sa-Matra, 22 November 2015 - 12:08.

  • 1

#13 OFFLINE   Cast

Cast

    Ефрейтор

  • Пользователи
  • 58 posts

Posted 22 November 2015 - 12:38

Я делаю так:

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

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

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

 

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

 

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

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

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


  • 0

#14 OFFLINE   Sa-Matra

Sa-Matra

    Ефрейтор

  • Пользователи
  • 97 posts

Posted 22 November 2015 - 13:12   Best Answer

Терпеть не могу триггеры, но все-таки решил попробовать помочь. То что я привел выше это решение достаточно сложное (но более гибкое), но в принципе тут можно одним триггером и 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, хотя их можно заменить на альтернативы)

Edited by Sa-Matra, 22 November 2015 - 13:14.

  • 3

#15 OFFLINE   Cast

Cast

    Ефрейтор

  • Пользователи
  • 58 posts

Posted 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 posts

Posted 22 November 2015 - 13:39

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

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

#17 OFFLINE   Cast

Cast

    Ефрейтор

  • Пользователи
  • 58 posts

Posted 22 November 2015 - 13:47

Я делаю так:

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

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

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

 

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


Edited by Cast, 22 November 2015 - 13:48.

  • 0

#18 OFFLINE   Dimon UA

Dimon UA

    Ст.сержант

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

Posted 23 November 2015 - 00:38

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


  • 0

#19 OFFLINE   Cast

Cast

    Ефрейтор

  • Пользователи
  • 58 posts

Posted 26 November 2015 - 09:37

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

 

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


  • 0

#20 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1797 posts
  • Откуда:Тбилиси, Грузия

Posted 26 November 2015 - 10:20

 

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

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

 


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

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

.


  • 1




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