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


Фотография

EventHandler "HIT" Звуки при ранении, нужна помощь!


Лучший Ответ Schatten , 07 October 2017 - 23:48

Schatten, а-а, я забыл изменить вызов скрипта.

{_x addEventHandler ["Hit", {[_this] execVM "Script\Soldier_Hurt.sqf";}] } forEach units MyTeam;

Здесь в _this у тебя 4 элемента (смотри BIKI, третий столбец).
 

Как я понял, у меня здесь только один элемент массива - [_this], как остальные добавить?

Я же написал.

Перейти к сообщению


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

#1 OFFLINE   Roman2035

Roman2035

    Рядовой

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

Отправлено 07 October 2017 - 16:10

Привет. Хочу сделать чтобы при получении урона солдат издавал нужные мне звуки.

Этой командой я вызвал скрипт для отряда.

{_x addEventHandler ["Hit", {[_this] execVM "Script\Soldier_Hurt.sqf";}] } forEach units MyTeam;

Вот скрипт.

_victim = _this select 0;
_sleepTime = _this select 1;


if (isNull _victim || !alive _victim || vehicle _victim != _victim) exitWith {};


_soundArray = ["hit_1", "hit_2", "hit_3", "hit_4", "hit_5"];


_soundToPlay = _soundArray select (floor(random(count _soundArray)));


_victim say3D [_soundToPlay, 25, 1];


if (_sleepTime > 0) then {
sleep _sleepTime;
};

Хочу разделить звуки на 3 типа. Сильные, средние, слабые, в зависимости от урона который получил солдат. Если полученный урон > 0.5, то подбор звуков из другого массива, где сильные звуки, который допишу, также для урона > 0.25 и так далее, но пока только 1 массив, вопрос как это сделать.


  • 0

#2 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 07 October 2017 - 20:32

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

элементами. Поэтому сценарий работать не будет.

Кроме этого, есть смысл присвоить код из Soldier_Hurt.sqf в переменную и вызывать с помощью

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

.


  • 1

#3 OFFLINE   Roman2035

Roman2035

    Рядовой

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

Отправлено 07 October 2017 - 21:53

То есть мне использовать Hitpart, что с уроном делать, как это выглядеть должно? Я не силен в скриптописании, пытаюсь разобраться.


  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 07 October 2017 - 22:04

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

). Далее с помощью

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

будешь определять нужный звук так:


_soundToPlay = switch (true) do {
	case (_damage > 0.5): {
		selectRandom ["hit_1", "hit_2", "hit_3", "hit_4", "hit_5"];
	};
	case (_damage > 0.25): {
		selectRandom ["hit_6", "hit_7", "hit_8", "hit_9", "hit_10"];
	};
	...
};

P. S.
Если хочешь время в сценарий отправлять, то можно сделать так:

(_this + [<time>]) execVM "Script\Soldier_Hurt.sqf";

Тогда в Soldier_Hurt.sqf

_sleepTime = _this select 4;

Сообщение отредактировал Schatten: 07 October 2017 - 22:08

  • 1

#5 OFFLINE   Roman2035

Roman2035

    Рядовой

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

Отправлено 07 October 2017 - 23:05

_victim = _this select 0;
_sleepTime = _this select 1;

if (isNull _victim || !alive _victim || vehicle _victim != _victim) exitWith {};

_soundToPlay = switch (true) do {
	case ((_damage > 0.5) && (_damage <= 0.99)): {
		selectRandom ["Hit_Max_1", "Hit_Max_2", "Hit_Max_3", "Hit_Max_4", "Hit_Max_5"];
	};
	case ((_damage > 0.25) && (_damage <= 0.5)): {
		selectRandom ["Hit_Mid_1", "Hit_Mid_2", "Hit_Mid_3", "Hit_Mid_4", "Hit_Mid_5"];
	};
	case ((_damage > 0.01) && (_damage <= 0.25)): {
		selectRandom ["Hit_Low_1", "Hit_Low_2", "Hit_Low_3", "Hit_Low_4", "Hit_Low_5"];
	};	
};

