mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-13 19:52:38 +03:00
Merge branch 'master' of https://github.com/EpochModTeam/DayZ-Epoch
This commit is contained in:
@@ -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"
|
||||
|
||||
134
SQF/dayz_code/Configs/CfgVehicles/Zeds/Bloodsuckers.hpp
Normal file
134
SQF/dayz_code/Configs/CfgVehicles/Zeds/Bloodsuckers.hpp
Normal 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";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -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"
|
||||
};
|
||||
7
SQF/dayz_code/Configs/CfgWeapons/Tools/MutantHeart.hpp
Normal file
7
SQF/dayz_code/Configs/CfgWeapons/Tools/MutantHeart.hpp
Normal 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;
|
||||
};
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
28
SQF/dayz_code/compile/mutant_findTarget.sqf
Normal file
28
SQF/dayz_code/compile/mutant_findTarget.sqf
Normal 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
|
||||
16
SQF/dayz_code/compile/mutant_generate.sqf
Normal file
16
SQF/dayz_code/compile/mutant_generate.sqf
Normal 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];
|
||||
@@ -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]);
|
||||
|
||||
76
SQF/dayz_code/compile/player_mutantAttack.sqf
Normal file
76
SQF/dayz_code/compile/player_mutantAttack.sqf
Normal 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;
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
719
SQF/dayz_code/system/mutant_agent.fsm
Normal file
719
SQF/dayz_code/system/mutant_agent.fsm
Normal 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>*/
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user