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


Фотография

Активация триггера на снаряд + узнать позицию снаряда


Лучший Ответ Ibragim , 16 December 2021 - 15:53

Ошибка выдается по следующей причине:
Ты не заспавнил код, а запустил в том же блоке обработчика события.

Среда блока кода в обработчике внепланировачная, т.е. в ней циклы не работают.

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

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

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

[_projectile] spawn // Спавн нового блока кода с возможностью использовать циклы
	{
		params ["_projectile"];
		
		If (typeof _projectile == "F_40mm_Green")  then 
			{ 
				 _zhdat_do = time + 5;
				 
				 waituntil 
					{
						_projectile inarea trg // Попала в зону триггера
						or
						time > _zhdat_do // 5 секунд прошло без попадания в зону триггера, пролетела мимо
					};
				 
				 if (time > _zhdat_do) exitWith 
					{
						// пролетела мимо триггера, выход из цикла без результата
					};
				 
				 // Попала в зону триггера
				 
				 WPplane1 = getPosATL _projectile;
				 If (surfaceIsWater WPplane1) then {hint "a"} else {hint "b"};
			};
	};
Перейти к сообщению


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

#1 OFFLINE   IPRiCeI

IPRiCeI

    Рядовой

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

Отправлено 15 December 2021 - 18:15

Делаю сброс техники по вызову с помощью осветительной ракеты. Мне нужно, что бы самолёт сбрасывал технику Максимально точно, в месте где находится  ракета через пару секунд после активации триггера. От этого зависит, будет сброшена машина или лодка.

Влепил в небо триггер, вписал в его активацию это

({_x == "F_40mm_Green"} count thisList) > 0 или это ({(toLower (typeOf _x)) in ["F_40mm_Green"]} count thisList) > 0

НЕ РАБОТАЕТ.
Самое обидное, что я когда-то давно уже делал подобную активацию,  но забыл как, а источники утеряны.



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

Тут мне, увы, не хватает навыка.



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

(getposATL raketa) > (getposASL raketa)

Но это не точно.

Буду очень благодарен, Всем кто поможет!

 


  • 0

#2 OFFLINE   Ibragim

Ibragim

    Сержант

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

Отправлено 16 December 2021 - 08:56

Ты используешь поиск объекта в триггере, который определяет присутствие юнитов. Поэтому и не работает.
Вначале определи в скрипте саму ракету, для этого используй обработчик события выстрела

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

и его параметр _projectile.

_tvoyUnit addEventHandler ["FiredMan", {
	params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle"];

// спавни цикл ожидания отсюда

}];

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

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

:

_projectile inArea _tvoyTrigger;

Для определения позиции маршрутной точки используй все ту же переменную _projectile.

_pozicijaWP = getPosATL _projectile;

Для определения позиции над водой она или нет, используй команду surfaceIsWater:

_isOnWater = surfaceIsWater position _projectile;

  • 1

#3 OFFLINE   IPRiCeI

IPRiCeI

    Рядовой

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

Отправлено 16 December 2021 - 14:27

 

Ты используешь поиск объекта в триггере, который определяет присутствие юнитов. Поэтому и не работает.
Вначале определи в скрипте саму ракету, для этого используй обработчик события выстрела

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

и его параметр _projectile.

_tvoyUnit addEventHandler ["FiredMan", {
	params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle"];

// спавни цикл ожидания отсюда

}];

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

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

:

_projectile inArea _tvoyTrigger;

Для определения позиции маршрутной точки используй все ту же переменную _projectile.

_pozicijaWP = getPosATL _projectile;

Для определения позиции над водой она или нет, используй команду surfaceIsWater:

_isOnWater = surfaceIsWater position _projectile;

Пока что пытаюсь понять принцип работы в вакууме (виртуальная реальность).
От части разобрался, но лишь от части. У меня получилась вот такое:
 

player addEventHandler ["FiredMan", { 
 params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle"]; 
  
 If (typeof _projectile == "F_40mm_Green")  then {
 
 waituntil {_projectile inarea trg};
 WPplane1 = getPosATL _projectile;
 If (surfaceIsWater WPplane1) then {hint "a"} else {hint "b"};
 
 };
 
}];

