PHP Code:
/*
ALL INFANTRY UNITS ON MAP WILL REACT IF ANY BULLETS PASS WITHIN 10m
BULLETS FIRED FROM LESS THAN 25m ARE IGNORED
BULLETS FROM SMG AND PISTOLS ARE IGNORED
BULLETS FROM OWN SIDE CAUSE UNIT TO KNEEL/CROUCH
BULLETS FROM ENEMY SIDE CAUSE UNIT TO KNEEL/DROP, AND A TEMPORARY DECREASE IN SKILL
SKILLS WILL GRADUALLY RETURN ONCE UNIT IS NOT SUPPRESSED
Authors: TPW & -Coulum-
Last changed: 20120622
*/
//Allow time for ASR AI skills to propagate
sleep 30;
//Start hint
0 = [] spawn {sleep 3;hintsilent "AI suppress active"; sleep 3; hintsilent ""};
private ["_stanceregain","_skillregain","_unit","_bc","_shots","_originalaccuracy","_originalshake","_originalcourage","_general","_ball"];
//Pistol and SMG ammo to ignore
tpw_mags =["30rnd_9x19_MP5",
"30rnd_9x19_MP5SD",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9SD",
"7Rnd_45ACP_1911",
"7Rnd_45ACP_1911",
"8Rnd_9x18_Makarov",
"8Rnd_9x18_MakarovSD",
"64Rnd_9x19_Bizon",
"64Rnd_9x19_SD_Bizon",
"13Rnd_9mm_SLP",
"17Rnd_9x19_glock17",
"6Rnd_45ACP",
"30Rnd_9x19_UZI",
"30Rnd_9x19_UZI_SD"];
//Main function
tpw_ai_sup =
{
{
//hint format["accuracy = %1, shake = %2, courage = %3, general = %4",(ai skill "aimingaccuracy"),(ai skill "aimingshake"),(ai skill "courage"),(ai skill "general")]; // Dsiplay skills for unit named "AI"
if (alive _x) then
{
_unit = _x;
_skillregain = _unit getvariable ["skillregain", -1];
_stanceregain = _unit getvariable ["stanceregain", -1];
if (_stanceregain == -1) then
{
_unit setvariable ["stanceregain", diag_ticktime];
_unit setvariable ["skillregain", diag_ticktime];
_unit addeventhandler ["fired",{tpw_fired = _this select 0;tpw_mag = _this select 5; tpw_bullet = _this select 6}];
_originalaccuracy = _unit skill "aimingaccuracy";
_unit setvariable ["originalaccuracy", _originalaccuracy];
_originalshake = _unit skill "aimingshake";
_unit setvariable ["originalshake", _originalshake];
_originalcourage = _unit skill "courage";
_unit setvariable ["originalcourage", _originalcourage];
_general = _unit skill "general";
_unit setvariable ["general", _general];
};
if ( diag_ticktime >= _stanceregain) then
{
_unit setvariable ["supshots", 0];
_unit setunitpos "auto";
_originalcourage = _unit getvariable "originalcourage";
_general = _unit getvariable "general";
if((_unit skill "courage") < _originalcourage) then
{
_unit setskill ["courage",(_unit skill "courage")+(_general)*(0.003)];
};
};
if (diag_ticktime >= _skillregain) then
{
_originalaccuracy = _unit getvariable "originalaccuracy";
_originalshake = _unit getvariable "originalshake";
_originalcourage = _unit getvariable "originalcourage";
_general = _unit getvariable "general";
if((_unit skill "aimingaccuracy") < _originalaccuracy) then
{
_unit setskill ["aimingaccuracy",(_unit skill "aimingaccuracy")+((_originalaccuracy-(_unit skill "aimingaccuracy"))*.01)];
};
if((_unit skill "aimingshake") < _originalshake) then
{
_unit setskill ["aimingshake",(_unit skill "aimingshake")+((_originalshake-(_unit skill "aimingshake"))*.01)];
};
};
if !(isnull tpw_bullet) then
{
_bc = count ((getposatl _unit) nearobjects ["bulletbase",10]);
if (_bc > 0) then
{
if ((tpw_fired distance _unit) > 25) then
{
if !(tpw_mag in tpw_mags) then
{
_unit setvariable ["skillregain", diag_ticktime + (random 4)-((_unit getvariable "general")+(_unit getvariable "originalcourage"))];
_unit setvariable ["stanceregain", diag_ticktime + 10];
_shots = _unit getvariable "supshots";
_unit setvariable ["supshots", _shots + _bc];
_shots = _unit getvariable "supshots";
_originalaccuracy = _unit getvariable "originalaccuracy";
_originalshake = _unit getvariable "originalshake";
_originalcourage = _unit getvariable "originalcourage";
_general = _unit getvariable "general";
_unit setunitpos "middle";
if ((side tpw_fired != side _unit) && (vehicle _unit == _unit)) then
{
_unit setskill ["aimingaccuracy",_originalaccuracy*_originalcourage*_general-(_shots*(1-_general)*.003)];
_unit setskill ["aimingshake",_originalshake*_originalcourage*_general-(_shots*(1-_general)*.003)];
_unit setskill ["courage",_originalcourage*_originalcourage*_general-(_shots*(1-_general)*.003)];
if (_shots > 5) then
{
_unit setunitpos "down";
};
};
};
};
};
};
};
} foreach allunits;
};
//Call function using per frame eventhandler so computer doesn't explode
[tpw_ai_sup,0] call cba_fnc_addPerFrameHandler;