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


Фотография

SwitchMove\PlayMove "АНИМАЦИЯ"


Лучший Ответ SteelRat , 23 May 2014 - 18:06

_unit = объект бот;
_enemy_detect = false;
 
WaitUntil {
 
	_enemy_detect = _unit  call BIS_fnc_enemyDetected;

	//DEBUG
	systemChat format["Enemy detected: %1", _enemy_detect];

	if(_enemy_detect) then {

 		_unit playActionNow "stop";
    		_unit switchMove "";
 
	};

	sleep 0.5;

	_enemy_detect

}

Попробуйте так, если получится, это удалите

//DEBUG
systemChat format["Enemy detected: %1", _enemy_detect];

И без нужды не плодите глобальные переменные

enemy_detect

приватной вполне достаточно

_enemy_detect

Ознакомьтесь, полезная во всех отношениях тема)

http://arma3.ru/foru...kriptopisaniiu/

 

Если не выйдет, попробуйте мой вариант, WaitUntil {} команда вредная) я её не люблю.

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


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

#1 OFFLINE   Dobryi_33RUS

Dobryi_33RUS

    Ефрейтор

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

Отправлено 22 May 2014 - 21:15

Как сделать так, чтобы в момент анимации бот замечал врагов и выходил из неё ? 


  • 0

#2 OFFLINE   Teilar

Teilar

    Ефрейтор

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

Отправлено 22 May 2014 - 21:21

Я ставил тригер на обнаружение и часовых без анимаций.
  • 0

#3 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 22 May 2014 - 21:32

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

 

Первое, при инициализации перса нужно сделать это

//	Мониторим клавиатуру
waitUntil { !(isNull (findDisplay 46)) };
(findDisplay 46) displayAddEventHandler ["KeyDown","_this call PTm_fnc_spaceInterrupt"];

Второе, сама функция

PTm_fnc_spaceInterrupt = {

  private ["_dikCode", "_handled"];
  _dikCode = 	_this select 1;

  r_interrupt = switch true do {
	case (_dikCode in actionKeys "MoveForward"): { true };
	case (_dikCode in actionKeys "MoveBack"): { true };
	case (_dikCode in actionKeys "MoveLeft"): { true };
	case (_dikCode in actionKeys "MoveRight"): { true };
	default { false };
  };
};

r_interrupt - глобальная переменная которая и даст коду понять что тело начало двигаться

 

Ну а далее пример применения, попробуйте разобраться в сути, не спеша)

/*
	Взаимодействие с предметами медицины
	
	автор SteelRat(ProjectTeam)
*/
private ["_unit","_unitTarget","_isUnitTarget","_isTargetDistance","_medItem","_isSync"];

//	Вызов из экшена
if ((typeName _this) == "ARRAY") then {
	_unitTarget 	= _this select 0;	//	Юнит которому пренадлежит экшен
	_unit			= _this select 1;	//	Юнит который активирует экшен
	_medItem 		= _this select 2;
//	Вызов из инвентаря
} else {
	_unitTarget = player;
	_unit =	player;
	_medItem = _this;
};

[{IsActionMedical_Activated = true;},"BIS_fnc_spawn",[_unitTarget, _unit],false] spawn PTm_fnc_MP;

_isSync = false;

_fnc_playAction = {
	private ["_unit","_unitTarget","_isAction"];
	
	_unitTarget =		_this select 0;
	_unit =			 	_this select 1;
	_isAction = 		true;

	_unit playActionNow "Medic";
	waitUntil {sleep 0.1; (["medic", animationState _unit] call BIS_fnc_inString)};

	while {["medic", animationState _unit] call BIS_fnc_inString} do {
		
		if (r_interrupt or ((_unit distance _unitTarget) > 2)) exitWith {	//	Если во время лечения юнит начал перемещаться, отменяем перевязку
			r_interrupt = false;
			_isAction = false;
			_unit  playActionNow 'stop';
			[[[ _unit], {_this select 0 switchMove "";}],"BIS_fnc_spawn",true,false] spawn PTm_fnc_MP;
		};
		sleep 0.1;
	};
	
	[{IsActionMedical_Activated = false;},"BIS_fnc_spawn",[_unitTarget,_unit],false] spawn PTm_fnc_MP;
	_isAction
};

