mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-14 20:13:13 +03:00
MPHit does not always fire when a player is killed: https://community.bistudio.com/wiki/ArmA_2:_Event_Handlers#MPHit Using either MPHit or MPKilled is not a good idea here. There is already a local 'killed' event handler which fires on player death (player_death.sqf). That script sends a PV (priority message) to the server which triggers server_playerDied. That means fnc_plyrHit needed to finish sending its data to the server via public setVariables (non-priority messages) before server_playerDied executed. Triggering both these scripts at the same time was a bad idea. Instead of sending the data to the server via setVariable I just included it in PVDZ_plr_Death. This also lets us pass extra information from the damage handler like ammo type, cause of death, etc. Still need to test, but it should be more reliable and performant than fnc_playerHit called from MPHit or MPKilled.
76 lines
3.0 KiB
Plaintext
76 lines
3.0 KiB
Plaintext
#include "\z\addons\dayz_server\compile\server_toggle_debug.hpp"
|
|
|
|
private ["_characterID","_minutes","_newObject","_playerID","_key","_pos","_infected","_killerName","_killerWeapon","_distance","_message","_killerMethod"];
|
|
//[unit, weapon, muzzle, mode, ammo, magazine, projectile]
|
|
|
|
_characterID = _this select 0;
|
|
_minutes = _this select 1;
|
|
_newObject = _this select 2;
|
|
_playerID = _this select 3;
|
|
_playerName = toString (_this select 4); //Sent as array to avoid publicVariable value restrictions
|
|
_infected = _this select 5;
|
|
_killerName = toString (_this select 6);
|
|
_killerWeapon = toString (_this select 7);
|
|
_distance = _this select 8;
|
|
_killerMethod = toString (_this select 9);
|
|
|
|
//Mark player as dead so we bypass the ghost system
|
|
dayz_died set [count dayz_died, _playerID];
|
|
|
|
_newObject setVariable ["processedDeath",diag_tickTime];
|
|
_newObject setVariable ["bodyName",_playerName,true];
|
|
_pos = getPosATL _newObject;
|
|
|
|
// force to follow the terrain slope in sched_corpses.sqf
|
|
if (_pos select 2 < 0.1) then {_pos set [2,0];};
|
|
_newObject setVariable ["deathPos",_pos];
|
|
|
|
if (typeName _minutes == "STRING") then {_minutes = parseNumber _minutes;};
|
|
|
|
if (_characterID != "0") then {
|
|
_key = format["CHILD:202:%1:%2:%3:",_characterID,_minutes,_infected];
|
|
//diag_log ("HIVE: WRITE: "+ str(_key));
|
|
_key call server_hiveWrite;
|
|
};
|
|
|
|
#ifdef PLAYER_DEBUG
|
|
diag_log format ["Player UID#%3 CID#%4 %1 as %5 died at %2",
|
|
_newObject call fa_plr2str, _pos call fa_coor2str,
|
|
getPlayerUID _newObject,_characterID,
|
|
typeOf _newObject
|
|
];
|
|
#endif
|
|
|
|
|
|
// EPOCH DEATH MESSAGES
|
|
if (_killerWeapon == "Throw") then {_killerWeapon = "Grenade";};
|
|
if (_killerMethod in ["starve","dehyd","sick","bled","crushed","rad","zombie"]) then {
|
|
if (_killerMethod == "zombie") then {
|
|
_message = format[localize "str_player_death_zombie",_playerName];
|
|
} else {
|
|
_methodStr = localize format["str_death_%1",_killerMethod];
|
|
_message = format[localize "str_player_death_message",_playerName,_methodStr];
|
|
};
|
|
} else {
|
|
if (_killerName == _playerName) then {
|
|
_message = format[localize "str_player_death_suicide",_playerName];
|
|
} else {
|
|
_message = format[localize "str_player_death_killed",_playerName,_killerName,_killerWeapon,_distance];
|
|
};
|
|
};
|
|
|
|
if ((_killerWeapon != "unknown weapon") or {_killerMethod != "unknown"} or {_killerName != "unknown"}) then {
|
|
diag_log _message;
|
|
//if (DZE_DeathMsgGlobal) then {customRemoteMessage = ['globalChat',_message,_newObject]; publicVariable "customRemoteMessage";};
|
|
if (DZE_DeathMsgGlobal) then {[nil,nil,rspawn,[_newObject,_message],{(_this select 0) globalChat (_this select 1)}] call RE;};
|
|
if (DZE_DeathMsgSide) then {[nil,nil,rspawn,[_newObject,_message],{(_this select 0) sideChat (_this select 1)}] call RE;};
|
|
if (DZE_DeathMsgTitleText) then {[nil,nil,"per",rTITLETEXT,_message,"PLAIN DOWN"] call RE;};
|
|
|
|
// Store death messages to allow viewing at message board in trader citys.
|
|
PlayerDeaths set [count PlayerDeaths,[_playerName,_killerName,_killerWeapon,_distance,ServerCurrentTime]];
|
|
};
|
|
|
|
|
|
_newObject setDamage 1;
|
|
_newObject setOwner 0;
|
|
//dead_bodyCleanup set [count dead_bodyCleanup,_newObject]; |