Files
DayZ-Epoch/SQF/dayz_code/compile/player_death.sqf

157 lines
5.9 KiB
Plaintext

//SetDamage immediately so Arma registers the player as dead.
if (deathHandled) exitWith {};
deathHandled = true;
player setDamage 1;
private ["_ammo","_body","_distance","_infected","_playerID","_sourceName","_sourceWeapon","_sourceVehicleType","_isBandit","_punishment","_humanityHit","_myKills","_kills","_killsV"];
_body = player;
_playerID = getPlayerUID player;
if (dayz_onBack != "") then {
_body addWeapon dayz_onBack;
};
//Get killer information immediately. Weapon, distance or vehicle can change in seconds.
_infected = if (r_player_infected && DZE_PlayerZed) then {1} else {0};
_sourceName = "unknown";
_sourceWeapon = "";
_distance = 0;
_source = if (typeName (_this select 0) == "ARRAY") then {(_this select 0) select 1} else {_this select 0};
_method = switch true do {
case (_this select 1 != "find"): {_this select 1}; //Manually passed method
case (dayz_lastDamageSource != "none" && diag_tickTime - dayz_lastDamageTime < 30): {dayz_lastDamageSource}; //Major event takes priority for cause of death (shot, fell, crash, etc.)
case (dayz_lastMedicalSource != "none" && diag_tickTime - dayz_lastMedicalTime < 10): {dayz_lastMedicalSource}; //Starve, Dehyd, Sick
default {"bled"}; //No other damage sources in last 30 seconds
};
_ammo = if (count _this > 2) then {_this select 2} else {""};
if (!isNull _source) then {
if (!isNull _body) then {_distance = round (_body distance _source);};
_sourceVehicleType = typeOf (vehicle _source);
_sourceWeapon = if (_sourceVehicleType isKindOf "LandVehicle" or _sourceVehicleType isKindOf "Air" or _sourceVehicleType isKindOf "Ship") then {_sourceVehicleType} else {currentWeapon _source};
if (_sourceWeapon == "Throw") then {_sourceWeapon = (weaponState _source) select 3;};
if (_ammo in ["PipeBomb","Mine","MineE"]) then {_sourceWeapon = _ammo;};
if (alive _source) then {
_sourceName = if (isPlayer _source) then {name _source} else {"AI"};
};
if (_source == _body) then {_sourceName = dayz_playerName;};
};
//Send Death Notice
diag_log format["Player_Death: Body:%1 BodyName:%2 Infected:%3 SourceName:%4 SourceWeapon:%5 Distance:%6 Method:%7",_body,dayz_playerName,_infected,_sourceName,_sourceWeapon,_distance,_method];
PVDZ_plr_Death = [dayz_characterID,0,_body,_playerID,toArray dayz_playerName,_infected,toArray _sourceName,toArray _sourceWeapon,_distance,toArray _method]; //Send name as array to avoid publicVariable value restrictions
publicVariableServer "PVDZ_plr_Death";
_body setVariable ["deathType",_method,true];
if (!local _source && isPlayer _source) then {
_isBandit = (player getVariable["humanity",0]) <= -2000;
//_isBandit = (typeOf player in ["Bandit1_DZ","BanditW1_DZ"]);
//if you are a bandit or start first - player will not recieve humanity drop
_punishment = ((_isBandit or {player getVariable ["OpenTarget",false]}) && !(player isKindOf "PZombie_VB"));
_humanityHit = 0;
if (!_punishment) then {
//I'm "not guilty" - kill me and be punished
_myKills = (player getVariable ["humanKills",0]) * 33.3;
// how many non bandit players have I (the dead player) killed?
// punish my killer 2000 for shooting a surivor
// but subtract 500 for each survivor I've murdered
_humanityHit = -(2000 - _myKills);
_kills = _source getVariable ["humanKills",0];
_source setVariable ["humanKills",(_kills + 1),true];
PVDZ_send = [_source,"Humanity",[_humanityHit,300]];
publicVariableServer "PVDZ_send";
} else {
//i'm "guilty" - kill me as bandit
_killsV = _source getVariable ["banditKills",0];
_source setVariable ["banditKills",(_killsV + 1),true];
};
//Setup for study bodys.
_body setVariable ["KillingBlow",[_source,_punishment],true];
};
[] spawn {
private ["_display","_body","_myGroup"];
disableSerialization;
//Prevent client freezes
_display = findDisplay 49;
if (!isNull _display) then {_display closeDisplay 0;};
if (dialog) then {closeDialog 0;};
if (visibleMap) then {openMap false;};
_body = player;
disableUserInput true;
_id = [player,20,true,getPosATL player] call player_alertZombies;
uiSleep 0.5;
if (dayz_soundMuted) then {call player_toggleSoundMute;}; // hide icon before fadeSound
0.1 fadeSound 0;
player setVariable ["NORRN_unconscious", false, true];
player setVariable ["unconsciousTime", 0, true];
player setVariable ["USEC_isCardiac",false,true];
player setVariable ["medForceUpdate",true,true];
player setVariable ["bloodTaken", false, true];
player setVariable ["startcombattimer", 0]; //remove combat timer on death
player setVariable ["inCombat", false, true];
r_player_unconscious = false;
r_player_cardiac = false;
dayz_autoRun = false;
if (player == vehicle player) then { //fix running corpses
[nil, player, rSWITCHMOVE, ""] call RE;
player SWITCHMOVE "";
PVDZ_plr_SwitchMove = [player,""];
publicVariableServer "PVDZ_plr_SwitchMove";
};
terminate dayz_musicH;
terminate dayz_slowCheck;
terminate dayz_monitor1;
//Reset (just in case)
//deleteVehicle dayz_playerTrigger;
//disableUserInput false;
r_player_dead = true;
//Player is dead!
3 fadeSound 0;
uiSleep 1;
dayz_originalPlayer enableSimulation true;
addSwitchableUnit dayz_originalPlayer;
setPlayable dayz_originalPlayer;
selectPlayer dayz_originalPlayer;
_myGroup = group _body;
[_body] joinSilent dayz_firstGroup;
deleteGroup _myGroup;
80000 cutText ["","PLAIN"]; //Clear group icons
3 cutRsc ["default", "PLAIN",3];
4 cutRsc ["default", "PLAIN",3];
_body setVariable["combattimeout", 0, true];
//due to a cleanup issue with effects this has been disabled remember to look at the cleanup before adding it back.
//dayzFlies = player;
//publicVariable "dayzFlies";
uiSleep 2;
1 cutRsc [if (DZE_DeathScreen) then {"DeathScreen_DZE"} else {"DeathScreen_DZ"},"BLACK OUT",3];
playMusic "dayz_track_death_1";
uiSleep 2;
for "_x" from 5 to 1 step -1 do {
titleText [format[localize "str_return_lobby", _x], "PLAIN DOWN", 1];
uiSleep 1;
};
PVDZ_Server_Simulation = [_body, false];
publicVariableServer "PVDZ_Server_Simulation";
endMission "END1";
};