Как сделать так, чтобы в момент анимации бот замечал врагов и выходил из неё ?
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 {} команда вредная) я её не люблю.
Перейти к сообщению#1 OFFLINE
Отправлено 22 May 2014 - 21:15
#2 OFFLINE
Отправлено 22 May 2014 - 21:21
#3 OFFLINE
Отправлено 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 { }; }; };
#4 OFFLINE
Отправлено 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 " ?
#5 OFFLINE
Отправлено 22 May 2014 - 21:45
Да господа!) Я не внимательно прочитал, тут про ботов. Ну да ладно и это тоже кому ни будь сгодится)
#6 OFFLINE
Отправлено 22 May 2014 - 21:48
Тут получается не так что бы коротко, попробую дать направление
Первое, при инициализации перса нужно сделать
Уточню вопрос. Нужно чтобы бот выходил из анимации а не перс)
#7 OFFLINE
Отправлено 23 May 2014 - 00:01
Тут получается не так что бы коротко, попробую дать направление
Первое, при инициализации перса нужно сделать
Уточню вопрос. Нужно чтобы бот выходил из анимации а не перс)
Ну, надо где то применить к боту это
_unit playActionNow 'stop'; _unit switchMove "";
Сообщение отредактировал SteelRat: 23 May 2014 - 00:02
#8 OFFLINE
Отправлено 23 May 2014 - 00:30
Ну, надо где то применить к боту это
_unit playActionNow 'stop'; _unit switchMove "";
Вот я и хочу узнать, как создать условие, для того что бы это применить. Как создать условие на то, что бот заметил врага?
#9 OFFLINE
Отправлено 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
#10 OFFLINE
Отправлено 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) > 0BIS_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
Пытаюсь в этом разобраться но пока ни как ))
#11 OFFLINE
Отправлено 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
#12 OFFLINE
Отправлено 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" не работает хотя бот видит врага, даже поворачивается к нему но продолжает выполнять аним. Как то так)
Сообщение отредактировал Dobryi_33RUS: 23 May 2014 - 11:05
#13 OFFLINE
Отправлено 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 OFFLINE
Отправлено 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 {} команда вредная) я её не люблю.
Вы угадали, я в скриптах в синтаксисе накосячил))). Спасибо за участие в моём нубстве
#15 OFFLINE
Отправлено 19 June 2014 - 13:08
[unit,"SIT_LOW"] call BIS_fnc_ambientAnimCombat;
А такая не подходит для таких целей? Сидит балдеет, только врага заметил начинает воевать.
Пардон за нубовский вопросец, понял что тут всего 7 анимаций.
Сообщение отредактировал Djon: 19 June 2014 - 19:31