diff --git a/exile_vemf_reloaded/sqf/aiKilled.sqf b/exile_vemf_reloaded/sqf/aiKilled.sqf new file mode 100644 index 0000000..7b68921 --- /dev/null +++ b/exile_vemf_reloaded/sqf/aiKilled.sqf @@ -0,0 +1,145 @@ +/* + VEMF AI Killed by Vampire, rewritten by IT07 + + Description: + removes launchers if desired and announces the kill if enabled in config.cpp + + Params: + _this: ARRAY + _this select 0: OBJECT - the killed AI + _this select 1: OBJECT - killer + + Returns: + nothing +*/ + +if (_this isEqualType []) then +{ + _target = param [0, objNull, [objNull]]; + _killer = param [1, objNull, [objNull]]; + if not(isNull _target AND isNull _killer) then + { + if isPlayer _killer then // Only allow this function to work if killer is an actual player + { + if (_killer isKindOf "Man") then // Roadkill or regular kill + { + if (vehicle _killer isEqualTo _killer) then // If on foot + { + if (vehicle _target isEqualTo _target) then + { + [_target, _killer] ExecVM "exile_vemf_reloaded\sqf\handleRespectGain.sqf"; + _sayKilled = "sayKilled" call VEMFr_fnc_getSetting; + if (_sayKilled > 0) then // Send kill message if enabled + { + [_target, _killer, _sayKilled] ExecVM "exile_vemf_reloaded\sqf\sayKilledWeapon.sqf"; + }; + } else + { + if (typeOf (vehicle _target) isEqualTo "Steerable_Parachute_F") then + { + if ("logCowardKills" call VEMFr_fnc_getSetting isEqualTo 1) then + { + ["fn_aiKilled", 1, format["A coward (%1 @ %2) killed a parachuting AI", name _killer, mapGridPosition _killer]] ExecVM "exile_vemf_reloaded\sqf\log.sqf"; + }; + } else + { + [_target, _killer] ExecVM "exile_vemf_reloaded\sqf\handleRespectGain.sqf"; + _sayKilled = "sayKilled" call VEMFr_fnc_getSetting; + if (_sayKilled > 0) then // Send kill message if enabled + { + [_target, _killer, _sayKilled] ExecVM "exile_vemf_reloaded\sqf\sayKilledWeapon.sqf"; + }; + }; + }; + } else // If in vehicle (a.k.a. roadkill) + { + if (("punishRoadKills" call VEMFr_fnc_getSetting) isEqualTo 1) then + { + _respectDeduct = "respectRoadKillDeduct" call VEMFr_fnc_getSetting; + _curRespect = _killer getVariable ["ExileScore", 0]; + //diag_log text format["_curRespect of _killer (%1) is %2", _killer, _curRespect]; + _newRespect = _curRespect - _respectDeduct; + _killer setVariable ["ExileScore", _newRespect]; + ExileClientPlayerScore = _newRespect; + (owner _killer) publicVariableClient "ExileClientPlayerScore"; + ExileClientPlayerScore = nil; + [_killer, "showFragRequest", [[["ROADKILL..."],["Respect Penalty:", -_respectDeduct]]]] call ExileServer_system_network_send_to; + format["setAccountMoneyAndRespect:%1:%2:%3", _killer getVariable ["ExileMoney", 0], _newRespect, (getPlayerUID _killer)] call ExileServer_system_database_query_fireAndForget; + + if (("sayKilled" call VEMFr_fnc_getSetting) isEqualTo 1) then + { + _kMsg = format["(VEMFr) %1 [Roadkill] AI", name _killer]; + [_kMsg, "sys"] ExecVM "exile_vemf_reloaded\sqf\broadCast.sqf"; + }; + }; + }; + } else // If kill from vehicle (NOT a roadkill) + { + if (typeOf (vehicle _target) isEqualTo "Steerable_Parachute_F") then + { + if ("logCowardKills" call VEMFr_fnc_getSetting isEqualTo 1) then + { + ["fn_aiKilled", 1, format["A coward (%1 @ %2) killed a parachuting AI", name _killer, mapGridPosition _killer]] ExecVM "exile_vemf_reloaded\sqf\log.sqf"; + }; + } else + { + _killer = effectiveCommander _killer; + [_target, _killer] ExecVM "exile_vemf_reloaded\sqf\handleRespectGain.sqf"; + _sayKilled = "sayKilled" call VEMFr_fnc_getSetting; + if (_sayKilled > 0) then // Send kill message if enabled + { + [_target, _killer, _sayKilled] ExecVM "exile_vemf_reloaded\sqf\sayKilledWeapon.sqf"; + }; + }; + }; + }; + + _settings = [["aiCleanup"],["removeLaunchers","aiDeathRemovalEffect","removeHeadGear"]] call VEMFr_fnc_getSetting; + _removeLaunchers = _settings select 0; + if (_removeLaunchers isEqualTo 1) then + { + _secWeapon = secondaryWeapon _target; + if not(_secWeapon isEqualTo "") then + { + _target removeWeaponGlobal _secWeapon; + _missiles = getArray (configFile >> "cfgWeapons" >> _secWeapon >> "magazines"); + { + if (_x in _missiles) then + { + _target removeMagazineGlobal _x; + }; + } forEach (magazines _target); + }; + }; + + if (_settings select 2 isEqualTo 1) then // If removeHeadGear setting is enabled + { + removeHeadGear _target; + }; + + if (_settings select 1 isEqualTo 1) then // If killEffect enabled + { + playSound3D ["A3\Missions_F_Bootcamp\data\sounds\vr_shutdown.wss", _target, false, getPosASL _target, 2, 1, 60]; + for "_u" from 1 to 12 do + { + if not(isObjectHidden _target) then + { + _target hideObjectGlobal true; + } else + { + _target hideObjectGlobal false; + }; + uiSleep 0.12; + }; + _target hideObjectGlobal true; + removeAllWeapons _target; + // Automatic cleanup yaaay + deleteVehicle _target; + }; + + _target removeAllEventHandlers "MPKilled"; + } else + { + ["fn_aiKilled", 0, "_target or _killer isNull"] ExecVM "exile_vemf_reloaded\sqf\log.sqf"; + }; +}; diff --git a/exile_vemf_reloaded/sqf/broadCast.sqf b/exile_vemf_reloaded/sqf/broadCast.sqf new file mode 100644 index 0000000..4487d89 --- /dev/null +++ b/exile_vemf_reloaded/sqf/broadCast.sqf @@ -0,0 +1,50 @@ +/* + Author: IT07 + + Description: + will alert players + + Params: + for global(!) systemChat message: + _this select 0: FORMATTED STRING - thing to send + _this select 1: STRING - must be "sys" + for mission announcement: + _this: ARRAY + _this select 0: ARRAY + _this select 0 select 0: FORMATTED STRING - Message line + _this select 0 select 1: STRING - announcement title + _this select 0 select 2: ARRAY - (optional) only send message to those units + _this select 1: STRING - (optional) must be empty or nil + + Returns: + nothing +*/ + +private ["_msg"]; +_msg = param [0, "", [[],format[""]]]; +if not(_msg isEqualTo "") then +{ + private ["_mode"]; + _mode = param [1, "", [""]]; + if (count allPlayers > 0) then + { + _targets = (_this select 0) param [2, [],[[]]]; + _broadCast = + { + { + if (isPlayer _x AND alive _x) then + { + VEMFrClientMsg = [_msg, _mode]; + (owner _x) publicVariableClient "VEMFrClientMsg"; + }; + } forEach _this; + }; + if (count _targets isEqualTo 0) then + { + allPlayers call _broadCast; + } else + { + _targets call _broadCast; + }; + }; +}; diff --git a/exile_vemf_reloaded/sqf/log.sqf b/exile_vemf_reloaded/sqf/log.sqf new file mode 100644 index 0000000..4e54407 --- /dev/null +++ b/exile_vemf_reloaded/sqf/log.sqf @@ -0,0 +1,48 @@ +/* + Author: IT07 + + Description: + will log given data if debug is enabled + + Params: + _this: ARRAY - contains data required for logging + _this select 0: STRING - prefix. Use "" if none + _this select 1: SCALAR - 0 = error, 1 = info, 2 = special + _this select 2: STRING - the thing to log + + Returns: + nothing (use spawn, not call) +*/ + +if ("debugMode" call VEMFr_fnc_getSetting > 0) then +{ + scopeName "outer"; + private ["_prefix","_type","_line","_doLog"]; + _prefix = param [0, "", [""]]; + _type = param [1, 3, [0]]; + _line = param [2, "", [""]]; + + _doLog = { diag_log text format["IT07: [exile_vemf_reloaded] %1 -- %2: %3", _prefix, _this, _line] }; + _debugMode = "debugMode" call VEMFr_fnc_getSetting; + if (_type isEqualTo 0) then + { + if (_debugMode isEqualTo 1 OR _debugMode isEqualTo 3) then + { + "ERROR" call _doLog; + breakOut "outer"; + }; + }; + if (_type isEqualTo 1) then + { + if (_debugMode isEqualTo 2 OR _debugMode isEqualTo 3) then + { + "INFO" call _doLog; + breakOut "outer"; + }; + }; + if (_type isEqualTo 2) then // This bypasses _debugMode setting. Always logs given params even if debugMode is set to 0 + { + "SYSTEM" call _doLog; + breakOut "outer"; + }; +};