This commit is contained in:
A Man
2021-08-18 17:05:03 +02:00
21 changed files with 3334 additions and 222 deletions

View File

@@ -622,6 +622,7 @@ class CfgVehicles
#include "Zeds\WildZeds.hpp" //Wild type zeds
#include "Zeds\SwarmZeds.hpp" //Swarm type zeds
#include "Zeds\PlayerZeds.hpp" //Player type zeds
#include "Zeds\Bloodsuckers.hpp" //NS Bloodsuckers
//Skins
#include "Skins\Male.hpp"
#include "Skins\Female.hpp"

View File

@@ -0,0 +1,134 @@
class z_bloodsucker : Zed_Base {
scope = 2;
glassesEnabled = 0;
vehicleClass = "Zombie";
displayName = $STR_ZNAME_BLOODSUCKER;
model = "\nst\NS_mutants\blood\bloodsucker.p3d";
hiddenSelections[] = {"invisible"};
//hiddenSelectionsTextures[] = {};
fsmDanger = "";
fsmFormation = "";
//zombieLoot = "bloodsucker";
moves = "CfgMovesBloodsucker";
isMan = false;
weapons[] = {};
magazines[] = {};
sensitivity = 1; // sensor sensitivity
sensitivityEar = 1;
identityTypes[] = {};
class TalkTopics {};
languages[] = {};
armor = 46;
damageScale = 250;
sepsisChance = 0;
BleedChance = 10; // Maybe this should be higher
forcedSpeed = 6; // Left here to prevent errors in player_zombieCheck
class Eventhandlers {
init = "[(_this select 0)] execFSM ""\z\AddOns\dayz_code\system\mutant_agent.fsm""";
local = "_z = _this select 0; if (!(_this select 1)) exitWith {}; if (isServer) exitWith { _z call sched_co_deleteVehicle; }; [_z,true] execFSM '\z\AddOns\dayz_code\system\mutant_agent.fsm';";
//HandleDamage = "_this call local_zombieDamage;";
//Killed = "[_this,'zombieKills'] call local_eventKill;";
};
class UserActions
{
class Butcher
{
displayName = $STR_EPOCH_ACTIONS_GUTBLOOD;
displayNameDefault = $STR_EPOCH_ACTIONS_GUTBLOOD;
priority = 0;
radius = 3;
position = "";
showWindow = 1;
onlyForPlayer = 1;
shortcut = "";
condition = "(['Butcher',this] call userActionConditions)";
statement = "this spawn player_butcher;";
};
};
class HitPoints {
class HitHead {
armor = 10;
material = -1;
name = "head_hit";
passThrough = true;
memoryPoint = "pilot";
};
class HitBody : HitHead {
armor = 20;
name = "body";
memoryPoint = "aimPoint";
};
class HitSpine : HitHead {
armor = 10;
name = "Spine2";
memoryPoint = "aimPoint";
};
class HitHands : HitHead {
armor = 10;
material = -1;
name = "hands";
passThrough = true;
};
class HitLArm : HitHands {
name = "LeftArm";
memoryPoint = "lelbow";
};
class HitRArm : HitHands {
name = "RightArm";
memoryPoint = "relbow";
};
class HitLForeArm : HitHands {
name = "LeftForeArm";
memoryPoint = "lwrist";
};
class HitRForeArm : HitHands {
name = "RightForeArm";
memoryPoint = "rwrist";
};
class HitLHand : HitHands {
name = "LeftHand";
memoryPoint = "LeftHandMiddle1";
};
class HitRHand : HitHands {
name = "RightHand";
memoryPoint = "RightHandMiddle1";
};
class HitLegs : HitHands {
name = "legs";
memoryPoint = "pelvis";
};
class HitLLeg : HitHands {
name = "LeftLeg";
memoryPoint = "lknee";
};
class HitLLegUp : HitHands {
name = "LeftUpLeg";
memoryPoint = "lfemur";
};
class HitRLeg : HitHands {
name = "RightLeg";
memoryPoint = "rknee";
};
class HitRLegUp : HitHands {
name = "RightUpLeg";
memoryPoint = "rfemur";
};
};
};

View File

@@ -214,8 +214,6 @@ class CfgWeapons
#include "Rifles\WA2000.hpp"
#include "Rifles\BarrettMRAD.hpp"
#include "Rifles\RedRyder.hpp"
/* PISTOLS */
class M9;
@@ -346,9 +344,10 @@ class CfgWeapons
#include "Tools\Scissors.hpp"
#include "Tools\ScrewExtractor.hpp"
#include "Tools\Wrench.hpp"
#include "Tools\MutantHeart.hpp"
#include "Item\ItemKeys.hpp"
#include "Item\Documents.hpp"
#include "VehicleWeapons.hpp"
#include "VehicleWeapons.hpp"
};

View File

@@ -0,0 +1,7 @@
class ItemMutantHeart: ItemCore
{
scope = 2;
displayName = $STR_MUTANT_HEART;
picture = "\nst\ns_mutants\blood\heart_icon_ca.paa";
descriptionShort = $STR_MUTANT_HEART_DESC;
};

View File

@@ -931,4 +931,24 @@ class RscTitles
};
};
};
class mutant_attack
{
idd=-1;
movingEnable=0;
duration=1;
fadein=0;
name="Skrabanec";
controls[]=
{
"skrabanec"
};
class skrabanec: RscPicture
{
x=0;
y=0;
w=1;
h=1;
text="\nst\textures\skrabanec.paa";
};
};
};

File diff suppressed because it is too large Load Diff

View File