switch _medItem do {
	case "Bandage_F": {
		private ["_isAction"];
		
		if (!(Check_Bleeding) and (_unitTarget == _unit)) exitWith {IsActionMedical_Activated = false};	//	Если кровотечения нет и мы не перевязываем другого выходим
		
		if (vehicle _unit == _unit) then {
			
			_isAction = [_unitTarget, _unit] call _fnc_playAction;
			
			if (_isAction) then {
				
				[{Check_Bleeding = false; player setBleedingRemaining 0;},"BIS_fnc_spawn",[_unitTarget],false] spawn PTm_fnc_MP;
				
				_unit removeMagazine _medItem;
				_isSync = true;
			};
		} else {
		
		};
	};
};

  • 0

#4 OFFLINE   Dobryi_33RUS

Dobryi_33RUS

    Ефрейтор

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

Отправлено 22 May 2014 - 21:43

 

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

 

Первое, при инициализации перса нужно сделать это

//	Мониторим клавиатуру
waitUntil { !(isNull (findDisplay 46)) };
(findDisplay 46) displayAddEventHandler ["KeyDown","_this call PTm_fnc_spaceInterrupt"];

Второе, сама функция

PTm_fnc_spaceInterrupt = {

  private ["_dikCode", "_handled"];
  _dikCode = 	_this select 1;

  r_interrupt = switch true do {
	case (_dikCode in actionKeys "MoveForward"): { true };
	case (_dikCode in actionKeys "MoveBack"): { true };
	case (_dikCode in actionKeys "MoveLeft"): { true };
	case (_dikCode in actionKeys "MoveRight"): { true };
	default { false };
  };
};

r_interrupt - глобальная переменная которая и даст коду понять что тело начало двигаться

 

Ну а далее пример применения, попробуйте разобраться в сути, не спеша)

/*
	Взаимодействие с предметами медицины
	
	автор SteelRat(ProjectTeam)
*/
private ["_unit","_unitTarget","_isUnitTarget","_isTargetDistance","_medItem","_isSync"];

//	Вызов из экшена
if ((typeName _this) == "ARRAY") then {
	_unitTarget 	= _this select 0;	//	Юнит которому пренадлежит экшен
	_unit			= _this select 1;	//	Юнит который активирует экшен
	_medItem 		= _this select 2;
//	Вызов из инвентаря
} else {
	_unitTarget = player;
	_unit =	player;
	_medItem = _this;
};

[{IsActionMedical_Activated = true;},"BIS_fnc_spawn",[_unitTarget, _unit],false] spawn PTm_fnc_MP;

_isSync = false;

_fnc_playAction = {
	private ["_unit","_unitTarget","_isAction"];
	
	_unitTarget =		_this select 0;
	_unit =			 	_this select 1;
	_isAction = 		true;

	_unit playActionNow "Medic";
	waitUntil {sleep 0.1; (["medic", animationState _unit] call BIS_fnc_inString)};

	while {["medic", animationState _unit] call BIS_fnc_inString} do {
		
		if (r_interrupt or ((_unit distance _unitTarget) > 2)) exitWith {	//	Если во время лечения юнит начал перемещаться, отменяем перевязку
			r_interrupt = false;
			_isAction = false;
			_unit  playActionNow 'stop';
			[[[ _unit], {_this select 0 switchMove "";}],"BIS_fnc_spawn",true,false] spawn PTm_fnc_MP;
		};
		sleep 0.1;
	};
	
	[{IsActionMedical_Activated = false;},"BIS_fnc_spawn",[_unitTarget,_unit],false] spawn PTm_fnc_MP;
	_isAction
};

switch _medItem do {
	case "Bandage_F": {
		private ["_isAction"];
		
		if (!(Check_Bleeding) and (_unitTarget == _unit)) exitWith {IsActionMedical_Activated = false};	//	Если кровотечения нет и мы не перевязываем другого выходим
		
		if (vehicle _unit == _unit) then {
			
			_isAction = [_unitTarget, _unit] call _fnc_playAction;
			
			if (_isAction) then {
				
				[{Check_Bleeding = false; player setBleedingRemaining 0;},"BIS_fnc_spawn",[_unitTarget],false] spawn PTm_fnc_MP;
				
				_unit removeMagazine _medItem;
				_isSync = true;
			};
		} else {
		
		};
	};
};

а как на счёт функций:  " call BIS_fnc_enemyDetected " и " call BIS_fnc_enemyTargets " ?


  • 0

#5 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 22 May 2014 - 21:45

Да господа!) Я не внимательно прочитал, тут про ботов. Ну да ладно и это тоже кому ни будь сгодится)


  • 0

#6 OFFLINE   Dobryi_33RUS

