Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 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";
};

 

Share this post


Link to post
Share on other sites

11 answers to this question

Recommended Posts

  • 0

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

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

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

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

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

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

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

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

 

if (DZE_MissionLootTable) then {

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

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

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

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

Edited by ka3ant1p (see edit history)

Share this post


Link to post
Share on other sites



  • 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;

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

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 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

Share this post


Link to post
Share on other sites
  • 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";

Edited by ka3ant1p (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

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

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

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

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

 

if (DZE_MissionLootTable) then {

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

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

Share this post


Link to post
Share on other sites
  • 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 подправить на патрулирование, и добавить им лут и еще несколько фишек а так то уже работает =)

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 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?

Share this post


Link to post
Share on other sites
  • 0

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

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

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

У тебя -

markerready = true;
missionrunning = false;

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 0

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



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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.