_victim say3D [_soundToPlay, 25, 1];

if (_sleepTime > 0) then {
sleep _sleepTime;
};

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


Сообщение отредактировал Roman2035: 07 October 2017 - 23:06

  • 0

#6 OFFLINE   Roman2035

Roman2035

    Рядовой

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

Отправлено 07 October 2017 - 23:38

Schatten, а-а, я забыл изменить вызов скрипта.

{_x addEventHandler ["Hit", {[_this] execVM "Script\Soldier_Hurt.sqf";}] } forEach units MyTeam;

Как я понял, у меня здесь только один элемент массива - [_this], как остальные добавить?


  • 0

#7 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 07 October 2017 - 23:48   Лучший Ответ

Schatten, а-а, я забыл изменить вызов скрипта.

{_x addEventHandler ["Hit", {[_this] execVM "Script\Soldier_Hurt.sqf";}] } forEach units MyTeam;

Здесь в _this у тебя 4 элемента (смотри

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

, третий столбец).
 

Как я понял, у меня здесь только один элемент массива - [_this], как остальные добавить?

Я же написал.


Сообщение отредактировал Schatten: 07 October 2017 - 23:55

  • 1

#8 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 16 June 2020 - 21:14

Привет. Хочу сделать чтобы при получении урона солдат издавал нужные мне звуки.

Этой командой я вызвал скрипт для отряда.

{_x addEventHandler ["Hit", {[_this] execVM "Script\Soldier_Hurt.sqf";}] } forEach units MyTeam;

Вот скрипт.

_victim = _this select 0;
_sleepTime = _this select 1;


if (isNull _victim || !alive _victim || vehicle _victim != _victim) exitWith {};


_soundArray = ["hit_1", "hit_2", "hit_3", "hit_4", "hit_5"];


_soundToPlay = _soundArray select (floor(random(count _soundArray)));


_victim say3D [_soundToPlay, 25, 1];


if (_sleepTime > 0) then {
sleep _sleepTime;
};

Хочу разделить звуки на 3 типа. Сильные, средние, слабые, в зависимости от урона который получил солдат. Если полученный урон > 0.5, то подбор звуков из другого массива, где сильные звуки, который допишу, также для урона > 0.25 и так далее, но пока только 1 массив, вопрос как это сделзд

Здравствуйте кто живой еще! Ребята, подскажите, а как в эту строчку: if (isNull _victim || !alive _victim || vehicle _victim != _victim) exitWith {}; добавить жертву (_victim), которая уже получила "Hit"?  Ну это, чтобы второй раз не кричал при попадании пули. Заранее благодарю, не проходите мимо, пожалуйста, очень нужно.


  • 0

#9 OFFLINE   ToxaBes

ToxaBes

    Ефрейтор

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

Отправлено 17 June 2020 - 17:11

Здравствуйте кто живой еще! Ребята, подскажите, а как в эту строчку: if (isNull _victim || !alive _victim || vehicle _victim != _victim) exitWith {}; добавить жертву (_victim), которая уже получила "Hit"?  Ну это, чтобы второй раз не кричал при попадании пули. Заранее благодарю, не проходите мимо, пожалуйста, очень нужно.

 

Попробуйте:

if (isNull _victim || !alive _victim || vehicle _victim != _victim || damage _victim > 0.1) exitWith {}; 

  • 0

#10 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 17 June 2020 - 23:09

 

Здравствуйте кто живой еще! Ребята, подскажите, а как в эту строчку: if (isNull _victim || !alive _victim || vehicle _victim != _victim) exitWith {}; добавить жертву (_victim), которая уже получила "Hit"?  Ну это, чтобы второй раз не кричал при попадании пули. Заранее благодарю, не проходите мимо, пожалуйста, очень нужно.

 

Попробуйте:

if (isNull _victim || !alive _victim || vehicle _victim != _victim || damage _victim > 0.1) exitWith {}; 

привет. попробовал, не работает. Вот я понимаю так эту строчку: не существует жертва или не жива жертва или в технике жертва. Ну почему нет раненая жертва, типа injured _victim?


Сообщение отредактировал Cooler58: 17 June 2020 - 23:11

  • 0

#11 OFFLINE   ToxaBes

ToxaBes

    Ефрейтор

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

Отправлено 18 June 2020 - 00:43

привет. попробовал, не работает. Вот я понимаю так эту строчку: не существует жертва или не жива жертва или в технике жертва. Ну почему нет раненая жертва, типа injured _victim?

Есть 

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

 

Попробуйте добавить условие

lifeState _victim == "INJURED"

  • 0

#12 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 18 June 2020 - 10:42

 

привет. попробовал, не работает. Вот я понимаю так эту строчку: не существует жертва или не жива жертва или в технике жертва. Ну почему нет раненая жертва, типа injured _victim?

Есть 

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

 

Попробуйте добавить условие

lifeState _victim == "INJURED"

ToxaBes, спасибо вам за участие и помощь,щас и ваш вариант проверю. Вы единственный кто откликнулся, жаль еще Шаттен куда-то пропал, всегда помогал делом без бла-бла-бла. Вобщем нашел я выход. Просто в конце всего цикла нужно было записать:  _victim removeEventHandler ["Hit", 0]; Проверил, работает.

_victim = _this select 0 select 0;
_sleepTime = _this select 0 select 2;

if (isNull _victim || !alive _victim || vehicle _victim != _victim ) exitWith {};


_soundArray = ["hit_1", "hit_4", "hit_5", "hit_6", "hit_7", "hit_10", "hit_11", "hit_12", "hit_13", "hit_16", "hit_17", "hit_21", "hit_22"];


_soundToPlay = _soundArray select (floor(random(count _soundArray)));


[_victim, [_soundToPlay, 85, 1]] remoteExec ["say3D", 0];

  sleep 0.1;

_AnimArray_1 = ["AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDleft", "AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDright", "AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDright"];

_AnimToPlay_1 = _AnimArray_1 select (floor(random(count _AnimArray_1)));

[_victim, _AnimToPlay_1] remoteExec ["switchMove", 0];

  sleep 2.6;

_AnimArray_2 = ["UnconsciousFaceDown", "UnconsciousReviveLegs_B", "UnconsciousReviveHead_A", "UnconsciousReviveDefault_B", "UnconsciousReviveDefault_A", "UnconsciousReviveBody_B", "UnconsciousFaceLeft", "Acts_LyingWounded_loop3", "acts_InjuredLyingRifle01", "Acts_InjuredCoughRifle02", "Acts_InjuredSpeakingRifle01", "Acts_InjuredLyingRifle02_180", "Acts_InjuredLookingRifle01", "Acts_InjuredLookingRifle02", "Acts_InjuredLookingRifle03", "Acts_InjuredLookingRifle04", "Acts_InjuredLookingRifle05", "Acts_InjuredAngryRifle01", "Acts_CivilInjuredLegs_1", "Acts_CivilInjuredChest_1", "Acts_CivilInjuredArms_1", "AmovPpneMstpSrasWrflDnon_injuredHealed", "AinjPpneMstpSnonWrflDnon_injuredHealed"];

_AnimToPlay_2 = _AnimArray_2 select (floor(random(count _AnimArray_2)));

[_victim, _AnimToPlay_2] remoteExec ["switchMove", 0];

  _victim removeEventHandler ["Hit", 0];
 
if (_sleepTime > 0) then {
sleep _sleepTime;
};

 


  • 0

#13 OFFLINE   ToxaBes

ToxaBes

    Ефрейтор

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

Отправлено 18 June 2020 - 16:25

