====== War Crime Detector ====== In some missions, it is necessary to keep track of friendly fire. This could include intentional or unintentional killings of teammates, civilians, surrendered units, and prisoners. This would be easier to track using Arma 3's binary health system where a unit is either alive or dead. However, ACE3 complicates matters by introducing unconsciousness, making it more difficult to track friendly fire since friendlies might not immediately be killed after incoming fire. The following script aims to mitigate that by tracking ACE3 unconsciousness status. This also keeps track of vehicle kills by drivers and bleeding out by instigators. Make sure ACE3 is installed. ===== Scripts ===== // War Crime Detector addMissionEventHandler ["EntityKilled", { params ["_killed", "_killer", "_instigator"]; _ownerKilled = owner _killed; _armedKilled = {_x != ""} count [currentWeapon _killed, secondaryWeapon _killed]; if (_killer == _killed) then { _killer = _killed getVariable ["ace_medical_lastDamageSource", _killer];} else {_killer}; if (isNull _instigator) then {_instigator = UAVControl vehicle _killer select 0}; if (isNull _instigator) then {_instigator = _killer}; if (_ownerKilled == clientOwner) then { if ((_killed isKindOf "CAManBase") && {side group _killed isEqualTo civilian} && {_armedKilled == 0} && {_killer in allPlayers}) then { _str_1 = str text format ["%2 has killed %1, an unarmed civilian.", (name _killed), (name _killer)]; [_str_1] remoteExec ["systemChat", 0, false]; }; if ((_killed isKindOf "CAManBase") && {side group _killed isEqualTo civilian} && {_armedKilled != 0} && {_killer in allPlayers}) then { _str_2 = str text format ["%2 has killed %1, a civilian combatant.", (name _killed), (name _killer)]; [_str_2] remoteExec ["systemChat", 0, false]; }; if (((animationState _killed) == "ACE_AmovPercMstpSsurWnonDnon") && {_killer in allPlayers}) then { _str_3 = str text format ["%2 has killed %1, a surrendered prisoner.", (name _killed), (name _killer)]; [_str_3] remoteExec ["systemChat", 0, false]; }; if (((animationState _killed) == "ACE_AmovPercMstpScapWnonDnon") && {_killer in allPlayers}) then { _str_4 = str text format ["%2 has killed %1, a captured prisoner.", (name _killed), (name _killer)]; [_str_4] remoteExec ["systemChat", 0, false]; }; if (((side group _killed) isEqualTo (side group _killer)) && {_killed != _killer} && {_killer in allPlayers}) then { _str_5 = str text format ["%2 has teamkilled %1.", (name _killed), (name _killer)]; [_str_5] remoteExec ["systemChat", 0, false]; }; }; if (hasInterface && (!isServer) && (local _killed)) then { if ((_killed isKindOf "CAManBase") && {side group _killed isEqualTo civilian} && {_armedKilled == 0} && {_killer in allPlayers}) then { _str_1 = str text format ["%2 has killed %1, an unarmed civilian.", (name _killed), (name _killer)]; [_str_1] remoteExec ["systemChat", 0, false]; }; if ((_killed isKindOf "CAManBase") && {side group _killed isEqualTo civilian} && {_armedKilled != 0} && {_killer in allPlayers}) then { _str_2 = str text format ["%2 has killed %1, a civilian combatant.", (name _killed), (name _killer)]; [_str_2] remoteExec ["systemChat", 0, false]; }; if (((animationState _killed) == "ACE_AmovPercMstpSsurWnonDnon") && {_killer in allPlayers}) then { _str_3 = str text format ["%2 has killed %1, a surrendered prisoner.", (name _killed), (name _killer)]; [_str_3] remoteExec ["systemChat", 0, false]; }; if (((animationState _killed) == "ACE_AmovPercMstpScapWnonDnon") && {_killer in allPlayers}) then { _str_4 = str text format ["%2 has killed %1, a captured prisoner.", (name _killed), (name _killer)]; [_str_4] remoteExec ["systemChat", 0, false]; }; if (((side group _killed) isEqualTo (side group _killer)) && {_killed != _killer} && {_killer in allPlayers}) then { _str_5 = str text format ["%2 has teamkilled %1.", (name _killed), (name _killer)]; [_str_5] remoteExec ["systemChat", 0, false]; }; }; }]; The script can also be edited to include some command after friendly fire is detected, for example removing tickets from players as punishment. if ((_killed isKindOf "CAManBase") && {side group _killed isEqualTo civilian} && {_armedKilled == 0} && {_killer in allPlayers}) then { // Remove 1 ticket per civilian killed [missionNamespace, -1] call BIS_fnc_respawnTickets; _str_1 = str text format ["%2 has killed %1, an unarmed civilian. Tickets reduced to %3", (name _killed), (name _killer), (str ([missionNamespace] call BIS_fnc_respawnTickets))]; [_str_1] remoteExec ["systemChat", 0, false]; }; **If using this variant, be sure to add the commands to the** ''if (_ownerKilled == clientOwner)'' **block and the** ''if (hasInterface && (!isServer) && (local _killed))''**.** ==== Source ==== [[https://forums.bohemia.net/forums/topic/221948-ace3-war-crime-indicator/| ACE3 "War Crime Indicator" by chazbotic]]