Dobryi_33RUS

    Ефрейтор

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

Отправлено 22 May 2014 - 21:48

 

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

 

Первое, при инициализации перса нужно сделать 

Уточню вопрос. Нужно чтобы бот выходил из анимации а не перс)


  • 0

#7 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 23 May 2014 - 00:01

 

 

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

 

Первое, при инициализации перса нужно сделать 

Уточню вопрос. Нужно чтобы бот выходил из анимации а не перс)

 

Ну, надо где то применить к боту это

_unit playActionNow 'stop';
_unit switchMove "";

Сообщение отредактировал SteelRat: 23 May 2014 - 00:02

  • 0

#8 OFFLINE   Dobryi_33RUS

Dobryi_33RUS

    Ефрейтор

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

Отправлено 23 May 2014 - 00:30


Ну, надо где то применить к боту это

 

_unit playActionNow 'stop';
_unit switchMove "";

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


  • 0

#9 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 23 May 2014 - 00:50


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

 

Похоже придётся рулить это

а как на счёт функций:  " call BIS_fnc_enemyDetected " и " call BIS_fnc_enemyTargets " ?

в цикле, во время проигрывания анимации

 

BIS_fnc_enemyDetected

/*
	Author: Jiri Wainar

	Description:
	Return true if unit knows about nearby enemy unit or driven vehicle.

	Parameter(s):
	_this: unit that is inspected

	Returns:
	_knowsAboutEnemy:bool

	Example:
	_knowsAboutEnemy:bool = _unit call BIS_fnc_enemyDetected;
*/

count (_this call BIS_fnc_enemyTargets) > 0

BIS_fnc_enemyTargets

/*
	Author: Jiri Wainar

	Description:
	Return list of nearby enemy targets for given unit.

	Parameter(s):
	_this: unit that is inspected

	Returns:
	_targets:array (empty array if unit doesn't know about any enemy)

	Example:
	_targets:array = _unit call BIS_fnc_getEnemyTargets;
*/

private["_targets","_enemies","_enemySides","_side","_unit"];

_targets = _this nearTargets 300;

_enemies = [];

_enemySides = _this call BIS_fnc_enemySides;

{
	_unit = (_x select 4);
	_side = (_x select 2);

	if ((_side in _enemySides) && (count crew _unit > 0)) then
	{
		if ((side driver _unit) in _enemySides) then
		{
			_enemies set [count _enemies, _unit];
		};
	};
}
forEach _targets;

_enemies

  • 0

#10 OFFLINE   Dobryi_33RUS

Dobryi_33RUS

    Ефрейтор

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

Отправлено 23 May 2014 - 01:05

 


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

 

Похоже придётся рулить это

а как на счёт функций:  " call BIS_fnc_enemyDetected " и " call BIS_fnc_enemyTargets " ?

в цикле, во время проигрывания анимации

 

BIS_fnc_enemyDetected

/*
	Author: Jiri Wainar

	Description:
	Return true if unit knows about nearby enemy unit or driven vehicle.

	Parameter(s):
	_this: unit that is inspected

	Returns:
	_knowsAboutEnemy:bool

	Example:
	_knowsAboutEnemy:bool = _unit call BIS_fnc_enemyDetected;
*/

count (_this call BIS_fnc_enemyTargets) > 0

BIS_fnc_enemyTargets

/*
	Author: Jiri Wainar

	Description:
	Return list of nearby enemy targets for given unit.

	Parameter(s):
	_this: unit that is inspected

	Returns:
	_targets:array (empty array if unit doesn't know about any enemy)

	Example:
	_targets:array = _unit call BIS_fnc_getEnemyTargets;
*/

private["_targets","_enemies","_enemySides","_side","_unit"];

_targets = _this nearTargets 300;

_enemies = [];

_enemySides = _this call BIS_fnc_enemySides;

{
	_unit = (_x select 4);
	_side = (_x select 2);

	if ((_side in _enemySides) && (count crew _unit > 0)) then
	{
		if ((side driver _unit) in _enemySides) then
		{
			_enemies set [count _enemies, _unit];
		};
	};
}
forEach _targets;

_enemies

Пытаюсь в этом разобраться но пока ни как ))


  • 0

#11 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 23 May 2014 - 02:11


Пытаюсь в этом разобраться но пока ни как ))

 

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

_unit = объект бот;
_loop = true;
_timer = time + время которое проигрывается анимация, в секундах, это как проще);

