fnc_usec_damageHandle = { /*********************************************************** ASSIGN DAMAGE HANDLER TO A UNIT - Function - [unit] call fnc_usec_damageHandle; ************************************************************/ private "_unit"; _unit = _this select 0; mydamage_eh1 = _unit addeventhandler ["HandleDamage",{_this call fnc_usec_damageHandler;} ]; mydamage_eh2 = _unit addEventHandler ["Fired", {_this call player_fired;}]; mydamage_eh3 = _unit addEventHandler ["Killed", {[_this,"find"] call player_death;}]; }; fnc_usec_pitchWhine = { private ["_visual", "_sound"]; _visual = _this select 0; _sound = _this select 1; //affect the player 0 fadeSound 0; playMusic ["PitchWhine",0]; if (!r_player_unconscious) then { _visual call fnc_usec_bulletHit; if (dayz_soundMuted) then { _sound fadeSound 0.25; } else { _sound fadeSound 1; }; }; r_pitchWhine = true; [] spawn { uiSleep 32; r_pitchWhine = false; }; }; fnc_usec_damageUnconscious = { private["_unit","_damage","_inVehicle"]; _unit = _this select 0; _damage = _this select 1; diag_log format["fnc_usec_damageUnconscious: %1,%2,%3",_unit,_damage, player]; _inVehicle = (vehicle _unit != _unit); if (_unit == player) then { if (r_player_timeout <= 0) then { r_player_timeout = 120 min (round((((random 2) max 0.1) * _damage) * 20)); }; r_player_unconscious = true; player setVariable ["unconsciousTime", r_player_timeout, true]; }; if (_inVehicle) then { _unit spawn { private["_veh","_unit"]; _veh = vehicle _this; _unit = _this; waitUntil {(((getPosATL _veh select 2 < 1) && {speed _veh < 1}) || (!r_player_unconscious))}; if (r_player_unconscious) then { _unit action ["eject", _veh]; waitUntil{((vehicle _this) != _this)}; uiSleep 1; _unit playActionNow "Die"; }; }; } else { _unit playActionNow "Die"; }; }; //Action Handlers added to init file fnc_usec_bulletHit = { private "_commit"; _commit = _this; if (!r_player_unconscious) then { "colorCorrections" ppEffectEnable true; "colorCorrections" ppEffectAdjust [1, 1.1, -0.02, [0.4,-0.2,-0.2, .04], [1,1,1,0], [1,1,1, 0]]; "colorCorrections" ppEffectCommit 0; "dynamicBlur" ppEffectEnable true;"dynamicBlur" ppEffectAdjust [1]; "dynamicBlur" ppEffectCommit 0; //setCamShakeParams [0.05, 4, 1, 3, true]; addCamShake [5, 0.5, 25]; "colorCorrections" ppEffectAdjust [1, 1, 0, [0,0,0,0], [1, 1, 1, 1], [1, 1, 1, 1]]; "colorCorrections" ppEffectCommit _commit; "dynamicBlur" ppEffectAdjust [0]; "dynamicBlur" ppEffectCommit _commit; }; }; fnc_usec_damageGetWound = { private ["_hit", "_sPoint", "_options", "_rnd", "_wound"]; _hit = format["%1",_this]; _sPoint = USEC_woundHit find _hit; _options = USEC_woundPoint select _sPoint; _rnd = floor(random(count _options)); _wound = _options select _rnd; _wound }; fnc_usec_medic_removeActions = { private "_obj"; _obj = player; { _obj = _x; { _obj removeAction _x; } forEach r_player_actions; } forEach r_action_targets; r_player_actions = []; r_action_targets = []; }; fnc_usec_calculateBloodPerSec = { private["_bloodLossPerSec","_bloodGainPerSec","_bloodPerSec","_wounded","_time"]; _bloodLossPerSec = 0; _bloodGainPerSec = 0; if (dayz_thirst >= SleepWater) then { _bloodLossPerSec = _bloodLossPerSec + 10; }; if (dayz_hunger >= SleepFood) then { _bloodLossPerSec = _bloodLossPerSec + 10; }; if (r_player_injured) then { _bloodLossPerSec = 10; { _wounded = player getVariable["hit_"+_x,false]; if (_wounded) then { _bloodLossPerSec = _bloodLossPerSec + 10; }; } forEach USEC_typeOfWounds; }; //Sepsis if (!r_player_infected) then { if (r_player_Sepsis select 0) then { _time = diag_tickTime - (r_player_Sepsis select 1); if (_time > 900) then { if (_time < 1800) then { _time = ((_time - 900) max 1) min 900; _bloodLossPerSec = _bloodLossPerSec + (_time / 450) + 1; _bloodLossPerSec = _bloodLossPerSec - (_bloodLossPerSec % 1); } else { r_player_Sepsis = [false, 0]; r_player_infected = true; player setVariable["USEC_infected",true,true]; }; }; if ((_time < 1) && {isNil "sepsisStarted"}) then { //if (isNil "sepsisStarted") then { localize "str_medical_sepsis_warning" call dayz_rollingMessages; //systemChat (localize "str_medical_sepsis_warning"); player setVariable ["sepsisStarted", _time]; }; }; } else { _bloodLossPerSec = _bloodLossPerSec + 3; }; //_golbalNutrition = 1200 / r_player_Nutrition; if (r_player_bloodregen > 0) then { _bloodGainPerSec = r_player_bloodregen * 0.1; /* if ((r_player_bloodregen) < 30) then { _bloodGainPerSec = r_player_bloodregen * _golbalNutrition; }; if ((r_player_bloodregen)< 60) then { _bloodGainPerSec = r_player_bloodregen * _golbalNutrition; }; */ r_player_bloodregen = (0 max r_player_bloodregen) - (0 max _bloodGainPerSec); }; r_player_bloodlosspersec = _bloodLossPerSec; r_player_bloodgainpersec = _bloodGainPerSec; _bloodPerSec = _bloodGainPerSec - _bloodLossPerSec; /* private [ "_foodVal", "_thirstVal", "_tempVal"]; _foodVal = round(100*(1 - (dayz_hunger / SleepFood))); _thirstVal = round(100*(1 - (dayz_thirst / SleepWater))); _tempVal = round(100*(1 - ((dayz_temperatur - dayz_temperaturmin)/(dayz_temperaturmax - dayz_temperaturmin)))); hintSilent format [ "blood/s: %1\ngain/s: %2\nloss/s: %3\nbloodregen: %4\ninjured: %5\ninfected: %6\nsepsis: %7\ninpain:%15\nblood: %8\nthirst: %9 (%12%%)\nhunger: %10 (%13%%)\ntemp: %11 (%14%%)\nFoodstack: %16\n", _bloodPerSec, r_player_bloodgainpersec, r_player_bloodlosspersec, r_player_bloodregen, r_player_injured, r_player_infected, r_player_Sepsis, r_player_blood, dayz_thirst, dayz_hunger, dayz_temperatur, _thirstVal, _foodVal, _tempVal, r_player_inpain, r_player_foodstack ]; */ dayz_lastMedicalSource = call { if (dayz_thirst >= SleepWater) exitwith {"dehyd"}; //10 if (dayz_hunger >= SleepFood) exitwith {"starve"}; //10 if (r_player_infected) exitwith {"sick"}; //3 "none"; //reset }; if (_bloodPerSec < 0 && {dayz_lastMedicalSource != "none"}) then {dayz_lastMedicalTime = diag_tickTime;}; r_player_bloodpersec = _bloodPerSec; _bloodPerSec }; fnc_usec_playerHandleBlood = { private["_bloodPerSec","_elapsedTime","_bleedTime","_bloodDiff"]; if (r_player_injured) then { // bleeding _bleedTime = (random 500) + 100; _elapsedTime = 0; while {(r_player_injured) && (r_player_blood > 0)} do { _bloodPerSec = [] call fnc_usec_calculateBloodPerSec; r_player_blood = r_player_blood + _bloodPerSec; _elapsedTime = _elapsedTime + 1; if (_elapsedTime > _bleedTime) then { r_player_injured = false; [player,player,false] call player_medBandage; }; _bloodDiff = r_player_blood - (player getVariable["USEC_BloodQty", r_player_bloodTotal]); if ((_bloodDiff >= 500) or (_bloodDiff <= -500)) then { player setVariable["USEC_BloodQty",r_player_blood,true]; }; uiSleep 1; }; } else { // not bleeding _bloodPerSec = [] call fnc_usec_calculateBloodPerSec; if (_bloodPerSec != 0) then { r_player_blood = r_player_blood + _bloodPerSec; }; _bloodDiff = r_player_blood - (player getVariable["USEC_BloodQty", r_player_bloodTotal]); if ((_bloodDiff >= 500) or (_bloodDiff <= -500)) then { player setVariable["USEC_BloodQty",r_player_blood,true]; }; }; }; fnc_usec_resetWoundPoints = { { player setVariable["hit_"+_x,false,true]; } forEach USEC_typeOfWounds; player setVariable ["USEC_injured",false,true]; }; fnc_usec_damageBleed = { /*********************************************************** PROCESS DAMAGE TO A UNIT - Function fnc_usec_damageBleed: Draw a creepy blood stream from a player limb - [_unit, _wound] call fnc_usec_damageBleed; ************************************************************/ private["_unit","_wound","_modelPos","_point","_source","_rndX"]; _unit = _this select 0; _wound = _this select 1; _point = objNull; _source = objNull; if (isServer) exitWith{}; // no graphical effects on server! _modelPos = call { if (_wound == "Pelvis") exitwith { [0,0,0.2] }; if (_wound == "aimpoint") exitwith { _rndX = (0.1 - random 0.2); [_rndX,0,0.2] }; if (_wound == "RightShoulder") exitwith { [0,0,0.2] }; if (_wound == "LeftShoulder") exitwith { [0,0,0.2] }; //added visual wounds to foots if (_wound == "RightFoot") exitwith { [0,0,0.2] }; if (_wound == "LeftFoot") exitwith { [0,0,0.2] }; [0,0,0]; }; while {1 == 1} do { scopeName "main"; waitUntil {(vehicle _unit == _unit)}; if ((dayz_bleedingeffect == 2) or (dayz_bleedingeffect == 3)) then { //Blood partical _point = "Logic" createVehicleLocal getPosATL _unit; _source = "#particlesource" createVehicleLocal getPosATL _unit; _source setParticleParams /* Sprite */ [["\Ca\Data\ParticleEffects\Universal\Universal", 16, 13, 1],"", // File,Ntieth,Index,Count,Loop(Bool) /* Type */ "Billboard", /* TimmerPer */ 1, /* Lifetime */ 0.2, /* Position */ [0,0,0], /* MoveVelocity */ [0,0,0.5], /* Simulation */ 1,0.32,0.1,0.05, //rotationVel,weight,volume,rubbing /* Scale */ [0.05,0.25], /* Color */ [[0.2,0.01,0.01,1],[0.2,0.01,0.01,0]], /* AnimSpeed */ [0.1], /* randDirPeriod */ 0, /* randDirIntesity */ 0, /* onTimerScript */ "", /* DestroyScript */ "", /* Follow */ _point]; _source setParticleRandom [2, [0, 0, 0], [0.0, 0.0, 0.0], 0, 0.5, [0, 0, 0, 0.1], 0, 0, 10]; _source setDropInterval 0.02; _point attachTo [_unit,_modelPos,_wound]; }; uiSleep 5; while {((_unit getVariable["USEC_injured",true]) && {alive _unit})} do { scopeName "loop"; if (vehicle _unit != _unit) then { BreakOut "loop"; }; uiSleep 1; }; deleteVehicle _source; deleteVehicle _point; if (!(_unit getVariable["USEC_injured",false])) then { BreakOut "main"; }; }; deleteVehicle _source; deleteVehicle _point; };