Я не предлагал _victim removeEventHandler ["Hit", 0]; потому что в этом случае жертва после первого попадания никогда больше не будет кричать. Те. она может вылечить ранение медпакетом и при следующем попадании не будет кричать. А жертвы должны кричать )


  • 0

#14 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 20 June 2020 - 20:39

Я не предлагал _victim removeEventHandler ["Hit", 0]; потому что в этом случае жертва после первого попадания никогда больше не будет кричать. Те. она может вылечить ранение медпакетом и при следующем попадании не будет кричать. А жертвы должны кричать )

Что-то я рано обрадовался(( Сначала работало а потом перестало и вот теперь сижу в глубоком стопоре и удивляюсь почему строчка: _victim removeEventHandler ["Hit", 0]; перестала работать. В игре ошибок не выдает, но и не работает как будто отсутствует. Просто логике не поддается, почему? Из init.sqf вызываю так: {_x addEventHandler ["Hit", {[_this] execVM "Soldier_Hit.sqf";}] } forEach (allUnits-playableUnits);

ToxaBes, если не сложно, подскажите как ваш вариант применить в данном скрипте?


  • 0

#15 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 20 June 2020 - 21:48

Согласен, жерива должна кричать, но не менять анимацию. Как сделать, чтобы после повторного "Hit" не повторялись снова анимации в массивах _AnimArray_1 и _AnimArray_2 ?


  • 0

#16 OFFLINE   ToxaBes

ToxaBes

    Ефрейтор

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

Отправлено 22 June 2020 - 16:30

Согласен, жерива должна кричать, но не менять анимацию. Как сделать, чтобы после повторного "Hit" не повторялись снова анимации в массивах _AnimArray_1 и _AnimArray_2 ?

 

 

Добавьте после вызова анимации строку:

_victim setVariable ["anim_switched", true, true];

А перед вызовом этой анимации напишите:

if (_victim getVariable ["anim_switched", false]) exitWith {};

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


  • 0

#17 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 23 June 2020 - 22:16

 

Согласен, жерива должна кричать, но не менять анимацию. Как сделать, чтобы после повторного "Hit" не повторялись снова анимации в массивах _AnimArray_1 и _AnimArray_2 ?

 

 

Добавьте после вызова анимации строку:

_victim setVariable ["anim_switched", true, true];

А перед вызовом этой анимации напишите:

if (_victim getVariable ["anim_switched", false]) exitWith {};

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

 

ToxaBes, очень благодарю, всё работает как надо, низкий поклон. Кстати ваш стиль ответов чем то напоминает Шаттена - так же четко лаконично с сознанием дела. Спасибо парни что вы есть!!!
 


  • 0

#18 OFFLINE   ToxaBes

ToxaBes

    Ефрейтор

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

Отправлено 29 June 2020 - 16:01

Кстати ваш стиль ответов чем то напоминает Шаттена - так же четко лаконично с сознанием дела. 

Скорее всего у нас с ним одинаковая проф деформация (постоянная работа с кодом).


Сообщение отредактировал ToxaBes: 29 June 2020 - 16:01

  • 0

#19 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 09 February 2021 - 20:39

Привет, люди добрые! Прошло много времени использования данного скрипта. Всё устраивает, за исключением одной вещи: если бот находится в положении лежа, то при попадании пули в него, он встает, выполняя 1  анимацию из массива _AnimArray_1. Неестественно смотрится. Вот как бы в строчку: if (isNull _victim || !alive _victim || vehicle _victim != _victim)  exitWith {}; Вставить что-то вроде: _victim getVariable ["PRONE", true] или _victim getVariable ["setUnitPos "Down"", false]. Т.е. если _victim в положении лежа, то его этот скрипт не касается и происходит exitWith {}?  Помогите пожалуйста


  • 0

#20 OFFLINE   Ibragim

Ibragim

    Сержант

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

Отправлено 09 February 2021 - 21:27

if (isNull _victim || !alive _victim || vehicle _victim != _victim || stance _victim in ["PRONE","UNDEFINED"])  exitWith {};

  • 0




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