@@ -1,27 +1,28 @@
private ["_item","_type","_hasHarvested","_knifeArray","_PlayerNear","_isListed","_activeKnife","_text","_qty","_string","_isZombie","_humanity","_finished"];
if (dayz_actionInProgress) exitWith {localize "str_player_actionslimit" call dayz_rollingMessages;};
local _body = _this;
if (_body getVariable["meatHarvested",false]) exitWith {}; // Exit the script if the meat has already been harvested.
if ({isPlayer _x} count ((getPosATL _body) nearEntities ["CAManBase", 12]) > 1) exitWith {localize "str_pickup_limit_5" call dayz_rollingMessages;}; // Exit the script if another player is near to prevent duping.
dayz_actionInProgress = true;
_item = _this;
_type = typeOf _item;
_isZombie = _type isKindOf "zZombie_base";
_hasHarvested = _item getVariable["meatHarvested",false];
local _type = typeOf _body;
local _isZombie = _type isKindOf "zZombie_base";
local _isMutant = _type == "z_bloodsucker";
local _knives = [];
local _string = "";
_knifeArray = [];
_PlayerNear = {isPlayer _x} count ((getPosATL _item) nearEntities ["CAManBase", 12]) > 1;
if (_PlayerNear) exitWith {localize "str_pickup_limit_5" call dayz_rollingMessages; dayz_actionInProgress = false;};
//Count how many active tools the player has
// Count how many knives the player has
{
if (_x IN items player) then {
_knifeArray set [count _knifeArray, _x];
if (_x in items player) then {
_knives set [count _knives, _x];
};
} count Dayz_Gutting;
if ((count _knifeArray) < 1) exitWith {
if (_isZombie) then {
// Exit the script if the player doesn't have a knife
if ((count _knives) < 1) exitWith {
if (_isZombie || _isMutant) then {
format[localize "str_missing_to_do_this",localize "STR_EQUIP_NAME_4"] call dayz_rollingMessages;
} else {
localize "str_cannotgut" call dayz_rollingMessages;
@@ -29,48 +30,48 @@ if ((count _knifeArray) < 1) exitWith {
dayz_actionInProgress = false;
};
if ((count _knifeArray > 0) and !_hasHarvested) then {
//Use sharpest knife player has
_activeKnife = _knifeArray select 0;
[player,(getPosATL player),10,"gut"] spawn fnc_alertZombies;
//Get Animal Type
_isListed = isClass (configFile >> "CfgSurvival" >> "Meat" >> _type);
_text = getText (configFile >> "CfgVehicles" >> _type >> "displayName");
local _finished = ["Medic",1] call fn_loopAction;
if (!_finished) exitWith {dayz_actionInProgress = false;};
[player,(getPosATL player),10,"gut"] spawn fnc_alertZombies;
// Added Nutrition-Factor for work
["Working",0,[20,40,15,0]] call dayz_NutritionSystem;
_finished = ["Medic",1] call fn_loopAction;
if (!_finished) exitWith {};
//Get Animal Type
local _isListed = isClass (configFile >> "CfgSurvival" >> "Meat" >> _type);
local _text = getText (configFile >> "CfgVehicles" >> _type >> "displayName");
// Added Nutrition-Factor for work
["Working",0,[20,40,15,0]] call dayz_NutritionSystem;
_body setVariable ["meatHarvested",true,true];
local _qty = if (_isListed) then {getNumber (configFile >> "CfgSurvival" >> "Meat" >> _type >> "yield")} else {2};
if ((_knives select 0) == "ItemKnifeBlunt") then {_qty = round(_qty / 2);};
_item setVariable ["meatHarvested",true,true];
_qty = if (_isListed) then {getNumber (configFile >> "CfgSurvival" >> "Meat" >> _type >> "yield")} else {2};
if (_activeKnife == "ItemKnifeBlunt") then { _qty = round(_qty / 2); };
if (local _item) then {
[_item,_qty] spawn local_gutObject; //leave as spawn (sleeping in loops will work but can freeze the script)
} else {
PVCDZ_obj_GutBody =[_item,_qty];
publicVariable "PVCDZ_obj_GutBody";
};
["knives",0.2] call fn_dynamicTool;
if (_isZombie) then {
// Reduce humanity for gutting zeds
_humanity = player getVariable ["humanity",0];
_humanity = _humanity - 10;
player setVariable ["humanity",_humanity,true];
_string = format[localize "str_success_gutted_zombie",_text]; //%1 has been gutted, zombie parts are now on the carcass
} else {
_string = format[localize "str_success_gutted_animal",_text,_qty];
};
closeDialog 0;
uiSleep 0.02;
_string call dayz_rollingMessages;
if (local _body) then {
[_body,_qty] spawn local_gutObject; //leave as spawn (sleeping in loops will work but can freeze the script)
} else {
PVCDZ_obj_GutBody =[_body,_qty];
publicVariable "PVCDZ_obj_GutBody";
};
["knives",0.2] call fn_dynamicTool;
call {
if (_isZombie) exitWith {
// Reduce humanity for gutting zeds
local _humanity = player getVariable ["humanity",0];
player setVariable ["humanity",(_humanity - 10),true];
_string = format[localize "str_success_gutted_zombie",_text]; //%1 has been gutted, zombie parts are now on the carcass
};
if (_isMutant) exitWith {
_string = format[localize "str_success_gutted_mutant",_text];
};
_string = format[localize "str_success_gutted_animal",_text,_qty]; // default is gut animal
};
closeDialog 0;
uiSleep 0.02;
_string call dayz_rollingMessages;
dayz_actionInProgress = false;

View File

@@ -41,4 +41,11 @@ if (!([_objPos] call DZE_SafeZonePosCheck)) then {
};
} forEach _positions;
};
// Bloodsuckers
if (DZE_Bloodsuckers) then {
if ((dayz_spawnBloodsuckers < DZE_BloodsuckersMaxLocal) && {dayz_CurrentNearBloodsuckers < DZE_BloodsuckersMaxNear} && {dayz_currentGlobalBloodsuckers < DZE_BloodsuckersMaxGlobal} && {_type in DZE_BloodsuckerBuildings} && {(random 1) < DZE_BloodsuckerChance}) then {
_objPos call mutant_generate;
};
};
};

View File

@@ -1,38 +1,43 @@
private ["_amount","_animalbody","_rawfoodtype","_qty"];
local _body = _this select 0;
local _qty = _this select 1;
local _rawfoodtype = "";
local _bodyType = typeOf _body;
local _time = diag_tickTime;
_animalbody = _this select 0;
_qty = _this select 1;
if (_animalbody isKindOf "zZombie_base") then {
_qty = 1;
_rawfoodtype = "ItemZombieParts";
} else {
_rawfoodtype = getText (configFile >> "CfgSurvival" >> "Meat" >> typeOf _animalbody >> "rawfoodtype");
call {
if (_body isKindOf "zZombie_base") exitWith {
_qty = 1;
_rawfoodtype = "ItemZombieParts";
};
if (_bodyType == "z_bloodsucker") exitWith {
_qty = 1;
_rawfoodtype = "ItemMutantHeart"; // toolbelt item
};
// default is animal
_rawfoodtype = getText (configFile >> "CfgSurvival" >> "Meat" >> _bodyType >> "rawfoodtype");
};
if (local _animalbody) then {
if (local _body) then {
for "_i" from 1 to _qty do {
_animalbody addMagazine _rawfoodtype;
if (_rawfoodtype == "ItemMutantHeart") then {
_body addWeapon _rawfoodtype;
} else {
_body addMagazine _rawfoodtype;
};
};
if (typeOf _animalbody in ["Cock","Hen"]) then {
_amount = (floor (random 4)) + 2;
if (_bodyType in ["Cock","Hen"]) then {
local _amount = (floor (random 4)) + 2;
for "_x" from 1 to _amount do {
_animalbody addMagazine "equip_feathers";
_body addMagazine "equip_feathers";
};
};
[time, _animalbody] spawn {
_timer = _this select 0;
_body = _this select 1;
_pos = getPosATL _body;
while {(count magazines _body > 0) && (time - _timer < 300)} do {
uiSleep 5;
};
hideBody _body;
uiSleep 10;
deleteVehicle _body;
true
while {((count magazines _body > 0) || (count weapons _body > 0)) && (diag_tickTime - _time < 300)} do {
uiSleep 5;
};
hideBody _body;
uiSleep 10;
deleteVehicle _body;
};

View File

@@ -0,0 +1,28 @@
/*
_localtargets and _remotetargets are set in player_zombieCheck.
The bloodsucker will move in the direction of the player assigned as target.
Players with a mutant heart on tool belt will not be targeted.
*/
local _mutant = _this;
if (isNull _mutant) exitWith {objNull}; // Prevent errors if mutant is suddenly deleted
local _localtargets = _mutant getVariable ["localtargets",[]];
local _remotetargets = _mutant getVariable ["remotetargets",[]];
local _targets = _localtargets + _remotetargets;
local _target = objNull;
local _scandist = 200;
{
if !(_x hasWeapon "ItemMutantHeart") then {
local _dist = _x distance _mutant;
if (_dist < _scandist) then {
_target = _x;
_scandist = _dist;
};
};
} count _targets;
_target

View File

@@ -0,0 +1,16 @@
// Select random position between 50 and 100 meters away from the building.
local _pos = [_this, 50, 100, 1] call fn_selectRandomLocation;
if (surfaceIsWater _pos) exitWith { diag_log "Mutant_Generate: Location is in water...abort"; };
// Create mutant
_agent = createAgent ["z_bloodsucker", _pos, [], 0, "NONE"];
_agent setDir (random 360);
_agent setPosATL _pos;
// Add to counts
dayz_spawnBloodsuckers = dayz_spawnBloodsuckers + 1;
dayz_CurrentNearBloodsuckers = dayz_CurrentNearBloodsuckers + 1;
dayz_currentGlobalBloodsuckers = dayz_currentGlobalBloodsuckers + 1;
//diag_log format ["Bloodsucker Counts: Current local - %1, Current near - %2, Current global - %3",dayz_spawnBloodsuckers,dayz_CurrentNearBloodsuckers,dayz_currentGlobalBloodsuckers];

View File

@@ -1,23 +1,16 @@
private ["_unit","_distance","_doRun","_pos","_listTalk","_zombie","_50","_localtargets","_remotetargets","_targets","_dis"];
_unit = _this select 0;
_distance = _this select 1;
_doRun = _this select 2;
_pos = _this select 3;
_listTalk = _pos nearEntities ["zZombie_Base",_distance];
local _unit = _this select 0;
local _distance = _this select 1;
local _doRun = _this select 2;
local _pos = _this select 3;
{
_distance = _distance max floor(_distance*.9);
_dis = _x distance _unit;
_zombie = _x;
local _dis = _x distance _unit;
call {
if (_dis < 51) exitwith {
if (_doRun) then {
_localtargets = _x getVariable ["localtargets",[]];
_remotetargets = _x getVariable ["remotetargets",[]];
_targets = _localtargets + _remotetargets;
local _localtargets = _x getVariable ["localtargets",[]];
local _remotetargets = _x getVariable ["remotetargets",[]];
local _targets = _localtargets + _remotetargets;
if (!(_unit in _targets)) then {
if !(local _x) then {
_remotetargets set [count _remotetargets,_unit];
@@ -28,16 +21,15 @@ _listTalk = _pos nearEntities ["zZombie_Base",_distance];
};
};
} else {
_zombie setVariable ["myDest",_pos,true];
_x setVariable ["myDest",_pos,true];
};
};
if ((_dis > 50) && {_dis <= 71}) exitwith {
_50 = round(random 100);
if (_50 < 50) then {
if (random 100 < 50) then {
if (_doRun) then {
_localtargets = _x getVariable ["localtargets",[]];
_remotetargets = _x getVariable ["remotetargets",[]];
_targets = _localtargets + _remotetargets;
local _localtargets = _x getVariable ["localtargets",[]];
local _remotetargets = _x getVariable ["remotetargets",[]];
local _targets = _localtargets + _remotetargets;
if (!(_unit in _targets)) then {
if !(local _x) then {
_remotetargets set [count _remotetargets,_unit];
@@ -48,14 +40,14 @@ _listTalk = _pos nearEntities ["zZombie_Base",_distance];
};
};
} else {
_zombie setVariable ["myDest",_pos,true];
_x setVariable ["myDest",_pos,true];
};
} else {
_zombie setVariable ["myDest",_pos,true];
_x setVariable ["myDest",_pos,true];
};
};
if (_dis > 70) exitwith {
_zombie setVariable ["myDest",_pos,true];
_x setVariable ["myDest",_pos,true];
};
};
} count _listTalk;
} count (_pos nearEntities ["Zed_Base",_distance]);

View File

@@ -0,0 +1,76 @@
/*
DayZ Epoch mutant attack script by JasonTM
Adapted from player_zombieAttack by facoptere
and Nightstalker melee attack effects by sumrak<at>nightstalkers.cz
*/
local _mutant = _this;
if (isNull _mutant) exitWith {}; // Prevent errors if mutant is deleted suddenly
local _damage = 0.5 + random (1.2); // Not sure about this. Maybe bloodsuckers should cause more damage.
local _wound = "";
local _dir = [_mutant,player] call BIS_Fnc_dirTo;
_mutant setDir _dir;
if (r_player_blood < (r_player_bloodTotal * 0.8)) then {
local _cnt = count (DAYZ_woundHit select 1);
local _index = floor (random _cnt);
_index = (DAYZ_woundHit select 1) select _index;
_wound = (DAYZ_woundHit select 0) select _index;
} else {
local _cnt = count (DAYZ_woundHit_ok select 1);
local _index = floor (random _cnt);
_index = (DAYZ_woundHit_ok select 1) select _index;
_wound = (DAYZ_woundHit_ok select 0) select _index;
};
local _pos = getPosATL player;
local _nearPlayer = false;
{
if (isPlayer _x && _x != player && {_x distance _pos < 100}) exitWith {_nearPlayer = true;};
} count playableUnits;
// Select a random attack sound
_sound = ["bloodatt0","bloodatt1","bloodatt2","bloodatt3"] call BIS_fnc_selectRandom;
// Broadcast hit noise and animation if a player is near
if (_nearPlayer) then {
[_mutant,_sound,0,false] call dayz_zombieSpeak;
//[objNull, _mutant, rplayMove, "AmelPercMstpSnonWnonDnon_amaterUder2"] call RE;
[nil, _mutant, rSwitchMove, "AmelPercMstpSnonWnonDnon_amaterUder2"] call RE;
} else {
[_mutant,_sound,0,true] call dayz_zombieSpeak;
//_mutant playMove "AmelPercMstpSnonWnonDnon_amaterUder2";
_mutant switchMove "AmelPercMstpSnonWnonDnon_amaterUder2";
};
uiSleep 0.3; // This sleep better coordinates the UI effects below with the animation and attack sound above.
if (DZE_BloodsuckerScreenEffect) then {cutRSC ["mutant_attack","PLAIN"];}; // the cool red slash marks that show up on screen.
"dynamicBlur" ppEffectEnable true;
"dynamicBlur" ppEffectAdjust [2];
"dynamicBlur" ppEffectCommit 0.1;
_pp = ppEffectCreate ["colorCorrections", 1553];
_pp ppEffectEnable true;
_pp ppEffectAdjust [1, 1, 0, [0.1, 0.0, 0.0, 1], [1.0, 0.5, 0.5, 0.1], [0.199, 0.587, 0.114, 0.0]];
_pp ppEffectCommit 0.1;
uiSleep 0.1;
_pp ppEffectAdjust [1, 1, 0, [0.1, 0.0, 0.0, 0.5], [1.0, 0.5, 0.5, 0.1], [0.199, 0.587, 0.114, 0.0]];
_pp ppEffectCommit 0.3;
uiSleep 0.3;
ppEffectDestroy _pp;
[player, _wound, _damage, _mutant, "zombie"] call fnc_usec_damageHandler;
uiSleep 0.2;
if (_nearPlayer) then {
[nil, _mutant, rSWITCHMOVE, ""] call RE;
} else {
_mutant switchMove "";
};
uiSleep 3;
"dynamicBlur" ppEffectEnable false;

View File

@@ -21,6 +21,22 @@ dayz_maxControlledZombies = dayz_maxLocalZombies; // This variable is also used
// Current loot spawns
dayz_currentWeaponHolders = count (_position nearObjects ["ReammoBox",_radius]);
// Current bloodsuckers
if (DZE_Bloodsuckers) then {
local _bloodsuckers = entities "z_bloodsucker";
dayz_currentGlobalBloodsuckers = count _bloodsuckers;
dayz_CurrentNearBloodsuckers = 0;
dayz_spawnBloodsuckers = 0;
{
if ((_x distance _position) < _radius && {alive _x}) then {
if (local _x) then {
dayz_spawnBloodsuckers = dayz_spawnBloodsuckers + 1;
};
dayz_CurrentNearBloodsuckers = dayz_CurrentNearBloodsuckers + 1;
};
} count _bloodsuckers;
};
// In vehicle check
local _vehicle = vehicle player;
local _inVehicle = (_vehicle != player);

View File

@@ -1,139 +1,144 @@
private ["_attacked","_chance","_near","_targeted","_localtargets","_remotetargets","_forcedSpeed","_vehicle","_refObj",
"_multiplier","_isAir","_hearingThreshold","_sightThreshold","_type","_dist","_attackDist",
"_targetedBySight","_targetedBySound","_targets","_last","_entHeight","_pHeight","_delta","_attackResult","_cantSee","_tPos","_zPos",
"_targetAngle","_inAngle","_lowBlood","_speedMin","_speedMax"];
// Check for near zombies and mutants and attack player
_vehicle = vehicle player;
_refObj = driver _vehicle;
_attacked = false; // at least one Z attacked the player
_near = false;
//_multiplier = 1;
_isAir = _vehicle isKindOf "Air";
_speedMin = DZE_ZombieSpeed select 0;
_speedMax = DZE_ZombieSpeed select 1;
local _vehicle = vehicle player;
local _inVehicle = _vehicle != player;
local _refObj = driver _vehicle;
local _attacked = false; // at least one Z attacked the player
local _isAir = _vehicle isKindOf "Air";
local _speedMin = DZE_ZombieSpeed select 0;
local _speedMax = DZE_ZombieSpeed select 1;
local _cantSee = false;
{
_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");};
//_forcedSpeed = getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "forcedSpeed");
//_hearingThreshold = getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "hearingThreshold");
//_sightThreshold = getNumber (configFile >> "CfgVehicles" >> (typeOf _x) >> "sightThreshold");
if !(typeOf _x == "swarm_newBase") then {
_type = "zombie";
if (alive _x) then {
private ["_dist","_attackDist"];
_dist = _x distance _refObj;
_group = _x;
_chance = 1; //0 / dayz_monitorPeriod; // Z verbosity
_targetedBySight = false;
_targetedBySound = false;
_localtargets = _group getVariable ["localtargets",[]];
_remotetargets = _group getVariable ["remotetargets",[]];
_targets = _localtargets + _remotetargets;
if (_x distance player >= (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;
};
local _isZombie = _x isKindOf "zZombie_base";
local _isMutant = 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 (_isMutant) then {
if (_dist <= 5) then {
local _skin = _x getVariable ["mutantSkin", "act_krovosos_new1"]; // Set textures locally on each client to prevent issues with RESec
_x setObjectTexture [0, format["\nst\ns_mutants\blood\%1.paa",_skin]];
} else {
_x setObjectTexture [0, ""];
local _sound = ["bloodgrowl0","bloodgrowl2","bloodgrowl3","bloodgrowl4","bloodforest1","bloodforest2","bloodforest3","bloodforest4"] call BIS_fnc_selectRandom;
[_x,_sound,(_chance + 4),false] call dayz_zombieSpeak;
};
};
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 (_x distance _refObj >= 3.3) then {_x setVariable ["speedLimit",_forcedSpeed,false];};
//if (!local _x) then {
if (_refObj in _targets) then {
_last = _x getVariable ["lastAttack", 0];
_entHeight = (getPosATL _x) select 2;
_pHeight = (getPosATL _refObj) select 2;
_delta = _pHeight - _entHeight;
_x setVariable ["speedLimit", 0, false];
if (_x distance _refObj <= 3) then {
//Force AI to Stand
_x setUnitPos "UP";
if !(animationState _x == "ZombieFeed") then {
if (((diag_tickTime - _last) > 1.5) && ((_delta < 1.5) && (_delta > -1.5))) then {
_cantSee = [_x,_refObj] call dayz_losCheck;
if (!_cantSee) then {
_attackResult = [_x, _type] spawn player_zombieAttack;
_x setVariable ["lastAttack", diag_tickTime];
};
};
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) 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 {
if (!(_refObj hasWeapon "ItemMutantHeart") && !_inVehicle) then {
_x spawn player_mutantAttack;
};
};
} else {
_x setVariable ["speedLimit", _forcedSpeed, false];
_x setVariable ["lastAttack", diag_tickTime];
};
_attacked = true;
} else {
_x setVariable ["speedLimit", _forcedSpeed, false];
};
//};
//Block all target atteps while in a vehicle
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 {
};
} 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 (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;};
};
};
//};
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 {
_tPos = getPosASL _vehicle;
_zPos = getPosASL _x;
_targetAngle = 30;
_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 or _targetedBySound) then {
[_x, "spotted", 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];
switch (local _x) do {
case false: {
_remotetargets set [count _remotetargets,_refObj];
_x setVariable ["remotetargets",_remotetargets,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;};
};
case true: {
_localtargets set [count _localtargets,_refObj];
_x setVariable ["localtargets",_localtargets,false];
};
};
};
};
};
};
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
} forEach ((getPosATL _refObj) nearEntities ["Zed_Base",100]);
if (_attacked) then {
if (r_player_unconscious) then {
[_refObj, "scream", 6, false] call dayz_zombieSpeak;
} else {
_lowBlood = (r_player_blood / r_player_bloodTotal) < 0.5;
local _lowBlood = (r_player_blood / r_player_bloodTotal) < 0.5;
if (diag_ticktime - dayz_panicCooldown > 9 && _lowBlood) then {
//Prevents overlapping sounds (panic tracks are 4-9s, this script is called every 1s)
//50% chance every 9s
@@ -143,5 +148,5 @@ if (_attacked) then {
};
};
// return true if attacked or near. if so, player_monitor will perform its ridiculous 'while true' loop faster.
(_attacked OR _near)
// return true if attacked. if so, player_monitor will perform its ridiculous 'while true' loop faster.
_attacked

View File

@@ -332,6 +332,16 @@ if (!isDedicated) then {
];
};
};
// Bloodsuckers
DZE_Bloodsuckers = false; // Enable bloodsucker spawning.
DZE_BloodsuckerChance = .15; // Chance that a building will spawn a bloodsucker. Default .15 (15%)
DZE_BloodsuckerBuildings = ["Land_Hlidac_budka","Land_Mil_Guardhouse","Land_Mil_Barracks","Land_Mil_House","Land_Mil_Barracks_i","CrashSite_RU","CrashSite_US","CrashSite_EU","CrashSite_UN"]; // Bloodsuckers will spawn near these building classes.
DZE_BloodsuckersMaxGlobal = 15; // Maximum number of bloodsuckers allowed on the map at one time.
DZE_BloodsuckersMaxNear = 3; // Maximum number of bloodsuckers allowed in any 200 meter area.
DZE_BloodsuckersMaxLocal = 2; // Maximum number of bloodsuckers that can spawn per client.
DZE_BloodsuckerScreenEffect = true; // On screen slash marks when the bloodsuckers attack.
DZE_BloodsuckerDeleteNearTrader = true; // Deletes bloodsuckers when near trader cities.
};
// Both

View File

@@ -211,6 +211,13 @@ if (!isDedicated) then {
if (DZE_Service_Points) then {
execVM "\z\addons\dayz_code\actions\servicePoints\init.sqf";
};
// Bloodsuckers
if (DZE_Bloodsuckers) then {
player_mutantAttack = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_mutantAttack.sqf";
mutant_generate = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\mutant_generate.sqf";
mutant_findTarget = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\mutant_findTarget.sqf";
};
// Weather
if (DZE_Weather in [3,4]) then {

View File

@@ -14281,6 +14281,9 @@
<French>Infecté</French>
<Czech>Infikovaný</Czech>
</Key>
<Key ID="STR_ZNAME_BLOODSUCKER">
<English>Bloodsucker</English>
</Key>
<Key ID="STR_ZNAME_INFECTEDVIRAL">
<English>Viral Infected</English>
<Spanish>Infectado Viral</Spanish>
@@ -22463,6 +22466,9 @@
<French>%1 a été vidé, les pièces de zombies sont maintenant sur la carcasse.</French>
<Czech>%1 byl zničený, zombie díly jsou nyní na kostru.</Czech>
</Key>
<Key ID="str_success_gutted_mutant">
<English>You have carved the heart of the %1 from it's chest.</English>
</Key>
<Key ID="str_actions_tamedog">
<English>Tame Dog</English>
<German>Hund zähmen</German>
@@ -25541,6 +25547,9 @@
<French>Dépecer le zombie</French>
<Czech>Vykuchat Zombie</Czech>
</Key>
<Key ID="STR_EPOCH_ACTIONS_GUTBLOOD">
<English>Butcher Bloodsucker</English>
</Key>
<Key ID="STR_EPOCH_ACTIONS_OPEN">
<English>Open %1</English>
<German>%1 öffnen</German>
@@ -27337,6 +27346,12 @@
<German>Zombiehaut in einem Sack.</German>
<Russian>Кожа зомби в мешке.</Russian>
</Key>
<Key ID="STR_MUTANT_HEART">
<English>Mutant Heart</English>
</Key>
<Key ID="STR_MUTANT_HEART_DESC">
<English>Bloodsuckers will not attack a player that keeps one in their inventory.</English>
</Key>
<Key ID="STR_EPOCH_COMBINATIONLOCK">
<English>Combination Lock</English>
<German>Zahlenschloss</German>

View File

@@ -0,0 +1,719 @@
/*%FSM<COMPILE "C:\Program Files (x86)\Bohemia Interactive\Tools\FSM Editor Personal Edition\scriptedFSM.cfg, DZE Bloodsucker Agent">*/
/*%FSM<HEAD>*/
/*
item0[] = {"init",0,250,-400.000000,-250.000000,-300.000000,-200.000000,0.000000,"init"};
item1[] = {"End",1,250,175.000000,-250.000000,275.000000,-200.000000,0.000000,"End"};
item2[] = {"Not_Alive",4,218,25.000000,375.000000,125.000000,425.000000,5.000000,"Not" \n "Alive"};
item3[] = {"Nobody_Near",4,218,25.000000,525.000000,125.000000,575.000000,6.000000,"Nobody" \n "Near"};
item4[] = {"",7,210,-29.000042,396.000000,-20.999958,404.000000,0.000000,""};
item5[] = {"",7,210,-29.000040,470.999939,-20.999960,479.000061,0.000000,""};
item6[] = {"",7,210,-354.000031,121.000000,-346.000000,129.000000,0.000000,""};
item7[] = {"UnitReady",4,218,-275.000000,275.000000,-175.000000,325.000000,5.000000,"UnitReady"};
item8[] = {"Chase",2,250,-150.000000,375.000000,-50.000000,425.000000,0.000000,"Chase"};
item9[] = {"",7,210,-29.000006,121.000000,-20.999994,129.000000,0.000000,""};
item10[] = {"",7,210,-29.000008,221.000000,-20.999992,229.000015,0.000000,""};
item11[] = {"No_Target",4,218,-400.000000,450.000000,-300.000000,500.000000,3.000000,"No" \n "Target"};
item12[] = {"",7,210,-479.000000,471.000000,-471.000000,479.000000,0.000000,""};
item13[] = {"",7,210,-729.000000,346.000000,-721.000000,354.000000,0.000000,""};
item14[] = {"",7,210,221.000000,396.000000,229.000000,404.000000,0.000000,""};
item15[] = {"",7,210,221.000000,471.000000,229.000000,479.000000,0.000000,""};
item16[] = {"Cleanup_",2,250,175.000000,200.000000,275.000000,250.000000,0.000000,"Cleanup?"};
item17[] = {"nobody_around",4,218,175.000000,-25.000000,275.000000,25.000000,0.000000,"nobody" \n "around"};
item18[] = {"",7,210,-104.000023,471.000000,-95.999985,479.000000,0.000000,""};
item19[] = {"cant_see",4,218,-275.000000,575.000000,-175.000000,625.000000,2.000000,"cant" \n "see"};
item20[] = {"Finish_Move",2,250,-275.000000,650.000000,-175.000000,700.000000,0.000000,"Finish" \n "Move"};
item21[] = {"finished",4,218,-425.000000,650.000000,-325.000000,700.000000,1.000000,"finished"};
item22[] = {"",7,210,-479.000000,671.000000,-471.000000,679.000000,0.000000,""};
item23[] = {"",7,210,-29.000002,671.000000,-20.999998,679.000000,0.000000,""};
item24[] = {"Move",2,250,-650.000000,50.000000,-550.000000,100.000000,0.000000,"Move"};
item25[] = {"someone_here",4,218,300.000000,200.000000,400.000000,250.000000,0.000000,"someone" \n "here"};
item26[] = {"wait",2,250,300.000000,125.000000,400.000000,175.000000,0.000000,"wait"};
item27[] = {"time_up",4,218,300.000000,-25.000000,400.000000,25.000000,0.000000,"time" \n "up"};
item28[] = {"",7,210,346.000000,95.999992,354.000000,104.000000,0.000000,""};
item29[] = {"",7,210,221.000000,96.000008,229.000000,103.999977,0.000000,""};
item30[] = {"Time_Check",4,218,425.000000,125.000000,525.000000,175.000000,0.000000,"Time" \n "Check"};
item31[] = {"",7,210,346.000000,-79.000000,354.000000,-71.000000,0.000000,""};
item32[] = {"",7,210,221.000000,-79.000000,229.000000,-71.000000,0.000000,""};
item33[] = {"too_long",4,4314,-425.000000,725.000000,-325.000000,775.000000,0.000000,"too long"};
item34[] = {"",7,210,-229.000000,746.000000,-221.000000,754.000000,0.000000,""};
item35[] = {"",7,210,-479.000000,746.000000,-471.000000,754.000000,0.000000,""};
item36[] = {"Reset_Targeting",2,250,-525.000000,325.000000,-425.000000,375.000000,0.000000,"Reset" \n "Targeting"};
item37[] = {"deleted",4,218,425.000000,-25.000000,525.000000,25.000000,0.000000,"deleted"};
item38[] = {"",7,210,471.000000,-79.000000,479.000000,-71.000000,0.000000,""};
item39[] = {"",7,210,471.000000,95.999977,479.000000,104.000023,0.000000,""};
item40[] = {"",7,210,-104.000000,596.000000,-95.999992,604.000000,0.000000,""};
item41[] = {"Target_Dead",4,218,-275.000000,500.000000,-175.000000,550.000000,3.000000,"Target Dead"};
item42[] = {"",7,210,-479.000000,521.000000,-471.000000,529.000000,0.000000,""};
item43[] = {"TimeCheck",4,218,-150.000000,275.000000,-50.000000,325.000000,2.000000,"TimeCheck"};
item44[] = {"No_Agent",4,218,25.000000,450.000000,125.000000,500.000000,5.000000,"No Agent"};
item45[] = {"",7,210,221.000015,546.000061,229.000000,553.999939,0.000000,""};
item46[] = {"",7,210,-29.000042,545.999939,-20.999958,554.000061,0.000000,""};
item47[] = {"Ready",4,218,-400.000000,-125.000000,-300.000000,-75.000000,0.000000,"Ready"};
item48[] = {"Loiter",2,250,-400.000000,25.000000,-300.000000,75.000000,0.000000,"Loiter"};
item49[] = {"Time_Check",4,218,-275.000000,50.000000,-175.000000,100.000000,0.000000,"Time" \n "Check"};
item50[] = {"MoveCompleted_",4,218,-525.000000,50.000000,-425.000000,100.000000,3.000000,"MoveCompleted "};
item51[] = {"Failed_Move",4,218,-525.000000,100.000000,-425.000000,150.000000,3.000000,"Failed Move"};
item52[] = {"Not_moving",4,218,-525.000000,0.000000,-425.000000,50.000000,1.000000,"Not moving"};
item53[] = {"",7,210,-604.000000,-29.000000,-596.000000,-21.000000,0.000000,""};
item54[] = {"player_check",4,218,-275.000000,0.000000,-175.000000,50.000000,2.000000,"player" \n "check"};
item55[] = {"True",8,218,-525.000000,-50.000000,-425.000000,0.000000,0.000000,"True"};
item56[] = {"",7,210,-729.000000,-129.000000,-721.000000,-121.000008,0.000000,""};
item57[] = {"InRange",4,218,-275.000000,400.000000,-175.000000,450.000000,1.000000,"InRange"};
item58[] = {"Attacking_Wait",2,250,-400.000000,375.000000,-300.000000,425.000000,0.000000,"Attacking Wait"};
item59[] = {"NotInRange",4,218,-275.000000,350.000000,-175.000000,400.000000,1.000000,"NotInRange"};
item60[] = {"TimeCheck",4,218,-400.000000,275.000000,-300.000000,325.000000,0.000000,"TimeCheck"};
item61[] = {"Has_Target",4,218,-150.000000,200.000000,-50.000000,250.000000,0.000000,"Has" \n "Target"};
item62[] = {"Reset_MoveTo",2,250,-275.000000,200.000000,-175.000000,250.000000,0.000000,"Reset MoveTo"};
item63[] = {"",7,210,-479.000000,-129.000000,-471.000000,-121.000000,0.000000,""};
item64[] = {"isDedicated",4,218,-125.000000,-250.000000,-25.000000,-200.000000,0.000000,"isDedicated"};
link0[] = {0,47};
link1[] = {0,64};
link2[] = {2,14};
link3[] = {3,45};
link4[] = {4,2};
link5[] = {4,5};
link6[] = {5,44};
link7[] = {5,46};
link8[] = {6,9};
link9[] = {7,8};
link10[] = {8,4};
link11[] = {8,18};
link12[] = {8,43};
link13[] = {8,57};
link14[] = {9,10};
link15[] = {10,4};
link16[] = {10,61};
link17[] = {11,12};
link18[] = {12,36};
link19[] = {13,56};
link20[] = {14,16};
link21[] = {15,14};
link22[] = {16,25};
link23[] = {16,29};
link24[] = {17,32};
link25[] = {18,11};
link26[] = {18,40};
link27[] = {18,41};
link28[] = {19,20};
link29[] = {20,21};
link30[] = {20,23};
link31[] = {20,34};
link32[] = {21,22};
link33[] = {22,42};
link34[] = {23,46};
link35[] = {24,53};
link36[] = {25,26};
link37[] = {26,28};
link38[] = {26,30};
link39[] = {27,31};
link40[] = {28,27};
link41[] = {28,29};
link42[] = {28,39};
link43[] = {29,17};
link44[] = {30,26};
link45[] = {31,32};
link46[] = {32,1};
link47[] = {33,35};
link48[] = {34,33};
link49[] = {35,22};
link50[] = {36,13};
link51[] = {37,38};
link52[] = {38,31};
link53[] = {39,37};
link54[] = {40,19};
link55[] = {41,42};
link56[] = {42,12};
link57[] = {43,8};
link58[] = {44,15};
link59[] = {45,15};
link60[] = {46,3};
link61[] = {47,48};
link62[] = {48,6};
link63[] = {48,49};
link64[] = {48,50};
link65[] = {48,51};
link66[] = {48,52};
link67[] = {48,54};
link68[] = {49,48};
link69[] = {50,24};
link70[] = {51,24};
link71[] = {52,24};
link72[] = {53,55};
link73[] = {54,48};
link74[] = {55,48};
link75[] = {56,63};
link76[] = {57,58};
link77[] = {58,59};
link78[] = {58,60};
link79[] = {59,8};
link80[] = {60,58};
link81[] = {61,62};
link82[] = {62,7};
link83[] = {63,55};
link84[] = {64,1};
globals[] = {25.000000,1,0,0,0,640,480,1,193,6316128,1,-736.296082,268.705750,907.675354,265.884705,1425,910,1};
window[] = {2,-1,-1,-1,-1,883,182,1390,182,3,1443};
*//*%FSM</HEAD>*/
class FSM
{
fsmName = "DZE Bloodsucker Agent";
class States
{
/*%FSM<STATE "init">*/
class init
{
name = "init";
init = /*%FSM<STATEINIT""">*/"_agent = _this select 0;" \n
"_position = _agent modelToWorld [0,0,0];" \n
"" \n
"_secondHand = false;" \n
"" \n
"if (count _this > 1) then {" \n
" _secondHand = true;" \n
" diag_log (""Second Hand Bloodsucker Initialized: "" + str(_this));" \n
"};"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "isDedicated">*/
class isDedicated
{
priority = 0.000000;
to="End";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"isDedicated"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Ready">*/
class Ready
{
priority = 0.000000;
to="Loiter";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(!isNil 'dayz_clientPreload' && {dayz_clientPreload}) && !(isNull _agent)"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"_myDest = [_agent,_position] call zombie_loiter;" \n
"" \n
"_agent disableAI ""FSM"";" \n
"_agent setBehaviour ""CARELESS"";" \n
"_agent setSpeedMode ""FULL"";" \n
"" \n
"// hint ""Bloodsucker has spawned"";" \n
"" \n
"_isSomeone = true;" \n
"" \n
"_target = objNull;" \n
"_targetPos = [];" \n
"_entityTime = diag_tickTime;" \n
"" \n
"// Select skin" \n
"_skin = [""act_krovosos_new1"",""act_krovosos_3"",""act_krovosos_2""] call BIS_fnc_selectRandom;" \n
"_agent setVariable [""mutantSkin"",_skin, false];" \n
"" \n
"// Announce presence" \n
"[_agent,""bloodgrowl1"",0,false] call dayz_zombieSpeak;"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "End">*/
class End
{
name = "End";
init = /*%FSM<STATEINIT""">*/"if (!isDedicated) then {" \n
" if (!isNull _agent) then {" \n
" deleteVehicle _agent;" \n
" };" \n
"} else {" \n
" [_agent] call zombie_findOwner;" \n
"};"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Chase">*/
class Chase
{
name = "Chase";
init = /*%FSM<STATEINIT""">*/"_timeN = diag_tickTime;" \n
"" \n
"_target = _agent call mutant_findTarget;" \n
"_targetPos = getPosATL _target;" \n
"_isAlive = alive _agent;" \n
"_isTargetAlive = alive _target;" \n
"" \n
"//Move to location" \n
"_agent moveTo _targetPos;" \n
"" \n
"//Check if LOS" \n
"if ((_agroCheck % 8) == 0) then {" \n
" _agroCheck = 0;" \n
" _cantSee = [_target,_agent] call dayz_losCheck;" \n
"};"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "Nobody_Near">*/
class Nobody_Near
{
priority = 6.000000;
to="Cleanup_";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!_isSomeone"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Not_Alive">*/
class Not_Alive
{
priority = 5.000000;
to="Cleanup_";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!_isAlive"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "No_Agent">*/
class No_Agent
{
priority = 5.000000;
to="Cleanup_";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(isNull _agent)"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "No_Target">*/
class No_Target
{
priority = 3.000000;
to="Reset_Targeting";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(isNull _target) && ((diag_tickTime - _timeN) > 5)"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Target_Dead">*/
class Target_Dead
{
priority = 3.000000;
to="Reset_Targeting";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!_isTargetAlive"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"_timeN = diag_tickTime;"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "cant_see">*/
class cant_see
{
priority = 2.000000;
to="Finish_Move";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"_cantSee"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"// diag_log (""Mutant Cant See Target"");"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "TimeCheck">*/
class TimeCheck
{
priority = 2.000000;
to="Chase";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(diag_tickTime - _timeN) > 2" \n
""/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"_agroCheck= _agroCheck + 1;"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "InRange">*/
class InRange
{
priority = 1.000000;
to="Attacking_Wait";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"_agent distance _targetPos < 3.1"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"_agent stop true;" \n
"" \n
"_myDest = [ _agent modelToWorld [0,0,0]];" \n
"" \n
"_agent setVariable [""myDest"",(_agent modelToWorld [0,0,0])];" \n
"" \n
"_agroCheck= 0;"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Cleanup_">*/
class Cleanup_
{
name = "Cleanup_";
init = /*%FSM<STATEINIT""">*/"_waitStart = diag_tickTime;"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "nobody_around">*/
class nobody_around
{
priority = 0.000000;
to="End";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!_isSomeone"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "someone_here">*/
class someone_here
{
priority = 0.000000;
to="wait";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"_isSomeone"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Finish_Move">*/
class Finish_Move
{
name = "Finish_Move";
init = /*%FSM<STATEINIT""">*/"_timeN = diag_tickTime;" \n
"" \n
"_isSomeone = false;" \n
"{" \n
" if (isPlayer _x && {_x distance _agent < 300}) exitWith {_isSomeone = true;};" \n
"} count playableUnits;"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "Nobody_Near">*/
class Nobody_Near
{
priority = 6.000000;
to="Cleanup_";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!_isSomeone"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "finished">*/
class finished
{
priority = 1.000000;
to="Reset_Targeting";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"_agent distance _targetPos < 3"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"//diag_log (""Finished"");"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "too_long">*/
class too_long
{
priority = 0.000000;
to="Reset_Targeting";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(diag_tickTime - _timeN) > 20"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"//diag_log (""Mutant Cant See Timeout"");"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Move">*/
class Move
{
name = "Move";
init = /*%FSM<STATEINIT""">*/"_myDest = [_agent,_position] call zombie_loiter;"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "True">*/
class True
{
priority = 0.000000;
to="Loiter";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/""/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "wait">*/
class wait
{
name = "wait";
init = /*%FSM<STATEINIT""">*/"_isSomeone = false;" \n
"{" \n
" if (isPlayer _x && {_x distance _agent < 300}) exitWith {_isSomeone = true;};" \n
"} count playableUnits;" \n
"" \n
"_timeN = diag_tickTime;" \n
"" \n
"//diag_log (""Waiting until players are not near to delete bloodsucker, or timeout"");"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "time_up">*/
class time_up
{
priority = 0.000000;
to="End";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(diag_tickTime - _waitStart) > 300"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "nobody_around">*/
class nobody_around
{
priority = 0.000000;
to="End";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!_isSomeone"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "deleted">*/
class deleted
{
priority = 0.000000;
to="End";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"isNull _agent;"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Time_Check">*/
class Time_Check
{
priority = 0.000000;
to="wait";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(diag_tickTime - _timeN) > 30"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Reset_Targeting">*/
class Reset_Targeting
{
name = "Reset_Targeting";
init = /*%FSM<STATEINIT""">*/"//Lets move" \n
"_myDest = [_agent,_position] call zombie_loiter;" \n
"" \n
"// Reset Targets" \n
"_agent setVariable [""localtargets"", [], false];" \n
"_agent setVariable [""remotetargets"", [], true];" \n
"_target = objNull;" \n
"" \n
"// diag_log (""Mutant Targets Reset"");" \n
""/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "True">*/
class True
{
priority = 0.000000;
to="Loiter";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/""/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Loiter">*/
class Loiter
{
name = "Loiter";
init = /*%FSM<STATEINIT""">*/"_isAlive = alive _agent;" \n
"_timeN = diag_tickTime;" \n
"" \n
"//Look for target" \n
"_target = _agent call mutant_findTarget;" \n
"" \n
"if (_myDest distance (getposATL _agent) > 3) then {" \n
" _agent moveTo _myDest;" \n
"};"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "Nobody_Near">*/
class Nobody_Near
{
priority = 6.000000;
to="Cleanup_";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!_isSomeone"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "No_Agent">*/
class No_Agent
{
priority = 5.000000;
to="Cleanup_";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(isNull _agent)"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Not_Alive">*/
class Not_Alive
{
priority = 5.000000;
to="Cleanup_";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!_isAlive"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Failed_Move">*/
class Failed_Move
{
priority = 3.000000;
to="Move";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"moveToFailed _agent;"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "MoveCompleted_">*/
class MoveCompleted_
{
priority = 3.000000;
to="Move";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"moveToCompleted _agent;"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "player_check">*/
class player_check
{
priority = 2.000000;
to="Loiter";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(diag_tickTime - _entityTime) > 30"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"_entityTime = diag_tickTime;" \n
"" \n
"_isSomeone = false;" \n
"{" \n
" if (isPlayer _x && {_x distance _agent < 300}) exitWith {_isSomeone = true;};" \n
"} count playableUnits;"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Not_moving">*/
class Not_moving
{
priority = 1.000000;
to="Move";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(Speed _agent == 0)" \n
""/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Time_Check">*/
class Time_Check
{
priority = 0.000000;
to="Loiter";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"(diag_tickTime - _timeN) > 1"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "Has_Target">*/
class Has_Target
{
priority = 0.000000;
to="Reset_MoveTo";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"!(isNull _target)"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"// diag_log ""Bloodsucker found target"";"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Attacking_Wait">*/
class Attacking_Wait
{
name = "Attacking_Wait";
init = /*%FSM<STATEINIT""">*/"_targetPos = _target modelToWorld [0,-1,0];" \n
"" \n
"_timeN = diag_tickTime;" \n
""/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "NotInRange">*/
class NotInRange
{
priority = 1.000000;
to="Chase";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"_agent distance _targetPos > 3.1"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"_agent stop false;"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
/*%FSM<LINK "TimeCheck">*/
class TimeCheck
{
priority = 0.000000;
to="Attacking_Wait";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"((diag_tickTime - _timeN) > 1)"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/""/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
/*%FSM<STATE "Reset_MoveTo">*/
class Reset_MoveTo
{
name = "Reset_MoveTo";
init = /*%FSM<STATEINIT""">*/"_agent moveTo (_agent modelToWorld [0,0,0]);"/*%FSM</STATEINIT""">*/;
precondition = /*%FSM<STATEPRECONDITION""">*/""/*%FSM</STATEPRECONDITION""">*/;
class Links
{
/*%FSM<LINK "UnitReady">*/
class UnitReady
{
priority = 5.000000;
to="Chase";
precondition = /*%FSM<CONDPRECONDITION""">*/""/*%FSM</CONDPRECONDITION""">*/;
condition=/*%FSM<CONDITION""">*/"unitReady _agent"/*%FSM</CONDITION""">*/;
action=/*%FSM<ACTION""">*/"_myDest = [ _agent modelToWorld [0,0,0]];" \n
"_agent setVariable [""myDest"",(_agent modelToWorld [0,0,0])];" \n
"" \n
"//Lets see if we can get the AI to stop running away before heading to the player" \n
"_agent moveTo (_agent modelToWorld [0,0,0]);" \n
"" \n
"_agroCheck = 0;" \n
"_cantSee = false;"/*%FSM</ACTION""">*/;
};
/*%FSM</LINK>*/
};
};
/*%FSM</STATE>*/
};
initState="init";
finalStates[] =
{
"End",
};
};
/*%FSM</COMPILE>*/

View File

@@ -36,7 +36,7 @@ sched_corpses = {
_addFlies = 0;
{
if (local _x && {_x isKindOf "CAManBase"}) then {
if (_x isKindOf "zZombie_Base") then {
if (_x isKindOf "zZombie_Base" || {typeOf _x == "z_bloodsucker"}) then {
_x call sched_co_deleteVehicle;
_delQtyZ = _delQtyZ + 1;
} else {

View File

@@ -2,7 +2,7 @@
5 !(^DZ_|^z_|^pz_|^WeaponHolder|Box|dog|PZombie_VB|^Smoke|^Chem|^._40mm|_DZ$|^Trap) !=(SeaGull|SmallSecondary|HelicopterExplo(Small|Big)|Stash(Small|Medium)(|[1-4])) !=(CZ_VestPouch_EP1|R_M136_AT|R_MEEWS_HEAT|Wire_cat1) !TentStorage !=(JackDaniels|(Tin|Soda)Can|RoadFlare|WoodenArrowF|zZombie_Base|Parachute(West|C)|Grenade(_|HandTimed)(West|East)) !=(CMflareAmmo|Pipebomb) !=(WildBoar|Rabbit|Sheep|Sheep(01_EP1|02_EP1)|Goat|Goat(01_EP1|02_EP1)|Hen|Cow0[1234]|Cow01_EP1|Cock) !=Blood_Trail_DZ !^(Wooden|Metal)Fence !^WoodenGate_ !=(ShantyHouse(|Stage[2-7])|SurvivorWorkshop(|Stage2|[ABC]Stage[345])|WorkBench) !=explosive_bolt !"Land_" !=Sign_(arrow_down_large|sphere10cm)_EP1 !="MAP_c_fern" !="Grave" !"VaultStorage" !="LaserTargetW" !Fort_ !Nest !CMflare !="GyroGrenade" !="CraterLong" !="pook_camel_HE" !="Fin" !="Pastor" !_DZE[12]$ !"TallSafe"
5 SeaGull //set to its own line so we know which kick we have here with out looking in the logs
1 ^DZ_ !=DZ_(British_ACU|Czech_Vest_Pouch|(TK_Assault_Pack|Patrol_Pack|Assault_Pack|ALICE_Pack|CivilBackpack|Backpack|LargeGunBag|GunBag)_EP1) !=DZ_((AmmoBox|ExplosiveBox)(RU|US)|MedBox|CardboardBox)
1 ^z_ !=z_((|new_)villager[1234]|(|new_)worker[1234]|teacher|hunter|suit[1-6]|soldier(|_pilot|_heavy)|policeman(|2)|doctor|priest) !=z_(citizen[1-4]|profiteer[1-4]|rocker[1-4]|lumberjack[1-4]|hunter[2345]|assistant|pilot|takistani[1-6]) !z_soldier_(usmc|fr|cdf|ru|gue|ins|tk|cz|un|ger|baf|pmc|acr) !=z_(dealer|gardener|mafiaboss|postman[1-4]|prisoner[1-3]|firefighter[1-5]|civilian([1-9]|1[0-5]))
1 ^z_ !=z_((|new_)villager[1234]|(|new_)worker[1234]|teacher|hunter|suit[1-6]|soldier(|_pilot|_heavy)|policeman(|2)|doctor|priest) !=z_(citizen[1-4]|profiteer[1-4]|rocker[1-4]|lumberjack[1-4]|hunter[2345]|assistant|pilot|takistani[1-6]) !z_soldier_(usmc|fr|cdf|ru|gue|ins|tk|cz|un|ger|baf|pmc|acr) !=z_(dealer|gardener|mafiaboss|postman[1-4]|prisoner[1-3]|firefighter[1-5]|civilian([1-9]|1[0-5])) !=z_bloodsucker
1 ^WeaponHolder !=WeaponHolder !WeaponHolder_part !=WeaponHolder_(Item(DomeTent|CamoNet|Crowbar|Fuelcan|Hatchet|Jerrycan|Tent)|Melee(BaseBallBat(|Nails)|BatBarbed|Machete)) !=WeaponHolder_Part(Engine|Fueltank|Generic|Glass|VRotor|Wheel) !=WeaponHolder_Item(WorkBench|MetalSheet|ConcreteBlock|RSJ|Pickaxe|Generator)
1 Box !=(DZ_((AmmoBox|ExplosiveBox)(RU|US)|MedBox|CardboardBox)|Item(Match|Tool)box|equip_pvc_box|DebugBoxPlayer_DZ|WeaponHolder_ItemLockbox) !=LockboxStorage(Locked|WinterLocked|2Locked|Winter2Locked)
1 ^Smoke !=SmokeShell(|Red|Green|Yellow) !=SmokeLauncherAmmo