Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
ka3ant1p

ZedAI нужна помощь

Помогите пожалуйста, сперва добился того что все зомби спавнятся но в одной точке и не агрятся пока не подойти в притык, потом вроде подправил но веравно фигня какая то, не спавнит теперь вообще, ошибок в логах нет =(
 

private ["_mission","_zedgear","_zedPos","_gearmagazines","_skin","_gear","_unitnumber","_position","_doLoiter","_agent","_type","_radius","_method","_myDest","_newDest","_isAlive"];
_position = 	_this select 0;
_unitnumber = _this select 1;
_skin = 	_this select 2;
_gear = _this select 3;
if (count _this > 4) then {
	_mission = _this select 4;
} else {
	_mission = False;
};

_doLoiter = 	true;
_type = "";
_zedgear = [];
_agent = 	objNull;

if (!isServer) exitWith {};

for "_x" from 1 to _unitnumber do {
		switch (_gear) do {
		case 0 : {_zedgear = zed_gear0;};
		case 1 : {_zedgear = zed_gear1;};
		case 2 : {_zedgear = zed_gear2;};
		case 3 : {_zedgear = zed_gear3;};
		case 4 : {_zedgear = zed_gear4;};
		case "Random" : {_zedgear = zed_gear_random call BIS_fnc_selectRandom;};
		};

	_gearmagazines = _zedgear select 0;
	
if (_skin == "") then {
	_type = zed_skin call BIS_fnc_selectRandom;
} else {
	_type = _skin;
};

_radius = 40;
_method = "NONE";

_zedPos = [_position,10,20,5,0,2000,0] call BIS_fnc_findSafePos;
_agent = createAgent [_type, _zedPos, [], _radius, _method];
{_agent addMagazine _x} forEach _gearmagazines;

//dayz_spawnZombies = dayz_spawnZombies + 1;
ai_ground_units = (ai_ground_units + 1);
	if (_mission) then {
		_agent setVariable ["missionclean", "ground"];
	};
	
_isAlive = alive _agent;

_myDest = getPosATL _agent;
_newDest = getPosATL _agent;
_agent setVariable ["myDest",_myDest];
_agent setVariable ["newDest",_newDest];
[_zedPos,_agent] execFSM "\z\AddOns\dayz_code\system\zombie_agent.fsm";
};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

Да все это я и сам мог бы глянуть.

У меня нет времени сейчас на зедов)

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

Так сделай вывод в РПТ, diag_log и глянь, что за массив идет, и т.п. добавь их побольше - выводов, и посмотри.

И еще могу посоветовать -

СОКРАТИ скрипт ДО МИНИМУМА.

т.е. удали ты всякие case  и т.п.

Чтоб у тебя основное работало. Успеешь ты им инвентарь дать еще... Ты основное проработай.

 

