diff --git a/addons/fcs/CfgEventHandlers.hpp b/addons/fcs/CfgEventHandlers.hpp index a03ca847ea..ab41fa904b 100644 --- a/addons/fcs/CfgEventHandlers.hpp +++ b/addons/fcs/CfgEventHandlers.hpp @@ -1,3 +1,4 @@ + class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); @@ -6,7 +7,7 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; diff --git a/addons/fcs/CfgVehicles.hpp b/addons/fcs/CfgVehicles.hpp index 53b279ef88..f1b896c612 100644 --- a/addons/fcs/CfgVehicles.hpp +++ b/addons/fcs/CfgVehicles.hpp @@ -26,7 +26,7 @@ class CfgVehicles { class ACE_SelfActions { class ResetFCS { displayName = CSTRING(ResetFCS); - condition = QUOTE(call FUNC(canResetFCS)); + condition = QUOTE(_player call FUNC(canResetFCS)); statement = QUOTE([ARR_2(vehicle _player,[_player] call DEFUNC(common,getTurretIndex))] call DFUNC(reset);); showDisabled = 0; priority = 1; @@ -39,7 +39,7 @@ class CfgVehicles { class ACE_SelfActions { class ResetFCS { displayName = CSTRING(ResetFCS); - condition = QUOTE(call FUNC(canResetFCS)); + condition = QUOTE(_player call FUNC(canResetFCS)); statement = QUOTE([ARR_2(vehicle _player,[_player] call DEFUNC(common,getTurretIndex))] call DFUNC(reset);); showDisabled = 0; priority = 1; @@ -321,9 +321,13 @@ class CfgVehicles { discreteDistance[] = {}; discreteDistanceInitIndex = 0; - /*class Turrets: Turrets { - class CommanderOptics: CommanderOptics {}; - };*/ + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + GVAR(Enabled) = 1; + discreteDistance[] = {}; + discreteDistanceInitIndex = 0; + }; + }; }; }; }; @@ -346,9 +350,13 @@ class CfgVehicles { discreteDistance[] = {}; discreteDistanceInitIndex = 0; - /*class Turrets: Turrets { - class CommanderOptics: CommanderOptics {}; - };*/ + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + GVAR(Enabled) = 1; + discreteDistance[] = {}; + discreteDistanceInitIndex = 0; + }; + }; }; }; }; @@ -362,6 +370,8 @@ class CfgVehicles { class Turrets: Turrets { class CommanderOptics: CommanderOptics { GVAR(Enabled) = 1; + discreteDistance[] = {}; + discreteDistanceInitIndex = 0; }; }; }; diff --git a/addons/fcs/XEH_clientInit.sqf b/addons/fcs/XEH_postInit.sqf similarity index 83% rename from addons/fcs/XEH_clientInit.sqf rename to addons/fcs/XEH_postInit.sqf index 3338e739e1..8a8b379318 100644 --- a/addons/fcs/XEH_clientInit.sqf +++ b/addons/fcs/XEH_postInit.sqf @@ -16,4 +16,4 @@ if (!hasInterface) exitWith {}; }] call EFUNC(common,addEventHandler); // Register event for global updates -[QGVAR(forceUpdate), FUNC(onForceUpdate)] call EFUNC(common,addEventHandler); +[QGVAR(forceUpdate), {ACE_player call FUNC(onForceUpdate)}] call EFUNC(common,addEventHandler); diff --git a/addons/fcs/XEH_preInit.sqf b/addons/fcs/XEH_preInit.sqf index 8fdc43df11..2bcda4f464 100644 --- a/addons/fcs/XEH_preInit.sqf +++ b/addons/fcs/XEH_preInit.sqf @@ -14,6 +14,7 @@ PREP(onForceUpdate); PREP(keyDown); PREP(keyUp); PREP(reset); +PREP(updateRangeHUD); PREP(vehicleInit); ADDON = true; diff --git a/addons/fcs/functions/fnc_adjustRange.sqf b/addons/fcs/functions/fnc_adjustRange.sqf index 4b7f4b6b88..f6f543d35a 100644 --- a/addons/fcs/functions/fnc_adjustRange.sqf +++ b/addons/fcs/functions/fnc_adjustRange.sqf @@ -1,29 +1,27 @@ /* * Author: KoffeinFlummi - * * Adjusts the currently zeroed distance. * * Arguments: - * 0: The vehicle in question - * 1: The amount to add to the distance (can be negative) + * 0: The vehicle in question + * 1: The Turrets that the Vehicle has + * 2: The amount to add to the distance (can be negative) * * Return Value: * None + * + * Public: No */ - #include "script_component.hpp" -private ["_vehicle", "_turret", "_delta", "_turretConfig", "_min", "_max", "_distance"]; +params ["_vehicle", "_turret", "_delta"]; -_vehicle = _this select 0; -_turret = _this select 1; -_delta = _this select 2; +private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); -_turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); +private _min = getNumber (_turretConfig >> QGVAR(MinDistance)); +private _max = getNumber (_turretConfig >> QGVAR(MaxDistance)); -_min = getNumber (_turretConfig >> QGVAR(MinDistance)); -_max = getNumber (_turretConfig >> QGVAR(MaxDistance)); -_distance = _vehicle getVariable [format ["%1_%2", QGVAR(Distance), _turret], _min]; +private _distance = _vehicle getVariable [format ["%1_%2", QGVAR(Distance), _turret], _min]; _distance = _distance + _delta; _distance = _distance min _max; diff --git a/addons/fcs/functions/fnc_canResetFCS.sqf b/addons/fcs/functions/fnc_canResetFCS.sqf index 488f1eebf4..b57435f388 100644 --- a/addons/fcs/functions/fnc_canResetFCS.sqf +++ b/addons/fcs/functions/fnc_canResetFCS.sqf @@ -1,15 +1,17 @@ /* * Author: KoffeinFlummi - * * Called from config. Can player reset FCS? * * Argument: * Nothing * - * Return value: - * Boolean (Bool) + * Return Value: + * Boolean + * + * Public: No */ - #include "script_component.hpp" -count ((vehicle ACE_player) getVariable [format ["%1_%2", QGVAR(Magazines), [ACE_player] call EFUNC(common,getTurretIndex)], []]) > 1 +params ["_unit"]; + +count ((vehicle _unit) getVariable [format ["%1_%2", QGVAR(Magazines), [_unit] call EFUNC(common,getTurretIndex)], []]) > 1 // return diff --git a/addons/fcs/functions/fnc_canUseFCS.sqf b/addons/fcs/functions/fnc_canUseFCS.sqf index cb4a1b608d..91b49554c2 100644 --- a/addons/fcs/functions/fnc_canUseFCS.sqf +++ b/addons/fcs/functions/fnc_canUseFCS.sqf @@ -1,16 +1,16 @@ /* * Author: commy2 - * * Called from config. Returns true if the player is a gunner and the players current vehicle has a FCS. * - * Argument: - * Nothing + * Arguments: + * None * - * Return value: - * Boolean (Bool) + * Return Value: + * Boolean + * + * Public: No */ - #include "script_component.hpp" getNumber ([configFile >> "CfgVehicles" >> typeOf vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex)] call EFUNC(common,getTurretConfigPath) >> QGVAR(Enabled)) == 1 -&& {cameraView == "GUNNER"} +&& {cameraView == "GUNNER"} // return diff --git a/addons/fcs/functions/fnc_canUseRangefinder.sqf b/addons/fcs/functions/fnc_canUseRangefinder.sqf index f6bb3b2e52..7403c74ac1 100644 --- a/addons/fcs/functions/fnc_canUseRangefinder.sqf +++ b/addons/fcs/functions/fnc_canUseRangefinder.sqf @@ -1,16 +1,16 @@ /* * Author: commy2 - * * Returns true if the laser distance measurement can be read from the engine. * - * Argument: - * Nothing + * Arguments: + * None * - * Return value: - * Boolean (Bool) + * Return Value: + * Boolean + * + * Public: No */ - #include "script_component.hpp" !isNull ((uiNamespace getVariable ["ACE_dlgRangefinder", displayNull]) displayCtrl 1713151) -&& {cameraView == "GUNNER"} +&& {cameraView == "GUNNER"} // return diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index 31fe38335d..237aed8ac1 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -1,6 +1,5 @@ /* * Author: KoffeinFlummi - * * Adjusts the direction of a shell. * * Arguments: @@ -8,58 +7,48 @@ * * Return Value: * None + * + * Public: No */ - #include "script_component.hpp" -private ["_vehicle", "_weapon", "_ammo", "_magazine", "_projectile", "_sumVelocity"]; +params ["_vehicle", "_weapon", "", "", "_ammo", "_magazine", "_projectile"]; -_vehicle = _this select 0; -_weapon = _this select 1; -_ammo = _this select 4; -_magazine = _this select 5; -_projectile = _this select 6; - -private ["_gunner", "_turret"]; - -_gunner = [_vehicle, _weapon] call EFUNC(common,getGunner); -_turret = [_gunner] call EFUNC(common,getTurretIndex); +private _gunner = [_vehicle, _weapon] call EFUNC(common,getGunner); +private _turret = _gunner call EFUNC(common,getTurretIndex); // Exit if the unit isn't a player if !([_gunner] call EFUNC(common,isPlayer)) exitWith {}; -private ["_FCSMagazines", "_FCSElevation", "_offset"]; - -_FCSMagazines = _vehicle getVariable [(format ["%1_%2", QGVAR(Magazines), _turret]), []]; -_FCSElevation = _vehicle getVariable format ["%1_%2", QGVAR(Elevation), _turret]; +private _FCSMagazines = _vehicle getVariable [format ["%1_%2", QGVAR(Magazines), _turret], []]; +private _FCSElevation = _vehicle getVariable format ["%1_%2", QGVAR(Elevation), _turret]; if !(_magazine in _FCSMagazines) exitWith {}; // GET ELEVATION OFFSET OF CURRENT MAGAZINE -_offset = 0; +private _offset = 0; + { if (_x == _magazine) exitWith { _offset = _FCSElevation select _forEachIndex; }; } forEach _FCSMagazines; - [_projectile, (_vehicle getVariable format ["%1_%2", QGVAR(Azimuth), _turret]), _offset, 0] call EFUNC(common,changeProjectileDirection); // Remove the platform velocity -if( (vectorMagnitude velocity _vehicle) > 2) then { - _sumVelocity = (velocity _projectile) vectorDiff (velocity _vehicle); +if (vectorMagnitude velocity _vehicle > 2) then { + private _sumVelocity = (velocity _projectile) vectorDiff (velocity _vehicle); + _projectile setVelocity _sumVelocity; }; // Air burst missile - // handle locally only if (!local _gunner) exitWith {}; if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(Airburst)) == 1) then { - private "_zeroing"; - _zeroing = _vehicle getVariable [format ["%1_%2", QGVAR(Distance), _turret], currentZeroing _vehicle]; + private _zeroing = _vehicle getVariable [format ["%1_%2", QGVAR(Distance), _turret], currentZeroing _vehicle]; if (_zeroing < 50) exitWith {}; if (_zeroing > 1500) exitWith {}; diff --git a/addons/fcs/functions/fnc_getAngle.sqf b/addons/fcs/functions/fnc_getAngle.sqf index 91150c110d..d2c51a9542 100644 --- a/addons/fcs/functions/fnc_getAngle.sqf +++ b/addons/fcs/functions/fnc_getAngle.sqf @@ -1,91 +1,82 @@ /* * Author: KoffeinFlummi - * * Calculates the angle offset necessary to hit the current target. * * Arguments: - * 0: distance to target in meters - * 1: current angle of the turret - * 2: maximum elevation of the turret - * 3: initSpeed of the projectile - * 4: airFriction of the projectile - * 5: maximum timeToLive of the projectile - * 6: simulationStep of the projectile + * 0: distance to target in meters + * 1: current angle of the turret + * 2: maximum elevation of the turret + * 3: initSpeed of the projectile + * 4: airFriction of the projectile + * 5: maximum timeToLive of the projectile + * 6: simulationStep of the projectile * * Return Value: - * offset from the current angle necessary to hit the target + * offset from the current angle necessary to hit the target + * + * Public: No */ - #include "script_component.hpp" + #define PRECISION 0.1 -private ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle1", "_angle2", "_it2", "_f1", "_f2", "_temp", "_it1", "_angle"]; - -_distance = _this select 0; -_angleTarget = _this select 1; -_maxElev = _this select 2; -_initSpeed = _this select 3; -_airFriction = _this select 4; -_timeToLive = _this select 5; -_simulationStep = _this select 6; +params ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep"]; if (_simulationStep == 0) exitWith {_angleTarget}; -FUNC(traceBullet) = { - private ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle", "_posTargetX", "_posTargetY", "_posX", "_posY", "_velocityX", "_velocityY", "_velocityMagnitude", "_i"]; - - _distance = _this select 0; - _angleTarget = _this select 1; - _maxElev = _this select 2; - _initSpeed = _this select 3; - _airFriction = _this select 4; - _timeToLive = _this select 5; - _simulationStep = _this select 6; - _angle = _this select 7; +private _fnc_traceBullet = { + params ["_distance", "_angleTarget", "_maxElev", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_angle"]; _angle = _angle - _angleTarget; _angleTarget = 0; - _posTargetX = (cos _angleTarget) * _distance; - _posTargetY = (sin _angleTarget) * _distance; + private _posTargetX = (cos _angleTarget) * _distance; + private _posTargetY = (sin _angleTarget) * _distance; - _posX = 0; - _posY = 0; + private _posX = 0; + private _posY = 0; - _velocityX = (cos _angle) * _initSpeed; - _velocityY = (sin _angle) * _initSpeed; + private _velocityX = (cos _angle) * _initSpeed; + private _velocityY = (sin _angle) * _initSpeed; // trace the path of the bullet for "_i" from 1 to ((floor (_timeToLive / _simulationStep)) + 1) do { - _velocityMagnitude = sqrt (_velocityX^2 + _velocityY^2); + private _velocityMagnitude = sqrt (_velocityX^2 + _velocityY^2); + _velocityX = _velocityX + _simulationStep * (_velocityX * _velocityMagnitude * _airFriction); _velocityY = _velocityY + _simulationStep * (_velocityY * _velocityMagnitude * _airFriction - 9.81); + _posX = _posX + _velocityX * _simulationStep; _posY = _posY + _velocityY * _simulationStep; + if (_posX >= _posTargetX) exitWith {}; // bullet passed the target }; - _posY - _posTargetY }; -if ((_this + [_maxElev]) call FUNC(traceBullet) < 0) exitWith {_maxElev - _angleTarget}; +private _data = [_distance, _angleTarget, _maxElev, _initSpeed, _airFriction, _timeToLive, _simulationStep, _maxElev]; + +if (_data call _fnc_traceBullet < 0) exitWith {_maxElev - _angleTarget}; // Newton Method / Secand Method -_angle1 = _angleTarget; -_angle2 = _maxElev; -_it2 = 0; -_f1 = (_this + [_angle1]) call FUNC(traceBullet); +private _angle1 = _angleTarget; +private _angle2 = _maxElev; +private _it2 = 0; + +_data set [7, _maxElev]; +private _f1 = _data call _fnc_traceBullet; + +if (abs _f1 <= PRECISION) exitWith {0}; + +while {abs _f1 > PRECISION} do { + _data set [7, _angle2]; + private _f2 = _data call _fnc_traceBullet; -if ((abs _f1) <= PRECISION) exitWith {0}; -while {(abs _f1) > PRECISION} do { - _f2 = (_this + [_angle2]) call FUNC(traceBullet); - _temp = _angle2-_f2*(_angle2-_angle1)/(_f2-_f1); _angle1 = _angle2; - _angle2 = _temp; - _f1 = _f2; - _it2 = _it2+1; -}; -//player globalChat format ["it1: %1 | _angle1: %2 | it2: %3 | _angle2: %4",_it1, _angle-_angleTarget, _it2, _angle2-_angleTarget]; + _angle2 = _angle2 - _f2 * (_angle2 - _angle1) / (_f2 - _f1); -_angle=_angle2; -_angle - _angleTarget + _f1 = _f2; + _it2 = _it2 + 1; +}; + +_angle2 - _angleTarget diff --git a/addons/fcs/functions/fnc_getRange.sqf b/addons/fcs/functions/fnc_getRange.sqf index 3618fa446e..51cdf564df 100644 --- a/addons/fcs/functions/fnc_getRange.sqf +++ b/addons/fcs/functions/fnc_getRange.sqf @@ -1,23 +1,18 @@ /* * Author: commy2 - * - * Read laser distance measurement from engine and update compatible info elements. + * Read laser distance measurement from engine. * * Argument: - * Nothing + * None * * Return value: - * Measured distance (Number) + * Measured distance + * + * Public: No */ - #include "script_component.hpp" -private ["_dlgRangefinder", "_range"]; - disableSerialization; -_dlgRangefinder = uiNamespace getVariable ["ACE_dlgRangefinder", displayNull]; +private _dlgRangefinder = uiNamespace getVariable ["ACE_dlgRangefinder", displayNull]; -_range = ctrlText (_dlgRangefinder displayCtrl 151); -(_dlgRangefinder displayCtrl 1713151) ctrlSetText _range; - -parseNumber _range +parseNumber ctrlText (_dlgRangefinder displayCtrl 151); diff --git a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf index 899cf0da76..aa166ece12 100644 --- a/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf +++ b/addons/fcs/functions/fnc_handleAirBurstAmmunitionPFH.sqf @@ -1,21 +1,32 @@ -// by commy2 +/* + * Author: commy2 + * Handle Air burst ammunition. Called from per frame handler. + * + * Arguments: + * - + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" -private ["_vehicle", "_projectile", "_zeroing", "_position", "_subMunition"]; - -_vehicle = _this select 0 select 0; -_projectile = _this select 0 select 1; -_zeroing = _this select 0 select 2; +(_this select 0) params ["_vehicle", "_projectile", "_zeroing"]; +// remove pfh if the projectile died before arriving if (isNull _projectile || {!alive _projectile}) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; +// wait if not there if (_projectile distance _vehicle < _zeroing) exitWith {}; -_position = getPosATL _projectile; +// explode +private _position = getPosATL _projectile; + +private _subMunition = createVehicle ["ACE_B_35mm_ABM_Helper", _position, [], 0, "FLY"]; -_subMunition = createVehicle ["ACE_B_35mm_ABM_Helper", _position, [], 0, "FLY"]; _subMunition setPosATL _position; _subMunition setVelocity [0, 0, -10]; diff --git a/addons/fcs/functions/fnc_keyDown.sqf b/addons/fcs/functions/fnc_keyDown.sqf index cea7196570..a34233bc91 100644 --- a/addons/fcs/functions/fnc_keyDown.sqf +++ b/addons/fcs/functions/fnc_keyDown.sqf @@ -1,23 +1,22 @@ /* * Author: KoffeinFlummi - * * Starts watching the target for sideways correction. * * Arguments: - * 0: Vehicle + * 0: Vehicle + * 1: Turret * * Return Value: - * none + * None + * + * Public: No */ - #include "script_component.hpp" -private ["_vehicle", "_turret", "_distance", "_weaponDirection"]; +params ["_vehicle", "_turret"]; -_vehicle = _this select 0; -_turret = _this select 1; - -_distance = call FUNC(getRange); +private _distance = call FUNC(getRange); +call (updateRangeHUD); if !(!GVAR(enabled) && FUNC(canUseFCS)) exitWith {}; @@ -28,7 +27,7 @@ if (_distance == 0) then { _distance = [5, 5000, 0] call EFUNC(common,getTargetDistance); // maximum distance: 5000m, 5m precision }; -_weaponDirection = _vehicle weaponDirection (_vehicle currentWeaponTurret _turret); // @todo doesn't work for sub turrets +private _weaponDirection = _vehicle weaponDirection (_vehicle currentWeaponTurret _turret); // @todo doesn't work for sub turrets if (_turret isEqualTo ([_vehicle] call EFUNC(common,getTurretCommander))) then { _weaponDirection = eyeDirection _vehicle; @@ -38,8 +37,4 @@ if (_weaponDirection isEqualTo [0,0,0]) then { // dummy value for non main turr _weaponDirection = [1,0,0]; }; -GVAR(Position) = [ - (getPos _vehicle select 0) + _distance * (_weaponDirection select 0), - (getPos _vehicle select 1) + _distance * (_weaponDirection select 1), - (getPos _vehicle select 2) + _distance * (_weaponDirection select 2) -]; +GVAR(Position) = (getPosASL _vehicle) vectorAdd (_weaponDirection vectorMultiply _distance); diff --git a/addons/fcs/functions/fnc_keyUp.sqf b/addons/fcs/functions/fnc_keyUp.sqf index 37390c0b47..ebbd6e3a06 100644 --- a/addons/fcs/functions/fnc_keyUp.sqf +++ b/addons/fcs/functions/fnc_keyUp.sqf @@ -1,40 +1,38 @@ /* * Author: KoffeinFlummi - * * Calculates the offsets for all weapons needed to hit the current target. * * Arguments: - * 0: The vehicle + * 0: Vehicle + * 1: Turret * * Return Value: - * none + * None + * + * Public: No */ - #include "script_component.hpp" -private ["_vehicle", "_turret", "_turretConfig", "_distance", "_weapons", "_magazines", "_showHint", "_playSound", "_i"]; +params ["_vehicle", "_turret", "_distance", ["_showHint", false], ["_playSound", true]]; -_vehicle = _this select 0; -_turret = _this select 1; +private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); -_turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); +call (updateRangeHUD); -_distance = call FUNC(getRange); +if (isNil "_distance") then { + _distance = call FUNC(getRange); -_weapons = _vehicle weaponsTurret _turret; -_magazines = _vehicle magazinesTurret _turret; - -if (_distance == 0) then { - _distance = [ - getNumber (_turretConfig >> QGVAR(DistanceInterval)), - getNumber (_turretConfig >> QGVAR(MaxDistance)), - getNumber (_turretConfig >> QGVAR(MinDistance)) - ] call EFUNC(common,getTargetDistance); // maximum distance: 5000m, 5m precision + if (_distance == 0) then { + _distance = [ + getNumber (_turretConfig >> QGVAR(DistanceInterval)), + getNumber (_turretConfig >> QGVAR(MaxDistance)), + getNumber (_turretConfig >> QGVAR(MinDistance)) + ] call EFUNC(common,getTargetDistance); // maximum distance: 5000m, 5m precision + }; }; -private ["_weapon", "_weaponDirection", "_angleTarget"]; -_weapon = _vehicle currentWeaponTurret _turret; -_weaponDirection = _vehicle weaponDirection _weapon; // @todo doesn't work for sub turrets +private _weapon = _vehicle currentWeaponTurret _turret; +private _weaponDirection = _vehicle weaponDirection _weapon; // @todo doesn't work for sub turrets if (_turret isEqualTo ([_vehicle] call EFUNC(common,getTurretCommander))) then { _weaponDirection = eyeDirection _vehicle; @@ -44,176 +42,139 @@ if (_weaponDirection isEqualTo [0,0,0]) then { // dummy value for non main turr _weaponDirection = [1,0,0]; }; -_angleTarget = asin (_weaponDirection select 2); - -if (count _this > 2) then { - if((_this select 2) > -1) then { - _distance = _this select 2; - }; -}; - -if (!(isNil QGVAR(backgroundCalculation)) and {!(scriptDone GVAR(backgroundCalculation))}) then { - terminate GVAR(backgroundCalculation); -}; - -private ["_movingAzimuth", "_posTarget", "_velocityTarget"]; +private _angleTarget = asin (_weaponDirection select 2); // MOVING TARGETS -_movingAzimuth = 0; -if (ACE_time - GVAR(time) > 1 and GVAR(time) != -1 and count _this < 3) then { - // calculate speed of target - _posTarget = [ - (getPos _vehicle select 0) + _distance * (_weaponDirection select 0), - (getPos _vehicle select 1) + _distance * (_weaponDirection select 1), - (getPos _vehicle select 2) + _distance * (_weaponDirection select 2) - ]; - _velocityTarget = [ - ((_posTarget select 0) - (GVAR(position) select 0)) / (ACE_time - GVAR(time)), - ((_posTarget select 1) - (GVAR(position) select 1)) / (ACE_time - GVAR(time)), - ((_posTarget select 2) - (GVAR(position) select 2)) / (ACE_time - GVAR(time)) - ]; +private _movingAzimuth = 0; - private ["_magazineType", "_ammoType", "_initSpeed", "_airFriction", "_timeToLive", "_simulationStep", "_initSpeedCoef", "_velocityMagnitude"]; +if (ACE_time - GVAR(time) > 1 && GVAR(time) != -1 && isNil {_this select 2}) then { + // calculate speed of target + private _posTarget = (getPosASL _vehicle) vectorAdd (_weaponDirection vectorMultiply _distance); + private _velocityTarget = (_posTarget vectorDiff GVAR(position)) vectorMultiply (1 / (ACE_time - GVAR(time))); // estimate time to target - _magazineType = _vehicle currentMagazineTurret _turret; - _ammoType = getText (configFile >> "CfgMagazines" >> _magazineType >> "ammo"); - _initSpeed = getNumber (configFile >> "CfgMagazines" >> _magazineType >> "initSpeed"); - _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammoType >> "airFriction"); - _timeToLive = getNumber (configFile >> "CfgAmmo" >> _ammoType >> "timeToLive"); - _simulationStep = getNumber (configFile >> "CfgAmmo" >> _ammoType >> "simulationStep"); + private _magazine = _vehicle currentMagazineTurret _turret; + private _ammo = getText (configFile >> "CfgMagazines" >> _magazine >> "ammo"); + private _initSpeed = getNumber (configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); + private _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); + private _timeToLive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "timeToLive"); + private _simulationStep = getNumber (configFile >> "CfgAmmo" >> _ammo >> "simulationStep"); + private _initSpeedCoef = getNumber (configFile >> "CfgWeapons" >> _weapon >> "initSpeed"); - _initSpeedCoef = getNumber(configFile >> "CfgWeapons" >> _weapon >> "initSpeed"); if (_initSpeedCoef < 0) then { - _initSpeed = _initSpeed * -_initSpeedCoef; + _initSpeed = _initSpeed * - _initSpeedCoef; }; + if (_initSpeedCoef > 0) then { _initSpeed = _initSpeedCoef; }; if (_simulationStep != 0) then { - private ["_posX", "_velocityX", "_velocityY", "_timeToTarget"]; + private _posX = 0; + private _velocityX = _initSpeed; + private _velocityY = 0; + private _timeToTarget = 0; - _posX = 0; - _velocityX = _initSpeed; - _velocityY = 0; - _timeToTarget = 0; - - for "_i" from 1 to ((floor (_timeToLive / _simulationStep)) + 1) do { + for "_i" from 1 to (floor (_timeToLive / _simulationStep) + 1) do { _posX = _posX + _velocityX * _simulationStep; + if (_posX >= _distance) exitWith { // bullet passed the target _timeToTarget = _i * _simulationStep; }; - _velocityMagnitude = sqrt (_velocityX^2 + _velocityY^2); + + private _velocityMagnitude = sqrt (_velocityX ^ 2 + _velocityY ^ 2); + _velocityX = _velocityX + _velocityX * _velocityMagnitude * _airFriction * _simulationStep; _velocityY = _velocityY + _velocityY * _velocityMagnitude * _airFriction * _simulationStep - 9.81 * _simulationStep; }; - private ["_posArrival", "_dirArrival"]; - // calculate offsets - _posArrival = [ - (_posTarget select 0) + (_velocityTarget select 0) * _timeToTarget, - (_posTarget select 1) + (_velocityTarget select 1) * _timeToTarget, - (_posTarget select 2) + (_velocityTarget select 2) * _timeToTarget - ]; - - _dirArrival = [ - ((_posArrival select 0) - (getPos _vehicle select 0)) / (_posArrival distance (getPos _vehicle)), - ((_posArrival select 1) - (getPos _vehicle select 1)) / (_posArrival distance (getPos _vehicle)), - ((_posArrival select 2) - (getPos _vehicle select 2)) / (_posArrival distance (getPos _vehicle)) - ]; + private _posArrival = _posTarget vectorAdd (_velocityTarget vectorMultiply _timeToTarget); + private _dirArrival = (_posArrival vectorDiff getPosASL _vehicle) vectorMultiply (1 / (_posArrival vectorDistance getPosASL _vehicle)); _movingAzimuth = ((_dirArrival select 0) atan2 (_dirArrival select 1)) - ((_weaponDirection select 0) atan2 (_weaponDirection select 1)); _angleTarget = asin (_dirArrival select 2); - _distance = floor (_posArrival distance (getPos _vehicle)); + _distance = floor (_posArrival distance (getPosASL _vehicle)); }; }; + GVAR(enabled) = false; GVAR(time) = -1; -private ["_viewDiff", "_FCSAzimuth", "_FCSMagazines", "_FCSElevation"]; - // CALCULATE AZIMUTH CORRECTION -_viewDiff = _vehicle getVariable format ["%1_%2", QGVAR(ViewDiff), _turret]; -_FCSAzimuth = _movingAzimuth; +private _viewDiff = _vehicle getVariable format ["%1_%2", QGVAR(ViewDiff), _turret]; +private _FCSAzimuth = _movingAzimuth; if (_viewDiff != 0) then { _FCSAzimuth = (atan (_distance / _viewDiff) - (abs _viewDiff / _viewDiff) * 90) + _movingAzimuth; }; // CALCULATE OFFSET -_FCSMagazines = []; -_FCSElevation = []; +private _FCSMagazines = []; +private _FCSElevation = []; { - private ["_magazine", "_ammoType"]; - _magazine = _x; - _ammoType = getText (configFile >> "CfgMagazines" >> _magazine >> "ammo"); + private _magazine = _x; + private _ammo = getText (configFile >> "CfgMagazines" >> _magazine >> "ammo"); - if !(getText (configFile >> "CfgAmmo" >> _ammoType >> "simulation") == "shotMissile") then { - private ["_maxElev", "_initSpeed", "_airFriction", "_offset"]; - - _maxElev = getNumber (_turretConfig >> "maxElev"); - _initSpeed = getNumber (configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); - _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammoType >> "airFriction"); + if !(getText (configFile >> "CfgAmmo" >> _ammo >> "simulation") == "shotMissile") then { + private _maxElev = getNumber (_turretConfig >> "maxElev"); + private _initSpeed = getNumber (configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); + private _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); { private ["_weapon", "_muzzles", "_weaponMagazines", "_muzzleMagazines"]; _weapon = _x; _muzzles = getArray (configFile >> "CfgWeapons" >> _weapon >> "muzzles"); _weaponMagazines = getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines"); + { if (_x != "this") then { _muzzleMagazines = getArray (configFile >> "CfgWeapons" >> _weapon >> _x >> "magazines"); _weaponMagazines append _muzzleMagazines; }; - } forEach _muzzles; + false + } count _muzzles; + if (_magazine in _weaponMagazines) exitWith { _initSpeedCoef = getNumber(configFile >> "CfgWeapons" >> _weapon >> "initSpeed"); + if (_initSpeedCoef < 0) then { _initSpeed = _initSpeed * -_initSpeedCoef; }; + if (_initSpeedCoef > 0) then { _initSpeed = _initSpeedCoef; }; }; - } forEach _weapons; + false + } count (_vehicle weaponsTurret _turret); - _offset = "ace_fcs" callExtension format ["%1,%2,%3,%4", _initSpeed, _airFriction, _angleTarget, _distance]; + private _offset = "ace_fcs" callExtension format ["%1,%2,%3,%4", _initSpeed, _airFriction, _angleTarget, _distance]; _offset = parseNumber _offset; - _FCSMagazines = _FCSMagazines + [_magazine]; - _FCSElevation = _FCSElevation + [_offset]; + _FCSMagazines pushBack _magazine; + _FCSElevation pushBack _offset; }; -} forEach _magazines; + false +} count (_vehicle magazinesTurret _turret); -[_vehicle, format ["%1_%2", QGVAR(Distance), _turret], _distance] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Distance), _turret], _distance] call EFUNC(common,setVariablePublic); [_vehicle, format ["%1_%2", QGVAR(Magazines), _turret], _FCSMagazines] call EFUNC(common,setVariablePublic); [_vehicle, format ["%1_%2", QGVAR(Elevation), _turret], _FCSElevation] call EFUNC(common,setVariablePublic); -[_vehicle, format ["%1_%2", QGVAR(Azimuth), _turret], _FCSAzimuth] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(Azimuth), _turret], _FCSAzimuth] call EFUNC(common,setVariablePublic); -_showHint = false; -if( (count _this) > 3) then { - _showHint = _this select 3; -}; - -_playSound = true; -if( (count _this) > 3) then { - _playSound = _this select 4; -}; - -if(_playSound) then { +if (_playSound) then { playSound "ACE_Sound_Click"; }; -if(_showHint) then { +if (_showHint) then { [format ["%1: %2", localize LSTRING(ZeroedTo), _distance]] call EFUNC(common,displayTextStructured); }; //Update the hud's distance display to the new value or "----" if out of range //(10m fudge because of EFUNC(common,getTargetDistance)) -if ((_distance + 10) >= (getNumber (_turretConfig >> QGVAR(MaxDistance)))) then { +if (_distance + 10 >= getNumber (_turretConfig >> QGVAR(MaxDistance))) then { ((uiNamespace getVariable ["ACE_dlgRangefinder", displayNull]) displayCtrl 1713151) ctrlSetText "----"; } else { ((uiNamespace getVariable ["ACE_dlgRangefinder", displayNull]) displayCtrl 1713151) ctrlSetText ([_distance, 4, 0] call CBA_fnc_formatNumber); diff --git a/addons/fcs/functions/fnc_onForceUpdate.sqf b/addons/fcs/functions/fnc_onForceUpdate.sqf index 6f477fd3f6..005a0d7801 100644 --- a/addons/fcs/functions/fnc_onForceUpdate.sqf +++ b/addons/fcs/functions/fnc_onForceUpdate.sqf @@ -1,7 +1,13 @@ #include "script_component.hpp" -if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; +params ["_unit"]; + +private _vehicle = vehicle _unit; + +if !([_unit, _vehicle, []] call EFUNC(common,canInteractWith)) exitWith {false}; if !((!GVAR(enabled) && FUNC(canUseFCS)) || FUNC(canUseRangefinder)) exitWith {false}; -[vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex), -1, false] call FUNC(keyDown); -[vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex), -1, false, false] call FUNC(keyUp); \ No newline at end of file +private _turret = _unit call EFUNC(common,getTurretIndex); + +[_vehicle, _turret, -1, false] call FUNC(keyDown); +[_vehicle, _turret, -1, false, false] call FUNC(keyUp); diff --git a/addons/fcs/functions/fnc_reset.sqf b/addons/fcs/functions/fnc_reset.sqf index 48e3803c83..dcb1718b3f 100644 --- a/addons/fcs/functions/fnc_reset.sqf +++ b/addons/fcs/functions/fnc_reset.sqf @@ -1,21 +1,19 @@ /* * Author: KoffeinFlummi - * * Resets the FCS to default. * * Arguments: - * 0: Vehicle + * 0: Vehicle + * 1: Turret * * Return Value: * none + * + * Public: No */ - #include "script_component.hpp" -private ["_vehicle", "_turret"]; - -_vehicle = _this select 0; -_turret = _this select 1; +params ["_vehicle", "_turret"]; [_vehicle, format ["%1_%2", QGVAR(Distance), _turret], 0] call EFUNC(common,setVariablePublic); [_vehicle, format ["%1_%2", QGVAR(Magazines), _turret], []] call EFUNC(common,setVariablePublic); diff --git a/addons/fcs/functions/fnc_updateRangeHUD.sqf b/addons/fcs/functions/fnc_updateRangeHUD.sqf new file mode 100644 index 0000000000..374254c620 --- /dev/null +++ b/addons/fcs/functions/fnc_updateRangeHUD.sqf @@ -0,0 +1,18 @@ +/* + * Author: commy2 + * Update compatible info elements. + * + * Argument: + * None + * + * Return value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +disableSerialization; +private _dlgRangefinder = uiNamespace getVariable ["ACE_dlgRangefinder", displayNull]; + +(_dlgRangefinder displayCtrl 1713151) ctrlSetText ctrlText (_dlgRangefinder displayCtrl 151); diff --git a/addons/fcs/functions/fnc_vehicleInit.sqf b/addons/fcs/functions/fnc_vehicleInit.sqf index 8ac23073f6..901e0477ab 100644 --- a/addons/fcs/functions/fnc_vehicleInit.sqf +++ b/addons/fcs/functions/fnc_vehicleInit.sqf @@ -1,6 +1,5 @@ /* * Author: KoffeinFlummi, commy2 - * * Checks if a vehicle is equipped with an FCS and if so, adds the fired event handler. Execute on server. * * Arguments: @@ -8,17 +7,15 @@ * * Return Value: * none + * + * Public: No */ - #include "script_component.hpp" -private "_vehicle"; - -_vehicle = _this select 0; +params ["_vehicle"]; { - private "_turretConfig"; - _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); + private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); if (getNumber (_turretConfig >> QGVAR(Enabled)) == 1) then { _vehicle setVariable [format ["%1_%2", QGVAR(Distance), _x], 0, true]; @@ -42,4 +39,5 @@ _vehicle = _this select 0; _vehicle setVariable [format ["%1_%2", QGVAR(ViewDiff), _x], 0, true]; }; }; -} forEach allTurrets _vehicle; + false +} count allTurrets _vehicle; diff --git a/addons/fcs/initKeybinds.sqf b/addons/fcs/initKeybinds.sqf index 3b22cb2262..a302776741 100644 --- a/addons/fcs/initKeybinds.sqf +++ b/addons/fcs/initKeybinds.sqf @@ -28,7 +28,7 @@ [vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex)] call FUNC(keyUp); false }, -[15, [false, false, false]], false] call cba_fnc_addKeybind; //Tab Key +[15, [false, false, false]], false] call CBA_fnc_addKeybind; //Tab Key ["ACE3 Vehicles", QGVAR(adjustRangeUp), localize LSTRING(AdjustRangeUp), { @@ -42,7 +42,7 @@ true }, {false}, -[201, [false, false, false]], false] call cba_fnc_addKeybind; //PageUp Key +[201, [false, false, false]], false] call CBA_fnc_addKeybind; //PageUp Key ["ACE3 Vehicles", QGVAR(adjustRangDown), localize LSTRING(AdjustRangeDown), { @@ -56,4 +56,4 @@ true }, {false}, -[209, [false, false, false]], false] call cba_fnc_addKeybind; //PageDown Key +[209, [false, false, false]], false] call CBA_fnc_addKeybind; //PageDown Key