diff --git a/SQF/dayz_code/compile/player_zombieCheck.sqf b/SQF/dayz_code/compile/player_zombieCheck.sqf index e4b020429..20beb9108 100644 --- a/SQF/dayz_code/compile/player_zombieCheck.sqf +++ b/SQF/dayz_code/compile/player_zombieCheck.sqf @@ -10,121 +10,123 @@ local _speedMax = DZE_ZombieSpeed select 1; local _cantSee = false; { - local _isZombie = _x isKindOf "zZombie_base"; - local _isMutant = (DZE_Bloodsuckers && {typeOf _x == "z_bloodsucker"}); - local _forcedSpeed = if ((_speedMin != _speedMax) && {(_speedMin > 0) && (_speedMax > 0)}) then {((random (DZE_ZombieSpeed select 1)) max (DZE_ZombieSpeed select 0));} else {getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "forcedSpeed");}; - local _dist = _x distance _refObj; - local _chance = 1; //0 / dayz_monitorPeriod; // Z verbosity - local _targetedBySight = false; - local _targetedBySound = false; - local _localtargets = _x getVariable ["localtargets",[]]; - local _remotetargets = _x getVariable ["remotetargets",[]]; - local _targets = _localtargets + _remotetargets; - - if (_isZombie) then { - if (_x distance _refObj >= (dayz_areaAffect*2)) then { - if (speed _x < 4) then { - [_x,"idle",(_chance + 4),true] call dayz_zombieSpeak; - } else { - [_x,"chase",(_chance + 3),true] call dayz_zombieSpeak; - }; - }; - if (_dist >= 3.3) then {_x setVariable ["speedLimit",_forcedSpeed,false];}; - }; - - if (_refObj in _targets) then { - if (_isZombie) then {_x setVariable ["speedLimit", 0, false];}; - - if (_dist <= 3.6) then { - //Force AI to Stand - _x setUnitPos "UP"; - if !(animationState _x == "ZombieFeed") then { - local _last = _x getVariable ["lastAttack", 0]; - local _entHeight = (getPosATL _x) select 2; - local _pHeight = (getPosATL _refObj) select 2; - local _delta = _pHeight - _entHeight; - if (((diag_tickTime - _last) > 1.5) && ((_delta < 1.5) && (_delta > -1.5))) then { - _cantSee = [_refObj,_x] call dayz_losCheck; - if (!_cantSee) then { - if (_isZombie) then { - [_x, "zombie"] spawn player_zombieAttack; - } else { - local _noAttack = (DZE_MutantHeartProtect && {_refObj hasWeapon "ItemMutantHeart"}); - if (!_noAttack && !_inVehicle) then { - _x spawn player_mutantAttack; - local _skin = _x getVariable ["mutantSkin", "act_krovosos_new1"]; // Set textures locally on each client to prevent issues with RESec - local _texture = format["\dayz_epoch_c\skins\bloodsucker\%1.paa",_skin]; - [nil,nil,rSETOBJECTTEXTURE,_x,0,_texture] call RE; - }; - }; - _x setVariable ["lastAttack", diag_tickTime]; - }; + if (!isNull _x) then { + local _isZombie = _x isKindOf "zZombie_base"; + local _isMutant = (DZE_Bloodsuckers && {typeOf _x == "z_bloodsucker"}); + local _forcedSpeed = if ((_speedMin != _speedMax) && {(_speedMin > 0) && (_speedMax > 0)}) then {((random (DZE_ZombieSpeed select 1)) max (DZE_ZombieSpeed select 0));} else {getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "forcedSpeed");}; + local _dist = _x distance _refObj; + local _chance = 1; //0 / dayz_monitorPeriod; // Z verbosity + local _targetedBySight = false; + local _targetedBySound = false; + local _localtargets = _x getVariable ["localtargets",[]]; + local _remotetargets = _x getVariable ["remotetargets",[]]; + local _targets = _localtargets + _remotetargets; + + if (_isZombie) then { + if (_x distance _refObj >= (dayz_areaAffect*2)) then { + if (speed _x < 4) then { + [_x,"idle",(_chance + 4),true] call dayz_zombieSpeak; + } else { + [_x,"chase",(_chance + 3),true] call dayz_zombieSpeak; }; }; + if (_dist >= 3.3) then {_x setVariable ["speedLimit",_forcedSpeed,false];}; + }; + + if (_refObj in _targets) then { + if (_isZombie) then {_x setVariable ["speedLimit", 0, false];}; + + if (_dist <= 3.6) then { + //Force AI to Stand + _x setUnitPos "UP"; + if !(animationState _x == "ZombieFeed") then { + local _last = _x getVariable ["lastAttack", 0]; + local _entHeight = (getPosATL _x) select 2; + local _pHeight = (getPosATL _refObj) select 2; + local _delta = _pHeight - _entHeight; + if (((diag_tickTime - _last) > 1.5) && ((_delta < 1.5) && (_delta > -1.5))) then { + _cantSee = [_refObj,_x] call dayz_losCheck; + if (!_cantSee) then { + if (_isZombie) then { + [_x, "zombie"] spawn player_zombieAttack; + } else { + local _noAttack = (DZE_MutantHeartProtect && {_refObj hasWeapon "ItemMutantHeart"}); + if (!_noAttack && !_inVehicle) then { + _x spawn player_mutantAttack; + local _skin = _x getVariable ["mutantSkin", "act_krovosos_new1"]; // Set textures locally on each client to prevent issues with RESec + local _texture = format["\dayz_epoch_c\skins\bloodsucker\%1.paa",_skin]; + [nil,nil,rSETOBJECTTEXTURE,_x,0,_texture] call RE; + }; + }; + _x setVariable ["lastAttack", diag_tickTime]; + }; + }; + }; + } else { + if (_isZombie) then {_x setVariable ["speedLimit", _forcedSpeed, false];}; + }; + _attacked = true; } else { if (_isZombie) then {_x setVariable ["speedLimit", _forcedSpeed, false];}; }; - _attacked = true; - } else { - if (_isZombie) then {_x setVariable ["speedLimit", _forcedSpeed, false];}; - }; - - //Block all target attempts while in an aircraft - if (!_isAir) then { - if !(_refObj in _targets) then { - //Noise Activation (zed is within players audial projection) - if (_dist < DAYZ_disAudial) then { - if (DAYZ_disAudial > 80) then { - _targetedBySound = true; - } else { - //if (DAYZ_disAudial > 6) then { - _chance = [_x,_dist,DAYZ_disAudial] call dayz_losChance; - //diag_log ("Visual Detection: " + str([_x,_dist]) + " " + str(_chance)); - if ((random 1) < _chance) then { - //make sure the player isnt behind a building or wall if target is in the open always target if player is making too much noise - _cantSee = [_refObj,_x] call dayz_losCheck; - if (!_cantSee) then { - _targetedBySound = true; - } else { - if (_dist < (DAYZ_disAudial / 2)) then {_targetedBySound = true;}; + + //Block all target attempts while in an aircraft + if (!_isAir) then { + if !(_refObj in _targets) then { + //Noise Activation (zed is within players audial projection) + if (_dist < DAYZ_disAudial) then { + if (DAYZ_disAudial > 80) then { + _targetedBySound = true; + } else { + //if (DAYZ_disAudial > 6) then { + _chance = [_x,_dist,DAYZ_disAudial] call dayz_losChance; + //diag_log ("Visual Detection: " + str([_x,_dist]) + " " + str(_chance)); + if ((random 1) < _chance) then { + //make sure the player isnt behind a building or wall if target is in the open always target if player is making too much noise + _cantSee = [_refObj,_x] call dayz_losCheck; + if (!_cantSee) then { + _targetedBySound = true; + } else { + if (_dist < (DAYZ_disAudial / 2)) then {_targetedBySound = true;}; + }; }; + //}; }; - //}; + }; + + //Sight Activation + if (_dist < DAYZ_disVisual) then { + _chance = [_x,_dist,DAYZ_disVisual] call dayz_losChance; + if ((random 1) < _chance) then { + local _tPos = getPosASL _vehicle; + local _zPos = getPosASL _x; + local _targetAngle = 30; + local _inAngle = [_zPos,(direction _x),_targetAngle,_tPos] call fnc_inAngleSector; + if (_inAngle) then { + _cantSee = [_refObj,_x] call dayz_losCheck; + if (!_cantSee) then {_targetedBySight = true;}; + }; + }; }; }; + }; + + if (_targetedBySight || _targetedBySound) then { + local _sound = ["spotted","bloodgrowl1"] select _isMutant; + [_x, _sound, 0, false] call dayz_zombieSpeak; + //diag_log format["Zombie: %1, Distance: %2, Target Reason: Sight-%3,%5/Sound-%4,%6",(typeof _x),_dist,_targetedBySight,_targetedBySound,DAYZ_disVisual,DAYZ_disAudial]; - //Sight Activation - if (_dist < DAYZ_disVisual) then { - _chance = [_x,_dist,DAYZ_disVisual] call dayz_losChance; - if ((random 1) < _chance) then { - local _tPos = getPosASL _vehicle; - local _zPos = getPosASL _x; - local _targetAngle = 30; - local _inAngle = [_zPos,(direction _x),_targetAngle,_tPos] call fnc_inAngleSector; - if (_inAngle) then { - _cantSee = [_refObj,_x] call dayz_losCheck; - if (!_cantSee) then {_targetedBySight = true;}; - }; - }; + if (local _x) then { + _localtargets set [count _localtargets,_refObj]; + _x setVariable ["localtargets",_localtargets,false]; + } else { + _remotetargets set [count _remotetargets,_refObj]; + _x setVariable ["remotetargets",_remotetargets,true]; }; }; - }; - - if (_targetedBySight || _targetedBySound) then { - local _sound = ["spotted","bloodgrowl1"] select _isMutant; - [_x, _sound, 0, false] call dayz_zombieSpeak; - //diag_log format["Zombie: %1, Distance: %2, Target Reason: Sight-%3,%5/Sound-%4,%6",(typeof _x),_dist,_targetedBySight,_targetedBySound,DAYZ_disVisual,DAYZ_disAudial]; - if (local _x) then { - _localtargets set [count _localtargets,_refObj]; - _x setVariable ["localtargets",_localtargets,false]; - } else { - _remotetargets set [count _remotetargets,_refObj]; - _x setVariable ["remotetargets",_remotetargets,true]; - }; + if (_isMutant && {DZE_BloodsuckerDeleteNearTrader && isInTraderCity}) then {deleteVehicle _x}; // Delete bloodsucker if the player is in a trader city }; - - if (_isMutant && {DZE_BloodsuckerDeleteNearTrader && isInTraderCity}) then {deleteVehicle _x}; // Delete bloodsucker if the player is in a trader city } forEach ((getPosATL _refObj) nearEntities ["Zed_Base",100]); if (_attacked) then {