while {_loop} do {

    // Если обнаружен противник, прерываем анимацию
    if (_unit call BIS_fnc_enemyDetected) exitWith {
         _unit playActionNow "stop";
         _unit switchMove "";
         _loop = false;
    };

    // Не большой перекур
    sleep 0.5;

    // Если анимация от играна выходим из цикла
    if (time > _timer) then {_loop = false};
};

Сударь, примите это как шаблон, а не конечный продукт)

Кое что забыл, такое дело надо спавнить

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


Сообщение отредактировал SteelRat: 23 May 2014 - 02:18

  • 0

#12 OFFLINE   Dobryi_33RUS

Dobryi_33RUS

    Ефрейтор

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

Отправлено 23 May 2014 - 11:01

_unit = объект бот;
_loop = true;
_timer = time + время которое проигрывается анимация, в секундах, это как проще);

while {_loop} do {

    // Если обнаружен противник, прерываем анимацию
    if (_unit call BIS_fnc_enemyDetected) exitWith {
         _unit playActionNow "stop";
         _unit switchMove "";
         _loop = false;
    };

    // Не большой перекур
    sleep 0.5;

    // Если анимация от играна выходим из цикла
    if (time > _timer) then {_loop = false};
};

Сударь, примите это как шаблон, а не конечный продукт)

Кое что забыл, такое дело надо спавнить

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

 

 


Я делаю не много подругому.

Вот так:

 

 

 

_unit = объект бот;

enemy_detect=false;

 

WaitUntil {

 

enemy_detect = _unit  call BIS_fnc_enemyDetected;

if(enemy_detect)then {

 

     _unit switchMove "";

 

};

sleep 0.5;

(enemy_detect)

}

 

Но почему то когда бот в аниме функция "BIS_fnc_enemyDetected" не работает  :nea: хотя бот видит врага, даже поворачивается к нему но продолжает выполнять аним. Как то так)


Сообщение отредактировал Dobryi_33RUS: 23 May 2014 - 11:05

  • 0

#13 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 23 May 2014 - 18:06   Лучший Ответ

_unit = объект бот;
_enemy_detect = false;
 
WaitUntil {
 
	_enemy_detect = _unit  call BIS_fnc_enemyDetected;

	//DEBUG
	systemChat format["Enemy detected: %1", _enemy_detect];

	if(_enemy_detect) then {

 		_unit playActionNow "stop";
    		_unit switchMove "";
 
	};

	sleep 0.5;

	_enemy_detect

}

Попробуйте так, если получится, это удалите

//DEBUG
systemChat format["Enemy detected: %1", _enemy_detect];

И без нужды не плодите глобальные переменные

enemy_detect

приватной вполне достаточно

_enemy_detect

Ознакомьтесь, полезная во всех отношениях тема)

http://arma3.ru/foru...kriptopisaniiu/

 

Если не выйдет, попробуйте мой вариант, WaitUntil {} команда вредная) я её не люблю.


  • 1

#14 OFFLINE   Dobryi_33RUS

Dobryi_33RUS

    Ефрейтор

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

Отправлено 23 May 2014 - 20:56

_unit = объект бот;
_enemy_detect = false;
 
WaitUntil {
 
	_enemy_detect = _unit  call BIS_fnc_enemyDetected;

	//DEBUG
	systemChat format["Enemy detected: %1", _enemy_detect];

	if(_enemy_detect) then {

 		_unit playActionNow "stop";
    		_unit switchMove "";
 
	};

	sleep 0.5;

	_enemy_detect

}

Попробуйте так, если получится, это удалите

//DEBUG
systemChat format["Enemy detected: %1", _enemy_detect];

И без нужды не плодите глобальные переменные

enemy_detect

приватной вполне достаточно

_enemy_detect

Ознакомьтесь, полезная во всех отношениях тема)

http://arma3.ru/foru...kriptopisaniiu/

 

Если не выйдет, попробуйте мой вариант, WaitUntil {} команда вредная) я её не люблю.

 

Вы угадали,  я в скриптах в синтаксисе накосячил))). Спасибо за участие в моём нубстве :)  :KidRock_06:


  • 0

#15 OFFLINE   Djon

Djon

    Старшина

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

Отправлено 19 June 2014 - 13:08

[unit,"SIT_LOW"] call BIS_fnc_ambientAnimCombat;

А такая не подходит для таких целей? Сидит балдеет, только врага заметил начинает воевать.

 

Пардон за нубовский вопросец, понял что тут всего 7 анимаций.


Сообщение отредактировал Djon: 19 June 2014 - 19:31

  • 0




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