/* * Author: Orginal by Ryan Schultz, edited by KoffeinFlummi, commy2 * Adds camera shake when firing * From TMR: Small Arms * * Arguments: * 0: Unit * 1: Weapon * 3: Muzzle * * Return Value: * Nothing * * Example: * [player, (currentWeapon player), (currentMuzzle player)] call ace_recoil_fnc_camShake; * * Public: No */ #include "script_component.hpp" #define BASE_POWER 0.40 #define BASE_TIME 0.19 #define BASE_FREQ 13 #define RECOIL_COEF 40 params ["_unit", "_weapon", "_muzzle"]; if (toLower _weapon in ["throw", "put"]) exitWith {}; private _powerMod = ([0, -0.1, -0.1, 0, -0.2] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find stance _unit)) + ([0, -1, 0, -1] select (["INTERNAL", "EXTERNAL", "GUNNER", "GROUP"] find cameraView)); // to get camshake read kickback private _recoil = missionNamespace getVariable format [QGVAR(%1-%2), _weapon, _muzzle]; if (isNil "_recoil") then { private _config = configFile >> "CfgWeapons" >> _weapon; if (_muzzle == _weapon) then { _recoil = getText (_config >> "recoil") } else { _recoil = getText (_config >> _muzzle >> "recoil") }; if (isClass (configFile >> "CfgRecoils" >> _recoil)) then { _recoil = getArray (configFile >> "CfgRecoils" >> _recoil >> "kickBack"); if (count _recoil < 2) then { _recoil = [0, 0]; }; } else { _recoil = [0, 0]; }; TRACE_3("Caching Recoil config",_weapon,_muzzle,_recoil); // parse numbers _recoil set [0, call compile format ["%1", _recoil select 0]]; _recoil set [1, call compile format ["%1", _recoil select 1]]; missionNamespace setVariable [format [QGVAR(%1-%2), _weapon, _muzzle], _recoil]; }; private _powerCoef = RECOIL_COEF * linearConversion [0, 1, random 1, _recoil select 0, _recoil select 1, false]; if (isWeaponRested _unit) then {_powerMod = _powerMod - 0.07}; if (isWeaponDeployed _unit) then {_powerMod = _powerMod - 0.11}; private _camshake = [ _powerCoef * (BASE_POWER + _powerMod) max 0, BASE_TIME, BASE_FREQ ]; TRACE_4("addCamShake",_recoil,_powerCoef,_powerMod,_camshake);\ addCamShake _camshake;