diff --git a/SQF/dayz_code/Configs/CfgVehicles/CfgVehicles.hpp b/SQF/dayz_code/Configs/CfgVehicles/CfgVehicles.hpp index e827177c0..3813c6a99 100644 --- a/SQF/dayz_code/Configs/CfgVehicles/CfgVehicles.hpp +++ b/SQF/dayz_code/Configs/CfgVehicles/CfgVehicles.hpp @@ -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" diff --git a/SQF/dayz_code/Configs/CfgVehicles/Zeds/Bloodsuckers.hpp b/SQF/dayz_code/Configs/CfgVehicles/Zeds/Bloodsuckers.hpp new file mode 100644 index 000000000..686337797 --- /dev/null +++ b/SQF/dayz_code/Configs/CfgVehicles/Zeds/Bloodsuckers.hpp @@ -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"; + }; + }; +}; \ No newline at end of file diff --git a/SQF/dayz_code/Configs/CfgWeapons/CfgWeapons.hpp b/SQF/dayz_code/Configs/CfgWeapons/CfgWeapons.hpp index 260344ccd..5e9614bb3 100644 --- a/SQF/dayz_code/Configs/CfgWeapons/CfgWeapons.hpp +++ b/SQF/dayz_code/Configs/CfgWeapons/CfgWeapons.hpp @@ -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" }; \ No newline at end of file diff --git a/SQF/dayz_code/Configs/CfgWeapons/Tools/MutantHeart.hpp b/SQF/dayz_code/Configs/CfgWeapons/Tools/MutantHeart.hpp new file mode 100644 index 000000000..a44f9453f --- /dev/null +++ b/SQF/dayz_code/Configs/CfgWeapons/Tools/MutantHeart.hpp @@ -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; +}; \ No newline at end of file diff --git a/SQF/dayz_code/Configs/RscDisplay/RscPlayerUI.hpp b/SQF/dayz_code/Configs/RscDisplay/RscPlayerUI.hpp index 6bc4b4bdb..3892cb186 100644 --- a/SQF/dayz_code/Configs/RscDisplay/RscPlayerUI.hpp +++ b/SQF/dayz_code/Configs/RscDisplay/RscPlayerUI.hpp @@ -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"; + }; + }; }; diff --git a/SQF/dayz_code/Configs/cfgMoves.hpp b/SQF/dayz_code/Configs/cfgMoves.hpp index 0050a9752..84cd12e66 100644 --- a/SQF/dayz_code/Configs/cfgMoves.hpp +++ b/SQF/dayz_code/Configs/cfgMoves.hpp @@ -661,4 +661,2058 @@ class CfgGesturesDogDZ transitionsInterpolated[] = {}; transitionsSimple[] = {}; transitionsDisabled[] = {}; +}; + +class CfgMovesBloodsucker: CfgMovesMaleSdr +{ + skeletonName="OFP2_ManSkeleton"; + gestures="CfgGesturesMale"; + class StandBase; + class StatesExt + { + class AmovPercMstpSnonWnonDnon: StandBase + { + actions="CivilStandActions"; + duty=-1; + equivalentTo=""; + preload=0; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + showWeaponAim=0; + disableWeapons=1; + canPullTrigger=0; + speed=1e+010; + relSpeedMin=0.69999999; + relSpeedMax=1.1; + leaningFactorBeg=0; + leaningFactorEnd=0; + looped=1; + soundEnabled=0; + soundOverride=""; + soundEdge[]={0.5,1}; + enableBinocular=1; + leftHandIKBeg=0; + leftHandIKCurve[]={}; + leftHandIKEnd=0; + rightHandIKBeg=0; + rightHandIKCurve[]={}; + rightHandIKEnd=0; + hasCollShapeSafe=0; + collisionShapeSafe=""; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Perc_Mrun_Slow_Wrfl.p3d"; + headBobStrength=0.21393; + limitGunMovement=0.1; + enableOptics=-1; + ConnectTo[]= + { + "ActsPercMstpSnonWpstDnon_suicide1A", + 0.02, + "ActsPercMstpSnonWpstDnon_suicide2A", + 0.02, + "AmovPercMstpSnonWnonDnon_sekaniIn", + 0.02, + "AidlPercMstpSnonWnonDnon", + 0.0099999998, + "AidlPercMstpSnonWnonDnon_player", + 0.0099999998, + "AovrPercMstpSnonWnonDf", + 0.0099999998, + "AmovPercMstpSnonWnonDnon_turnL", + 0.02, + "AmovPercMstpSnonWnonDnon_turnR", + 0.02, + "AmovPercMstpSnonWnonDnon_AmovPknlMstpSnonWnonDnon", + 0.02, + "AmovPercMstpSnonWnonDnon_AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPercMstpSnonWnonDnon_AmovPercMstpSrasWrflDnon", + 0.02, + "AmovPercMstpSnonWnonDnon_AmovPercMstpSrasWpstDnon", + 0.02, + "AmovPercMstpSnonWnonDnon_AmovPknlMstpSrasWlnrDnon", + 0.029999999, + "AmovPercMstpSnonWnonDnon_AwopPercMstpSoptWbinDnon", + 0.02, + "ActsPercMstpSnonWnonDnon_varStayLeant", + 2, + "ActsPercMstpSnonWrflDnon_Interrogate01", + 2, + "ActsPercMstpSnonWrflDnon_Interrogate02", + 2, + "ActsPsitMstpSnonWnonDnon_InterrogateLeaves", + 2, + "AmovPercMstpSnonWnonDnon_Scared", + 2, + "AmovPercMstpSnonWnonDnon_Scared2", + 2, + "AmovPercMstpSnonWnonDnon_carCheckPush", + 2, + "AmovPercMstpSnonWnonDnon_carCheckWash", + 2, + "AmovPercMstpSnonWnonDnon_carCheckWheel", + 2, + "AmovPercMstpSnonWnonDnon_exerciseKata", + 2, + "ActsPercMstpSnonWnonDnon_DancingDuoIvan", + 2, + "ActsPercMstpSnonWnonDnon_DancingDuoStefan", + 2, + "ActsPercMstpSnonWnonDnon_DancingStefan", + 2, + "AmovPercMstpSnonWnonDnon_exercisekneeBendA", + 2, + "AmovPercMstpSnonWnonDnon_exercisekneeBendB", + 2, + "AmovPercMstpSnonWnonDnon_exercisePushup", + 2, + "AmovPercMstpSnonWnonDnon_seeWatch", + 2, + "AmovPercMstpSnonWnonDnon_talking", + 2, + "ActsPercMstpSnonWpstDnon_sceneBardak01", + 0.1, + "AmovPercMstpSnonWnonDnon_normalizationTest", + 0.1, + "AmovPercMstpSnonWnonDnon_SaluteIn", + 0.1, + "AmovPercMstpSnonWnonDnon_EaseIn", + 0.1, + "AmovPercMstpSnonWnonDnon_AmovPsitMstpSnonWnonDnon_ground", + 0.1, + "AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon", + 0.1, + "AwopPercMstpSgthWnonDnon_start", + 0.1, + "LadderCivilOn", + 1, + "AswmPercMstpSnonWnonDnon", + 0.30000001, + "ActsPknlMstpWunaSnonDnon_sceneCrashSite_Villager", + 0.1, + "AmovPercMstpSnonWnonDnon_AinvPknlMstpSnonWnonDnon", + 0.02, + "AmovPercMstpSnonWnonDnon_AcrgPknlMstpSnonWnonDnon_getInLow", + 0.02, + "AmovPercMstpSnonWnonDnon_AcrgPknlMstpSnonWnonDnon_getInMedium", + 0.02, + "AmovPercMstpSnonWnonDnon_AcrgPknlMstpSnonWnonDnon_getInHigh", + 0.02, + "amovpercmstpsnonwnondnon_amovpercmstpsraswlnrdnon", + 0.02, + "ActsPercSnonWnonDnon_assembling", + 0.0099999998, + "ActsPercSnonWnonDnon_carFixing", + 0.0099999998, + "ActsPercSnonWnonDnon_carFixing2", + 0.0099999998, + "ActsPercSnonWnonDnon_tableSupport_TalkIn", + 0.0099999998, + "ActsPercMstpSrasWunaDnon_sceneLopotevBandCaptured_Kostey", + 0.0099999998, + "AidlPpneMstpSnonWnonDnon_SleepA_layDown", + 0.0099999998, + "AidlPpneMstpSnonWnonDnon_SleepB_layDown", + 0.0099999998, + "AidlPpneMstpSnonWnonDnon_SleepC_layDown", + 0.0099999998, + "ActsPercMstpSnonWunaDnon_sceneNikitinDisloyalty_Nikitin", + 0.0099999998, + "ActsPercMstpSnonWunaDnon_sceneNikitinDisloyalty_Bardak", + 0.0099999998, + "ActsPercMstpSlowWrflDnon_sceneNikitinDisloyalty_Homeless", + 0.0099999998, + "ActsPercMstpSnonWunaDnon_sceneNikitinDisloyalty_Lopotev1", + 0.0099999998, + "ErcUnarm_sitUnarm_L", + 0.0099999998, + "ErcUnarm_sitUnarm_R", + 0.0099999998, + "sitTableRfl_listening_onTTractor", + 0.0099999998, + "sitUnarm_L_idleLoop_onFoiledPallets", + 0.0099999998, + "sitUnarm_L_idleLoop_onFoiledPallets2", + 0.0099999998, + "ErcUnarm_sitTable", + 0.0099999998, + "sitTableUnarm_talkingListening_TowingTractor", + 0.0099999998, + "UnaErc_UnaErcPoslechVelitele", + 0.0099999998, + "Csdr_LHD_oprenOzabradli118cm_A", + 0.0099999998, + "UnaErcVelitelProslov1", + 0.0099999998, + "FPS_shift", + 0.0099999998, + "ctsLopoHover_cdf2", + 0.0099999998, + "ctsLopoHover_lopotev", + 0.0099999998, + "sitUnarm_L_idleLoop_inUH1Y", + 0.0099999998, + "AmelPercMstpSnonWnonDnon_amaterUder1", + 0.02, + "AmelPercMstpSnonWnonDnon_amaterUder2", + 0.02, + "AmelPercMstpSnonWnonDnon_amaterUder3", + 0.02, + "AmelPercMstpSnonWnonDnon_zasah1", + 0.02, + "AmelPercMstpSnonWnonDnon_zasah2", + 0.02, + "AmelPercMstpSnonWnonDnon_zasah3hard", + 0.02, + "AmelPercMstpSnonWnonDnon_zasah4", + 0.02, + "AmelPercMstpSnonWnonDnon_zasah5hard", + 0.02, + "AmelPercMstpSnonWnonDnon_zasah6hlava", + 0.02, + "AmelPercMstpSnonWnonDnon_zasah7bricho", + 0.02, + "NavigationDriverReverse", + 0.0099999998, + "RepairingKneel", + 0.0099999998, + "RepairingErc", + 0.0099999998, + "NavigationHeli", + 0.0099999998, + "AmovPercMstpSnonWnonDnon_initLoop", + 0.0099999998, + "AmovPercMstpSnonWnonDnon_idle70chozeniPoRukou", + 0.0099999998, + "AmovPercMstpSnonWnonDnon_idle68boxing", + 0.0099999998, + "AmovPercMstpSnonWnonDnon_zevl", + 0.0099999998 + }; + InterpolateTo[]= + { + "AinvPknlMstpSnonWnonDnon_AinvPknlMstpSnonWnonDnon_medic", + 0.02, + "AmovPercMstpSnonWnonDnon_turnL", + 0.02, + "AmovPercMstpSnonWnonDnon_turnR", + 0.02, + "AmovPercMwlkSnonWnonDf", + 0.02, + "AmovPercMwlkSnonWnonDfl", + 0.02, + "AmovPercMwlkSnonWnonDl", + 0.02, + "AmovPercMwlkSnonWnonDbl", + 0.02, + "AmovPercMwlkSnonWnonDb", + 0.02, + "AmovPercMwlkSnonWnonDbr", + 0.02, + "AmovPercMwlkSnonWnonDr", + 0.02, + "AmovPercMwlkSnonWnonDfr", + 0.02, + "AmovPercMrunSnonWnonDf", + 0.02, + "AmovPercMrunSnonWnonDfl", + 0.02, + "AmovPercMrunSnonWnonDl", + 0.02, + "AmovPercMrunSnonWnonDbl", + 0.02, + "AmovPercMrunSnonWnonDb", + 0.02, + "AmovPercMrunSnonWnonDbr", + 0.02, + "AmovPercMrunSnonWnonDr", + 0.02, + "AmovPercMrunSnonWnonDfr", + 0.02, + "AmovPercMevaSnonWnonDf", + 0.02, + "AmovPercMevaSnonWnonDfl", + 0.02, + "AmovPercMevaSnonWnonDfr", + 0.02, + "AdthPercMstpSnonWnonDnon_1", + 0.0099999998, + "AdthPercMstpSnonWnonDnon_2", + 0.0099999998, + "AdthPercMstpSnonWnonDnon_3", + 0.0099999998, + "ActsPsitMstpSnonWnonDnon_varSittingDrinking", + 0.02, + "AmovPercMstpSnonWnonDnon_AcinPknlMwlkSnonWnonDb_1", + 0.1, + "ActsPercMstpSnonWnonDnon_talking01", + 0.1, + "ActsPercMstpSnonWnonDnon_talking02", + 0.1, + "ActsPercMstpSnonWnonDnon_talking03", + 0.1, + "ActsPercMstpSnonWnonDnon_talking04", + 0.1, + "AidlPercSnonWnonDnon_talkBS", + 0.0099999998, + "sitTableRfl_listening_onTTractor", + 0.0099999998, + "sitUnarm_L_idleLoop_onFoiledPallets", + 0.0099999998, + "sitUnarm_L_idleLoop_onFoiledPallets2", + 0.0099999998, + "sitUnarm_L_idleLoop_inUH1Y", + 0.0099999998 + }; + }; + class AmovPercMrunSnonWnonDf: AmovPercMstpSnonWnonDnon + { + actions="CivilRunActionsF"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + soundEdge[]={0.25,0.5,0.75,1}; + duty=0.40000001; + soundOverride="run"; + soundEnabled=1; + limitGunMovement=0.1; + walkcycles=2; + disableWeapons=1; + ConnectTo[]= + { + "AmovPercMsprSnonWnonDf_AmovPpneMstpSnonWnonDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPercMstpSnonWnonDnon", + 0.02, + "AmovPercMwlkSnonWnonDf", + 0.025, + "AmovPercMrunSnonWnonDfl", + 0.025, + "AmovPercMrunSnonWnonDfr", + 0.025, + "AmovPknlMrunSnonWnonDf", + 0.029999999, + "AmovPercMsprSnonWnonDf_AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPercMevaSnonWnonDf", + 0.02 + }; + }; + class AmovPercMwlkSnonWnonDf: AmovPercMstpSnonWnonDnon + { + actions="CivilWlkActionsF"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + soundEdge[]={0.25,0.5,0.75,1}; + speed=3.21; + duty=-0.1; + soundOverride="walk"; + soundEnabled=1; + walkcycles=2; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMwlkSnonWnonDnon_transition", + 0.015, + "AmovPercMwlkSnonWnonDfl", + 0.025, + "AmovPercMwlkSnonWnonDfr", + 0.025, + "AmovPercMrunSnonWnonDf", + 0.025, + "AmovPknlMwlkSnonWnonDf", + 0.029999999, + "AmovPercMevaSnonWnonDf", + 0.025, + "AmovPercMrunSnonWnonDf_AmovPercMstpSnonWnonDnon_gthStart", + 0.1 + }; + }; + class AmovPercMwlkSnonWnonDfl: AmovPercMwlkSnonWnonDf + { + actions="CivilWlkActionsFL"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMwlkSnonWnonDnon_transition", + 0.015, + "AmovPercMwlkSnonWnonDf", + 0.025, + "AmovPercMwlkSnonWnonDl", + 0.025, + "AmovPercMrunSnonWnonDfl", + 0.025, + "AmovPknlMwlkSnonWnonDfl", + 0.029999999, + "AmovPercMevaSnonWnonDfl", + 0.025, + "AmovPercMrunSnonWnonDf_AmovPercMstpSnonWnonDnon_gthStart", + 0.1 + }; + }; + class AmovPercMwlkSnonWnonDl: AmovPercMwlkSnonWnonDf + { + actions="CivilWlkActionsL"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMwlkSnonWnonDnon_transition", + 0.015, + "AmovPercMwlkSnonWnonDfl", + 0.025, + "AmovPercMwlkSnonWnonDbl", + 0.025, + "AmovPercMrunSnonWnonDl", + 0.025, + "AmovPknlMwlkSnonWnonDl", + 0.029999999 + }; + }; + class AmovPercMwlkSnonWnonDbl: AmovPercMwlkSnonWnonDf + { + actions="CivilWlkActionsBL"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMwlkSnonWnonDnon_transition", + 0.015, + "AmovPercMwlkSnonWnonDl", + 0.025, + "AmovPercMwlkSnonWnonDb", + 0.025, + "AmovPercMrunSnonWnonDbl", + 0.025, + "AmovPknlMwlkSnonWnonDbl", + 0.029999999 + }; + }; + class AmovPercMwlkSnonWnonDb: AmovPercMwlkSnonWnonDf + { + actions="CivilWlkActionsB"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMwlkSnonWnonDnon_transition", + 0.015, + "AmovPercMwlkSnonWnonDbl", + 0.025, + "AmovPercMwlkSnonWnonDbr", + 0.025, + "AmovPercMrunSnonWnonDb", + 0.025, + "AmovPknlMwlkSnonWnonDb", + 0.029999999 + }; + }; + class AmovPercMwlkSnonWnonDbr: AmovPercMwlkSnonWnonDf + { + actions="CivilWlkActionsBR"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMwlkSnonWnonDnon_transition", + 0.015, + "AmovPercMwlkSnonWnonDb", + 0.025, + "AmovPercMwlkSnonWnonDr", + 0.025, + "AmovPercMrunSnonWnonDbr", + 0.025, + "AmovPknlMwlkSnonWnonDbr", + 0.029999999 + }; + }; + class AmovPercMwlkSnonWnonDr: AmovPercMwlkSnonWnonDf + { + actions="CivilWlkActionsR"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMwlkSnonWnonDnon_transition", + 0.015, + "AmovPercMwlkSnonWnonDbr", + 0.025, + "AmovPercMwlkSnonWnonDfr", + 0.15000001, + "AmovPercMrunSnonWnonDr", + 0.025, + "AmovPknlMwlkSnonWnonDr", + 0.029999999 + }; + }; + class AmovPercMwlkSnonWnonDfr: AmovPercMwlkSnonWnonDf + { + actions="CivilWlkActionsFR"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMwlkSnonWnonDnon_transition", + 0.015, + "AmovPercMwlkSnonWnonDf", + 0.025, + "AmovPercMwlkSnonWnonDr", + 0.15000001, + "AmovPercMrunSnonWnonDfr", + 0.025, + "AmovPknlMwlkSnonWnonDfr", + 0.029999999, + "AmovPercMevaSnonWnonDfr", + 0.025, + "AmovPercMrunSnonWnonDf_AmovPercMstpSnonWnonDnon_gthStart", + 0.1 + }; + }; + class SprintBaseDf: StandBase + { + actions="RifleStandEvasiveActions"; + preload=0; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + soundOverride="sprint"; + duty=0.60000002; + showWeaponAim=0; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Perc_Mrun_Slow_Wrfl.p3d"; + leaningFactorBeg=0; + leaningFactorEnd=0; + limitGunMovement=0; + relSpeedMin=0.69717097; + relSpeedMax=1.1; + enableAutoActions=0; + visibleSize=1.000121; + soundEnabled=1; + aiming="aimingCivil"; + aimingBody="aimingUpCivil"; + headBobStrength=0.154229; + headBobMode=2; + ConnectTo[]= + { + "AmovPercMsprSlowWrflDf_AmovPpneMstpSrasWrflDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPercMsprSlowWrflDf_AmovPpneMstpSrasWrflDnon", + 0.02 + }; + }; + class SprintBaseDfl: SprintBaseDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Perc_Mrun_Slow_Wrfl_Dl.p3d"; + ConnectTo[]={}; + InterpolateTo[]={}; + }; + class SprintBaseDfr: SprintBaseDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Perc_Mrun_Slow_Wrfl_Dr.p3d"; + ConnectTo[]={}; + InterpolateTo[]={}; + }; + class SprintCivilBaseDf: SprintBaseDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Perc_Wnon.p3d"; + visibleSize=1.000121; + ConnectTo[]={}; + InterpolateTo[]={}; + }; + class SprintCivilBaseDfl: SprintCivilBaseDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]={}; + }; + class SprintCivilBaseDfr: SprintCivilBaseDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + ConnectTo[]={}; + InterpolateTo[]={}; + }; + class AmovPercMevaSnonWnonDf: SprintCivilBaseDf + { + actions="CivilEvasiveActions"; + soundOverride="sprint"; + soundEnabled=1; + speed=3.21; + canPullTrigger=0; + duty=0.60000002; + walkcycles=1; + ConnectTo[]= + { + "AmovPercMsprSnonWnonDf_AmovPpneMstpSnonWnonDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPercMstpSnonWnonDnon", + 0.02, + "AmovPercMwlkSnonWnonDf", + 0.025, + "AmovPercMrunSnonWnonDf", + 0.02, + "AmovPercMsprSnonWnonDf_AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPercMevaSnonWnonDfl", + 0.02, + "AmovPercMevaSnonWnonDfr", + 0.02 + }; + }; + class AmovPercMevaSnonWnonDfl: SprintCivilBaseDfl + { + actions="CivilEvasiveActions"; + soundOverride="sprint"; + soundEnabled=1; + canPullTrigger=0; + duty=0.60000002; + relSpeedMin=0.69717097; + relSpeedMax=1.1064889; + walkcycles=2; + ConnectTo[]= + { + "AmovPercMsprSnonWnonDf_AmovPpneMstpSnonWnonDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPercMstpSnonWnonDnon", + 0.02, + "AmovPercMwlkSnonWnonDfl", + 0.025, + "AmovPercMrunSnonWnonDfl", + 0.02, + "AmovPercMsprSnonWnonDf_AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPercMevaSnonWnonDf", + 0.02, + "AmovPercMevaSnonWnonDfr", + 0.02 + }; + }; + class AmovPercMevaSnonWnonDfr: SprintCivilBaseDfr + { + actions="CivilEvasiveActions"; + soundOverride="sprint"; + soundEnabled=1; + canPullTrigger=0; + duty=0.60000002; + relSpeedMin=0.69717097; + relSpeedMax=1.1064889; + walkcycles=2; + ConnectTo[]= + { + "AmovPercMsprSnonWnonDf_AmovPpneMstpSnonWnonDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPercMstpSnonWnonDnon", + 0.02, + "AmovPercMwlkSnonWnonDfr", + 0.025, + "AmovPercMrunSnonWnonDfr", + 0.02, + "AmovPercMsprSnonWnonDf_AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPercMevaSnonWnonDf", + 0.02, + "AmovPercMevaSnonWnonDfl", + 0.02 + }; + }; + class AmovPercMevaSrasWrflDf: SprintBaseDf + { + actions="RifleStandEvasiveActions"; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Perc_Mrun_Slow_Wrfl.p3d"; + relSpeedMin=0.797005; + soundOverride="sprint"; + soundEnabled=1; + limitGunMovement=0.1; + weaponIK=1; + headBobStrength=0.25373101; + duty=0.60000002; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMstpSrasWrflDnon", + 0.02, + "AmovPercMrunSlowWrflDf", + 0.025, + "AmovPercMwlkSrasWrflDf", + 0.025, + "AmovPercMrunSrasWrflDf", + 0.025, + "AmovPercMsprSlowWrflDf_AmovPpneMstpSrasWrflDnon", + 0.02, + "AmovPknlMevaSrasWrflDf", + 0.025, + "AmovPercMevaSlowWrflDf", + 0.025, + "AmovPercMevaSrasWrflDfl", + 0.025, + "AmovPercMevaSrasWrflDfr", + 0.025, + "AdthPercMrunSlowWrflDf_6", + 0.0099999998, + "AdthPercMrunSlowWrflDf_A1short", + 0.0099999998, + "AdthPercMrunSlowWrflDf_A2short", + 0.0099999998, + "AdthPercMrunSlowWrflDf_A3short", + 0.0099999998, + "AdthPercMrunSlowWrflDf_A4short", + 0.0099999998 + }; + }; + class AmovPknlMevaSrasWrflDf: AmovPercMevaSrasWrflDf + { + actions="RifleKneelEvasiveActions"; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPknlMrunSlowWrflDf", + 0.025, + "AmovPknlMrunSrasWrflDf", + 0.025, + "AmovPercMevaSrasWrflDf", + 0.025, + "AmovPercMevaSlowWrflDf", + 0.025 + }; + }; + class AmovPercMevaSlowWrflDf: AmovPercMevaSrasWrflDf + { + actions="RifleStandLowEvasiveActions"; + limitGunMovement=0.1; + weaponIK=1; + headBobStrength=0.25373101; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPercMstpSlowWrflDnon", + 0.025, + "AmovPercMwlkSlowWrflDf", + 0.025, + "AmovPercMrunSlowWrflDf", + 0.025, + "AmovPercMevaSrasWrflDf", + 0.025, + "AidlPercMevaSrasWrflDf", + 0.0099999998, + "AmovPercMevaSlowWrflDfl", + 0.025, + "AmovPercMevaSlowWrflDfr", + 0.025, + "AdthPercMrunSlowWrflDf_A1short", + 0.0099999998, + "AdthPercMrunSlowWrflDf_A2short", + 0.0099999998, + "AdthPercMrunSlowWrflDf_A3short", + 0.0099999998, + "AdthPercMrunSlowWrflDf_A4short", + 0.0099999998 + }; + }; + class AmovPercMstpSrasWpstDnon: StandBase + { + actions="PistolStandActions"; + duty=-1; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + showWeaponAim=1; + disableWeapons=0; + disableWeaponsLong=0; + showHandGun=1; + speed=1e+010; + relSpeedMin=0.700001; + relSpeedMax=1.1; + aiming="aimingPistol"; + aimingBody="aimingUpPistol"; + looped=1; + soundEnabled=0; + enableBinocular=1; + leftHandIKBeg=1; + leftHandIKCurve[]={1}; + leftHandIKEnd=1; + rightHandIKBeg=1; + rightHandIKCurve[]={1}; + rightHandIKEnd=1; + collisionShape="ca\Anims\Characters\Data\Geom\Sdr\Perc_Wpst.p3d"; + weaponIK=2; + enableOptics=2; + headBobStrength=0.22388101; + headBobMode=2; + ConnectTo[]= + { + "AidlPercMstpSrasWpstDnon_player_0S", + 0.02, + "AovrPercMstpSrasWpstDf", + 0.0099999998, + "AmovPercMstpSrasWpstDnon_AidlPercMstpSlowWpstDnon", + 0.0099999998, + "AmovPercMstpSrasWpstDnon_turnL", + 0.02, + "AmovPercMstpSrasWpstDnon_turnR", + 0.02, + "PistolMagazineReloadStand", + 0.1, + "AmovPercMstpSrasWpstDnon_AmovPercMstpSlowWpstDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AmovPknlMstpSrasWpstDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AmovPercMstpSrasWrflDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AwopPercMstpSoptWbinDnon", + 0.02, + "AmovPercMstpSrasWpstDnon_AmovPercMstpSnonWnonDnon", + 0.02, + "ActsPercMstpSnonWpstDnon_sceneBardakPistol01", + 0.1, + "AmovPercMstpSrasWpstDnon_SaluteIn", + 0.02, + "AwopPercMstpSgthWpstDnon_Part1", + 0.1, + "AswmPercMstpSnonWnonDnon", + 0.30000001, + "AmovPercMstpSrasWpstDnon_AinvPknlMstpSnonWnonDnon", + 0.02, + "amovpercmstpsraswpstdnon_amovpercmstpsraswlnrdnon", + 0.02, + "ctsLopoHover_shagarov", + 0.0099999998 + }; + InterpolateTo[]= + { + "AmovPercMstpSrasWpstDnon_turnL", + 0.02, + "AmovPercMstpSrasWpstDnon_turnR", + 0.02, + "AmovPercMwlkSrasWpstDf", + 0.02, + "AmovPercMwlkSrasWpstDfl", + 0.02, + "AmovPercMwlkSrasWpstDl", + 0.02, + "AmovPercMwlkSrasWpstDbl", + 0.02, + "AmovPercMwlkSrasWpstDb", + 0.02, + "AmovPercMwlkSrasWpstDbr", + 0.02, + "AmovPercMwlkSrasWpstDr", + 0.02, + "AmovPercMwlkSrasWpstDfr", + 0.02, + "AmovPercMrunSrasWpstDf", + 0.02, + "AmovPercMrunSrasWpstDfl", + 0.02, + "AmovPercMrunSrasWpstDl", + 0.02, + "AmovPercMrunSrasWpstDbl", + 0.02, + "AmovPercMrunSrasWpstDb", + 0.02, + "AmovPercMrunSrasWpstDbr", + 0.02, + "AmovPercMrunSrasWpstDr", + 0.02, + "AmovPercMrunSrasWpstDfr", + 0.02, + "AmovPercMevaSrasWpstDf", + 0.02, + "AmovPercMevaSrasWpstDfl", + 0.02, + "AmovPercMevaSrasWpstDfr", + 0.02, + "AdthPercMstpSrasWpstDnon_1", + 0.0099999998, + "AdthPercMstpSrasWpstDnon_3", + 0.0099999998, + "AdthPercMstpSrasWpstDnon_5", + 0.0099999998 + }; + }; + class AmovPpneMstpSrasWpstDnon: AmovPercMstpSrasWpstDnon + { + actions="PistolProneActions"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + showWeaponAim=1; + visibleSize=0.100123; + onLandBeg=1; + onLandEnd=1; + aiming="aimingPistol"; + aimingBody="aimingUpPistol"; + legs="legsDefault"; + collisionShape="ca\Anims\Characters\Data\Geom\Sdr\Ppne.p3d"; + leaningFactorBeg=0; + leaningFactorEnd=0; + leaning="leaningDefault"; + soundOverride="crawl"; + weaponIK=2; + limitGunMovement=1; + ConnectTo[]= + { + "AmovPpneMstpSrasWpstDnon_turnL", + 0.02, + "AmovPpneMstpSrasWpstDnon_turnR", + 0.02, + "PistolMagazineReloadProne", + 0.1, + "AmovPpneMstpSrasWpstDnon_AmovPercMstpSrasWpstDnon", + 0.02, + "AmovPpneMstpSrasWpstDnon_AmovPknlMstpSrasWpstDnon", + 0.02, + "AmovPpneMstpSrasWpstDnon_AmovPpneMstpSrasWrflDnon", + 0.02, + "AmovPpneMstpSrasWpstDnon_AwopPpneMstpSoptWbinDnon", + 0.02, + "AmovPpneMstpSrasWpstDnon_AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMstpSrasWpstDnon_AmovPpneMevaSlowWpstDl", + 0.02, + "AmovPpneMstpSrasWpstDnon_AmovPpneMevaSlowWpstDr", + 0.02, + "AwopPpneMstpSgthWpstDnon_Part1", + 0.1, + "AidlPpneMstpSrasWpstDnon0S", + 0.1, + "AidlPpneMstpSrasWpstDnon01", + 0.1, + "AidlPpneMstpSrasWpstDnon02", + 0.1, + "AidlPpneMstpSrasWpstDnon03", + 0.1, + "AmovPpneMstpSrasWpstDnon_healed", + 0.02 + }; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon_turnL", + 0.02, + "AmovPpneMstpSrasWpstDnon_turnR", + 0.02, + "AmovPpneMrunSlowWpstDf", + 0.02, + "AmovPpneMrunSlowWpstDfl", + 0.02, + "AmovPpneMrunSlowWpstDl", + 0.02, + "AmovPpneMrunSlowWpstDbl", + 0.02, + "AmovPpneMrunSlowWpstDb", + 0.02, + "AmovPpneMrunSlowWpstDbr", + 0.02, + "AmovPpneMrunSlowWpstDr", + 0.02, + "AmovPpneMrunSlowWpstDfr", + 0.02, + "AmovPpneMstpSrasWpstDnon_AmovPercMsprSlowWpstDf", + 0.0099999998, + "AdthPpneMstpSrasWpstDnon_1", + 0.0099999998, + "AdthPpneMstpSrasWpstDnon_2", + 0.0099999998, + "AidlPpneMstpSrasWpstDnon0S", + 0.02, + "AidlPpneMstpSrasWpstDnon01", + 0.02, + "AidlPpneMstpSrasWpstDnon02", + 0.02, + "AidlPpneMstpSrasWpstDnon03", + 0.02 + }; + }; + class AmovPpneMrunSlowWpstDf: AmovPpneMstpSrasWpstDnon + { + visibleSize=0.150123; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + soundOverride="crawl"; + duty=0.40000001; + showWeaponAim=0; + disableWeapons=1; + limitGunMovement=0; + soundEnabled=1; + legs="wholeBody"; + leaning="empty"; + aimingBody="empty"; + aiming="empty"; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMrunSlowWpstDl", + 0.025, + "AmovPpneMrunSlowWpstDfr", + 0.025, + "AmovPpneMstpSrasWpstDnon_AmovPercMsprSlowWpstDf", + 0.0099999998 + }; + }; + class AmovPpneMrunSlowWpstDfl: AmovPpneMrunSlowWpstDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMrunSlowWpstDl", + 0.025, + "AmovPpneMrunSlowWpstDb", + 0.025, + "AmovPpneMstpSrasWpstDnon_AmovPercMsprSlowWpstDf", + 0.0099999998 + }; + }; + class AmovPpneMrunSlowWpstDl: AmovPpneMrunSlowWpstDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMrunSlowWpstDf", + 0.025, + "AmovPpneMrunSlowWpstDfl", + 0.025 + }; + }; + class AmovPpneMrunSlowWpstDbl: AmovPpneMrunSlowWpstDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMrunSlowWpstDb", + 0.025, + "AmovPpneMrunSlowWpstDbr", + 0.025 + }; + }; + class AmovPpneMrunSlowWpstDb: AmovPpneMrunSlowWpstDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMrunSlowWpstDfl", + 0.025, + "AmovPpneMrunSlowWpstDbl", + 0.025 + }; + }; + class AmovPpneMrunSlowWpstDbr: AmovPpneMrunSlowWpstDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMrunSlowWpstDbl", + 0.025, + "AmovPpneMrunSlowWpstDr", + 0.025 + }; + }; + class AmovPpneMrunSlowWpstDr: AmovPpneMrunSlowWpstDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMrunSlowWpstDbr", + 0.025, + "AmovPpneMrunSlowWpstDfr", + 0.025 + }; + }; + class AmovPpneMrunSlowWpstDfr: AmovPpneMrunSlowWpstDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=3.21; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMrunSlowWpstDf", + 0.025, + "AmovPpneMrunSlowWpstDr", + 0.025, + "AmovPpneMstpSrasWpstDnon_AmovPercMsprSlowWpstDf", + 0.0099999998 + }; + }; + class AmovPercMstpSlowWrflDnon: StandBase + { + actions="RifleLowStandActions"; + duty=-1; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Perc_Idle.p3d"; + showWeaponAim=0; + disableWeapons=0; + disableWeaponsLong=1; + speed=1e+010; + relSpeedMin=0.69999999; + relSpeedMax=1.1; + looped=1; + soundEnabled=0; + enableBinocular=1; + aiming="aimingDefault"; + aimingBody="aimingUpDefault"; + leftHandIKBeg=1; + leftHandIKCurve[]={1}; + leftHandIKEnd=1; + rightHandIKBeg=1; + rightHandIKCurve[]={1}; + rightHandIKEnd=1; + aimPrecision=1; + weaponIK=1; + headBobMode=2; + canPullTrigger=0; + ConnectTo[]= + { + "AidlPercMstpSlowWrflDnon_player_0S", + 0.0099999998, + "AovrPercMstpSlowWrflDf", + 0.0099999998, + "AmovPercMstpSlowWrflDnon_turnL", + 0.02, + "AmovPercMstpSlowWrflDnon_turnR", + 0.02, + "AmovPercMstpSlowWrflDnon_AmovPknlMstpSlowWrflDnon", + 0.02, + "AmovPercMstpSlowWrflDnon_AmovPpneMstpSrasWrflDnon", + 0.02, + "AmovPercMstpSlowWrflDnon_AmovPercMstpSrasWrflDnon", + 0.0099999998, + "ActsPsitMstpSnonWrflDnon_varSittingDrinking", + 10, + "AmovPercMstpSlowWrflDnon_ScaredTalking", + 2, + "AmovPercMstpSlowWrflDnon_talking", + 2, + "AmovPercMstpSlowWrflDnon_seeWatch", + 2, + "AmovPercMstpSlowWrflDnon_SaluteIn", + 0.1, + "AmovPercMstpSrasWrflDnon_SaluteIn", + 0.15000001, + "AmovPercMstpSlowWrflDnon_AmovPsitMstpSlowWrflDnon", + 0.1, + "AmovPercMstpSlowWrflDnon_AmovPsitMstpSrasWrflDnon", + 0.1, + "LadderRifleOn", + 1, + "AswmPercMstpSnonWnonDnon", + 0.30000001, + "AidlPercMstpSrasWrflDnon0S", + 0.0099999998, + "ActsPpneMstpWunaSnonDnon_sceneCrashSite_Cooper", + 0.1, + "AidlPercMstpSlowWrflDnon0S", + 0.0099999998, + "ActsPpneMstpWrflSlowDnon_sceneCrashSite_Ohara", + 0.1, + "ActsPpneMstpWrflSlowDnon_sceneCrashSite_Sykes", + 0.1, + "ActsPpneMstpWrflSlowDnon_sceneCrashSite_Rodriguez", + 0.1, + "AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1", + 0.0099999998, + "AmovPercMstpSnonWnonDnon_AcinPknlMwlkSnonWnonDb_1", + 0.1, + "ActsPercMstpSnonWnonDnon_talking01a", + 0.1, + "AidlPercSlowWrflDnon_talkCalm", + 0.0099999998, + "ActsPercMstpSrasWrflDnon_sceneLopotevBandCaptured_Rodriguez1", + 0.0099999998, + "ActsPercMstpSrasWrflDnon_sceneLopotevBandCaptured_Ohara1", + 0.0099999998, + "ActsPercMstpSlowWrflDnon_sceneLopotevBandCaptured_Cooper", + 0.1, + "AidlPercSlowWrflDnon_talkHeated", + 0.0099999998, + "ActsPercMstpSlowWrflDnon_sceneNikitinDisloyalty_Steve", + 0.0099999998, + "ActsPercMstpSlowWrflDnon_sceneNikitinDisloyalty_Simms", + 0.0099999998, + "ActsPercMstpSlowWrflDnon_sceneNikitinDisloyalty_Kostey", + 0.0099999998, + "ActsPercMstpSlowWrflDnon_sceneNikitinDisloyalty_Adamson", + 0.0099999998, + "ActsPercMstpSgthWmagDnon_sceneNikitinDisloyalty_USflashbang1", + 10, + "ActsPercMstpSlowWpstDnon_sceneLopotevBandCaptured_Sykes", + 0.0099999998, + "ErcRflLow_sitRfl_L", + 0.0099999998, + "ErcRflLow_sitRfl_L2", + 0.0099999998, + "ErcRflLow_sitRfl_R", + 0.0099999998, + "ErcRflLow_sitTable", + 0.0099999998, + "ErcRflLow_sitRfl_L_CARGO", + 0.0099999998, + "CtsDoktor_Doktor_uder4", + 0.0099999998, + "CtsDoktor_Doktor_uder5", + 0.0099999998, + "CtsDoktor_Vojak_vyslechStand2unaerc_reverse", + 0.0099999998, + "otockaErcRflLow_180leva", + 0.0099999998, + "ctsLopoHover_cooper", + 0.0099999998, + "ctsLopoHover_ohara", + 0.0099999998, + "ctsLopoHover_rodriguez", + 0.0099999998, + "ctsLopoHover_sykes", + 0.0099999998, + "sitRfl_R_BidleLoopTest", + 0.0099999998, + "AmelPercMstpSlowWrflDnon_StrokeGun", + 0.02, + "ActsPercMstpSlowWrflDnon_listeningOrdersUnderFireShort", + 0.0099999998, + "AmovPercMstpSlowWrflDnon_ActsPercMstpSlowWrflDr_HideFromFire", + 0.0099999998, + "AsigPercMstpSlowWrflDnon_GoGo", + 0.0099999998, + "AsigPercMstpSlowWrflDnon_AmovPercMrunSlowWrflDnon_GoGo", + 0.0099999998, + "AsigPercMstpSlowWrflDnon_SendMenInAction", + 0.0099999998, + "AmovPercMstpSnonWnonDnon_zevl", + 0.0099999998, + "c4coming2cdf_genericstani", + 0.0099999998 + }; + InterpolateTo[]= + { + "AmovPercMstpSlowWrflDnon_turnL", + 0.02, + "AmovPercMstpSlowWrflDnon_turnR", + 0.02, + "AmovPercMwlkSlowWrflDf", + 0.02, + "AmovPercMwlkSlowWrflDfl", + 0.02, + "AmovPercMwlkSlowWrflDl", + 0.02, + "AmovPercMwlkSlowWrflDbl", + 0.02, + "AmovPercMwlkSlowWrflDb", + 0.02, + "AmovPercMwlkSlowWrflDbr", + 0.02, + "AmovPercMwlkSlowWrflDr", + 0.02, + "AmovPercMwlkSlowWrflDfr", + 0.02, + "AmovPercMrunSlowWrflDf", + 0.02, + "AmovPercMrunSlowWrflDfl", + 0.02, + "AmovPercMrunSlowWrflDl", + 0.02, + "AmovPercMrunSlowWrflDbl", + 0.02, + "AmovPercMrunSlowWrflDb", + 0.02, + "AmovPercMrunSlowWrflDbr", + 0.02, + "AmovPercMrunSlowWrflDr", + 0.02, + "AmovPercMrunSlowWrflDfr", + 0.02, + "AmovPercMevaSlowWrflDf", + 0.025, + "AmovPercMevaSlowWrflDfl", + 0.025, + "AmovPercMevaSlowWrflDfr", + 0.025, + "AmovPercMstpSlowWrflDnon_AmovPercMevaSrasWrflDl", + 0.02, + "AmovPercMstpSlowWrflDnon_AmovPercMevaSrasWrflDr", + 0.02, + "AmovPercMstpSlowWrflDnon_AmovPercMevaSrasWrflDb", + 0.02, + "AdthPercMstpSlowWrflDnon_1", + 0.0099999998, + "AdthPercMstpSlowWrflDnon_2", + 0.0099999998, + "AdthPercMstpSlowWrflDnon_4", + 0.0099999998, + "AdthPercMstpSlowWrflDnon_8", + 0.0099999998, + "AdthPercMstpSlowWrflDnon_rS0", + 0.0099999998, + "AwopPercMstpSgthWrflDnon_Start1", + 0.1, + "AwopPercMstpSgthWrflDnon_Throw1", + 0.1, + "AwopPercMstpSgthWrflDnon_End1", + 0.1, + "AwopPercMstpSgthWrflDnon_Throw2", + 0.1, + "AwopPercMstpSgthWrflDnon_End2", + 0.1, + "AidlPercMstpSlowWrflDnon01", + 0.02, + "AidlPercMstpSlowWrflDnon02", + 0.02, + "AidlPercMstpSlowWrflDnon03", + 0.02, + "AidlPercMstpSlowWrflDnon04", + 0.02, + "AidlPercMstpSlowWrflDnon_i01", + 0.02, + "AidlPercMstpSlowWrflDnon_i02", + 0.02, + "AidlPercMstpSlowWrflDnon_i03", + 0.02, + "AidlPercMstpSlowWrflDnon_i04", + 0.02, + "AidlPercMstpSlowWrflDnon_i05", + 0.02, + "AidlPercMstpSlowWrflDnon_i06", + 0.02, + "AidlPercMstpSlowWrflDnon_i07", + 0.02, + "AidlPercMstpSlowWrflDnon_i08", + 0.02, + "AidlPercMstpSlowWrflDnon_i09", + 0.02, + "AidlPercMstpSlowWrflDnon_i10", + 0.02, + "AidlPercMstpSlowWrflDnon_i11", + 0.02, + "AidlPercMstpSlowWrflDnon_i12", + 0.02, + "AidlPercMstpSlowWrflDnon_i13", + 0.02, + "AidlPercMstpSlowWrflDnon05", + 0.02, + "AidlPercMstpSlowWrflDnon06", + 0.02, + "AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1", + 0.0099999998, + "AdthPercMstpSlowWrflDnon_16", + 0.0099999998, + "AdthPercMstpSlowWrflDnon_32", + 0.0099999998, + "ActsPercMstpSlowWrflDnon_talking_C3BeginBriefing", + 0.1, + "AidlPercSlowWrflDnon_talkListeningS", + 0.0099999998, + "AidlPercSnonWnonDnon_talkAS", + 0.0099999998 + }; + }; + class AmovPercMstpSrasWrflDnon: AmovPercMstpSlowWrflDnon + { + visibleSize=0.70012099; + actions="RifleStandActions"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Perc_Wrfl.p3d"; + showWeaponAim=1; + disableWeapons=0; + disableWeaponsLong=0; + aiming="aimingDefault"; + aimingBody="aimingUpDefault"; + relSpeedMax=1.1; + relSpeedMin=0.700001; + aimPrecision=1; + weaponIK=1; + canPullTrigger=1; + ConnectTo[]= + { + "AidlPercMstpSrasWrflDnon_aiming0S", + 0.02, + "AovrPercMstpSrasWrflDf", + 0.0099999998, + "AmovPercMwlkSrasWrflDnon_transition", + 0.02, + "AmovPercMstpSrasWrflDnon_turnL", + 0.02, + "AmovPercMstpSrasWrflDnon_turnR", + 0.02, + "WeaponMagazineReloadStand", + 0.1, + "amovpercmstpsraswrfldnon_amovpercmstpsraswlnrdnon", + 0.0099999998, + "AmovPercMstpSrasWrflDnon_AmovPknlMstpSrasWrflDnon", + 0.02, + "AmovPercMstpSrasWrflDnon_AmovPpneMstpSrasWrflDnon", + 0.02, + "AmovPercMstpSrasWrflDnon_AmovPercMstpSlowWrflDnon", + 0.0099999998, + "AmovPercMstpSrasWrflDnon_AmovPercMstpSrasWpstDnon", + 0.02, + "AmovPercMstpSrasWrflDnon_AwopPercMstpSoptWbinDnon", + 0.02, + "AmovPercMstpSrasWrflDnon_AmovPercMstpSnonWnonDnon", + 0.02, + "AwopPercMstpSgthWrflDnon_Start2", + 0.1, + "AswmPercMstpSnonWnonDnon", + 0.30000001, + "AmovPercMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon", + 0.02, + "AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1", + 0.0099999998, + "ActsPercMstpSnonWpstDnon_sceneBardakRifle01", + 0.1, + "adthpercmstpsraswrfldnon_NikitinDead", + 0.0099999998, + "ActsPercMstpSrasWrflDnon_sceneLopotevBandCaptured_zevl1", + 0.0099999998, + "ActsPercMstpSrasWrflDnon_sceneLopotevBandCaptured_zevl2", + 0.0099999998, + "ActsPercMstpSrasWunaDnon_sceneLopotevBandCaptured_Bardak", + 10, + "ActsPercMstpSrasWrflDnon_sceneLopotevBandCaptured_Lopotev", + 0.0099999998, + "ActsPercMstpSrasWrflDnon_sceneLopotevBandCaptured_Miles", + 0.0099999998, + "ActsPercMstpSrasWrflDnon_sceneLopotevBandCaptured_Nameless", + 0.0099999998, + "ActsPercMstpSrasWrflDnon_sceneLopotevBandCaptured_Nikitin", + 0.0099999998 + }; + InterpolateTo[]= + { + "AmovPercMstpSrasWrflDnon_turnL", + 0.02, + "AmovPercMstpSrasWrflDnon_turnR", + 0.02, + "AmovPercMwlkSrasWrflDf", + 0.02, + "AmovPercMwlkSrasWrflDfl", + 0.02, + "AmovPercMwlkSrasWrflDl", + 0.02, + "AmovPercMwlkSrasWrflDbl", + 0.02, + "AmovPercMwlkSrasWrflDb", + 0.02, + "AmovPercMwlkSrasWrflDbr", + 0.02, + "AmovPercMwlkSrasWrflDr", + 0.02, + "AmovPercMwlkSrasWrflDfr", + 0.02, + "AmovPercMrunSrasWrflDf", + 0.02, + "AmovPercMrunSrasWrflDfl", + 0.02, + "AmovPercMrunSrasWrflDl", + 0.02, + "AmovPercMrunSrasWrflDbl", + 0.02, + "AmovPercMrunSrasWrflDb", + 0.02, + "AmovPercMrunSrasWrflDbr", + 0.02, + "AmovPercMrunSrasWrflDr", + 0.02, + "AmovPercMrunSrasWrflDfr", + 0.02, + "AmovPercMstpSrasWrflDnon_AmovPknlMstpSlowWrflDnon", + 0.02, + "AmovPercMevaSrasWrflDf", + 0.02, + "AmovPercMevaSrasWrflDfl", + 0.02, + "AmovPercMevaSrasWrflDfr", + 0.02, + "AmovPercMstpSrasWrflDnon_AmovPercMevaSrasWrflDl", + 0.02, + "AmovPercMstpSrasWrflDnon_AmovPercMevaSrasWrflDr", + 0.02, + "AmovPercMstpSrasWrflDnon_AmovPercMevaSrasWrflDb", + 0.02, + "AdthPercMstpSrasWrflDnon_1", + 0.0099999998, + "AdthPercMstpSrasWrflDnon_2", + 0.0099999998, + "AdthPercMstpSrasWrflDnon_4", + 0.0099999998, + "AdthPercMstpSrasWrflDnon_8", + 0.0099999998, + "AdthPercMstpSrasWrflDnon_rS0", + 0.0099999998, + "AidlPercMstpSrasWrflDnon0S", + 0.02, + "AidlPercMstpSrasWrflDnon", + 0.0099999998, + "AmovPercMstpSlowWrflDnon_AcinPknlMwlkSlowWrflDb_1", + 0.0099999998, + "AdthPercMstpSrasWrflDnon_16", + 0.0099999998, + "AdthPercMstpSrasWrflDnon_32", + 0.0099999998, + "adthpercmstpsraswrfldnon_NikitinDead", + 0.0099999998 + }; + }; + class AmovPpneMstpSrasWrflDnon: AmovPercMstpSrasWrflDnon + { + variantsAI[]={}; + actions="RifleProneActions"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Ppne.p3d"; + onLandBeg=1; + onLandEnd=1; + showWeaponAim=1; + disableWeapons=0; + visibleSize=0.100123; + aimPrecision=0.30000001; + aiming="aimingDefault"; + aimingBody="aimingUpDefault"; + leaning="leaningDefault"; + legs="legsDefault"; + leaningFactorBeg=0; + leaningFactorEnd=0; + limitGunMovement=1; + soundOverride="crawl"; + weaponIK=1; + headBobStrength=0.20398; + ConnectTo[]= + { + "AmovPpneMstpSrasWrflDnon_injured", + 0.1, + "AmovPpneMstpSrasWrflDnon_turnL", + 0.02, + "AmovPpneMstpSrasWrflDnon_turnR", + 0.02, + "WeaponMagazineReloadProne", + 0.1, + "AmovPpneMstpSrasWrflDnon_AmovPercMstpSrasWrflDnon", + 0.02, + "AmovPpneMstpSrasWrflDnon_AmovPknlMstpSrasWrflDnon", + 0.02, + "AmovPpneMstpSrasWrflDnon_AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMstpSrasWrflDnon_AwopPpneMstpSoptWbinDnon", + 0.02, + "AmovPpneMstpSrasWrflDnon_AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDl", + 0.02, + "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDr", + 0.02, + "AwopPpneMstpSgthWrflDnon_Start", + 0.1, + "AwopPpneMstpSgthWrflDnon_End", + 0.1, + "AidlPpneMstpSrasWrflDnon0S", + 0.1, + "AidlPpneMstpSrasWrflDnon01", + 0.1, + "AidlPpneMstpSrasWrflDnon02", + 0.1, + "AidlPpneMstpSrasWrflDnon03", + 0.1, + "AmovPpneMstpSrasWrflDnon_healed", + 0.02 + }; + InterpolateTo[]= + { + "AmovPpneMstpSrasWrflDnon_turnL", + 0.02, + "AmovPpneMstpSrasWrflDnon_turnR", + 0.02, + "AmovPpneMrunSlowWrflDf", + 0.02, + "AmovPpneMrunSlowWrflDfl", + 0.02, + "AmovPpneMrunSlowWrflDl", + 0.02, + "AmovPpneMrunSlowWrflDbl", + 0.02, + "AmovPpneMrunSlowWrflDb", + 0.02, + "AmovPpneMrunSlowWrflDbr", + 0.02, + "AmovPpneMrunSlowWrflDr", + 0.02, + "AmovPpneMrunSlowWrflDfr", + 0.02, + "AmovPpneMsprSlowWrflDf", + 0.02, + "AmovPpneMsprSlowWrflDbl", + 0.02, + "AmovPpneMsprSlowWrflDl", + 0.02, + "AmovPpneMsprSlowWrflDr", + 0.02, + "AmovPpneMsprSlowWrflDbr", + 0.02, + "AmovPpneMsprSlowWrflDb", + 0.02, + "AmovPpneMsprSlowWrflDfl", + 0.02, + "AmovPpneMsprSlowWrflDfr", + 0.02, + "AmovPpneMstpSrasWrflDnon_AmovPercMsprSlowWrflDf", + 0.050000001, + "AdthPpneMstpSrasWrflDnon_1", + 0.0099999998, + "AdthPpneMstpSrasWrflDnon_2", + 0.0099999998, + "AidlPpneMstpSrasWrflDnon0S", + 0.02, + "AidlPpneMstpSrasWrflDnon01", + 0.02, + "AidlPpneMstpSrasWrflDnon02", + 0.02, + "AidlPpneMstpSrasWrflDnon03", + 0.02 + }; + }; + class AmovPpneMrunSlowWrflDf: AmovPpneMstpSrasWrflDnon + { + visibleSize=0.150123; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + soundOverride="crawl"; + duty=0.40000001; + showWeaponAim=0; + disableWeapons=1; + soundEnabled=1; + limitGunMovement=0; + legs="wholeBody"; + aiming="empty"; + aimingBody="empty"; + leaning="empty"; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + leftHandIKBeg=0; + leftHandIKCurve[]={}; + leftHandIKEnd=0; + actions="RifleProneActionsRunF"; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSrasWrflDnon", + 0.02, + "AmovPpneMrunSlowWrflDfl", + 0.025, + "AmovPpneMrunSlowWrflDfr", + 0.025, + "AmovPpneMsprSlowWrflDf", + 0.025, + "AmovPpneMstpSrasWrflDnon_AmovPercMsprSlowWrflDf", + 0.050000001, + "AdthPpneMstpSlowWrflDf_1", + 0.0099999998, + "AdthPpneMstpSlowWrflDf_2", + 0.0099999998 + }; + }; + class AmovPpneMstpSrasWrflDnon_turnL: AmovPpneMstpSrasWrflDnon + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + soundOverride="crawl"; + ConnectTo[]= + { + "AmovPpneMstpSrasWrflDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPpneMstpSrasWrflDnon", + 0.02 + }; + }; + class AmovPpneMstpSrasWrflDnon_turnR: AmovPpneMstpSrasWrflDnon + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + soundOverride="crawl"; + ConnectTo[]= + { + "AmovPpneMstpSrasWrflDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPpneMstpSrasWrflDnon", + 0.02 + }; + }; + class AmovPpneMstpSnonWnonDnon: AmovPercMstpSnonWnonDnon + { + actions="CivilProneActions"; + file="\nst\ns_anims\bloodsucker\forward.rtm"; + legs="Wholebody"; + onLandBeg=1; + onLandEnd=1; + collisionShape="ca\Anims\Characters\data\Geom\Sdr\Ppne.p3d"; + aimingBody="empty"; + disableWeapons=0; + soundOverride="crawl"; + canPullTrigger=0; + ConnectTo[]= + { + "AmovPpneMstpSnonWnonDnon_turnL", + 0.02, + "AmovPpneMstpSnonWnonDnon_turnR", + 0.02, + "AmovPpneMstpSnonWnonDnon_AmovPercMstpSnonWnonDnon", + 0.02, + "AmovPpneMstpSnonWnonDnon_AmovPknlMstpSnonWnonDnon", + 0.02, + "AmovPpneMstpSnonWnonDnon_AmovPercMsprSnonWnonDf", + 0.050000001, + "AmovPpneMstpSnonWnonDnon_AmovPpneMstpSrasWrflDnon", + 0.02, + "AmovPpneMstpSnonWnonDnon_AmovPpneMstpSrasWpstDnon", + 0.02, + "AmovPpneMstpSnonWnonDnon_AmovPknlMstpSrasWlnrDnon", + 0.02, + "AmovPpneMstpSnonWnonDnon_AwopPpneMstpSoptWbinDnon", + 0.02, + "AmovPpneMstpSnonWnonDnon_AmovPpneMevaSnonWnonDl", + 0.02, + "AmovPpneMstpSnonWnonDnon_AmovPpneMevaSnonWnonDr", + 0.02, + "AmovPpneMstpSnonWnonDnon_AmovPsitMstpSnonWnonDnon_ground", + 0.1, + "AwopPpneMstpSgthWnonDnon_start", + 0.1, + "AidlPpneMstpSnonWnonDnon0S", + 0.1, + "AidlPpneMstpSnonWnonDnon01", + 0.1, + "AidlPpneMstpSnonWnonDnon02", + 0.1, + "AidlPpneMstpSnonWnonDnon03", + 0.1, + "AmovPpneMstpSnonWnonDnon_healed", + 0.02, + "AmovPpneMstpSnonWnonDnon_injured", + 0.1 + }; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon_turnL", + 0.02, + "AmovPpneMstpSnonWnonDnon_turnR", + 0.02, + "AmovPpneMrunSnonWnonDf", + 0.02, + "AmovPpneMrunSnonWnonDfl", + 0.02, + "AmovPpneMrunSnonWnonDl", + 0.02, + "AmovPpneMrunSnonWnonDbl", + 0.02, + "AmovPpneMrunSnonWnonDb", + 0.02, + "AmovPpneMrunSnonWnonDbr", + 0.02, + "AmovPpneMrunSnonWnonDr", + 0.02, + "AmovPpneMrunSnonWnonDfr", + 0.02, + "AdthPpneMstpSnonWnonDnon", + 0.0099999998 + }; + }; + class AmovPpneMrunSnonWnonDf: AmovPpneMstpSnonWnonDnon + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + duty=0.40000001; + soundOverride="crawl"; + leaningFactorBeg=0; + leaningFactorEnd=0; + soundEnabled=1; + legs="wholeBody"; + aimingBody="empty"; + leaning="empty"; + aiming="empty"; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + canPullTrigger=0; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMrunSnonWnonDfl", + 0.025, + "AmovPpneMrunSnonWnonDfr", + 0.025, + "AmovPpneMstpSnonWnonDnon_AmovPercMsprSnonWnonDf", + 0.050000001 + }; + }; + class AmovPpneMstpSnonWnonDnon_turnL: AmovPpneMstpSnonWnonDnon + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + soundOverride="crawl"; + canPullTrigger=0; + ConnectTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02 + }; + }; + class AmovPpneMstpSnonWnonDnon_turnR: AmovPpneMstpSnonWnonDnon + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + soundOverride="crawl"; + canPullTrigger=0; + ConnectTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02 + }; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02 + }; + }; + class AmovPpneMrunSnonWnonDfl: AmovPpneMrunSnonWnonDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + canPullTrigger=0; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMrunSnonWnonDf", + 0.025, + "AmovPpneMrunSnonWnonDl", + 0.025, + "AmovPpneMstpSnonWnonDnon_AmovPercMsprSnonWnonDf", + 0.050000001 + }; + }; + class AmovPpneMrunSnonWnonDl: AmovPpneMrunSnonWnonDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + canPullTrigger=0; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMrunSnonWnonDfl", + 0.025, + "AmovPpneMrunSnonWnonDbl", + 0.025 + }; + }; + class AmovPpneMrunSnonWnonDbl: AmovPpneMrunSnonWnonDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + canPullTrigger=0; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMrunSnonWnonDl", + 0.025, + "AmovPpneMrunSnonWnonDb", + 0.025 + }; + }; + class AmovPpneMrunSnonWnonDb: AmovPpneMrunSnonWnonDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + canPullTrigger=0; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMrunSnonWnonDbl", + 0.025, + "AmovPpneMrunSnonWnonDbr", + 0.025 + }; + }; + class AmovPpneMrunSnonWnonDbr: AmovPpneMrunSnonWnonDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + canPullTrigger=0; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMrunSnonWnonDb", + 0.025, + "AmovPpneMrunSnonWnonDr", + 0.025 + }; + }; + class AmovPpneMrunSnonWnonDr: AmovPpneMrunSnonWnonDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=0.5; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + canPullTrigger=0; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMrunSnonWnonDbr", + 0.025, + "AmovPpneMrunSnonWnonDfr", + 0.025 + }; + }; + class AmovPpneMrunSnonWnonDfr: AmovPpneMrunSnonWnonDf + { + file="\nst\ns_anims\bloodsucker\forward.rtm"; + speed=1.05; + duty=0.40000001; + relSpeedMin=0.69717097; + relSpeedMax=1.096506; + soundOverride="crawl"; + soundEnabled=1; + canPullTrigger=0; + ConnectTo[]={}; + InterpolateTo[]= + { + "AmovPpneMstpSnonWnonDnon", + 0.02, + "AmovPpneMrunSnonWnonDf", + 0.025, + "AmovPpneMrunSnonWnonDr", + 0.025, + "AmovPpneMstpSnonWnonDnon_AmovPercMsprSnonWnonDf", + 0.050000001 + }; + }; + }; }; \ No newline at end of file diff --git a/SQF/dayz_code/actions/gather_meat.sqf b/SQF/dayz_code/actions/gather_meat.sqf index 1826fb5af..9e90794df 100644 --- a/SQF/dayz_code/actions/gather_meat.sqf +++ b/SQF/dayz_code/actions/gather_meat.sqf @@ -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; diff --git a/SQF/dayz_code/compile/building_spawnZombies.sqf b/SQF/dayz_code/compile/building_spawnZombies.sqf index 8e7be6f60..865a9e981 100644 --- a/SQF/dayz_code/compile/building_spawnZombies.sqf +++ b/SQF/dayz_code/compile/building_spawnZombies.sqf @@ -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; + }; + }; }; diff --git a/SQF/dayz_code/compile/local_gutObject.sqf b/SQF/dayz_code/compile/local_gutObject.sqf index aad00420d..48eed429f 100644 --- a/SQF/dayz_code/compile/local_gutObject.sqf +++ b/SQF/dayz_code/compile/local_gutObject.sqf @@ -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; }; diff --git a/SQF/dayz_code/compile/mutant_findTarget.sqf b/SQF/dayz_code/compile/mutant_findTarget.sqf new file mode 100644 index 000000000..c89269571 --- /dev/null +++ b/SQF/dayz_code/compile/mutant_findTarget.sqf @@ -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 \ No newline at end of file diff --git a/SQF/dayz_code/compile/mutant_generate.sqf b/SQF/dayz_code/compile/mutant_generate.sqf new file mode 100644 index 000000000..ca1278726 --- /dev/null +++ b/SQF/dayz_code/compile/mutant_generate.sqf @@ -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]; diff --git a/SQF/dayz_code/compile/player_alertZombies.sqf b/SQF/dayz_code/compile/player_alertZombies.sqf index 8a222e24e..38b1c8b15 100644 --- a/SQF/dayz_code/compile/player_alertZombies.sqf +++ b/SQF/dayz_code/compile/player_alertZombies.sqf @@ -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]); diff --git a/SQF/dayz_code/compile/player_mutantAttack.sqf b/SQF/dayz_code/compile/player_mutantAttack.sqf new file mode 100644 index 000000000..6394004dd --- /dev/null +++ b/SQF/dayz_code/compile/player_mutantAttack.sqf @@ -0,0 +1,76 @@ +/* + DayZ Epoch mutant attack script by JasonTM + Adapted from player_zombieAttack by facoptere + and Nightstalker melee attack effects by sumraknightstalkers.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; \ No newline at end of file diff --git a/SQF/dayz_code/compile/player_spawnCheck.sqf b/SQF/dayz_code/compile/player_spawnCheck.sqf index 7cff6dea9..e6aed8be5 100644 --- a/SQF/dayz_code/compile/player_spawnCheck.sqf +++ b/SQF/dayz_code/compile/player_spawnCheck.sqf @@ -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); diff --git a/SQF/dayz_code/compile/player_zombieCheck.sqf b/SQF/dayz_code/compile/player_zombieCheck.sqf index 73f891fc7..c33557cee 100644 --- a/SQF/dayz_code/compile/player_zombieCheck.sqf +++ b/SQF/dayz_code/compile/player_zombieCheck.sqf @@ -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 diff --git a/SQF/dayz_code/configVariables.sqf b/SQF/dayz_code/configVariables.sqf index 42e3461f9..7da054bd6 100644 --- a/SQF/dayz_code/configVariables.sqf +++ b/SQF/dayz_code/configVariables.sqf @@ -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 diff --git a/SQF/dayz_code/init/compiles.sqf b/SQF/dayz_code/init/compiles.sqf index 72432bbe1..f3a1078a0 100644 --- a/SQF/dayz_code/init/compiles.sqf +++ b/SQF/dayz_code/init/compiles.sqf @@ -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 { diff --git a/SQF/dayz_code/stringtable.xml b/SQF/dayz_code/stringtable.xml index 4aa5f253d..3e7149d27 100644 --- a/SQF/dayz_code/stringtable.xml +++ b/SQF/dayz_code/stringtable.xml @@ -14281,6 +14281,9 @@ Infecté Infikovaný + + Bloodsucker + Viral Infected Infectado Viral @@ -22463,6 +22466,9 @@ %1 a été vidé, les pièces de zombies sont maintenant sur la carcasse. %1 byl zničený, zombie díly jsou nyní na kostru. + + You have carved the heart of the %1 from it's chest. + Tame Dog Hund zähmen @@ -25541,6 +25547,9 @@ Dépecer le zombie Vykuchat Zombie + + Butcher Bloodsucker + Open %1 %1 öffnen @@ -27337,6 +27346,12 @@ Zombiehaut in einem Sack. Кожа зомби в мешке. + + Mutant Heart + + + Bloodsuckers will not attack a player that keeps one in their inventory. + Combination Lock Zahlenschloss diff --git a/SQF/dayz_code/system/mutant_agent.fsm b/SQF/dayz_code/system/mutant_agent.fsm new file mode 100644 index 000000000..09c4deca8 --- /dev/null +++ b/SQF/dayz_code/system/mutant_agent.fsm @@ -0,0 +1,719 @@ +/*%FSM*/ +/*%FSM*/ +/* +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*/ +class FSM +{ + fsmName = "DZE Bloodsucker Agent"; + class States + { + /*%FSM*/ + class init + { + name = "init"; + init = /*%FSM*/"_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*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class isDedicated + { + priority = 0.000000; + to="End"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"isDedicated"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Ready + { + priority = 0.000000; + to="Loiter"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(!isNil 'dayz_clientPreload' && {dayz_clientPreload}) && !(isNull _agent)"/*%FSM*/; + action=/*%FSM*/"_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*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class End + { + name = "End"; + init = /*%FSM*/"if (!isDedicated) then {" \n + " if (!isNull _agent) then {" \n + " deleteVehicle _agent;" \n + " };" \n + "} else {" \n + " [_agent] call zombie_findOwner;" \n + "};"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + }; + }; + /*%FSM*/ + /*%FSM*/ + class Chase + { + name = "Chase"; + init = /*%FSM*/"_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*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Nobody_Near + { + priority = 6.000000; + to="Cleanup_"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_isSomeone"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Not_Alive + { + priority = 5.000000; + to="Cleanup_"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_isAlive"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class No_Agent + { + priority = 5.000000; + to="Cleanup_"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(isNull _agent)"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class No_Target + { + priority = 3.000000; + to="Reset_Targeting"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(isNull _target) && ((diag_tickTime - _timeN) > 5)"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Target_Dead + { + priority = 3.000000; + to="Reset_Targeting"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_isTargetAlive"/*%FSM*/; + action=/*%FSM*/"_timeN = diag_tickTime;"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class cant_see + { + priority = 2.000000; + to="Finish_Move"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_cantSee"/*%FSM*/; + action=/*%FSM*/"// diag_log (""Mutant Cant See Target"");"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class TimeCheck + { + priority = 2.000000; + to="Chase"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _timeN) > 2" \n + ""/*%FSM*/; + action=/*%FSM*/"_agroCheck= _agroCheck + 1;"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class InRange + { + priority = 1.000000; + to="Attacking_Wait"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_agent distance _targetPos < 3.1"/*%FSM*/; + action=/*%FSM*/"_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*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Cleanup_ + { + name = "Cleanup_"; + init = /*%FSM*/"_waitStart = diag_tickTime;"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class nobody_around + { + priority = 0.000000; + to="End"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_isSomeone"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class someone_here + { + priority = 0.000000; + to="wait"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_isSomeone"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Finish_Move + { + name = "Finish_Move"; + init = /*%FSM*/"_timeN = diag_tickTime;" \n + "" \n + "_isSomeone = false;" \n + "{" \n + " if (isPlayer _x && {_x distance _agent < 300}) exitWith {_isSomeone = true;};" \n + "} count playableUnits;"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Nobody_Near + { + priority = 6.000000; + to="Cleanup_"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_isSomeone"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class finished + { + priority = 1.000000; + to="Reset_Targeting"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_agent distance _targetPos < 3"/*%FSM*/; + action=/*%FSM*/"//diag_log (""Finished"");"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class too_long + { + priority = 0.000000; + to="Reset_Targeting"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _timeN) > 20"/*%FSM*/; + action=/*%FSM*/"//diag_log (""Mutant Cant See Timeout"");"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Move + { + name = "Move"; + init = /*%FSM*/"_myDest = [_agent,_position] call zombie_loiter;"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class True + { + priority = 0.000000; + to="Loiter"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class wait + { + name = "wait"; + init = /*%FSM*/"_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*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class time_up + { + priority = 0.000000; + to="End"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _waitStart) > 300"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class nobody_around + { + priority = 0.000000; + to="End"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_isSomeone"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class deleted + { + priority = 0.000000; + to="End"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"isNull _agent;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Time_Check + { + priority = 0.000000; + to="wait"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _timeN) > 30"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Reset_Targeting + { + name = "Reset_Targeting"; + init = /*%FSM*/"//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*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class True + { + priority = 0.000000; + to="Loiter"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/""/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Loiter + { + name = "Loiter"; + init = /*%FSM*/"_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*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Nobody_Near + { + priority = 6.000000; + to="Cleanup_"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_isSomeone"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class No_Agent + { + priority = 5.000000; + to="Cleanup_"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(isNull _agent)"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Not_Alive + { + priority = 5.000000; + to="Cleanup_"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!_isAlive"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Failed_Move + { + priority = 3.000000; + to="Move"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"moveToFailed _agent;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class MoveCompleted_ + { + priority = 3.000000; + to="Move"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"moveToCompleted _agent;"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class player_check + { + priority = 2.000000; + to="Loiter"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _entityTime) > 30"/*%FSM*/; + action=/*%FSM*/"_entityTime = diag_tickTime;" \n + "" \n + "_isSomeone = false;" \n + "{" \n + " if (isPlayer _x && {_x distance _agent < 300}) exitWith {_isSomeone = true;};" \n + "} count playableUnits;"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Not_moving + { + priority = 1.000000; + to="Move"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(Speed _agent == 0)" \n + ""/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Time_Check + { + priority = 0.000000; + to="Loiter"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _timeN) > 1"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Has_Target + { + priority = 0.000000; + to="Reset_MoveTo"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!(isNull _target)"/*%FSM*/; + action=/*%FSM*/"// diag_log ""Bloodsucker found target"";"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Attacking_Wait + { + name = "Attacking_Wait"; + init = /*%FSM*/"_targetPos = _target modelToWorld [0,-1,0];" \n + "" \n + "_timeN = diag_tickTime;" \n + ""/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class NotInRange + { + priority = 1.000000; + to="Chase"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"_agent distance _targetPos > 3.1"/*%FSM*/; + action=/*%FSM*/"_agent stop false;"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class TimeCheck + { + priority = 0.000000; + to="Attacking_Wait"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"((diag_tickTime - _timeN) > 1)"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Reset_MoveTo + { + name = "Reset_MoveTo"; + init = /*%FSM*/"_agent moveTo (_agent modelToWorld [0,0,0]);"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class UnitReady + { + priority = 5.000000; + to="Chase"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"unitReady _agent"/*%FSM*/; + action=/*%FSM*/"_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*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + }; + initState="init"; + finalStates[] = + { + "End", + }; +}; +/*%FSM*/ \ No newline at end of file diff --git a/SQF/dayz_server/system/scheduler/sched_corpses.sqf b/SQF/dayz_server/system/scheduler/sched_corpses.sqf index b40e7d698..5d607e882 100644 --- a/SQF/dayz_server/system/scheduler/sched_corpses.sqf +++ b/SQF/dayz_server/system/scheduler/sched_corpses.sqf @@ -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 { diff --git a/Server Files/DZE_Server_Config/BattlEye/createvehicle.txt b/Server Files/DZE_Server_Config/BattlEye/createvehicle.txt index 4e3c8ae05..bea251c8f 100644 --- a/Server Files/DZE_Server_Config/BattlEye/createvehicle.txt +++ b/Server Files/DZE_Server_Config/BattlEye/createvehicle.txt @@ -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