Но присутствует проблема. Если стреляющий находится внутри триггера, все вроде ок, и работает без ошибок. НО, если стреляющий вне триггера, то в момент выстрела ракетой вылезает ошибка в   {_projectile #inarea trg}   При этом скрипт продолжает выполнение и выводит таки hint "b".

Самостоятельно решить не выходит. И я не знаю как прекращать циклы. Может я вообще не в ту сторону начал копаться.

И наверное сразу стоило упомянуть, наверняка это важно. Миссия кооперативная и с респаунами. Так что этот кусок кода будет лежать в "onPlayerRespawn.sqf"


  • 0

#4 OFFLINE   Ibragim

Ibragim

    Сержант

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

Отправлено 16 December 2021 - 15:53   Лучший Ответ

Ошибка выдается по следующей причине:
Ты не заспавнил код, а запустил в том же блоке обработчика события.

Среда блока кода в обработчике внепланировачная, т.е. в ней циклы не работают.

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

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

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

[_projectile] spawn // Спавн нового блока кода с возможностью использовать циклы
	{
		params ["_projectile"];
		
		If (typeof _projectile == "F_40mm_Green")  then 
			{ 
				 _zhdat_do = time + 5;
				 
				 waituntil 
					{
						_projectile inarea trg // Попала в зону триггера
						or
						time > _zhdat_do // 5 секунд прошло без попадания в зону триггера, пролетела мимо
					};
				 
				 if (time > _zhdat_do) exitWith 
					{
						// пролетела мимо триггера, выход из цикла без результата
					};
				 
				 // Попала в зону триггера
				 
				 WPplane1 = getPosATL _projectile;
				 If (surfaceIsWater WPplane1) then {hint "a"} else {hint "b"};
			};
	};

  • 1

#5 OFFLINE   IPRiCeI

IPRiCeI

    Рядовой

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

Отправлено 16 December 2021 - 17:11

 

Ошибка выдается по следующей причине:
Ты не заспавнил код, а запустил в том же блоке обработчика события.

Среда блока кода в обработчике внепланировачная, т.е. в ней циклы не работают.

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

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

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

[_projectile] spawn // Спавн нового блока кода с возможностью использовать циклы
	{
		params ["_projectile"];
		
		If (typeof _projectile == "F_40mm_Green")  then 
			{ 
				 _zhdat_do = time + 5;
				 
				 waituntil 
					{
						_projectile inarea trg // Попала в зону триггера
						or
						time > _zhdat_do // 5 секунд прошло без попадания в зону триггера, пролетела мимо
					};
				 
				 if (time > _zhdat_do) exitWith 
					{
						// пролетела мимо триггера, выход из цикла без результата
					};
				 
				 // Попала в зону триггера
				 
				 WPplane1 = getPosATL _projectile;
				 If (surfaceIsWater WPplane1) then {hint "a"} else {hint "b"};
			};
	};

Большое спасибо! Вы\ты очень мне помог\ли.

В принципе я понял всё, кроме принципа работы команды spawn.
Если разжевать мне простыми словами принцип её работы, это наверняка очень поможет мне в будущем. 


  • 0

#6 OFFLINE   Ibragim

Ibragim

    Сержант

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

Отправлено 16 December 2021 - 18:46

Если по-простому, то существует планировщик, который запускает скрипты, останавливает один, продолжает другой и так далее. Планировщик признает работу циклов, потому что он вправе остановить скрипт и продолжить его, когда придет его очередь снова. Поэтому скрипты в планировщике по сути не очень влияют на ФПС. А есть скрипты, которые запускаются вне планировщика и игра по сути останавливается на долю секунды, пока этот скрипт не закончит свою работу. Эти скрипты проигрывают циклы только один раз, потому, что если они зациклятся, игра не продолжится, а будет ждать, пока этот скрипт прекратится.

Чтобы запустить что-то в планировщике, используй

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

и

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

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

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

.


  • 1




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