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


Фотография

follow


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

#1 OFFLINE   TankiSD

TankiSD

    Ст. Прапорщик

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

Отправлено 14 October 2014 - 07:28

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

 

Суть скрипта.

 

Когда два бота удаляются от игрока на определённое расстояние, ботам даётся команда прекратить всяческую стрельбу и бежать к игроку.

Кода расстояние сокращается до необходимого, боты вновь переходят в боевой режим.

 

Так вот, в теории, всё отлично работает.

Даже на практике практически всё получается.

 

Но есть одно но.

В 3 из пяти случаев, боты не переходят обратно в боевой режим.

И далее, если им дать принудительный вход в боевой режим, они все равно не стреляют по врагу.

 

Быть может я что упустил?

Взгляните свежими глазами.

sleep 1;
while {true} do {
//даю ботом максимальную скорость
sq1 setSpeedMode "FULL";
sq2 setSpeedMode "FULL";
//включаю проверку на расстояние

if (sq1 distance sq1MOVE > 5) then {sq1 domove (position sq1MOVE);};
if (sq2 distance sq2MOVE > 5) then {sq2 domove (position sq2MOVE);};
//если больше 15 метров между sq1Move или sq2Move, то боты бегут к позициям не обращая внимание на врага.
if (sq1 distance sq1MOVE > 15) then {
sq1 setunitpos "UP";
sq1 setBehaviour "CARELESS";
sq1 setCombatMode "BLUE";
sq1 setcaptive true;
};
if (sq2 distance sq2MOVE > 15) then {
sq2 setunitpos "UP";
sq2 setBehaviour "CARELESS";
sq2 setCombatMode "BLUE";
sq2 setcaptive true;
};

if (sq1 distance sq1MOVE < 10) then {
sq1 setunitpos "middle";
sq1 setBehaviour "COMBAT";
sq1 setCombatMode "RED";
sq1 setcaptive false;
};

if (sq2 distance sq2MOVE < 10) then {
sq2 setunitpos "middle";
sq2 setBehaviour "COMBAT";
sq2 setCombatMode "RED";
sq2 setcaptive false;
};

sleep 5
};

p.s. чёрт, кажется я понял, в чём вся беда. 

Надо ведь для каждого бота отдельно пилить проверки.

Вот я нуп 


  • 0

#2 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 14 October 2014 - 17:47

Попробуйте, если где ошибся, дайте знать.

/*
	file: checkDistance.sqf
	
	Пример вызова:
	0 = [this, sq1MOVE] execVM "checkDistance.sqf"; // В инит бота sq1
	0 = [this, sq2MOVE] execVM "checkDistance.sqf"; // В инит бота sq2
	
	Что бы принудительно завершить работу логики, выполнить команду:
	sq1 setVariable ["CheckDistance", false];
*/

_this spawn {

	_unit	= _this select 0;
	_point	= _this select 1;
	_state	= "IDLE";
	_mode	= "COMBAT";
	
	_unit setVariable ["CheckDistance", true];
	waitUntil {sleep 0.01; (_unit getVariable ["CheckDistance", false])};
	
	//даю ботом максимальную скорость, вполне вероятно придётся вернуть обратно в цикл, надо тестить
	_unit setSpeedMode "FULL";
	
	while {(alive _unit) && (_unit getVariable ["CheckDistance", false])} do {
	
		switch true do {
			
			case ((_unit distance _point > 5) && (_state == "IDLE")): {
				_state = "RUN";
				_unit domove (position _point);
			};
			
			case ((_unit distance _point < 10) && (_mode != "COMBAT")): {
				_mode = "COMBAT";
				_unit setunitpos "middle";
				_unit setBehaviour "COMBAT";
				_unit setCombatMode "RED";
				_unit setcaptive false;
			};
			
			case ((_unit distance _point > 15) && (_mode != "CARELESS")): {
				_mode = "CARELESS";
				_unit setunitpos "UP";
				_unit setBehaviour "CARELESS";
				_unit setCombatMode "BLUE";
				_unit setcaptive true;
			};
		};
		
		if (_unit distance _point <= 5) then {
			if (_state != "IDLE") then {_state = "IDLE"};
			sleep 5;
		} else {
			sleep 1;
		};
	};
};

Сообщение отредактировал SteelRat: 14 October 2014 - 18:03

  • 1

#3 OFFLINE   TankiSD

TankiSD

    Ст. Прапорщик

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

Отправлено 24 March 2015 - 20:18

Скрипт не работает.

 

Ошибку не видит.

 

=======================

 

В общем я запилил "новый" вариант.

 

Но теперь беда другая.

 

Бот, про отсоединении, не хочет вставать, т.е. в каком положении он остался, в таком положении он и придёт к игроку.

И всё бы ничего, но бот бывает тупо ползёт и не встаёт.