if (DZE_MissionLootTable) then {

Вот нафига те эта проверка, если ты однозначно юзаешь конфиги с миски - удали нафиг, все лишнее, и сразу станет скрипт яснее и нагляднее.

Ты же свое создаешь? Ну так и вырезай нахрен все левое.

Я уже нашел в чем проблема, до этого работало т.к. zombie_agent.fsm вызывался за скобкой тобишь он не работал, а сейчас он делает деспаун зомбкаов, буду использовать куски кода из control_zombieAgent.sqf что бы задать им поведение. но уже завтра

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

Изменено пользователем ka3ant1p (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





  • 0

_myDest = getPosATL _agent;
_newDest = getPosATL _agent;
_agent setVariable ["myDest",_myDest];
_agent setVariable ["newDest",_newDest];

 

Зачем 2 раза получать getPosATL

Зачем два раза устанавливать в разные переменные одно и тоже значение

 

for "_x" from

Что есть "_x" - не инициализирован, не внутри цикла фореач, и отсутствует в привате - чему же он равен?

 

Что приходит в _this?

 

_zedPos = [_position,10,20,5,0,2000,0] call BIS_fnc_findSafePos;

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

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

_myDest = getPosATL _agent;

_newDest = getPosATL _agent;

_agent setVariable ["myDest",_myDest];

_agent setVariable ["newDest",_newDest];

 

Зачем 2 раза получать getPosATL

Зачем два раза устанавливать в разные переменные одно и тоже значение

 

for "_x" from

Что есть "_x" - не инициализирован, не внутри цикла фореач, и отсутствует в привате - чему же он равен?

 

Что приходит в _this?

 

_zedPos = [_position,10,20,5,0,2000,0] call BIS_fnc_findSafePos;

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

Это интегрированaый wild_spawnZombies в sapwngroup из WAI

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

вот оригинальный скрипт:
 

SpawnGroup.sqf

private ["_mission","_aipack","_aicskill","_position","_unitnumber","_skill","_gun","_mags","_backpack","_skin","_gear","_aiweapon","_aigear","_aiskin","_skillarray","_unitGroup","_weapon","_magazine","_weaponandmag","_gearmagazines","_geartools","_unit"];
_position = _this select 0;
_unitnumber = _this select 1;
_skill = _this select 2;
_gun = _this select 3;
_mags = _this select 4;
_backpack = _this select 5;
_skin = _this select 6;
_gear = _this select 7;
if (count _this > 8) then {
	_mission = _this select 8;
} else {
	_mission = False;
};

_aiweapon = [];
_aigear = [];
_aiskin = "";
_aicskill = [];
_aipack = "";
_skillarray = ["aimingAccuracy","aimingShake","aimingSpeed","endurance","spotDistance","spotTime","courage","reloadSpeed","commanding","general"];
_unitGroup = createGroup east;

if (!isServer) exitWith {};

for "_x" from 1 to _unitnumber do {
	switch (_gun) do {
		case 0 : {_aiweapon = ai_wep0;};
		case 1 : {_aiweapon = ai_wep1;};
		case 2 : {_aiweapon = ai_wep2;};
		case 3 : {_aiweapon = ai_wep3;};
		case 4 : {_aiweapon = ai_wep4;};
		case "Random" : {_aiweapon = ai_wep_random call BIS_fnc_selectRandom;};
	};
	_weaponandmag = _aiweapon call BIS_fnc_selectRandom;
	_weapon = _weaponandmag select 0;
	_magazine = _weaponandmag select 1;
		switch (_gear) do {
		case 0 : {_aigear = ai_gear0;};
		case 1 : {_aigear = ai_gear1;};
		case 2 : {_aigear = ai_gear2;};
		case 3 : {_aigear = ai_gear3;};
		case 4 : {_aigear = ai_gear4;};
		case "Random" : {_aigear = ai_gear_random call BIS_fnc_selectRandom;};
	};
	_gearmagazines = _aigear select 0;
	_geartools = _aigear select 1;
	if (_skin == "") then {
		_aiskin = ai_skin call BIS_fnc_selectRandom;
	} else {
		_aiskin = _skin
	};
	_unit = _unitGroup createUnit [_aiskin, [(_position select 0),(_position select 1),(_position select 2)], [], 10, "PRIVATE"];
	[_unit] joinSilent _unitGroup;
	if (_backpack == "") then {
		_aipack = ai_packs call BIS_fnc_selectRandom;
	} else {
		_aipack = _backpack
	};
	_unit enableAI "TARGET";
	_unit enableAI "AUTOTARGET";
	_unit enableAI "MOVE";
	_unit enableAI "ANIM";
	_unit enableAI "FSM";
	_unit setCombatMode ai_combatmode;
	_unit setBehaviour ai_behaviour;
	removeAllWeapons _unit;
	removeAllItems _unit;
	_unit addweapon _weapon;
	for "_i" from 1 to _mags do {_unit addMagazine _magazine;};
	_unit addBackpack _aipack;
	{_unit addMagazine _x} forEach _gearmagazines;
	{_unit addweapon _x} forEach _geartools;
	if (ai_custom_skills) then {
		switch (_skill) do {
		case 0 : {_aicskill = ai_custom_array1;};
		case 1 : {_aicskill = ai_custom_array2;};
		case 2 : {_aicskill= ai_custom_array3;};
		case "Random" : {_aicskill = ai_skill_random call BIS_fnc_selectRandom;};
	};
		{_unit setSkill [(_x select 0),(_x select 1)]} forEach _aicskill;
	} else {
		{_unit setSkill [_x,_skill]} forEach _skillarray;
	};
	ai_ground_units = (ai_ground_units + 1);
	_unit addEventHandler ["Killed",{[_this select 0, _this select 1, "ground"] call on_kill;}];
	if (_mission) then {
		_unit setVariable ["missionclean", "ground"];
	};
};
_unitGroup selectLeader ((units _unitGroup) select 0);
[_unitGroup, _position, _mission] call group_waypoints;

diag_log format ["WAI: Spawned a group of %1 Bandits at %2",_unitnumber,_position];

wild_spawnZombie.sqf
 

private ["_position","_doLoiter","_unitTypes","_loot","_array","_agent","_type","_radius","_method","_myDest","_newDest","_lootType","_player","_isAlive","_rnd","_id"];
_player = _this select 0;

_unitTypes = [];
if (DZE_MissionLootTable) then {
	_unitTypes = 	[]+ getArray (missionConfigFile >> "CfgBuildingLoot" >> "Default" >> "zombieClass");
} else {
	_unitTypes = 	[]+ getArray (configFile >> "CfgBuildingLoot" >> "Default" >> "zombieClass");
};
_doLoiter = 	true;

_loot = 	"";
_array = 	[];
_agent = 	objNull;

_type = _unitTypes call BIS_fnc_selectRandom;

//Create the Group and populate it
//diag_log ("Spawned: " + _type);
_radius = 40;
_method = "NONE";

_position = [_player,120,200,10,0,0,0] call BIS_fnc_findSafePos;

_agent = createAgent [_type, _position, [], _radius, _method];

if (_doLoiter) then {
	//_agent setPosATL _position;
	//_agent setVariable ["doLoiter",true,true];
	_agent setDir round(random 180);
};

dayz_spawnZombies = dayz_spawnZombies + 1;

if (random 1 > 0.7) then {
	_agent setUnitPos "Middle";
};

if (isNull _agent) exitWith {
	dayz_spawnZombies = dayz_spawnZombies - 1;
};

_isAlive = alive _agent;

_myDest = getPosATL _agent;
_newDest = getPosATL _agent;
_agent setVariable ["myDest",_myDest];
_agent setVariable ["newDest",_newDest];

//Add some loot
_rnd = random 1;
if (_rnd > 0.3) then {
	_lootType = 		configFile >> "CfgVehicles" >> _type >> "zombieLoot";
	if (isText _lootType) then {

		_array = [];
		if (DZE_MissionLootTable) then {
			_array = getArray (missionConfigFile >> "cfgLoot" >> getText(_lootType));
		} else {
			_array = getArray (configFile >> "cfgLoot" >> getText(_lootType));
		};
		
		if (count _array > 0) then {
			_loot = _array call BIS_fnc_selectRandomWeighted;
			if(!isNil "_array") then {
				_agent addMagazine _loot;
			};
		};
	};
};

//Start behavior
_id = [_position,_agent] execFSM "\z\AddOns\dayz_code\system\zombie_agent.fsm";

Вызывается скрипт в миссии по средством call cpawn_zeds ну и естсественно подключен как полагается. Есть файл инит который подключается через server_monitor там где и все боты, и в ините: spawn_zeds =     compile preprocessFileLineNumbers "\z\addons\dayz_server\ZedAI\compile\SpawnZeds.sqf";

Изменено пользователем ka3ant1p (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Да все это я и сам мог бы глянуть.

У меня нет времени сейчас на зедов)

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

Так сделай вывод в РПТ, diag_log и глянь, что за массив идет, и т.п. добавь их побольше - выводов, и посмотри.

И еще могу посоветовать -

СОКРАТИ скрипт ДО МИНИМУМА.

т.е. удали ты всякие case  и т.п.

Чтоб у тебя основное работало. Успеешь ты им инвентарь дать еще... Ты основное проработай.

 

if (DZE_MissionLootTable) then {

Вот нафига те эта проверка, если ты однозначно юзаешь конфиги с миски - удали нафиг, все лишнее, и сразу станет скрипт яснее и нагляднее.

Ты же свое создаешь? Ну так и вырезай нахрен все левое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

И так вот что у меня получилось:
В миссии имеем строку:

_position = [getMarkerPos "center",0,5500,10,0,2000,0] call BIS_fnc_findSafePos;

[[_position select 0, _position select 1, 0],_rndnum,"z_hunter","Random",true] call spawn_zeds; 

 

функция spawn_zeds выполняется скриптом SpawnZeds.sqf

 

private ["_mission","_skin","_gear","_unitnumber","_position","_agent","_radius","_method"];
_position = 	_this select 0;
_unitnumber = _this select 1;
_skin = 	_this select 2;
_gear = _this select 3;
if (count _this > 4) then {
	_mission = _this select 4; // 8
} else {
	_mission = False;
};

_agent = 	objNull;
_i = 1;
if (!isServer) exitWith {};
for "_i" from 1 to _unitnumber do
 {
_radius = 40;
_method = "NONE";

_agent = createAgent [_skin, _position, [], _radius, _method];

//dayz_spawnZombies = dayz_spawnZombies + 1;
ai_ground_units = (ai_ground_units + 1);
	if (_mission) then {
		_agent setVariable ["missionclean", "ground"];
	};
	
[_agent] execVM "\z\addons\dayz_server\ZedAI\compile\zombie_behaviour.sqf";
};

Таким образом мы спавним 4 зомби "z_hunter" в радиусе 40м от центра миссии далее вызываем zombie_behaviour.sqf:
 

private ["_position","_target","_targetPos","_isAlive","_list","_myDest","_agent"];
_agent = _this select 0;
_list = (getposATL _agent) nearEntities ["Man",200];
_isAlive = alive _agent;

while {_isAlive} do {
	_agent disableAI "FSM";
	_target = objNull;
	_targetPos = [];
	_myDest = getPosATL _agent;
	
	while {isNull _target and _isAlive} do {
		_isAlive = alive _agent;
		_list = (getposATL _agent) nearEntities ["Man",200];
		_target = _agent call zeds_findTarget;
		if (_isAlive and (_agent distance _myDest < 5)) then {
			[_agent,_position] call zeds_loiter;
		};
		_agent forceSpeed 2;
		sleep 1;
	};
	
	[_agent,"attack",0,false] call zeds_speak;
	
	while {!isNull _target and _isAlive} do {
		_target = _agent call zeds_findTarget;
		_isAlive = alive _agent;
		_targetPos = getPosATL _target;
		_agent moveTo _targetPos;
		_agent forceSpeed 8;
		sleep 1;
	};
	_agent setVariable ["targets",[],true];
	_isAlive = alive _agent;
	sleep 1;
};

sleep 5;

 

используемые тут функции zeds_findTarget и zeds_loiter:

zeds_findTarget - по сути идентична zombie_findTargetAgent я тут вроде вообще ничего не менял
а zeds_loiter = zedsLoiter.sqf:
 

private ["_unit","_originalPos","_pos","_chance","_playerpos"];
_unit = 		_this select 0;
_originalPos = 	_this select 1;
_pos = 			getPosATL _unit;
_playerpos = 	getPos player;

if (count _this > 2) then {
	_pos = _this select 2;
} else {
	_pos = [_originalPos,30,120,4,0,5,0] call BIS_fnc_findSafePos;
};

if(isNull group _unit) then {
	_unit moveTo _pos;
} else {
	_unit domove _pos;		
};	
_unit forceSpeed 2;
_unit setVariable ["myDest",_pos];

Все работает, осталось только loiter подправить на патрулирование, и добавить им лут и еще несколько фишек а так то уже работает =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Не очень получается переделать стандартный patrol.sqf от WAI для зомби.
Вот думаю как бы сделать что бы зомби бродили в радиусе миссии, потому как с моим zedsLoiter.sqf они все дружно идут в поисках SafePos.
Так вот я думаю если я скажем добавлю туда "_agent setDir round(random 360);" и вызывать BIS_fnc_findSafePos буду не по конкретно заданым параметрам а по рандому, то зомби по идее должны будут идти в разные стороны т.к. для каждого будет попадаться свой рандом. Вот только после достижения точки они будут повторно искать новую с новыми значениями рандома за счет "sleep 1" в моем zombie_behaviour.sqf или это нужно в повторяющийся цикл запихивать уже в самом zedsLoiter.sqf?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Решил объединить свой ZedAI и WAI для удобства, теперь будут и миссии с ботами и миссии с зомби и совместные.
Так и не смог добиться спавна новых зомби без аддона посему пока просто добавил проверку на наличие аддона, если есть то будут и новые зомби спавнится если нет то только обычные.
Проблема в другом возникла, мозг уже кипит не могу в просто коде разобраться....
В общем сделал 2 отдельных missions.sqf, для ботов и для зедов. Но не могу заставить эти миссии стартовать независимо друг от друга.
Хочу сделать так что бы могла одновременно стартануть 1 миссия для ботов и 1 миссия для зедов, а сейчас стартует либо та либо та =(
Вот коды:
WAImissions:
 

if(!isServer) exitWith {};

diag_log "WAI: Starting WAI Missions Monitor";

markerready = true;
missionrunning = false;
_startTime = floor(time);
_result = 0;

while {true} do
{
	_cnt = {alive _x} count playableUnits;
	_currTime = floor(time);
	if((_currTime - _startTime >= wai_mission_timer) AND (!missionrunning)) then {_result = 1};
	
	if(missionrunning) then
	{
		_startTime = floor(time);
	};
	
	if((_result == 1) AND (_cnt >= 1) AND (markerready))  then
    {
		clean_running_mission = False;
        _mission = wai_missions call BIS_fnc_selectRandom;
        execVM format ["\z\addons\dayz_server\ZedAI\missions\WAImissions\%1.sqf",_mission];
		missionrunning = true;
        diag_log format["WAI: Starting Mission %1",_mission];
        _startTime = floor(time);
        _result = 0;
    } else {
    	sleep 60;
    };    
};

ZEDmissions:

if(!isServer) exitWith {};

diag_log "ZedAI: Starting ZedAI Missions Monitor";

markerready = true;
missionrunning = false;
_startTime = floor(time);
_result = 0;

while {true} do
{
	_cnt = {alive _x} count playableUnits;
	_currTime = floor(time);
	if((_currTime - _startTime >= Zedai_mission_timer) AND (!missionrunning)) then {_result = 1};
	
	if(missionrunning) then
	{
		_startTime = floor(time);
	};
	
	if((_result == 1) AND (_cnt >= 1) AND (markerready))  then
    {
		clean_running_mission = False;
        _mission = ZedAI_missions call BIS_fnc_selectRandom;
        execVM format ["\z\addons\dayz_server\ZedAI\missions\ZedAImissions\%1.sqf",_mission];
		missionrunning = true;
        diag_log format["ZedAI: Starting Mission %1",_mission];
        _startTime = floor(time);
        _result = 0;
    } else {
    	sleep 60;
    };    
};

уже нет сил проверять, вот пока писал пришла в голову идея, может просто в 1 из них поменять глобальную переменную missionrunning на скажем ZEDmissionrunning?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ты понимаешь разницу в глобальных и локальных переменных?

В скриптах армы с нижним подчеркиванием - локальные переменные. Если они вызываются с помощью execVM то можешь их и в привате не добавлять.

Без подчеркивания - глобальные.

У тебя -

markerready = true;
missionrunning = false;

Глобальные переменные.

То один скрипт их занимает(присваивает им свои значения и работает) то другой.

Раз у тебя скрипт серверный, и к тому же в цикле while {true} do - т.е. бесконечном, пока пашет сервак, то или сделай их локальными(но скорее всего, есть другие скрипты - ты же не все выложил, и скорее всего им важно знать в каком состоянии в текущий момент данные переменные), или сделай свои собственные переменные, и копай остальную составляющую - остальные скрипты которые ты не указал, и в них меняй переменные на свои.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

мое предположение оказалось верным, я же за основу брал ВАЙ. А у них получается проверка на текущую миссию. а по скольку я зедам и ботам разделил конфиги то пришлось и глобальные переменные эти менять так как в миссиях и скрипте который делает маркер они так же используются.
Я решил этот проект в немного более грандиозный превратить. скажем так, решил добавить в арму сюжетность =)
Пока все в стадии задумки но с тем что уже сделал остальное вполне реализуемо.
В кратце будут 5 каст: военные, герои, бандиты, зомби, нейтралы
Для первых 3 привычных миссий не будет, у них они будут сами формироваться рандомно из заданных вариантов, таким образом миссий получится вариантов огромнейшее множество и фактически нет возможности повторения.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

в WAI есть миссия special , она стартует даже если уже запущены 2 миссии может к ней прилепить?



да и если банни ранч смешать с зомбаками будет весело )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.