sq1 setUnitPos "UP";
sq1 setcaptive true;
sq1 allowdamage false;
sq1 disableAI "target";
sq1 disableAI "autotarget";
sq1 setcaptive true;
sq1 allowdamage false;
[sq1] join grpnull;
sq1 setspeedMode "full";
sq1 setCombatMode "BLUE";
sq1 setBehaviour "CARELESS";
while {!(sq1 distance tmsq < 5)} do {
"sqmove" setmarkerpos getpos tmsq;
sq1 move getmarkerpos "sqmove";
sq1 setUnitPos "UP";
sleep 15;
};
[sq1] joinSilent tmsq;
sq1 setunitpos "middle";
sq1 allowdamage true;
sq1 setcaptive true;
sq1 enableAI "target";
sq1 enableAI "autotarget";
sq1 setCombatMode "YELLOW";
sq1 setBehaviour "AWARE";

Сообщение отредактировал TankiSD: 24 March 2015 - 20:18

  • 0

#4 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 24 March 2015 - 20:41

 

Отправлено 14 October 2014 - 17:47

:rofl:


Я думаю, будет уместным дать команду встать после смены бехавиора.


  • 0

#5 OFFLINE   TankiSD

TankiSD

    Ст. Прапорщик

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

Отправлено 24 March 2015 - 21:18

да я уже по разному пробовал)))

 

В итоге, я просто взял в руки топор и сделал грубый костыль)))

deletevehicle trighealtsq1;
"heltsq1mark" setmarkerpos getpos sq1; 
_deadman=sq1;
deletevehicle _deadman;
_side = createCenter BLUFOR;
_group = createGroup west;
_unit = grpSpN createUnit ["B_recon_M_F", [0, 0, 0], [], 0, "FORM"];
_unit setPos getmarkerpos "heltsq1mark";
_unit setrank "SERGEANT";
sq1=_unit;
[sq1] joinSilent grpnull;
sq1 disableAI "target";
sq1 disableAI "autotarget";
sq1 setcaptive true;
sq1 allowdamage true;

sq1 setIdentity "sq2";
sq1 setmimic "angry";

sq1 setCombatMode "BLUE";
sq1 setBehaviour "CARELESS";

removeHeadgear sq1;
removeBackpack sq1;
removeallweapons sq1;
removeUniform sq1;
removeVest sq1;
removeGoggles sq1;
removeAllAssignedItems sq1;

sq1 addHeadgear "H_HelmetB_light";
sq1 addUniform "U_B_CombatUniform_mcam";
sq1 addVest "V_PlateCarrier3_rgr";
sq1 addBackpack "B_AssaultPack_mcamo";
sq1 addGoggles "G_Tactical_Clear";

sq1 addItem "NVGoggles";
sq1 assignItem "NVGoggles";
sq1 addItem "ItemWatch";
sq1 assignItem "ItemWatch";
sq1 addItem "ItemCompass";
sq1 assignItem "ItemCompass";
sq1 addItem "ItemRadio";
sq1 assignItem "ItemRadio";
sq1 addItem "ItemMap";
sq1 assignItem "ItemMap";

{sq1 addItem "FirstAidKit";} foreach [0];
{sq1 addmagazine "20Rnd_762x51_Mag"} foreach [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
sq1 AddWeapon "srifle_EBR_DMS_pointer_snds_F";
{sq1 addmagazine "DemoCharge_Remote_Mag"} foreach [0];
{sq1 addmagazine "ClaymoreDirectionalMine_Remote_Mag"} foreach [0];
sleep 5;
while {!(sq1 distance tmsq < 5)} do {
"sqmove" setmarkerpos getpos tmsq;
sq1 move getmarkerpos "sqmove";
sq1 setUnitPos "UP";
sleep 15;
};
[sq1] joinSilent tmsq;
sq1 setunitpos "middle";
sq1 allowdamage true;
sq1 setcaptive true;
sq1 enableAI "target";
sq1 enableAI "autotarget";
sq1 setCombatMode "YELLOW";
sq1 setBehaviour "AWARE";

trighealtsq1=createTrigger["EmptyDetector",getPos player];
trighealtsq1 setTriggerArea[0,0,0,false];
trighealtsq1 setTriggerActivation["ANY","PRESENT",true];
trighealtsq1 setTriggerStatements["damage sq1 > 0.9", "healsq1=[] execvm 'healtsq1.sqf';", ""];

  • 0

#6 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 25 March 2015 - 00:42

Оригинальный вариант

{sq1 addmagazine "20Rnd_762x51_Mag"} foreach [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

Вот не такой оригинальный

sq1 addmagazines ["20Rnd_762x51_Mag", 100]; 

  • 0

#7 OFFLINE   TankiSD

TankiSD

    Ст. Прапорщик

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

Отправлено 25 March 2015 - 00:47

 

Оригинальный вариант

{sq1 addmagazine "20Rnd_762x51_Mag"} foreach [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

Вот не такой оригинальный

sq1 addmagazines ["20Rnd_762x51_Mag", 100]; 

 

да я по старинке)


  • 0

#8 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 25 March 2015 - 01:01

for "_i" from 0 to (N - 1) do {this addMagazine "magazineClassName"};
// N = кол-во магазинов

  • 0

#9 OFFLINE   TankiSD

TankiSD

    Ст. Прапорщик

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

Отправлено 25 March 2015 - 01:19

:D


  • 0




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