From ec64a1b0ca79368b50e67642f1e364953d59c16a Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 2 Apr 2015 09:35:36 -0700 Subject: [PATCH 01/43] Changed: Laser functionality tweaking Changed: DAGR deflection refinement Clean up of tabs --- addons/laser/CfgEventhandlers.hpp | 12 +- addons/laser/CfgVehicles.hpp | 12 +- addons/laser/XEH_pre_init.sqf | 2 +- addons/laser/config.cpp | 14 +- addons/laser/functions/fnc_checkLos.sqf | 12 +- .../functions/fnc_findLaserDesignator.sqf | 108 ++--- .../laser/functions/fnc_findStrongestRay.sqf | 58 +-- addons/laser/functions/fnc_laserTargetPFH.sqf | 8 +- addons/laser/functions/fnc_laser_init.sqf | 10 +- addons/laser/functions/fnc_shootCone.sqf | 72 +-- addons/laser/functions/fnc_shootRay.sqf | 32 +- .../functions/fnc_translateToWeaponSpace.sqf | 8 +- addons/laser/script_component.hpp | 4 +- .../laser_selfdesignate/CfgEventhandlers.hpp | 4 +- .../functions/fnc_laserHudDesignateOff.sqf | 6 +- .../functions/fnc_laserHudDesignateOn.sqf | 141 +++--- .../laser_selfdesignate/script_component.hpp | 4 +- addons/missileguidance/CfgAmmo.hpp | 16 +- addons/missileguidance/CfgEventhandlers.hpp | 18 +- addons/missileguidance/CfgWeapons.hpp | 62 +-- addons/missileguidance/config.cpp | 14 +- .../missileguidance/functions/fnc_fired.sqf | 12 +- .../functions/fnc_guidance_DAGR.sqf | 201 ++++---- .../functions/fnc_guidance_HellfireII.sqf | 450 +++++++++--------- .../functions/fnc_guidance_LGB.sqf | 188 ++++---- .../functions/fnc_translateToWeaponSpace.sqf | 8 +- addons/missileguidance/script_component.hpp | 4 +- 27 files changed, 747 insertions(+), 733 deletions(-) diff --git a/addons/laser/CfgEventhandlers.hpp b/addons/laser/CfgEventhandlers.hpp index 1fcfc0244f..bad89fd048 100644 --- a/addons/laser/CfgEventhandlers.hpp +++ b/addons/laser/CfgEventhandlers.hpp @@ -1,11 +1,11 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_pre_init)); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_pre_init)); + }; }; class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_post_init)); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_post_init)); + }; }; diff --git a/addons/laser/CfgVehicles.hpp b/addons/laser/CfgVehicles.hpp index 1c5887bd38..07b8055f0e 100644 --- a/addons/laser/CfgVehicles.hpp +++ b/addons/laser/CfgVehicles.hpp @@ -1,9 +1,9 @@ class CfgVehicles { - class All; + class All; - class LaserTarget: All { - class EventHandlers { - init = QUOTE(_this call FUNC(laser_init)); - }; - }; + class LaserTarget: All { + class EventHandlers { + init = QUOTE(_this call FUNC(laser_init)); + }; + }; }; \ No newline at end of file diff --git a/addons/laser/XEH_pre_init.sqf b/addons/laser/XEH_pre_init.sqf index 8a4b3166b8..8b39c429b6 100644 --- a/addons/laser/XEH_pre_init.sqf +++ b/addons/laser/XEH_pre_init.sqf @@ -14,7 +14,7 @@ PREP(translateToWeaponSpace); PREP(laser_init); -GVAR(laser) = nil; // a single hud draws 1 laser at a time +GVAR(laser) = nil; // a single hud draws 1 laser at a time PREP(laserTargetPFH); diff --git a/addons/laser/config.cpp b/addons/laser/config.cpp index 711bd743b6..4b209b866e 100644 --- a/addons/laser/config.cpp +++ b/addons/laser/config.cpp @@ -1,13 +1,13 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = { "ace_common" }; - VERSION_CONFIG; - }; + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { "ace_common" }; + VERSION_CONFIG; + }; }; #include "CfgEventhandlers.hpp" diff --git a/addons/laser/functions/fnc_checkLos.sqf b/addons/laser/functions/fnc_checkLos.sqf index f0df153887..9888642a80 100644 --- a/addons/laser/functions/fnc_checkLos.sqf +++ b/addons/laser/functions/fnc_checkLos.sqf @@ -7,7 +7,7 @@ _designator = _this select 2; _seeker = _this select 3; _spacing = 100; if((count _this) > 4) then { - _spacing = _this select 4; + _spacing = _this select 4; }; _return = true; @@ -21,11 +21,11 @@ _pos2 = [(_pos2 select 0) + _x, (_pos2 select 1) + _y, (_pos2 select 2) + _z]; // player sideChat format["new los check"]; if(terrainIntersect [_pos2, _pos1]) then { - _return = false; + _return = false; } else { - if(lineIntersects [_pos2, _pos1]) then { // should take as arguments and add to this command objects to exclude - target and observer - // player sideChat format["with: %1", lineIntersectsWith [_pos1, _pos2]]; - _return = false; - }; + if(lineIntersects [_pos2, _pos1]) then { // should take as arguments and add to this command objects to exclude - target and observer + // player sideChat format["with: %1", lineIntersectsWith [_pos1, _pos2]]; + _return = false; + }; }; _return; \ No newline at end of file diff --git a/addons/laser/functions/fnc_findLaserDesignator.sqf b/addons/laser/functions/fnc_findLaserDesignator.sqf index 8a2e4caf29..73a9462457 100644 --- a/addons/laser/functions/fnc_findLaserDesignator.sqf +++ b/addons/laser/functions/fnc_findLaserDesignator.sqf @@ -1,70 +1,70 @@ #include "script_component.hpp" private ["_missile", "_headingPitch", "_found", "_vectorTo", "_polarTo", "_dir", "_vertOk", "_horzOk", "_fov", - "_closestDistance", "_pos1", "_pos2", "_disCheck", "_currentTarget", "_potentialTargets", "_offset", "_vector"]; + "_closestDistance", "_pos1", "_pos2", "_disCheck", "_currentTarget", "_potentialTargets", "_offset", "_vector"]; _missile = _this select 0; _laserCode = _this select 1; _fov = if (count _this > 2) then {_this select 2} else {75}; _vector = if (count _this > 3) then {_this select 3} else {vectorDir _missile}; _offset = if (count _this > 4) then {_this select 4} else {[0,0,0]}; -_headingPitch = _vector call CBA_fnc_vect2polar; +_headingPitch = _vector call CBA_fnc_vect2polar; _currentTarget = nil; _found = false; LOG("Searching lasers"); if(!(isNil "ACE_LASERS")) then { - _potentialTargets = []; - TRACE_1("", ACE_LASERS); - - { - if(!(isNull _x)) then { - _sensorPos = ATLtoASL(_missile modelToWorld _offset); - _vectorTo = [_sensorPos, ([_x] call FUNC(getPosASL))] call BIS_fnc_vectorFromXToY; - _polarTo = _vectorTo call CBA_fnc_vect2polar; - _dir = _polarTo select 1; - _dir = _dir - (_headingPitch select 1); - - TRACE_4("Calc", _sensorPos, _vectorTo, _polarTo, _dir); - - if (_dir < 0) then {_dir = _dir + 360}; - if (_dir > 360) then {_dir = _dir - 360}; - _vertOk = false; - _horzOk = false; - if(_dir < _fov || {_dir > (360-_fov)}) then { - _horzOk = true; - }; - if(abs((abs(_polarTo select 2))-(abs(_headingPitch select 2))) < _fov) then { - _vertOk = true; - }; - - TRACE_2("Results", _vertOk, _horzOk); - - if(_vertOk && {_horzOk}) then { - // Does the laser currently have our current code, if we have one? - _targetCode = _x getVariable ["ACE_LASERTARGET_CODE", ACE_DEFAULT_LASER_CODE]; - TRACE_1("Target in sight, checking code", _targetCode, _laserCode); - if(_targetCode == _laserCode) then { - _potentialTargets set[(count _potentialTargets), _x]; - }; - }; - }; - - } forEach ACE_LASERS; - - TRACE_1("", _potentialTargets); - - _closestDistance = 100000; - { - _pos1 = (getPosASL _missile); - _pos2 = ([_x] call FUNC(getPosASL)); - _disCheck = _pos1 distance _pos2; - // shouldn't this bail out when a valid target is found instead of iterating over all potential targets ? - if(_disCheck < _closestDistance && {[_pos1, _pos2, _x, _missile] call FUNC(checkLos)}) then { - _found = true; - _currentTarget = _x; - _closestDistance = _disCheck; - }; - } forEach _potentialTargets; + _potentialTargets = []; + TRACE_1("", ACE_LASERS); + + { + if(!(isNull _x)) then { + _sensorPos = ATLtoASL(_missile modelToWorld _offset); + _vectorTo = [_sensorPos, ([_x] call FUNC(getPosASL))] call BIS_fnc_vectorFromXToY; + _polarTo = _vectorTo call CBA_fnc_vect2polar; + _dir = _polarTo select 1; + _dir = _dir - (_headingPitch select 1); + + TRACE_4("Calc", _sensorPos, _vectorTo, _polarTo, _dir); + + if (_dir < 0) then {_dir = _dir + 360}; + if (_dir > 360) then {_dir = _dir - 360}; + _vertOk = false; + _horzOk = false; + if(_dir < _fov || {_dir > (360-_fov)}) then { + _horzOk = true; + }; + if(abs((abs(_polarTo select 2))-(abs(_headingPitch select 2))) < _fov) then { + _vertOk = true; + }; + + TRACE_2("Results", _vertOk, _horzOk); + + if(_vertOk && {_horzOk}) then { + // Does the laser currently have our current code, if we have one? + _targetCode = _x getVariable ["ACE_LASERTARGET_CODE", ACE_DEFAULT_LASER_CODE]; + TRACE_1("Target in sight, checking code", _targetCode, _laserCode); + if(_targetCode == _laserCode) then { + _potentialTargets set[(count _potentialTargets), _x]; + }; + }; + }; + + } forEach ACE_LASERS; + + TRACE_1("", _potentialTargets); + + _closestDistance = 100000; + { + _pos1 = (getPosASL _missile); + _pos2 = ([_x] call FUNC(getPosASL)); + _disCheck = _pos1 distance _pos2; + // shouldn't this bail out when a valid target is found instead of iterating over all potential targets ? + if(_disCheck < _closestDistance && {[_pos1, _pos2, _x, _missile] call FUNC(checkLos)}) then { + _found = true; + _currentTarget = _x; + _closestDistance = _disCheck; + }; + } forEach _potentialTargets; }; [_found, _currentTarget] \ No newline at end of file diff --git a/addons/laser/functions/fnc_findStrongestRay.sqf b/addons/laser/functions/fnc_findStrongestRay.sqf index db85ce8b3d..e4238361cb 100644 --- a/addons/laser/functions/fnc_findStrongestRay.sqf +++ b/addons/laser/functions/fnc_findStrongestRay.sqf @@ -7,43 +7,43 @@ _outliers = []; _spot = []; _testPos = (_list select 0) select 0; { - _samplePos = _x select 0; - if(!lineIntersects [_samplePos, _checkPos] && {!terrainIntersectASL [_samplePos, _checkPos]}) then { - if(_samplePos distance _testPos < 2) then { - _spot pushBack _samplePos; - } else { - _outliers pushBack _samplePos; - }; - }; + _samplePos = _x select 0; + if(!lineIntersects [_samplePos, _checkPos] && {!terrainIntersectASL [_samplePos, _checkPos]}) then { + if(_samplePos distance _testPos < 2) then { + _spot pushBack _samplePos; + } else { + _outliers pushBack _samplePos; + }; + }; } forEach _list; _spots pushBack _spot; if(count _outliers > 0) then { - for "_i" from 1 to 3 do { - _remainingSpots = _outliers; - _outliers = []; - _spot = []; - _testPos = (_remainingSpots select 0); - { - _samplePos = _x; - if(!lineIntersects [_samplePos, _checkPos] && {!terrainIntersectASL [_samplePos, _checkPos]}) then { - if(_samplePos distance _testPos < 2) then { - _spot pushBack _samplePos; - } else { - _outliers pushBack _samplePos; - }; - }; - } forEach _remainingSpots; - _spots pushBack _spot; - }; + for "_i" from 1 to 3 do { + _remainingSpots = _outliers; + _outliers = []; + _spot = []; + _testPos = (_remainingSpots select 0); + { + _samplePos = _x; + if(!lineIntersects [_samplePos, _checkPos] && {!terrainIntersectASL [_samplePos, _checkPos]}) then { + if(_samplePos distance _testPos < 2) then { + _spot pushBack _samplePos; + } else { + _outliers pushBack _samplePos; + }; + }; + } forEach _remainingSpots; + _spots pushBack _spot; + }; }; _largest = 0; _largestSpot = []; { - if((count _x) > _largest) then { - _largest = (count _x); - _largestSpot = _x; - }; + if((count _x) > _largest) then { + _largest = (count _x); + _largestSpot = _x; + }; } forEach _spots; // player sideChat format["g: %1", _spots]; _largestSpot select (random (floor(count _largestSpot))); \ No newline at end of file diff --git a/addons/laser/functions/fnc_laserTargetPFH.sqf b/addons/laser/functions/fnc_laserTargetPFH.sqf index bf526f464e..bdab413685 100644 --- a/addons/laser/functions/fnc_laserTargetPFH.sqf +++ b/addons/laser/functions/fnc_laserTargetPFH.sqf @@ -6,8 +6,8 @@ _args = _this select 0; _laserTarget = _args select 0; if(isNull _laserTarget || !alive player) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - REM(ACE_LASERS, _laserTarget); + [(_this select 1)] call cba_fnc_removePerFrameHandler; + REM(ACE_LASERS, _laserTarget); }; _end = diag_tickTime; @@ -18,8 +18,8 @@ _pos = [_laserTarget] call FUNC(getPosASL); drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], (ASLtoATL _pos), 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; { - drawLine3D [ASLtoATL (_x select 0), ASLtoATL (_x select 1), (_x select 2)]; - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", (_x select 2), ASLtoATL (_x select 1), 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; + drawLine3D [ASLtoATL (_x select 0), ASLtoATL (_x select 1), (_x select 2)]; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", (_x select 2), ASLtoATL (_x select 1), 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; } forEach DRAW_LINES; DRAW_LINES = []; #endif diff --git a/addons/laser/functions/fnc_laser_init.sqf b/addons/laser/functions/fnc_laser_init.sqf index 4c6b0b5f2a..9fcb439032 100644 --- a/addons/laser/functions/fnc_laser_init.sqf +++ b/addons/laser/functions/fnc_laser_init.sqf @@ -16,10 +16,10 @@ REM(ACE_LASERS, objNull); if(!(local _laserTarget)) exitWith { }; // The target is local, so its on this client if(!isDedicated) then { - _laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", player, true]; - - [FUNC(laserTargetPFH), 0, [_laserTarget, player]] call cba_fnc_addPerFrameHandler; + _laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", player, true]; + + [FUNC(laserTargetPFH), 0, [_laserTarget, player]] call cba_fnc_addPerFrameHandler; } else { - // server side ownership of laser - //_laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", nil, false]; + // server side ownership of laser + //_laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", nil, false]; }; diff --git a/addons/laser/functions/fnc_shootCone.sqf b/addons/laser/functions/fnc_shootCone.sqf index 8d2d7fef66..e33edd10bc 100644 --- a/addons/laser/functions/fnc_shootCone.sqf +++ b/addons/laser/functions/fnc_shootCone.sqf @@ -17,50 +17,50 @@ _vecRotateMap = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); _result = [_pos, _vec] call FUNC(shootRay); _resultPos = _result select 0; if(!isNil "_resultPos") then { - _distance = _result select 1; - if(_distance < _shortestReturn) then { - _shortestReturn = _distance; - }; - if(_distance > _longestReturn) then { - _longestReturn = _distance; - }; - _resultPositions set[(count _resultPositions), _result]; + _distance = _result select 1; + if(_distance < _shortestReturn) then { + _shortestReturn = _distance; + }; + if(_distance > _longestReturn) then { + _longestReturn = _distance; + }; + _resultPositions set[(count _resultPositions), _result]; #ifdef DEBUG_MODE_FULL - DRAW_LINES set[(count DRAW_LINES), [_pos, _resultPos, [0, 1, 0, 1]]]; + DRAW_LINES set[(count DRAW_LINES), [_pos, _resultPos, [0, 1, 0, 1]]]; #endif }; _count = 8; _pos2 = [ - (_pos select 0)+((_vec select 0)*1000), - (_pos select 1)+((_vec select 1)*1000), - (_pos select 2)+((_vec select 2)*1000) - ]; + (_pos select 0)+((_vec select 0)*1000), + (_pos select 1)+((_vec select 1)*1000), + (_pos select 2)+((_vec select 2)*1000) + ]; { - for "_i" from 0 to ceil(_count*_x) do { - _radOffset = random 360; - _offset = [_vecRotateMap, (((360/_count)*_i)+_radOffset) mod 360] call FUNC(rotateVectLine); - _offsetPos = [ - (_pos2 select 0)+((_offset select 0)*(_divergence*_x)), - (_pos2 select 1)+((_offset select 1)*(_divergence*_x)), - (_pos2 select 2)+((_offset select 2)*(_divergence*_x)) - ]; - _offsetVector = [_pos, _offsetPos] call BIS_fnc_vectorFromXtoY; - _result = [_pos, _offsetVector] call FUNC(shootRay); - _resultPos = _result select 0; - if(!isNil "_resultPos") then { - _distance = _result select 1; - if(_distance < _shortestReturn) then { - _shortestReturn = _distance; - }; - if(_distance > _longestReturn) then { - _longestReturn = _distance; - }; - _resultPositions set[(count _resultPositions), _result]; + for "_i" from 0 to ceil(_count*_x) do { + _radOffset = random 360; + _offset = [_vecRotateMap, (((360/_count)*_i)+_radOffset) mod 360] call FUNC(rotateVectLine); + _offsetPos = [ + (_pos2 select 0)+((_offset select 0)*(_divergence*_x)), + (_pos2 select 1)+((_offset select 1)*(_divergence*_x)), + (_pos2 select 2)+((_offset select 2)*(_divergence*_x)) + ]; + _offsetVector = [_pos, _offsetPos] call BIS_fnc_vectorFromXtoY; + _result = [_pos, _offsetVector] call FUNC(shootRay); + _resultPos = _result select 0; + if(!isNil "_resultPos") then { + _distance = _result select 1; + if(_distance < _shortestReturn) then { + _shortestReturn = _distance; + }; + if(_distance > _longestReturn) then { + _longestReturn = _distance; + }; + _resultPositions set[(count _resultPositions), _result]; #ifdef DEBUG_MODE_FULL - DRAW_LINES set[(count DRAW_LINES), [_pos, _resultPos, [0, 1, 0, 1]]]; + DRAW_LINES set[(count DRAW_LINES), [_pos, _resultPos, [0, 1, 0, 1]]]; #endif - }; - }; + }; + }; } forEach [1,0.5,0.25]; [_longestReturn, _shortestReturn, _resultPositions]; \ No newline at end of file diff --git a/addons/laser/functions/fnc_shootRay.sqf b/addons/laser/functions/fnc_shootRay.sqf index 768194e351..62847d16b6 100644 --- a/addons/laser/functions/fnc_shootRay.sqf +++ b/addons/laser/functions/fnc_shootRay.sqf @@ -9,22 +9,22 @@ _resultPos = nil; _fidelity = [1000,100,10,1,0.1]; _lastPos = +_pos; { - scopeName "mainSearch"; - for "_i" from 1 to 10 do { - _nextPos = [ - (_lastPos select 0)+((_vec select 0)*_x), - (_lastPos select 1)+((_vec select 1)*_x), - (_lastPos select 2)+((_vec select 2)*_x) - ]; - - if(lineIntersects [_lastPos, _nextPos] || terrainIntersectASL [_lastPos, _nextPos]) then { - _resultPos = _lastPos; - breakTo "mainSearch"; - } else { - _distance = _distance + _x; - _lastPos = _nextPos; - }; - }; + scopeName "mainSearch"; + for "_i" from 1 to 10 do { + _nextPos = [ + (_lastPos select 0)+((_vec select 0)*_x), + (_lastPos select 1)+((_vec select 1)*_x), + (_lastPos select 2)+((_vec select 2)*_x) + ]; + + if(lineIntersects [_lastPos, _nextPos] || terrainIntersectASL [_lastPos, _nextPos]) then { + _resultPos = _lastPos; + breakTo "mainSearch"; + } else { + _distance = _distance + _x; + _lastPos = _nextPos; + }; + }; } forEach _fidelity; [_resultPos, _distance]; \ No newline at end of file diff --git a/addons/laser/functions/fnc_translateToWeaponSpace.sqf b/addons/laser/functions/fnc_translateToWeaponSpace.sqf index 406d81b145..2c7dc5e6da 100644 --- a/addons/laser/functions/fnc_translateToWeaponSpace.sqf +++ b/addons/laser/functions/fnc_translateToWeaponSpace.sqf @@ -14,9 +14,9 @@ _y = _offset select 1; _z = _offset select 2; _out = [ - ((_xVec select 0)*_x) + ((_xVec select 1)*_y) + ((_xVec select 2)*_z), - ((_yVec select 0)*_x) + ((_yVec select 1)*_y) + ((_yVec select 2)*_z), - ((_zVec select 0)*_x) + ((_zVec select 1)*_y) + ((_zVec select 2)*_z) - ]; + ((_xVec select 0)*_x) + ((_xVec select 1)*_y) + ((_xVec select 2)*_z), + ((_yVec select 0)*_x) + ((_yVec select 1)*_y) + ((_yVec select 2)*_z), + ((_zVec select 0)*_x) + ((_zVec select 1)*_y) + ((_zVec select 2)*_z) + ]; _out; \ No newline at end of file diff --git a/addons/laser/script_component.hpp b/addons/laser/script_component.hpp index afca689204..2be1e9e14b 100644 --- a/addons/laser/script_component.hpp +++ b/addons/laser/script_component.hpp @@ -2,11 +2,11 @@ #include "\z\ace\Addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_LASER - #define DEBUG_MODE_FULL + #define DEBUG_MODE_FULL #endif #ifdef DEBUG_SETTINGS_LASER - #define DEBUG_SETTINGS DEBUG_SETTINGS_LASER + #define DEBUG_SETTINGS DEBUG_SETTINGS_LASER #endif #include "\z\ace\Addons\main\script_macros.hpp" diff --git a/addons/laser_selfdesignate/CfgEventhandlers.hpp b/addons/laser_selfdesignate/CfgEventhandlers.hpp index ea33d05bcb..953687bb2b 100644 --- a/addons/laser_selfdesignate/CfgEventhandlers.hpp +++ b/addons/laser_selfdesignate/CfgEventhandlers.hpp @@ -13,7 +13,7 @@ class Extended_PostInit_EventHandlers { class Extended_GetIn_EventHandlers { class B_Heli_Attack_01_F { class ADDON { - getIn = QUOTE(call FUNC(onGetin)); + getIn = QUOTE(_this call FUNC(onGetin)); }; }; }; @@ -21,7 +21,7 @@ class Extended_GetIn_EventHandlers { class Extended_GetOut_EventHandlers { class B_Heli_Attack_01_F { class ADDON { - getOut = QUOTE(call FUNC(onGetout)); + getOut = QUOTE(_this call FUNC(onGetout)); }; }; }; diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf index 088f3d9303..2f4c437d28 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf @@ -1,15 +1,15 @@ #include "script_component.hpp" if(isNil QGVAR(laser)) exitWith { - false + false }; if(!local GVAR(laser)) then { - false + false }; _handle = GVAR(laser) getVariable ["ACE_PFH_HANDLE", nil]; if(!isNil "_handle") then { - [_handle] call cba_fnc_removePerFrameHandler; + [_handle] call cba_fnc_removePerFrameHandler; }; REM(ACE_LASERS, GVAR(laser)); diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index bac440c853..a58284ee34 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -4,87 +4,94 @@ TRACE_1("enter", _this); FUNC(magnitude) = { - _this distance [0, 0, 0] + _this distance [0, 0, 0] }; FUNC(mat_normalize3d) = { - private ["_mag"]; - PARAMS_3(_vx,_vy,_vz); + private ["_mag"]; + PARAMS_3(_vx,_vy,_vz); - _mag = _this call FUNC(magnitude); - if (_mag == 0) then {_mag = 1}; - [(_vx/_mag), (_vy/_mag), (_vz/_mag)] + _mag = _this call FUNC(magnitude); + if (_mag == 0) then {_mag = 1}; + [(_vx/_mag), (_vy/_mag), (_vz/_mag)] }; FUNC(laserHudDesignatePFH) = { - _args = _this select 0; - _laserTarget = _args select 0; - _shooter = _args select 1; - - _vehicle = vehicle _shooter; - _weapon = currentWeapon _vehicle; - - if(!alive _shooter || isNull _vehicle || isNull _laserTarget || !GVAR(laserActive) ) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - // Retrieve the gunner and turret memory point information - _gunnerInfo = [_vehicle, _weapon] call CBA_fnc_getFirer; - - _turret = [_vehicle, _gunnerInfo select 1] call CBA_fnc_getTurret; - _pov = getText (_turret >> "memoryPointGunnerOptics"); - _gunBeg = getText (_turret >> "gunBeg"); - _gunEnd = getText (_turret >> "gunEnd"); - TRACE_3("", _pov, _gunBeg, _gunEnd); + private["_args", "_laserTarget", "_shooter", "_vehicle", "_weapon", "_gunnerInfo", "_turret", "_pov", "_gunBeg", "_gunEnd", "_povPos", "_povDir", "_result", "_resultPositions", "_firstResult"]; + _args = _this select 0; + _laserTarget = _args select 0; + _shooter = _args select 1; + + _vehicle = vehicle _shooter; + _weapon = currentWeapon _vehicle; + + TRACE_1("", _args); + + if(!alive _shooter || isNull _vehicle || isNull _laserTarget || !GVAR(laserActive) ) exitWith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + // Retrieve the gunner and turret memory point information + _gunnerInfo = [_vehicle, _weapon] call CBA_fnc_getFirer; + + _turret = [_vehicle, _gunnerInfo select 1] call CBA_fnc_getTurret; + _pov = getText (_turret >> "memoryPointGunnerOptics"); + _gunBeg = getText (_turret >> "gunBeg"); + _gunEnd = getText (_turret >> "gunEnd"); + TRACE_3("", _pov, _gunBeg, _gunEnd); - // Pull the PIP pov or barrel direction, depending on how the model is set up - _povPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _pov ) ); - _povDir = [0,0,0]; - if(_pov == "pip0_pos") then { - _pipDir = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition "pip0_dir" ) ); - _povDir = [_povPos, _pipDir] call BIS_fnc_vectorDiff; - } else { - _gunBeginPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunBeg ) ); - _gunEndPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunEnd ) ); - _povDir = [_gunEndPos, _gunBeginPos] call BIS_fnc_vectorDiff; - }; - - TRACE_4("", _povDir, _povPos, _gunBeginPos, _gunEndPos); - - _result = [_povPos, _povDir] call EFUNC(laser,shootCone); - - if((count _result) > 0) then { - _resultPositions = _result select 2; + // Pull the PIP pov or barrel direction, depending on how the model is set up + _povPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _pov ) ); + _povDir = [0,0,0]; + if(_pov == "pip0_pos") then { + _pipDir = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition "pip0_dir" ) ); + _povDir = [_povPos, _pipDir] call BIS_fnc_vectorDiff; + } else { + _gunBeginPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunBeg ) ); + _gunEndPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunEnd ) ); + _povDir = [_gunEndPos, _gunBeginPos] call BIS_fnc_vectorDiff; + }; + + TRACE_4("", _povDir, _povPos, _gunBeginPos, _gunEndPos); + + _result = [_povPos, _povDir] call EFUNC(laser,shootCone); + + if((count _result) > 0) then { + _resultPositions = _result select 2; - if((count _resultPositions) > 0) then { - _firstResult = _resultPositions select 0; - _pos = _firstResult select 0; - - // If the laser has moved less than a half meter, then dont move it. - // Just regular use of lasers will commonly make them move this much, - // but not across multiple close frames. - // This loses accuracy a little, but saves position updates per frame. - //if( ((getPosASL _laserTarget) distance _pos) > 0.5) then { - _laserTarget setPosATL (ASLToATL _pos); - //}; + if((count _resultPositions) > 0) then { + _firstResult = _resultPositions select 0; + _pos = _firstResult select 0; + + // If the laser has moved less than a half meter, then dont move it. + // Just regular use of lasers will commonly make them move this much, + // but not across multiple close frames. + // This loses accuracy a little, but saves position updates per frame. + //if( ((getPosASL _laserTarget) distance _pos) > 0.5) then { + _laserTarget setPosATL (ASLToATL _pos); + //}; #ifdef DEBUG_MODE_FULL - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLToATL _pos, 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLToATL _pos, 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; #endif - }; - }; + }; + }; }; +private "_laserTarget"; +private "_handle"; + if(isNil QGVAR(laser)) then { - _laserTarget = "LaserTarget" createVehicle (getpos player); - - GVAR(laserActive) = true; - - _handle = [FUNC(laserHudDesignatePFH), 0, [_laserTarget, player]] call cba_fnc_addPerFrameHandler; - _laserTarget setVariable ["ACE_PFH_HANDLE", _handle, false]; - - GVAR(laser) = _laserTarget; + + _laserTarget = "LaserTargetW" createVehicle (getpos player); + + GVAR(laserActive) = true; + + _handle = [FUNC(laserHudDesignatePFH), 0, [_laserTarget, player]] call cba_fnc_addPerFrameHandler; + _laserTarget setVariable ["ACE_PFH_HANDLE", _handle, false]; + + GVAR(laser) = _laserTarget; } else { - [] call FUNC(laserHudDesignateOff); - [] call FUNC(laserHudDesignateOn); + [] call FUNC(laserHudDesignateOff); + [] call FUNC(laserHudDesignateOn); }; diff --git a/addons/laser_selfdesignate/script_component.hpp b/addons/laser_selfdesignate/script_component.hpp index c9742423df..46e9c48d2f 100644 --- a/addons/laser_selfdesignate/script_component.hpp +++ b/addons/laser_selfdesignate/script_component.hpp @@ -2,11 +2,11 @@ #include "\z\ace\Addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_LASER_SELFDESIGNATE - #define DEBUG_MODE_FULL + #define DEBUG_MODE_FULL #endif #ifdef DEBUG_SETTINGS_LASER_SELFDESIGNATE - #define DEBUG_SETTINGS DEBUG_SETTINGS_LASER_SELFDESIGNATE + #define DEBUG_SETTINGS DEBUG_SETTINGS_LASER_SELFDESIGNATE #endif #include "\z\ace\Addons\main\script_macros.hpp" diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index 1fdd580724..df876ae2ae 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -1,10 +1,10 @@ class CfgAmmo { - class MissileBase; - - class M_PG_AT : MissileBase { - irLock = 0; - laserLock = 0; - airLock = 0; - manualControl = 0; - }; + class MissileBase; + + class M_PG_AT : MissileBase { + irLock = 0; + laserLock = 0; + airLock = 0; + manualControl = 0; + }; }; \ No newline at end of file diff --git a/addons/missileguidance/CfgEventhandlers.hpp b/addons/missileguidance/CfgEventhandlers.hpp index faa5edef0b..2775490d11 100644 --- a/addons/missileguidance/CfgEventhandlers.hpp +++ b/addons/missileguidance/CfgEventhandlers.hpp @@ -1,17 +1,17 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_pre_init)); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_pre_init)); + }; }; class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_post_init)); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_post_init)); + }; }; class Extended_FiredBIS_EventHandlers { - class AllVehicles { - ADDON = QUOTE(_this call FUNC(fired)); - }; + class AllVehicles { + ADDON = QUOTE(_this call FUNC(fired)); + }; }; \ No newline at end of file diff --git a/addons/missileguidance/CfgWeapons.hpp b/addons/missileguidance/CfgWeapons.hpp index d2961604b6..739ef3c5e0 100644 --- a/addons/missileguidance/CfgWeapons.hpp +++ b/addons/missileguidance/CfgWeapons.hpp @@ -1,34 +1,34 @@ class Mode_SemiAuto; class CfgWeapons { - class CannonCore; - class LauncherCore; - - class RocketPods: LauncherCore { - canLock = 1; - }; - class missiles_DAGR: RocketPods { - canLock = 1; - }; - /* - class autocannon_Base_F: CannonCore { - canLock = 1; - }; - class cannon_120mm: CannonCore { - canLock = 1; - - class player : Mode_SemiAuto { - canLock = 1; - }; - }; - class gatling_25mm: CannonCore { - canLock = 1; - }; - class autocannon_35mm: CannonCore { - canLock = 1; - }; - - class launch_NLAW_F: Launcher_Base_F - { - canLock = 1; - };*/ + class CannonCore; + class LauncherCore; + + class RocketPods: LauncherCore { + canLock = 1; + }; + class missiles_DAGR: RocketPods { + canLock = 1; + }; + /* + class autocannon_Base_F: CannonCore { + canLock = 1; + }; + class cannon_120mm: CannonCore { + canLock = 1; + + class player : Mode_SemiAuto { + canLock = 1; + }; + }; + class gatling_25mm: CannonCore { + canLock = 1; + }; + class autocannon_35mm: CannonCore { + canLock = 1; + }; + + class launch_NLAW_F: Launcher_Base_F + { + canLock = 1; + };*/ }; \ No newline at end of file diff --git a/addons/missileguidance/config.cpp b/addons/missileguidance/config.cpp index 6720559ccc..9c5842a065 100644 --- a/addons/missileguidance/config.cpp +++ b/addons/missileguidance/config.cpp @@ -1,13 +1,13 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = { "ace_common", "ace_laser" }; - VERSION_CONFIG; - }; + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { "ace_common", "ace_laser" }; + VERSION_CONFIG; + }; }; #include "CfgEventhandlers.hpp" diff --git a/addons/missileguidance/functions/fnc_fired.sqf b/addons/missileguidance/functions/fnc_fired.sqf index 3b4f4b3635..dbe6abfec7 100644 --- a/addons/missileguidance/functions/fnc_fired.sqf +++ b/addons/missileguidance/functions/fnc_fired.sqf @@ -7,12 +7,12 @@ PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); if(!local _shooter) exitWith { false }; switch _weapon do { - case "missiles_DAGR": { - _this call FUNC(guidance_DAGR); - }; - case "GBU12BombLauncher": { - _this call FUNC(guidance_LGB); - }; + case "missiles_DAGR": { + _this call FUNC(guidance_DAGR); + }; + case "GBU12BombLauncher": { + _this call FUNC(guidance_LGB); + }; }; //_this call FUNC(guidance_HellfireII); diff --git a/addons/missileguidance/functions/fnc_guidance_DAGR.sqf b/addons/missileguidance/functions/fnc_guidance_DAGR.sqf index 4461c1223f..3bef324931 100644 --- a/addons/missileguidance/functions/fnc_guidance_DAGR.sqf +++ b/addons/missileguidance/functions/fnc_guidance_DAGR.sqf @@ -2,112 +2,119 @@ #include "script_component.hpp" FUNC(guidance_DIRECT_LOAL_PFH) = { - //TRACE_1("enter", _this); - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _shooter = _args select 0; - _dagr = _args select 6; - _curVelocity = velocity _dagr; - - if(!alive _dagr || isNull _dagr || isNull _shooter) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _targets = [_dagr, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace_laser_fnc_findLaserDesignator; - TRACE_2("Targets", _target, _targets); - - if((_targets select 0)) then { - _target = _targets select 1; - - // player sideChat "FUCK!"; - // drop ["\a3\data_f\Cl_basic","","Billboard",1,20,(getPos _dagr),[0,0,0],1,1.275,1.0,0.0,[5],[[1,0,0,1]],[0],0.0,2.0,"","",""]; - - - _yVec = vectorDir _dagr; - _zVec = vectorUp _dagr; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _dagrPos = getPosASL _dagr; - // player sideChat "G!"; - _targetPos = getPosASL _target; - if((count _targetPos) > 0) then { - _distanceToTarget = _dagrPos vectorDistance _targetPos; - - _addHeight = [0,0,(_dagrPos distance _targetPos)*0.02]; - #ifdef DEBUG_MODE_FULL - drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - #endif - - _targetPos = _targetPos vectorAdd _addHeight; + //TRACE_1("enter", _this); + private["_args", "_shooter", "_dagr", "_curVelocity", "_targets", "_target", "_yVec", "_xVec", "_zVec", "_dagrPos", "_shooterPos", "_distanceToTarget", "_distanceToShooter", "_def"]; + _args = _this select 0; + //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + _shooter = _args select 0; + _dagr = _args select 6; + _curVelocity = velocity _dagr; + + if(!alive _dagr || isNull _dagr || isNull _shooter) exitWith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + _targets = [_dagr, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace_laser_fnc_findLaserDesignator; + TRACE_2("Targets", _target, _targets); + + if((_targets select 0)) then { + _target = _targets select 1; + + // player sideChat "FUCK!"; + // drop ["\a3\data_f\Cl_basic","","Billboard",1,20,(getPos _dagr),[0,0,0],1,1.275,1.0,0.0,[5],[[1,0,0,1]],[0],0.0,2.0,"","",""]; + + + _yVec = vectorDir _dagr; + _zVec = vectorUp _dagr; + _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); + + _dagrPos = getPosASL _dagr; + // player sideChat "G!"; + _targetPos = getPosASL _target; + _shooterPos = getPosASL _shooter; + + if((count _targetPos) > 0) then { + _distanceToTarget = _dagrPos vectorDistance _targetPos; + _distanceToShooter = _dagrPos vectorDistance _shooterPos; + + _addHeight = [0,0,(_dagrPos distance _targetPos)*0.02]; + #ifdef DEBUG_MODE_FULL + drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; + #endif + + _targetPos = _targetPos vectorAdd _addHeight; - _def = 0.0050; - - _targetVectorSeeker = [_dagr, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - // _targetVectorSeeker = _dagr worldToModel (ASLtoATL _targetPos); - // _targetVectorSeeker = [0,0,0] vectorFromTo _targetVectorSeeker; - _yaw = 0.0; - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_def; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _def; - }; - }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_def; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _def; - }; - }; - #ifdef DEBUG_MODE_FULL - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _dagrPos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _dagrPos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _dagrPos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _dagrPos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; + _def = 0.0030; + if(_distanceToShooter > 100) then { + _def = 0.0020; + }; + + _targetVectorSeeker = [_dagr, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); + // _targetVectorSeeker = _dagr worldToModel (ASLtoATL _targetPos); + // _targetVectorSeeker = [0,0,0] vectorFromTo _targetVectorSeeker; + _yaw = 0.0; + if((_targetVectorSeeker select 0) < 0) then { + _yaw = -_def; + } else { + if((_targetVectorSeeker select 0) > 0) then { + _yaw = _def; + }; + }; + + _pitch = 0.0; + if((_targetVectorSeeker select 2) < 0) then { + _pitch = -_def; + } else { + if((_targetVectorSeeker select 2) > 0) then { + _pitch = _def; + }; + }; + #ifdef DEBUG_MODE_FULL + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _dagrPos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; + drawLine3D [ASLtoATL _dagrPos, ASLtoATL _targetPos, [1,0,0,1]]; + + _distance = ([getPos startPos, _dagrPos] call BIS_fnc_distance2D); + _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _dagrPos select 2]]; + _marker setMarkerTypeLocal "mil_dot"; + _marker setMarkerColorLocal "ColorRed"; - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - _outVector = [_dagr, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - // _outVector = _dagr modelToWorld [_yaw, 1, _pitch]; - // _outVector = ATLtoASL _outVector; - _vectorTo = _dagrPos vectorFromTo _outVector; - - // hintSilent format["v: %1", _vectorTo]; - - // _dagr setVectorDir _vectorTo; - _dagr setVectorDirAndUp [_vectorTo, vectorUp _dagr]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _distanceToTarget]; - #endif - }; - }; + MARKERCOUNT = MARKERCOUNT + 1; + #endif + + if(accTime > 0) then { + _outVector = [_dagr, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); + // _outVector = _dagr modelToWorld [_yaw, 1, _pitch]; + // _outVector = ATLtoASL _outVector; + _vectorTo = _dagrPos vectorFromTo _outVector; + + // hintSilent format["v: %1", _vectorTo]; + + // _dagr setVectorDir _vectorTo; + _dagr setVectorDirAndUp [_vectorTo, vectorUp _dagr]; + }; + + #ifdef DEBUG_MODE_FULL + hintSilent format["d: %1", _distanceToTarget]; + #endif + }; + }; }; FUNC(guidance_DAGR_DIRECT_LOAL) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - GVAR(lastTime) = time; - [FUNC(guidance_DIRECT_LOAL_PFH), 0, _this] call cba_fnc_addPerFrameHandler; + PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + + GVAR(lastTime) = time; + [FUNC(guidance_DIRECT_LOAL_PFH), 0, _this] call cba_fnc_addPerFrameHandler; }; PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); _fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_DEFAULT_FIRE_SELECTION]; switch (_fireMode select 0) do { - // Default to FIREMODE_DIRECT_LOAL - // FIREMODE_DIRECT_LOAL - default { - LOG("Initiating DAGR FIREMODE_DIRECT_LOAL"); - _this call FUNC(guidance_DAGR_DIRECT_LOAL); - }; + // Default to FIREMODE_DIRECT_LOAL + // FIREMODE_DIRECT_LOAL + default { + LOG("Initiating DAGR FIREMODE_DIRECT_LOAL"); + _this call FUNC(guidance_DAGR_DIRECT_LOAL); + }; }; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_guidance_HellfireII.sqf b/addons/missileguidance/functions/fnc_guidance_HellfireII.sqf index e6551ad4f4..72b8da8c67 100644 --- a/addons/missileguidance/functions/fnc_guidance_HellfireII.sqf +++ b/addons/missileguidance/functions/fnc_guidance_HellfireII.sqf @@ -2,248 +2,248 @@ #include "script_component.hpp" FUNC(guidance_Hellfire_LOAL_HI_PFH) = { - //TRACE_1("enter", _this); - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _shooter = _args select 0; - _missile = _args select 6; - _curVelocity = velocity _missile; - - if(!alive _missile || isNull _missile || isNull _shooter) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _launchPos = _shooter getVariable [QGVAR(launchPos), nil]; - if(isNil "_launchPos") then { - TRACE_1("Setting launch parameters", ""); - _launchPos = getPosASL _shooter; - _shooter setVariable [QGVAR(launchPos), _launchPos, false]; - _shooter setVariable [QGVAR(launchTime), diag_tickTime, false]; - }; - - _targets = [_missile, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace_laser_fnc_findLaserDesignator; - _addHeight = [0,0,0]; - if((_targets select 0)) then { - _target = _targets select 1; - TRACE_2("Targets", _target, _targets); - - _yVec = vectorDir _missile; - _zVec = vectorUp _missile; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _missilePos = getPosASL _missile; - // player sideChat "G!"; - _targetPos = getPosASL _target; - TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); - if((count _targetPos) > 0) then { - _distanceToTarget = _missilePos vectorDistance _targetPos; - - _defPitch = 0.05; - - if((_launchPos distance _missilePos) < 400 && (_targetPos distance _missilePos) > 400) then { - _addHeight = [0,0,(_targetPos select 2) + ((_launchPos distance _targetPos)*2)]; - TRACE_1("Climb phase", _addHeight); - //_defPitch = 0.1; - } else { - // Covered half the distance, go terminal - if((_missilePos distance _targetPos) < (_launchPos distance _targetPos) / 2) then { - TRACE_1("TERMINAL", ""); - } else { - if((_missilePos select 2) > (_targetPos select 2)) then { - _heightDiff = (_missilePos select 2) - (_targetPos select 2); - TRACE_1("Coasting", _heightDiff); - _addHeight = [0,0, _heightDiff]; - }; - }; - }; - _targetPos = _targetPos vectorAdd _addHeight; - - _defYaw = 0.0035; - - - _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - _yaw = 0.0; - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_defYaw; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _defYaw; - }; - }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_defPitch; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _defPitch; - }; - }; - #ifdef DEBUG_MODE_FULL - drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - - _light = "#lightpoint" createVehicleLocal (getPos _missile); - _light setLightBrightness 1.0; - _light setLightAmbient [1.0, 0.0, 0.0]; - _light setLightColor [1.0, 0.0, 0.0]; - - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _missilePos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _missilePos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; + //TRACE_1("enter", _this); + _args = _this select 0; + //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + _shooter = _args select 0; + _missile = _args select 6; + _curVelocity = velocity _missile; + + if(!alive _missile || isNull _missile || isNull _shooter) exitWith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + _launchPos = _shooter getVariable [QGVAR(launchPos), nil]; + if(isNil "_launchPos") then { + TRACE_1("Setting launch parameters", ""); + _launchPos = getPosASL _shooter; + _shooter setVariable [QGVAR(launchPos), _launchPos, false]; + _shooter setVariable [QGVAR(launchTime), diag_tickTime, false]; + }; + + _targets = [_missile, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace_laser_fnc_findLaserDesignator; + _addHeight = [0,0,0]; + if((_targets select 0)) then { + _target = _targets select 1; + TRACE_2("Targets", _target, _targets); + + _yVec = vectorDir _missile; + _zVec = vectorUp _missile; + _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); + + _missilePos = getPosASL _missile; + // player sideChat "G!"; + _targetPos = getPosASL _target; + TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); + if((count _targetPos) > 0) then { + _distanceToTarget = _missilePos vectorDistance _targetPos; + + _defPitch = 0.05; + + if((_launchPos distance _missilePos) < 400 && (_targetPos distance _missilePos) > 400) then { + _addHeight = [0,0,(_targetPos select 2) + ((_launchPos distance _targetPos)*2)]; + TRACE_1("Climb phase", _addHeight); + //_defPitch = 0.1; + } else { + // Covered half the distance, go terminal + if((_missilePos distance _targetPos) < (_launchPos distance _targetPos) / 2) then { + TRACE_1("TERMINAL", ""); + } else { + if((_missilePos select 2) > (_targetPos select 2)) then { + _heightDiff = (_missilePos select 2) - (_targetPos select 2); + TRACE_1("Coasting", _heightDiff); + _addHeight = [0,0, _heightDiff]; + }; + }; + }; + _targetPos = _targetPos vectorAdd _addHeight; + + _defYaw = 0.0035; + + + _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); + _yaw = 0.0; + if((_targetVectorSeeker select 0) < 0) then { + _yaw = -_defYaw; + } else { + if((_targetVectorSeeker select 0) > 0) then { + _yaw = _defYaw; + }; + }; + + _pitch = 0.0; + if((_targetVectorSeeker select 2) < 0) then { + _pitch = -_defPitch; + } else { + if((_targetVectorSeeker select 2) > 0) then { + _pitch = _defPitch; + }; + }; + #ifdef DEBUG_MODE_FULL + drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; + + _light = "#lightpoint" createVehicleLocal (getPos _missile); + _light setLightBrightness 1.0; + _light setLightAmbient [1.0, 0.0, 0.0]; + _light setLightColor [1.0, 0.0, 0.0]; + + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; + drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; + + _distance = ([getPos startPos, _missilePos] call BIS_fnc_distance2D); + _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _missilePos select 2]]; + _marker setMarkerTypeLocal "mil_dot"; + _marker setMarkerColorLocal "ColorRed"; - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - - _vectorTo = _missilePos vectorFromTo _outVector; - _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _distanceToTarget]; - #endif - }; - }; + MARKERCOUNT = MARKERCOUNT + 1; + #endif + + if(accTime > 0) then { + _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); + + _vectorTo = _missilePos vectorFromTo _outVector; + _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; + }; + + #ifdef DEBUG_MODE_FULL + hintSilent format["d: %1", _distanceToTarget]; + #endif + }; + }; }; FUNC(guidance_Hellfire_LOAL_DIR_PFH) = { - //TRACE_1("enter", _this); - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _shooter = _args select 0; - _missile = _args select 6; - _curVelocity = velocity _missile; - - if(!alive _missile || isNull _missile || isNull _shooter) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _launchPos = _shooter getVariable [QGVAR(launchPos), nil]; - if(isNil "_launchPos") then { - TRACE_1("Setting launch parameters", ""); - _launchPos = getPosASL _shooter; - _shooter setVariable [QGVAR(launchPos), _launchPos, false]; - _shooter setVariable [QGVAR(launchTime), diag_tickTime, false]; - }; - - _targets = [_missile, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace__laser_fnc_findLaserDesignator; - _addHeight = [0,0,0]; - if((_targets select 0)) then { - _target = _targets select 1; - TRACE_2("Targets", _target, _targets); - - _yVec = vectorDir _missile; - _zVec = vectorUp _missile; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _missilePos = getPosASL _missile; - // player sideChat "G!"; - _targetPos = getPosASL _target; - TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); - if((count _targetPos) > 0) then { - _distanceToTarget = _missilePos vectorDistance _targetPos; - - if((_launchPos distance _missilePos) < 400 && (_targetPos distance _missilePos) > 400) then { - _addHeight = [0,0,(_targetPos select 2) + (_missilePos distance _targetPos)*0.5]; - TRACE_1("Climb phase", _addHeight); - } else { - // Covered half the distance, go terminal - if((_missilePos distance _targetPos) < (_launchPos distance _targetPos) / 2) then { - TRACE_1("TERMINAL", ""); - } else { - if((_missilePos select 2) > (_targetPos select 2)) then { - _heightDiff = (_missilePos select 2) - (_targetPos select 2); - TRACE_1("Coasting", _heightDiff); - _addHeight = [0,0, _heightDiff]; - }; - }; - }; - _targetPos = _targetPos vectorAdd _addHeight; - - _defYaw = 0.0035; - _defPitch = 0.0075; - - _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - _yaw = 0.0; - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_defYaw; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _defYaw; - }; - }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_defPitch; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _defPitch; - }; - }; - #ifdef DEBUG_MODE_FULL - drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - - _light = "#lightpoint" createVehicleLocal (getPos _missile); - _light setLightBrightness 1.0; - _light setLightAmbient [1.0, 0.0, 0.0]; - _light setLightColor [1.0, 0.0, 0.0]; - - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _missilePos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _missilePos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; + //TRACE_1("enter", _this); + _args = _this select 0; + //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + _shooter = _args select 0; + _missile = _args select 6; + _curVelocity = velocity _missile; + + if(!alive _missile || isNull _missile || isNull _shooter) exitWith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + _launchPos = _shooter getVariable [QGVAR(launchPos), nil]; + if(isNil "_launchPos") then { + TRACE_1("Setting launch parameters", ""); + _launchPos = getPosASL _shooter; + _shooter setVariable [QGVAR(launchPos), _launchPos, false]; + _shooter setVariable [QGVAR(launchTime), diag_tickTime, false]; + }; + + _targets = [_missile, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace__laser_fnc_findLaserDesignator; + _addHeight = [0,0,0]; + if((_targets select 0)) then { + _target = _targets select 1; + TRACE_2("Targets", _target, _targets); + + _yVec = vectorDir _missile; + _zVec = vectorUp _missile; + _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); + + _missilePos = getPosASL _missile; + // player sideChat "G!"; + _targetPos = getPosASL _target; + TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); + if((count _targetPos) > 0) then { + _distanceToTarget = _missilePos vectorDistance _targetPos; + + if((_launchPos distance _missilePos) < 400 && (_targetPos distance _missilePos) > 400) then { + _addHeight = [0,0,(_targetPos select 2) + (_missilePos distance _targetPos)*0.5]; + TRACE_1("Climb phase", _addHeight); + } else { + // Covered half the distance, go terminal + if((_missilePos distance _targetPos) < (_launchPos distance _targetPos) / 2) then { + TRACE_1("TERMINAL", ""); + } else { + if((_missilePos select 2) > (_targetPos select 2)) then { + _heightDiff = (_missilePos select 2) - (_targetPos select 2); + TRACE_1("Coasting", _heightDiff); + _addHeight = [0,0, _heightDiff]; + }; + }; + }; + _targetPos = _targetPos vectorAdd _addHeight; + + _defYaw = 0.0035; + _defPitch = 0.0075; + + _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); + _yaw = 0.0; + if((_targetVectorSeeker select 0) < 0) then { + _yaw = -_defYaw; + } else { + if((_targetVectorSeeker select 0) > 0) then { + _yaw = _defYaw; + }; + }; + + _pitch = 0.0; + if((_targetVectorSeeker select 2) < 0) then { + _pitch = -_defPitch; + } else { + if((_targetVectorSeeker select 2) > 0) then { + _pitch = _defPitch; + }; + }; + #ifdef DEBUG_MODE_FULL + drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; + + _light = "#lightpoint" createVehicleLocal (getPos _missile); + _light setLightBrightness 1.0; + _light setLightAmbient [1.0, 0.0, 0.0]; + _light setLightColor [1.0, 0.0, 0.0]; + + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; + drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; + + _distance = ([getPos startPos, _missilePos] call BIS_fnc_distance2D); + _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _missilePos select 2]]; + _marker setMarkerTypeLocal "mil_dot"; + _marker setMarkerColorLocal "ColorRed"; - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - - _vectorTo = _missilePos vectorFromTo _outVector; - _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _distanceToTarget]; - #endif - }; - }; + MARKERCOUNT = MARKERCOUNT + 1; + #endif + + if(accTime > 0) then { + _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); + + _vectorTo = _missilePos vectorFromTo _outVector; + _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; + }; + + #ifdef DEBUG_MODE_FULL + hintSilent format["d: %1", _distanceToTarget]; + #endif + }; + }; }; FUNC(guidance_Hellfire_LOAL_HI) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - GVAR(lastTime) = time; - [FUNC(guidance_Hellfire_LOAL_HI_PFH), 0, _this] call cba_fnc_addPerFrameHandler; + PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + + GVAR(lastTime) = time; + [FUNC(guidance_Hellfire_LOAL_HI_PFH), 0, _this] call cba_fnc_addPerFrameHandler; }; FUNC(guidance_Hellfire_LOAL_DIR) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - GVAR(lastTime) = time; - [FUNC(guidance_Hellfire_LOAL_DIR_PFH), 0, _this] call cba_fnc_addPerFrameHandler; + PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + + GVAR(lastTime) = time; + [FUNC(guidance_Hellfire_LOAL_DIR_PFH), 0, _this] call cba_fnc_addPerFrameHandler; }; PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); _fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_DEFAULT_FIRE_SELECTION]; switch (_fireMode select 0) do { - // Default to FIREMODE_DIRECT_LOAL - // FIREMODE_DIRECT_LOAL - default { - LOG("Initiating Hellfire II FIREMODE_LOAL_DIR"); - _this call FUNC(guidance_Hellfire_LOAL_HI); - }; + // Default to FIREMODE_DIRECT_LOAL + // FIREMODE_DIRECT_LOAL + default { + LOG("Initiating Hellfire II FIREMODE_LOAL_DIR"); + _this call FUNC(guidance_Hellfire_LOAL_HI); + }; }; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_guidance_LGB.sqf b/addons/missileguidance/functions/fnc_guidance_LGB.sqf index e9e8754f19..940c94d34e 100644 --- a/addons/missileguidance/functions/fnc_guidance_LGB.sqf +++ b/addons/missileguidance/functions/fnc_guidance_LGB.sqf @@ -2,108 +2,108 @@ #include "script_component.hpp" FUNC(guidance_LGB_LOAL_PFH) = { - //TRACE_1("enter", _this); - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _lgb = _args select 6; - _curVelocity = velocity _lgb; - - if(!alive _lgb) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _targets = [_lgb, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call uo_laser_fnc_findLaserDesignator; - //TRACE_2("Targets", _target, _targets); - - if((_targets select 0)) then { - _target = _targets select 1; - - // player sideChat "FUCK!"; - // drop ["\a3\data_f\Cl_basic","","Billboard",1,20,(getPos _lgb),[0,0,0],1,1.275,1.0,0.0,[5],[[1,0,0,1]],[0],0.0,2.0,"","",""]; - - - _yVec = vectorDir _lgb; - _zVec = vectorUp _lgb; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _lgbPos = getPosASL _lgb; - // player sideChat "G!"; - _targetPos = getPosASL _target; - if((count _targetPos) > 0) then { - // player sideChat format["f: %1", _targetPos]; - _addHeight = [0,0,(_lgbPos distance _targetPos)*0.06]; - // drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - _targetPos = _targetPos vectorAdd _addHeight; - - - - _def = 0.0025; - - _targetVectorSeeker = [_lgb, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - // _targetVectorSeeker = _lgb worldToModel (ASLtoATL _targetPos); - // _targetVectorSeeker = [0,0,0] vectorFromTo _targetVectorSeeker; - _yaw = 0.0; - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_def; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _def; - }; - }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_def; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _def; - }; - }; - #ifdef DEBUG_MODE_FULL - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _lgbPos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _lgbPos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _lgbPos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _lgbPos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; + //TRACE_1("enter", _this); + _args = _this select 0; + //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + _lgb = _args select 6; + _curVelocity = velocity _lgb; + + if(!alive _lgb) exitWith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + _targets = [_lgb, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call uo_laser_fnc_findLaserDesignator; + //TRACE_2("Targets", _target, _targets); + + if((_targets select 0)) then { + _target = _targets select 1; + + // player sideChat "FUCK!"; + // drop ["\a3\data_f\Cl_basic","","Billboard",1,20,(getPos _lgb),[0,0,0],1,1.275,1.0,0.0,[5],[[1,0,0,1]],[0],0.0,2.0,"","",""]; + + + _yVec = vectorDir _lgb; + _zVec = vectorUp _lgb; + _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); + + _lgbPos = getPosASL _lgb; + // player sideChat "G!"; + _targetPos = getPosASL _target; + if((count _targetPos) > 0) then { + // player sideChat format["f: %1", _targetPos]; + _addHeight = [0,0,(_lgbPos distance _targetPos)*0.06]; + // drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; + _targetPos = _targetPos vectorAdd _addHeight; + + + + _def = 0.0025; + + _targetVectorSeeker = [_lgb, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); + // _targetVectorSeeker = _lgb worldToModel (ASLtoATL _targetPos); + // _targetVectorSeeker = [0,0,0] vectorFromTo _targetVectorSeeker; + _yaw = 0.0; + if((_targetVectorSeeker select 0) < 0) then { + _yaw = -_def; + } else { + if((_targetVectorSeeker select 0) > 0) then { + _yaw = _def; + }; + }; + + _pitch = 0.0; + if((_targetVectorSeeker select 2) < 0) then { + _pitch = -_def; + } else { + if((_targetVectorSeeker select 2) > 0) then { + _pitch = _def; + }; + }; + #ifdef DEBUG_MODE_FULL + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _lgbPos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; + drawLine3D [ASLtoATL _lgbPos, ASLtoATL _targetPos, [1,0,0,1]]; + + _distance = ([getPos startPos, _lgbPos] call BIS_fnc_distance2D); + _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _lgbPos select 2]]; + _marker setMarkerTypeLocal "mil_dot"; + _marker setMarkerColorLocal "ColorRed"; - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - _outVector = [_lgb, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - // _outVector = _lgb modelToWorld [_yaw, 1, _pitch]; - // _outVector = ATLtoASL _outVector; - _vectorTo = _lgbPos vectorFromTo _outVector; - - // hintSilent format["v: %1", _vectorTo]; - - // _lgb setVectorDir _vectorTo; - _lgb setVectorDirAndUp [_vectorTo, vectorUp _lgb]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _lgbPos vectorDistance _targetPos]; - #endif - }; - }; + MARKERCOUNT = MARKERCOUNT + 1; + #endif + + if(accTime > 0) then { + _outVector = [_lgb, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); + // _outVector = _lgb modelToWorld [_yaw, 1, _pitch]; + // _outVector = ATLtoASL _outVector; + _vectorTo = _lgbPos vectorFromTo _outVector; + + // hintSilent format["v: %1", _vectorTo]; + + // _lgb setVectorDir _vectorTo; + _lgb setVectorDirAndUp [_vectorTo, vectorUp _lgb]; + }; + + #ifdef DEBUG_MODE_FULL + hintSilent format["d: %1", _lgbPos vectorDistance _targetPos]; + #endif + }; + }; }; FUNC(guidance_LGB_LOAL) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - [FUNC(guidance_LGB_LOAL_PFH), 0, _this] call cba_fnc_addPerFrameHandler; + PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + + [FUNC(guidance_LGB_LOAL_PFH), 0, _this] call cba_fnc_addPerFrameHandler; }; PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); _fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_DEFAULT_FIRE_SELECTION]; switch (_fireMode select 0) do { - // Default to FIREMODE_DIRECT_LOAL - // FIREMODE_DIRECT_LOAL - default { - LOG("Initiating FIREMODE_DIRECT_LOAL"); - _this call FUNC(guidance_LGB_LOAL); - }; + // Default to FIREMODE_DIRECT_LOAL + // FIREMODE_DIRECT_LOAL + default { + LOG("Initiating FIREMODE_DIRECT_LOAL"); + _this call FUNC(guidance_LGB_LOAL); + }; }; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_translateToWeaponSpace.sqf b/addons/missileguidance/functions/fnc_translateToWeaponSpace.sqf index 406d81b145..2c7dc5e6da 100644 --- a/addons/missileguidance/functions/fnc_translateToWeaponSpace.sqf +++ b/addons/missileguidance/functions/fnc_translateToWeaponSpace.sqf @@ -14,9 +14,9 @@ _y = _offset select 1; _z = _offset select 2; _out = [ - ((_xVec select 0)*_x) + ((_xVec select 1)*_y) + ((_xVec select 2)*_z), - ((_yVec select 0)*_x) + ((_yVec select 1)*_y) + ((_yVec select 2)*_z), - ((_zVec select 0)*_x) + ((_zVec select 1)*_y) + ((_zVec select 2)*_z) - ]; + ((_xVec select 0)*_x) + ((_xVec select 1)*_y) + ((_xVec select 2)*_z), + ((_yVec select 0)*_x) + ((_yVec select 1)*_y) + ((_yVec select 2)*_z), + ((_zVec select 0)*_x) + ((_zVec select 1)*_y) + ((_zVec select 2)*_z) + ]; _out; \ No newline at end of file diff --git a/addons/missileguidance/script_component.hpp b/addons/missileguidance/script_component.hpp index 886764be2b..377469cdee 100644 --- a/addons/missileguidance/script_component.hpp +++ b/addons/missileguidance/script_component.hpp @@ -2,11 +2,11 @@ #include "\z\ace\Addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_MISSILEGUIDANCE - #define DEBUG_MODE_FULL + #define DEBUG_MODE_FULL #endif #ifdef DEBUG_SETTINGS_MISSILEGUIDANCE - #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILEGUIDANCE + #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILEGUIDANCE #endif #include "\z\ace\Addons\main\script_macros.hpp" From 596854a2645086c30873d3ec4beb41afde8bd975 Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 2 Apr 2015 10:05:50 -0700 Subject: [PATCH 02/43] Moved getTurretDirection to common. Tweak creation of action (fucking actions?!) :( :( :( --- addons/common/XEH_preInit.sqf | 1 + .../functions/fnc_getTurretDirection.sqf | 37 +++++++++++++++++++ .../laser_selfdesignate/CfgEventhandlers.hpp | 4 +- .../functions/fnc_laserHudDesignateOn.sqf | 23 ++---------- .../functions/fnc_onGetin.sqf | 2 +- 5 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 addons/common/functions/fnc_getTurretDirection.sqf diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 6dacdf316b..05322924e0 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -92,6 +92,7 @@ PREP(getTurretIndex); PREP(getTurrets); PREP(getTurretsFFV); PREP(getTurretsOther); +PREP(getTurretDirection); PREP(getUavControlPosition); PREP(getVehicleCargo); PREP(getVehicleCodriver); diff --git a/addons/common/functions/fnc_getTurretDirection.sqf b/addons/common/functions/fnc_getTurretDirection.sqf new file mode 100644 index 0000000000..9022670af5 --- /dev/null +++ b/addons/common/functions/fnc_getTurretDirection.sqf @@ -0,0 +1,37 @@ +/* + * Author: jaynus + * + * Get the absolute turret direction for FOV/PIP turret. + * + * Argument: + * 0: Vehicle (Object) + * 1: Turret Position + * + * Return value: + * [position, direction] + */ +#include "script_component.hpp" + +EXPLODE_2_PVT(_this,_vehicle,_position); +private ["_turrets", "_turret", "_config", "_turret", "_povPos", "_povDir", "_gunBeginPos", "_gunEndPos", "_pov"]; + +_turret = [_vehicle, _position] call CBA_fnc_getTurret; +_pov = getText (_turret >> "memoryPointGunnerOptics"); +_gunBeg = getText (_turret >> "gunBeg"); +_gunEnd = getText (_turret >> "gunEnd"); +TRACE_3("", _pov, _gunBeg, _gunEnd); + +// Pull the PIP pov or barrel direction, depending on how the model is set up +_povPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _pov ) ); +_povDir = [0,0,0]; + +if(_pov == "pip0_pos") then { + _pipDir = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition "pip0_dir" ) ); + _povDir = [_povPos, _pipDir] call BIS_fnc_vectorDiff; +} else { + _gunBeginPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunBeg ) ); + _gunEndPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunEnd ) ); + _povDir = [_gunEndPos, _gunBeginPos] call BIS_fnc_vectorDiff; +}; + +[_povPos, _povDir] \ No newline at end of file diff --git a/addons/laser_selfdesignate/CfgEventhandlers.hpp b/addons/laser_selfdesignate/CfgEventhandlers.hpp index 953687bb2b..e75b3b674b 100644 --- a/addons/laser_selfdesignate/CfgEventhandlers.hpp +++ b/addons/laser_selfdesignate/CfgEventhandlers.hpp @@ -13,7 +13,7 @@ class Extended_PostInit_EventHandlers { class Extended_GetIn_EventHandlers { class B_Heli_Attack_01_F { class ADDON { - getIn = QUOTE(_this call FUNC(onGetin)); + clientGetIn = QUOTE(_this call FUNC(onGetIn)); }; }; }; @@ -21,7 +21,7 @@ class Extended_GetIn_EventHandlers { class Extended_GetOut_EventHandlers { class B_Heli_Attack_01_F { class ADDON { - getOut = QUOTE(_this call FUNC(onGetout)); + clientGetOut = QUOTE(_this call FUNC(onGetOut)); }; }; }; diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index a58284ee34..a2f3c5f871 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -33,26 +33,9 @@ FUNC(laserHudDesignatePFH) = { // Retrieve the gunner and turret memory point information _gunnerInfo = [_vehicle, _weapon] call CBA_fnc_getFirer; - - _turret = [_vehicle, _gunnerInfo select 1] call CBA_fnc_getTurret; - _pov = getText (_turret >> "memoryPointGunnerOptics"); - _gunBeg = getText (_turret >> "gunBeg"); - _gunEnd = getText (_turret >> "gunEnd"); - TRACE_3("", _pov, _gunBeg, _gunEnd); - - // Pull the PIP pov or barrel direction, depending on how the model is set up - _povPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _pov ) ); - _povDir = [0,0,0]; - if(_pov == "pip0_pos") then { - _pipDir = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition "pip0_dir" ) ); - _povDir = [_povPos, _pipDir] call BIS_fnc_vectorDiff; - } else { - _gunBeginPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunBeg ) ); - _gunEndPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunEnd ) ); - _povDir = [_gunEndPos, _gunBeginPos] call BIS_fnc_vectorDiff; - }; - - TRACE_4("", _povDir, _povPos, _gunBeginPos, _gunEndPos); + _turretInfo = [_vehicle, _gunnerInfo select 1] call EFUNC(common,getTurretDirection); + _povPos = _turretInfo select 0; + _povDir = _turretInfo select 1; _result = [_povPos, _povDir] call EFUNC(laser,shootCone); diff --git a/addons/laser_selfdesignate/functions/fnc_onGetin.sqf b/addons/laser_selfdesignate/functions/fnc_onGetin.sqf index d6f555c02f..dc62f72e95 100644 --- a/addons/laser_selfdesignate/functions/fnc_onGetin.sqf +++ b/addons/laser_selfdesignate/functions/fnc_onGetin.sqf @@ -1,4 +1,4 @@ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" // TODO: we should do this differently eventually private["_onActionId", "_offActionId"]; From 0ca1703048b2c58d1fcc7e3f952f681abee7f0c3 Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 2 Apr 2015 10:41:54 -0700 Subject: [PATCH 03/43] Slight tweak to deflection. --- addons/missileguidance/functions/fnc_guidance_DAGR.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/missileguidance/functions/fnc_guidance_DAGR.sqf b/addons/missileguidance/functions/fnc_guidance_DAGR.sqf index 3bef324931..9599a81161 100644 --- a/addons/missileguidance/functions/fnc_guidance_DAGR.sqf +++ b/addons/missileguidance/functions/fnc_guidance_DAGR.sqf @@ -44,9 +44,9 @@ FUNC(guidance_DIRECT_LOAL_PFH) = { _targetPos = _targetPos vectorAdd _addHeight; - _def = 0.0030; + _def = 0.0040; if(_distanceToShooter > 100) then { - _def = 0.0020; + _def = 0.0025; }; _targetVectorSeeker = [_dagr, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); From b88d1b4cac146233c822c581e7949339ca1c966d Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 2 Apr 2015 10:45:52 -0700 Subject: [PATCH 04/43] Begin time to live changes for extended range rounds. --- addons/ballistics/CfgAmmo.hpp | 11 +++++++++++ addons/ballistics/config.cpp | 1 + 2 files changed, 12 insertions(+) create mode 100644 addons/ballistics/CfgAmmo.hpp diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp new file mode 100644 index 0000000000..1eb07a95a6 --- /dev/null +++ b/addons/ballistics/CfgAmmo.hpp @@ -0,0 +1,11 @@ +class CfgAmmo { + class BulletBase; + + class B_20mm : BulletBase { + timeToLive = 20; + }; + + class B_25mm: BulletBase { + timeToLive = 20; + }; +}; \ No newline at end of file diff --git a/addons/ballistics/config.cpp b/addons/ballistics/config.cpp index c526b0f7d4..4b9944364c 100644 --- a/addons/ballistics/config.cpp +++ b/addons/ballistics/config.cpp @@ -14,3 +14,4 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "CfgAmmo.hpp" \ No newline at end of file From 8a18d18c08726beacc3b0cdb3979359078993c25 Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 2 Apr 2015 16:35:19 -0700 Subject: [PATCH 05/43] doubleplusgood all munition TTL for range. --- addons/ballistics/CfgAmmo.hpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 1eb07a95a6..79f99c33a4 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -1,11 +1,20 @@ class CfgAmmo { - class BulletBase; + class BulletCore; - class B_20mm : BulletBase { - timeToLive = 20; + class BulletBase: BulletCore { + timeToLive = 15; // Default: 6, doubleplusgood all munition range. }; - class B_25mm: BulletBase { - timeToLive = 20; + class B_20mm : BulletBase { + timeToLive = 30; + }; + class B_25mm : BulletBase { + timeToLive = 30; + }; + class B_35mm_AA : BulletBase { + timeToLive = 30; + }; + class B_30mm_AP : BulletBase { + timeToLive = 30; }; }; \ No newline at end of file From c82cef1b28926f2f45b6774962f491959f914043 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Fri, 3 Apr 2015 12:43:41 -0300 Subject: [PATCH 06/43] - self designate capabilities read from config - add designator on/off actions to the interact_menu --- .../laser_selfdesignate/CfgEventhandlers.hpp | 16 ++----- addons/laser_selfdesignate/XEH_pre_init.sqf | 9 ++-- addons/laser_selfdesignate/config.cpp | 2 +- .../functions/fnc_initDesignatorActions.sqf | 47 +++++++++++++++++++ .../functions/fnc_onGetin.sqf | 13 ----- .../functions/fnc_onGetout.sqf | 10 ---- .../functions/fnc_unitTurretHasDesignator.sqf | 21 +++++++++ addons/laser_selfdesignate/stringtable.xml | 12 +++++ 8 files changed, 89 insertions(+), 41 deletions(-) create mode 100644 addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf delete mode 100644 addons/laser_selfdesignate/functions/fnc_onGetin.sqf delete mode 100644 addons/laser_selfdesignate/functions/fnc_onGetout.sqf create mode 100644 addons/laser_selfdesignate/functions/fnc_unitTurretHasDesignator.sqf create mode 100644 addons/laser_selfdesignate/stringtable.xml diff --git a/addons/laser_selfdesignate/CfgEventhandlers.hpp b/addons/laser_selfdesignate/CfgEventhandlers.hpp index e75b3b674b..4cef7be4a3 100644 --- a/addons/laser_selfdesignate/CfgEventhandlers.hpp +++ b/addons/laser_selfdesignate/CfgEventhandlers.hpp @@ -10,18 +10,10 @@ class Extended_PostInit_EventHandlers { }; }; -class Extended_GetIn_EventHandlers { - class B_Heli_Attack_01_F { +class Extended_Init_EventHandlers { + class Helicopter { class ADDON { - clientGetIn = QUOTE(_this call FUNC(onGetIn)); + init = QUOTE(_this call DFUNC(initDesignatorActions)); }; }; -}; - -class Extended_GetOut_EventHandlers { - class B_Heli_Attack_01_F { - class ADDON { - clientGetOut = QUOTE(_this call FUNC(onGetOut)); - }; - }; -}; +}; \ No newline at end of file diff --git a/addons/laser_selfdesignate/XEH_pre_init.sqf b/addons/laser_selfdesignate/XEH_pre_init.sqf index 4e98fce7ec..a8d4b1779d 100644 --- a/addons/laser_selfdesignate/XEH_pre_init.sqf +++ b/addons/laser_selfdesignate/XEH_pre_init.sqf @@ -1,12 +1,11 @@ #include "script_component.hpp" -PREP(onGetIn); -PREP(onGetOut); - +PREP(initDesignatorActions); PREP(laserHudDesignateOn); PREP(laserHudDesignateOff); +PREP(unitTurretHasDesignator); GVAR(laser) = nil; -GVAR(laserActive) = false; +GVAR(laserActive) = false; -FUNC(getPosASL) = {visiblePositionASL (_this select 0)}; \ No newline at end of file +FUNC(getPosASL) = {visiblePositionASL (_this select 0)}; diff --git a/addons/laser_selfdesignate/config.cpp b/addons/laser_selfdesignate/config.cpp index e19e438da0..ff9c269989 100644 --- a/addons/laser_selfdesignate/config.cpp +++ b/addons/laser_selfdesignate/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_main", "ace_laser"}; + requiredAddons[] = {"ace_interaction", "ace_laser"}; version = VERSION; }; }; diff --git a/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf b/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf new file mode 100644 index 0000000000..2216fe6e71 --- /dev/null +++ b/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf @@ -0,0 +1,47 @@ +/* + * Author: esteldunedain + * Initializes the actions for turning on/off the laser for vehicles that have them + * + * Argument: + * 0: Vehicle + * + * Return value: + * NONE. + */ +#include "script_component.hpp" + +EXPLODE_1_PVT(_this,_vehicle); + +{ + private ["_turretConfig","_onAction","_offAction"]; + _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); + + if (getNumber (_turretConfig >> QGVAR(Enabled)) == 1) exitWith { + // @todo: Add the state variables to the vehicle, instead of to the client + // e.g.: _vehicle setVariable [format ["%1_%2", QGVAR(laserActive), _x], false]; + + // Add actions + _onAction = [QGVAR(LaserOn), localize "STR_ACE_Laser_SelfDesignate_DesignatorOn", "", + { + // Statement + _this call FUNC(laserHudDesignateOn) + }, + { + // Condition + !GVAR(laserActive) && {[ACE_player] call FUNC(unitTurretHasDesignator)} + }] call EFUNC(interact_menu,createAction); + + _offAction = [QGVAR(LaserOff), localize "STR_ACE_Laser_SelfDesignate_DesignatorOff", "", + { + // Statement + _this call FUNC(laserHudDesignateOff) + }, + { + // Condition + GVAR(laserActive) && {[ACE_player] call FUNC(unitTurretHasDesignator)} + }] call EFUNC(interact_menu,createAction); + + [typeOf _vehicle, 1, ["ACE_SelfActions"], _onAction] call EFUNC(interact_menu,addActionToClass); + [typeOf _vehicle, 1, ["ACE_SelfActions"], _offAction] call EFUNC(interact_menu,addActionToClass); + }; +} forEach allTurrets _vehicle; diff --git a/addons/laser_selfdesignate/functions/fnc_onGetin.sqf b/addons/laser_selfdesignate/functions/fnc_onGetin.sqf deleted file mode 100644 index dc62f72e95..0000000000 --- a/addons/laser_selfdesignate/functions/fnc_onGetin.sqf +++ /dev/null @@ -1,13 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -// TODO: we should do this differently eventually -private["_onActionId", "_offActionId"]; -TRACE_1("ENTER", _this); - -// TODO: THIS SHOULD NOT BE ACTIONS EVENTUALLY - -_onActionId = player addAction ["Laser Designator On", { _this call FUNC(laserHudDesignateOn) }, [], 1, false, false, "", QUOTE( (gunner (vehicle player)) == player && !GVAR(laserActive))]; -player setVariable[QGVAR(onActionId), _onActionId, false]; - -_offActionId = player addAction ["Laser Designator Off", { _this call FUNC(laserHudDesignateOff) }, [], 1, false, false, "", QUOTE( (gunner (vehicle player)) == player && GVAR(laserActive))]; -player setVariable[QGVAR(offActionId), _offActionId, false]; \ No newline at end of file diff --git a/addons/laser_selfdesignate/functions/fnc_onGetout.sqf b/addons/laser_selfdesignate/functions/fnc_onGetout.sqf deleted file mode 100644 index 2a32403c19..0000000000 --- a/addons/laser_selfdesignate/functions/fnc_onGetout.sqf +++ /dev/null @@ -1,10 +0,0 @@ -#include "script_component.hpp" - -_onActionId = player getVariable[QGVAR(onActionId), -1]; -_offActionId = player getVariable[QGVAR(offActionId), -1]; - -player removeAction _onActionId; -player removeAction _offActionId; - -player setVariable[QGVAR(onActionId), -1, false]; -player setVariable[QGVAR(offActionId), -1, false]; \ No newline at end of file diff --git a/addons/laser_selfdesignate/functions/fnc_unitTurretHasDesignator.sqf b/addons/laser_selfdesignate/functions/fnc_unitTurretHasDesignator.sqf new file mode 100644 index 0000000000..291deb5015 --- /dev/null +++ b/addons/laser_selfdesignate/functions/fnc_unitTurretHasDesignator.sqf @@ -0,0 +1,21 @@ +/* + * Author: esteldunedain + * Checks if the turret occupied by the given unit has a laser designator + * + * Argument: + * 0: Unit + * + * Return value: + * Has designator? + */ +#include "script_component.hpp" + +EXPLODE_1_PVT(_this,_unit); + +// Get the player turret path +private ["_turret","_config","_turretConfig"]; +_turret = [_unit] call EFUNC(common,getTurretIndex); +_config = configFile >> "CfgVehicles" >> typeOf vehicle _unit; +_turretConfig = [_config, _turret] call EFUNC(common,getTurretConfigPath); + +getNumber (_turretConfig >> QGVAR(Enabled)) > 0 diff --git a/addons/laser_selfdesignate/stringtable.xml b/addons/laser_selfdesignate/stringtable.xml new file mode 100644 index 0000000000..70f8912cfe --- /dev/null +++ b/addons/laser_selfdesignate/stringtable.xml @@ -0,0 +1,12 @@ + + + + + + Laser<br/>Designator On + + + Laser<br/>Designator Off + + + \ No newline at end of file From b7e3a9446212936ff8ba003d6d283143371c51d8 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Fri, 3 Apr 2015 12:44:09 -0300 Subject: [PATCH 07/43] Add designator to the comanche's gunner --- addons/laser_selfdesignate/CfgVehicles.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/laser_selfdesignate/CfgVehicles.hpp b/addons/laser_selfdesignate/CfgVehicles.hpp index 5b2fdd7d28..1c30e3d1e7 100644 --- a/addons/laser_selfdesignate/CfgVehicles.hpp +++ b/addons/laser_selfdesignate/CfgVehicles.hpp @@ -23,7 +23,8 @@ class CfgVehicles { class B_Heli_Attack_01_F: Heli_Attack_01_base_F { class Turrets: Turrets { class MainTurret: MainTurret { - stabilizedInAxes = 4; // This stablizes the turret a bit more for laser designation + GVAR(Enabled) = 1; // Enable laser self-designation + stabilizedInAxes = 4; // This stablizes the turret a bit more for laser designation }; }; }; From b0ac672c13f4a145c5df30baf4fc8aa14d3d14c7 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Fri, 3 Apr 2015 13:24:50 -0300 Subject: [PATCH 08/43] Only init each vehicle type once --- .../functions/fnc_initDesignatorActions.sqf | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf b/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf index 2216fe6e71..cd45c45d32 100644 --- a/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf +++ b/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf @@ -12,9 +12,18 @@ EXPLODE_1_PVT(_this,_vehicle); +// Add action to class if it is not already done +private ["_type", "_initializedClasses"]; +_type = typeOf _vehicle; +_initializedClasses = GETGVAR(initializedClasses,[]); + +// do nothing if the class is already initialized +if (_type in _initializedClasses) exitWith {}; +_initializedClasses pushBack _type; + { private ["_turretConfig","_onAction","_offAction"]; - _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _x] call EFUNC(common,getTurretConfigPath); + _turretConfig = [configFile >> "CfgVehicles" >> _type, _x] call EFUNC(common,getTurretConfigPath); if (getNumber (_turretConfig >> QGVAR(Enabled)) == 1) exitWith { // @todo: Add the state variables to the vehicle, instead of to the client @@ -41,7 +50,7 @@ EXPLODE_1_PVT(_this,_vehicle); GVAR(laserActive) && {[ACE_player] call FUNC(unitTurretHasDesignator)} }] call EFUNC(interact_menu,createAction); - [typeOf _vehicle, 1, ["ACE_SelfActions"], _onAction] call EFUNC(interact_menu,addActionToClass); - [typeOf _vehicle, 1, ["ACE_SelfActions"], _offAction] call EFUNC(interact_menu,addActionToClass); + [_type, 1, ["ACE_SelfActions"], _onAction] call EFUNC(interact_menu,addActionToClass); + [_type, 1, ["ACE_SelfActions"], _offAction] call EFUNC(interact_menu,addActionToClass); }; } forEach allTurrets _vehicle; From 84d801a45ac0382af70b2c667fac0415b1c78b71 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 09:49:41 -0700 Subject: [PATCH 09/43] Added: ace_fcs_forceUpdate event for forcing the FCS to update from self-designate Merged: in-vehicle interact for laser designator Changed: Perf. tweaks on laser update times. --- addons/fcs/XEH_clientInit.sqf | 3 ++ addons/fcs/XEH_preInit.sqf | 1 + addons/fcs/functions/fnc_keyUp.sqf | 15 ++++++++-- addons/fcs/functions/fnc_onForceUpdate.sqf | 7 +++++ .../functions/fnc_laserHudDesignateOn.sqf | 28 +++++++++++++++++-- 5 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 addons/fcs/functions/fnc_onForceUpdate.sqf diff --git a/addons/fcs/XEH_clientInit.sqf b/addons/fcs/XEH_clientInit.sqf index 17faa70f17..49f04d44e7 100644 --- a/addons/fcs/XEH_clientInit.sqf +++ b/addons/fcs/XEH_clientInit.sqf @@ -5,3 +5,6 @@ GVAR(time) = 0; GVAR(position) = [0,0,0]; #include "initKeybinds.sqf" + +// Register event for global updates +[QGVAR(forceUpdate), FUNC(onForceUpdate)] call ace_common_fnc_addEventHandler \ No newline at end of file diff --git a/addons/fcs/XEH_preInit.sqf b/addons/fcs/XEH_preInit.sqf index 78a2fd091c..8fdc43df11 100644 --- a/addons/fcs/XEH_preInit.sqf +++ b/addons/fcs/XEH_preInit.sqf @@ -10,6 +10,7 @@ PREP(firedEH); PREP(getAngle); PREP(getRange); PREP(handleAirBurstAmmunitionPFH); +PREP(onForceUpdate); PREP(keyDown); PREP(keyUp); PREP(reset); diff --git a/addons/fcs/functions/fnc_keyUp.sqf b/addons/fcs/functions/fnc_keyUp.sqf index d33bd08893..f0b1f1b137 100644 --- a/addons/fcs/functions/fnc_keyUp.sqf +++ b/addons/fcs/functions/fnc_keyUp.sqf @@ -12,7 +12,7 @@ #include "script_component.hpp" -private ["_vehicle", "_turret", "_turretConfig", "_distance", "_magazines"]; +private ["_vehicle", "_turret", "_turretConfig", "_distance", "_magazines", "_userChange"]; _vehicle = _this select 0; _turret = _this select 1; @@ -46,7 +46,9 @@ if (_weaponDirection isEqualTo [0,0,0]) then { // dummy value for non main turr _angleTarget = asin (_weaponDirection select 2); if (count _this > 2) then { - _distance = _this select 2; + if((_this select 2) > -1) then { + _distance = _this select 2; + }; }; if (!(isNil QGVAR(backgroundCalculation)) and {!(scriptDone GVAR(backgroundCalculation))}) then { @@ -160,4 +162,11 @@ _FCSElevation = []; [_vehicle, format ["%1_%2", QGVAR(Elevation), _turret], _FCSElevation] call EFUNC(common,setVariablePublic); [_vehicle, format ["%1_%2", QGVAR(Azimuth), _turret], _FCSAzimuth] call EFUNC(common,setVariablePublic); -[format ["%1: %2", localize "STR_ACE_FCS_ZeroedTo", _distance]] call EFUNC(common,displayTextStructured); +_userChange = true; +if( (count _this) > 3) then { + _userChange = _this select 3; +}; + +if(_userChange) then { + [format ["%1: %2", localize "STR_ACE_FCS_ZeroedTo", _distance]] call EFUNC(common,displayTextStructured); +}; \ No newline at end of file diff --git a/addons/fcs/functions/fnc_onForceUpdate.sqf b/addons/fcs/functions/fnc_onForceUpdate.sqf new file mode 100644 index 0000000000..c911fc38de --- /dev/null +++ b/addons/fcs/functions/fnc_onForceUpdate.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +if !([ACE_player, vehicle ACE_player, []] 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] call FUNC(keyUp); \ No newline at end of file diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index a2f3c5f871..417744fd46 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -3,6 +3,8 @@ TRACE_1("enter", _this); +#define FCS_UPDATE_DELAY 2.0 + FUNC(magnitude) = { _this distance [0, 0, 0] }; @@ -17,11 +19,16 @@ FUNC(mat_normalize3d) = { }; FUNC(laserHudDesignatePFH) = { - private["_args", "_laserTarget", "_shooter", "_vehicle", "_weapon", "_gunnerInfo", "_turret", "_pov", "_gunBeg", "_gunEnd", "_povPos", "_povDir", "_result", "_resultPositions", "_firstResult"]; + private["_args", "_laserTarget", "_shooter", "_vehicle", "_weapon", "_gunnerInfo", "_turret", "_pov", "_gunBeg", "_gunEnd", "_povPos", "_povDir", "_result", "_resultPositions", "_firstResult", "_forceUpdateTime"]; _args = _this select 0; _laserTarget = _args select 0; _shooter = _args select 1; + if( (count _args) < 3) then { + _args set[2, diag_tickTime + FCS_UPDATE_DELAY]; + }; + _forceUpdateTime = _args select 2; + _vehicle = vehicle _shooter; _weapon = currentWeapon _vehicle; @@ -50,14 +57,29 @@ FUNC(laserHudDesignatePFH) = { // Just regular use of lasers will commonly make them move this much, // but not across multiple close frames. // This loses accuracy a little, but saves position updates per frame. - //if( ((getPosASL _laserTarget) distance _pos) > 0.5) then { + TRACE_5("", diag_tickTime, _forceUpdateTime, getPosASL _laserTarget, _pos, ((getPosASL _laserTarget) distance _pos)); + + if(diag_tickTime > _forceUpdateTime) then { + TRACE_1("FCS Update", ""); + ["ace_fcs_forceUpdate", []] call ace_common_fnc_localEvent; + }; + + if( diag_tickTime > _forceUpdateTime || ((getPosASL _laserTarget) distance _pos) > 0.5) then { + TRACE_1("LaserPos Update", ""); _laserTarget setPosATL (ASLToATL _pos); - //}; + + }; + + if(diag_tickTime > _forceUpdateTime) then { + _args set[3, diag_tickTime + FCS_UPDATE_DELAY]; + }; #ifdef DEBUG_MODE_FULL drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLToATL _pos, 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; #endif }; }; + + _this set[0, _args]; }; private "_laserTarget"; From 368b51e0ee5ad4623f0d2e3aa3bceb6483130f21 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 10:10:57 -0700 Subject: [PATCH 10/43] Fixed: Get in/out of vehicle automatically turns off lasers --- .../functions/fnc_laserHudDesignateOn.sqf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index 417744fd46..ea9cd201cc 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -35,7 +35,10 @@ FUNC(laserHudDesignatePFH) = { TRACE_1("", _args); if(!alive _shooter || isNull _vehicle || isNull _laserTarget || !GVAR(laserActive) ) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [] call FUNC(laserHudDesignateOff); + }; + if(!([ACE_player] call FUNC(unitTurretHasDesignator)) ) exitWith { + [] call FUNC(laserHudDesignateOff); }; // Retrieve the gunner and turret memory point information From ced44f8a9dca616789e4d03455147ba70c10a33d Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 10:34:36 -0700 Subject: [PATCH 11/43] Fixed: Reduce bouncing. TODO: wtf is going on with the lateral axis? TODO: maybe dummy laser that doesnt show up as a target. --- .../laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index ea9cd201cc..059ca2d381 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -48,7 +48,6 @@ FUNC(laserHudDesignatePFH) = { _povDir = _turretInfo select 1; _result = [_povPos, _povDir] call EFUNC(laser,shootCone); - if((count _result) > 0) then { _resultPositions = _result select 2; @@ -67,7 +66,7 @@ FUNC(laserHudDesignatePFH) = { ["ace_fcs_forceUpdate", []] call ace_common_fnc_localEvent; }; - if( diag_tickTime > _forceUpdateTime || ((getPosASL _laserTarget) distance _pos) > 0.5) then { + if( (str (getPosASL _laserTarget)) != str _pos) then { TRACE_1("LaserPos Update", ""); _laserTarget setPosATL (ASLToATL _pos); From caecf9b21bf4b4995f3c19a96646dc8064e3e10f Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 13:46:53 -0700 Subject: [PATCH 12/43] Cmake framework for cross-platform extensions and building. --- extensions/CMakeLists.txt | 31 +++++++++++++++++++++++++++++++ extensions/build/.gitignore | 4 ++++ extensions/common/ace_common.cpp | 4 ++++ extensions/common/ace_common.h | 4 ++++ extensions/common/targetver.h | 8 ++++++++ extensions/fcs/CMakeLists.txt | 11 +++++++++++ extensions/{ => fcs}/ace_fcs.cpp | 4 ++-- extensions/stdafx.cpp | 8 -------- extensions/stdafx.h | 16 ---------------- 9 files changed, 64 insertions(+), 26 deletions(-) create mode 100644 extensions/CMakeLists.txt create mode 100644 extensions/build/.gitignore create mode 100644 extensions/common/ace_common.cpp create mode 100644 extensions/common/ace_common.h create mode 100644 extensions/common/targetver.h create mode 100644 extensions/fcs/CMakeLists.txt rename extensions/{ => fcs}/ace_fcs.cpp (99%) delete mode 100644 extensions/stdafx.cpp delete mode 100644 extensions/stdafx.h diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt new file mode 100644 index 0000000000..cc233746b6 --- /dev/null +++ b/extensions/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required (VERSION 3.0) +project (ACE) + +if (NOT CMAKE_BUILD_TYPE AND CMAKE_COMPILER_IS_GNUCXX) + message(STATUS "No build type selected, default to Debug") + set(CMAKE_BUILD_TYPE "Debug") +endif() + +option(USE_64BIT_BUILD "USE_64BIT_BUILD" OFF) +option(USE_STATIC_LINKING "USE_STATIC_LINKING" ON) + + +if(CMAKE_COMPILER_IS_GNUCXX) + SET(CMAKE_CXX_FLAGS "-std=c++11 -march=i686 -m32 -O2 -s -fPIC -fpermissive") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++") +else() + set(CMAKE_CXX_FLAGS_DEBUG "/D _DEBUG /MTd /Zi /Ob0 /Od /RTC1") + set(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O1 /Ob1 /D NDEBUG") + set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Ob2 /D NDEBUG") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG") +endif() + +file(GLOB_RECURSE ACE_COMMON_SOURCES common/*.h common/*.hpp common/*.c common/*.cpp) +add_library(ace_common STATIC ${ACE_COMMON_SOURCES}) +include_directories(AFTER "common") + +# Add extensions to build here +add_subdirectory(fcs) + +message("Build Type: ${CMAKE_BUILD_TYPE}") \ No newline at end of file diff --git a/extensions/build/.gitignore b/extensions/build/.gitignore new file mode 100644 index 0000000000..44c5ea8fa7 --- /dev/null +++ b/extensions/build/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/extensions/common/ace_common.cpp b/extensions/common/ace_common.cpp new file mode 100644 index 0000000000..6ccd690c3a --- /dev/null +++ b/extensions/common/ace_common.cpp @@ -0,0 +1,4 @@ + +int test(int var) { + return var; +} \ No newline at end of file diff --git a/extensions/common/ace_common.h b/extensions/common/ace_common.h new file mode 100644 index 0000000000..4a8847b209 --- /dev/null +++ b/extensions/common/ace_common.h @@ -0,0 +1,4 @@ +#pragma once + +#include "targetver.h" + diff --git a/extensions/common/targetver.h b/extensions/common/targetver.h new file mode 100644 index 0000000000..781012c18f --- /dev/null +++ b/extensions/common/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +#ifdef _WIN32 + #define WIN32_LEAN_AND_MEAN + #include +#else + +#endif \ No newline at end of file diff --git a/extensions/fcs/CMakeLists.txt b/extensions/fcs/CMakeLists.txt new file mode 100644 index 0000000000..25b7746fe0 --- /dev/null +++ b/extensions/fcs/CMakeLists.txt @@ -0,0 +1,11 @@ +set(ACE_EXTENSION_NAME "ace_fcs") + +file(GLOB_RECURSE SOURCES *.h *.hpp *.c *.cpp) +add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES}) +add_dependencies(${ACE_EXTENSION_NAME} ace_common) +SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") + +if(CMAKE_COMPILER_IS_GNUCXX) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_END_STATIC 1) +endif() \ No newline at end of file diff --git a/extensions/ace_fcs.cpp b/extensions/fcs/ace_fcs.cpp similarity index 99% rename from extensions/ace_fcs.cpp rename to extensions/fcs/ace_fcs.cpp index 81c515e0aa..bf3b8e1290 100644 --- a/extensions/ace_fcs.cpp +++ b/extensions/fcs/ace_fcs.cpp @@ -11,8 +11,8 @@ * Correction to angle */ -#include "stdafx.h" - +#include "ace_common.h" + #define _USE_MATH_DEFINES #include diff --git a/extensions/stdafx.cpp b/extensions/stdafx.cpp deleted file mode 100644 index e1e622b65d..0000000000 --- a/extensions/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// ace_fcs.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/extensions/stdafx.h b/extensions/stdafx.h deleted file mode 100644 index f3a07375c7..0000000000 --- a/extensions/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files: -#include - - - -// TODO: reference additional headers your program requires here From 735384cdb47b17b5cc0ad2c88c59af00d9510411 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 14:28:12 -0700 Subject: [PATCH 13/43] stabalize a little more and do some debug drawing. --- .../functions/fnc_laserHudDesignateOn.sqf | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index 059ca2d381..57c5d686c9 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -66,17 +66,23 @@ FUNC(laserHudDesignatePFH) = { ["ace_fcs_forceUpdate", []] call ace_common_fnc_localEvent; }; - if( (str (getPosASL _laserTarget)) != str _pos) then { + if( ((getPosASL _laserTarget) vectorDistance _pos) > 2) then { TRACE_1("LaserPos Update", ""); _laserTarget setPosATL (ASLToATL _pos); - }; + }; if(diag_tickTime > _forceUpdateTime) then { _args set[3, diag_tickTime + FCS_UPDATE_DELAY]; }; #ifdef DEBUG_MODE_FULL - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLToATL _pos, 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], (getPosATL _laserTarget), 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; + + { + private["_position"]; + _position = _x select 0; + drawLine3d [_povPos, _position, [0,0,1,1] ]; + } forEach _resultPositions; #endif }; }; From 6c4dda2dc8f3bacdb16803637bebea70daf1ab2f Mon Sep 17 00:00:00 2001 From: Nou Date: Fri, 3 Apr 2015 14:40:01 -0700 Subject: [PATCH 14/43] Use visual versions. --- addons/common/functions/fnc_getTurretDirection.sqf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/common/functions/fnc_getTurretDirection.sqf b/addons/common/functions/fnc_getTurretDirection.sqf index 9022670af5..0619fb302c 100644 --- a/addons/common/functions/fnc_getTurretDirection.sqf +++ b/addons/common/functions/fnc_getTurretDirection.sqf @@ -22,16 +22,16 @@ _gunEnd = getText (_turret >> "gunEnd"); TRACE_3("", _pov, _gunBeg, _gunEnd); // Pull the PIP pov or barrel direction, depending on how the model is set up -_povPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _pov ) ); +_povPos = ATLtoASL ( _vehicle modelToWorldVisual (_vehicle selectionPosition _pov ) ); _povDir = [0,0,0]; if(_pov == "pip0_pos") then { - _pipDir = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition "pip0_dir" ) ); - _povDir = [_povPos, _pipDir] call BIS_fnc_vectorDiff; + _pipDir = ATLtoASL ( _vehicle modelToWorldVisual (_vehicle selectionPosition "pip0_dir" ) ); + _povDir = _povPos vectorDiff _pipDir; } else { - _gunBeginPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunBeg ) ); - _gunEndPos = ATLtoASL ( _vehicle modelToWorld (_vehicle selectionPosition _gunEnd ) ); - _povDir = [_gunEndPos, _gunBeginPos] call BIS_fnc_vectorDiff; + _gunBeginPos = ATLtoASL ( _vehicle modelToWorldVisual (_vehicle selectionPosition _gunBeg ) ); + _gunEndPos = ATLtoASL ( _vehicle modelToWorldVisual (_vehicle selectionPosition _gunEnd ) ); + _povDir = _gunEndPos vectorDiff _gunBeginPos; }; [_povPos, _povDir] \ No newline at end of file From 6541600d44222d6b8cb3acb3a75981a2defaa67c Mon Sep 17 00:00:00 2001 From: Nou Date: Fri, 3 Apr 2015 15:26:27 -0700 Subject: [PATCH 15/43] Switch everything to use modelToWorldVisual instead of modelToWorld. --- addons/attach/functions/fnc_attach.sqf | 2 +- addons/attach/functions/fnc_canAttach.sqf | 2 +- addons/attach/functions/fnc_placeApprove.sqf | 2 +- addons/backpacks/functions/fnc_backpackOpened.sqf | 2 +- addons/common/functions/fnc_addToInventory.sqf | 6 +++--- addons/common/functions/fnc_canGetInPosition.sqf | 4 ++-- addons/common/functions/fnc_getTurretDirection.sqf | 4 ++-- addons/common/functions/fnc_inWater.sqf | 2 +- addons/dragging/functions/fnc_carryObject.sqf | 2 +- addons/dragging/functions/fnc_dragObject.sqf | 2 +- addons/dragging/functions/fnc_handleScrollWheel.sqf | 2 +- addons/explosives/functions/fnc_dialingPhone.sqf | 2 +- addons/explosives/functions/fnc_placeExplosive.sqf | 2 +- addons/interact_menu/functions/fnc_renderBaseMenu.sqf | 8 ++++---- addons/laser/functions/fnc_findLaserDesignator.sqf | 2 +- .../functions/fnc_laserHudDesignateOn.sqf | 8 +++++--- addons/laserpointer/functions/fnc_drawLaserpoint.sqf | 2 +- addons/medical/functions/fnc_isInMedicalFacility.sqf | 2 +- addons/missileguidance/functions/fnc_guidance_DAGR.sqf | 2 +- addons/missileguidance/functions/fnc_guidance_LGB.sqf | 2 +- addons/movement/functions/fnc_handleClimb.sqf | 2 +- addons/resting/functions/fnc_getIntersection.sqf | 2 +- addons/safemode/functions/fnc_playChangeFiremodeSound.sqf | 2 +- .../functions/fnc_playChangeFiremodeSound.sqf | 2 +- 24 files changed, 35 insertions(+), 33 deletions(-) diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index a8b73052dc..3703514fb6 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -94,7 +94,7 @@ if (_unit == _attachToVehicle) then { //Self Attachment _unit removeAction _actionID; if (GVAR(placeAction) == 1) then { - _startingPosition = _tempObject modelToWorld [0,0,0]; + _startingPosition = _tempObject modelToWorldVisual [0,0,0]; [_unit, _attachToVehicle, _itemClassname, _itemVehClass, _onAtachText, _startingPosition] call FUNC(placeApprove); }; deleteVehicle _tempObject; diff --git a/addons/attach/functions/fnc_canAttach.sqf b/addons/attach/functions/fnc_canAttach.sqf index 966794b32f..d0930dc069 100644 --- a/addons/attach/functions/fnc_canAttach.sqf +++ b/addons/attach/functions/fnc_canAttach.sqf @@ -25,6 +25,6 @@ _itemName = [_args, 0, ""] call CBA_fnc_defaultParam; _attachLimit = [6, 1] select (_player == _attachToVehicle); _attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; -_playerPos = (ACE_player modelToWorld (ACE_player selectionPosition "pilot")); +_playerPos = (ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot")); (canStand _player) && {(_attachToVehicle distance _player) < 7} && {alive _attachToVehicle} && {(count _attachedObjects) < _attachLimit} && {_itemName in ((itemsWithMagazines _player) + [""])}; diff --git a/addons/attach/functions/fnc_placeApprove.sqf b/addons/attach/functions/fnc_placeApprove.sqf index 576721cf59..60c5e3a9bf 100644 --- a/addons/attach/functions/fnc_placeApprove.sqf +++ b/addons/attach/functions/fnc_placeApprove.sqf @@ -45,7 +45,7 @@ while {(_closeInMax - _closeInMin) > 0.01} do { // systemChat format ["Trying %1 from %2 start %3", _closeInDistance, [_closeInMax, _closeInMin], _startDistanceFromCenter]; _endPosTestOffset = _startingOffset vectorAdd (_closeInUnitVector vectorMultiply _closeInDistance); _endPosTestOffset set [2, (_startingOffset select 2)]; - _endPosTest = _attachToVehicle modelToWorld _endPosTestOffset; + _endPosTest = _attachToVehicle modelToWorldVisual _endPosTestOffset; _doesIntersect = false; { diff --git a/addons/backpacks/functions/fnc_backpackOpened.sqf b/addons/backpacks/functions/fnc_backpackOpened.sqf index 186202027f..1894d68f23 100644 --- a/addons/backpacks/functions/fnc_backpackOpened.sqf +++ b/addons/backpacks/functions/fnc_backpackOpened.sqf @@ -37,7 +37,7 @@ _sounds = [ QUOTE(PATHTO_R(sounds\zip_out.wav)) ]; -_position = _target modelToWorld (_target selectionPosition "Spine3"); +_position = _target modelToWorldVisual (_target selectionPosition "Spine3"); _position = _position call EFUNC(common,positionToASL); playSound3D [ diff --git a/addons/common/functions/fnc_addToInventory.sqf b/addons/common/functions/fnc_addToInventory.sqf index 4e088525fc..b28d864df8 100644 --- a/addons/common/functions/fnc_addToInventory.sqf +++ b/addons/common/functions/fnc_addToInventory.sqf @@ -57,7 +57,7 @@ switch ((_type select 0)) do { }; } else { _addedToPlayer = false; - _pos = _unit modelToWorld [0,1,0.05]; + _pos = _unit modelToWorldVisual [0,1,0.05]; _unit = createVehicle ["WeaponHolder_Single_F",_pos,[],0,"NONE"]; _unit addWeaponCargoGlobal [_classname,1]; _unit setPosATL _pos; @@ -73,7 +73,7 @@ switch ((_type select 0)) do { }; } else { _addedToPlayer = false; - _pos = _unit modelToWorld [0,1,0.05]; + _pos = _unit modelToWorldVisual [0,1,0.05]; _unit = createVehicle ["WeaponHolder_Single_F",_pos,[],0,"NONE"]; _unit addMagazineCargoGlobal [_classname, 1]; _unit setPosATL _pos; @@ -89,7 +89,7 @@ switch ((_type select 0)) do { }; } else { _addedToPlayer = false; - _pos = _unit modelToWorld [0,1,0.05]; + _pos = _unit modelToWorldVisual [0,1,0.05]; _unit = createVehicle ["WeaponHolder_Single_F",_pos,[],0,"NONE"]; _unit addItemCargoGlobal [_classname,1]; _unit setPosATL _pos; diff --git a/addons/common/functions/fnc_canGetInPosition.sqf b/addons/common/functions/fnc_canGetInPosition.sqf index 5ac4c527fd..f4337b6171 100644 --- a/addons/common/functions/fnc_canGetInPosition.sqf +++ b/addons/common/functions/fnc_canGetInPosition.sqf @@ -242,10 +242,10 @@ _fnc_isInRange = { private ["_unitPosition", "_distance"]; _unitPosition = getPos _unit; - _distance = _unitPosition distance (_vehicle modelToWorld _selectionPosition); + _distance = _unitPosition distance (_vehicle modelToWorldVisual _selectionPosition); if (!isNil "_selectionPosition2") then { - _distance = _distance min (_unitPosition distance (_vehicle modelToWorld _selectionPosition2)); + _distance = _distance min (_unitPosition distance (_vehicle modelToWorldVisual _selectionPosition2)); }; _distance < _radius diff --git a/addons/common/functions/fnc_getTurretDirection.sqf b/addons/common/functions/fnc_getTurretDirection.sqf index 0619fb302c..fb265bf545 100644 --- a/addons/common/functions/fnc_getTurretDirection.sqf +++ b/addons/common/functions/fnc_getTurretDirection.sqf @@ -27,11 +27,11 @@ _povDir = [0,0,0]; if(_pov == "pip0_pos") then { _pipDir = ATLtoASL ( _vehicle modelToWorldVisual (_vehicle selectionPosition "pip0_dir" ) ); - _povDir = _povPos vectorDiff _pipDir; + _povDir = _pipDir vectorDiff _povPos; } else { _gunBeginPos = ATLtoASL ( _vehicle modelToWorldVisual (_vehicle selectionPosition _gunBeg ) ); _gunEndPos = ATLtoASL ( _vehicle modelToWorldVisual (_vehicle selectionPosition _gunEnd ) ); - _povDir = _gunEndPos vectorDiff _gunBeginPos; + _povDir = _gunBeginPos vectorDiff _gunEndPos; }; [_povPos, _povDir] \ No newline at end of file diff --git a/addons/common/functions/fnc_inWater.sqf b/addons/common/functions/fnc_inWater.sqf index ea511d388d..2fdede1737 100644 --- a/addons/common/functions/fnc_inWater.sqf +++ b/addons/common/functions/fnc_inWater.sqf @@ -14,7 +14,7 @@ private ["_unit","_return","_aslPos"]; _unit = _this select 0; _return = false; if ((surfaceIsWater getPos _unit)) then { - _aslPos = _unit modelToWorld (_unit selectionPosition "head"); + _aslPos = _unit modelToWorldVisual (_unit selectionPosition "head"); if ((_aslPos select 2) <= 0) then { _return = true; }; diff --git a/addons/dragging/functions/fnc_carryObject.sqf b/addons/dragging/functions/fnc_carryObject.sqf index 2037dfc3f0..ee72dc9aa7 100644 --- a/addons/dragging/functions/fnc_carryObject.sqf +++ b/addons/dragging/functions/fnc_carryObject.sqf @@ -36,7 +36,7 @@ if (_target isKindOf "CAManBase") then { // add height offset of model private "_offset"; - _offset = (_target modelToWorld [0, 0, 0] select 2) - (_unit modelToWorld [0, 0, 0] select 2); + _offset = (_target modelToWorldVisual [0, 0, 0] select 2) - (_unit modelToWorldVisual [0, 0, 0] select 2); _position = _position vectorAdd [0, 0, _offset]; diff --git a/addons/dragging/functions/fnc_dragObject.sqf b/addons/dragging/functions/fnc_dragObject.sqf index f614af9548..35f8687ed0 100644 --- a/addons/dragging/functions/fnc_dragObject.sqf +++ b/addons/dragging/functions/fnc_dragObject.sqf @@ -25,7 +25,7 @@ _direction = _target getVariable [QGVAR(dragDirection), 0]; // add height offset of model private "_offset"; -_offset = (_target modelToWorld [0, 0, 0] select 2) - (_unit modelToWorld [0, 0, 0] select 2); +_offset = (_target modelToWorldVisual [0, 0, 0] select 2) - (_unit modelToWorldVisual [0, 0, 0] select 2); _position = _position vectorAdd [0, 0, _offset]; diff --git a/addons/dragging/functions/fnc_handleScrollWheel.sqf b/addons/dragging/functions/fnc_handleScrollWheel.sqf index 0782e64db7..96f46413bc 100644 --- a/addons/dragging/functions/fnc_handleScrollWheel.sqf +++ b/addons/dragging/functions/fnc_handleScrollWheel.sqf @@ -36,7 +36,7 @@ if (_carriedItem isKindOf "CAManBase") exitWith {false}; private ["_position", "_maxHeight"]; _position = getPosATL _carriedItem; -_maxHeight = (_unit ModelToWorld [0,0,0]) select 2; +_maxHeight = (_unit modelToWorldVisual [0,0,0]) select 2; _position set [2, ((_position select 2) + _scrollAmount min (_maxHeight + 1.5)) max _maxHeight]; diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index d3c429c9fc..fa992a9cac 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -19,7 +19,7 @@ #include "script_component.hpp" EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); if ((_i mod 4) == 0) then { - playSound3D [QUOTE(PATHTO_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; + playSound3D [QUOTE(PATHTO_R(Data\Audio\DialTone.wss)), objNull, false, (_unit modelToWorldVisual [0,0.2,2]), 15,1,2.5]; }; ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf index 1e1ac44bdf..ce43698309 100644 --- a/addons/explosives/functions/fnc_placeExplosive.sqf +++ b/addons/explosives/functions/fnc_placeExplosive.sqf @@ -15,7 +15,7 @@ * Placed explosive * * Example: - * _explosive = [player, player modelToWorld [0,0.5, 0.1], 134, + * _explosive = [player, player modelToWorldVisual [0,0.5, 0.1], 134, * "SatchelCharge_Remote_Mag", "Command", []] call ACE_Explosives_fnc_placeExplosive; * * Public: Yes diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index 077a9239f0..0f03dc1b50 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -28,15 +28,15 @@ if((count _this) > 2) then { _pos = _this select 2; } else { if(typeName (_actionData select 7) == "ARRAY") then { - _pos = _object modelToWorld (_actionData select 7); + _pos = _object modelToWorldVisual (_actionData select 7); } else { if ((_actionData select 7) == "weapon") then { // Craft a suitable position for weapon interaction _weaponDir = _object weaponDirection currentWeapon _object; _ref = _weaponDir call EFUNC(common,createOrthonormalReference); - _pos = (_object modelToWorld (_object selectionPosition "righthand")) vectorAdd ((_ref select 2) vectorMultiply 0.1); + _pos = (_object modelToWorldVisual (_object selectionPosition "righthand")) vectorAdd ((_ref select 2) vectorMultiply 0.1); } else { - _pos = _object modelToWorld (_object selectionPosition (_actionData select 7)); + _pos = _object modelToWorldVisual (_object selectionPosition (_actionData select 7)); }; }; // Compensate for movement during the frame to get rid of jittering @@ -45,7 +45,7 @@ if((count _this) > 2) then { // For non-self actions, exit if the action is too far away if (GVAR(openedMenuType) == 0 && vehicle ACE_player == ACE_player && - {(ACE_player modelToWorld (ACE_player selectionPosition "pilot")) distance _pos >= _distance}) exitWith {false}; + {(ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot")) distance _pos >= _distance}) exitWith {false}; // Exit if the action is behind you _sPos = if (count _pos != 2) then { diff --git a/addons/laser/functions/fnc_findLaserDesignator.sqf b/addons/laser/functions/fnc_findLaserDesignator.sqf index 73a9462457..d10e221501 100644 --- a/addons/laser/functions/fnc_findLaserDesignator.sqf +++ b/addons/laser/functions/fnc_findLaserDesignator.sqf @@ -19,7 +19,7 @@ if(!(isNil "ACE_LASERS")) then { { if(!(isNull _x)) then { - _sensorPos = ATLtoASL(_missile modelToWorld _offset); + _sensorPos = ATLtoASL(_missile modelToWorldVisual _offset); _vectorTo = [_sensorPos, ([_x] call FUNC(getPosASL))] call BIS_fnc_vectorFromXToY; _polarTo = _vectorTo call CBA_fnc_vect2polar; _dir = _polarTo select 1; diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index 57c5d686c9..f44fb2e2b9 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -1,4 +1,4 @@ -//#define DEBUG_MODE_FULL +// #define DEBUG_MODE_FULL #include "script_component.hpp" TRACE_1("enter", _this); @@ -47,6 +47,8 @@ FUNC(laserHudDesignatePFH) = { _povPos = _turretInfo select 0; _povDir = _turretInfo select 1; + + _result = [_povPos, _povDir] call EFUNC(laser,shootCone); if((count _result) > 0) then { _resultPositions = _result select 2; @@ -77,11 +79,11 @@ FUNC(laserHudDesignatePFH) = { }; #ifdef DEBUG_MODE_FULL drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], (getPosATL _laserTarget), 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; - + { private["_position"]; _position = _x select 0; - drawLine3d [_povPos, _position, [0,0,1,1] ]; + drawLine3d [ASLToATL _povPos, ASLToATL _position, [0,0,1,1] ]; } forEach _resultPositions; #endif }; diff --git a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf index 969607f987..31be95099a 100644 --- a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf +++ b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf @@ -3,7 +3,7 @@ EXPLODE_3_PVT(_this,_unit,_range,_isGreen); -_p0Pos = _unit modelToWorld (_unit selectionPosition "righthand"); +_p0Pos = _unit modelToWorldVisual (_unit selectionPosition "righthand"); // Convert _p0Pos to ASL _p0 = + _p0Pos; diff --git a/addons/medical/functions/fnc_isInMedicalFacility.sqf b/addons/medical/functions/fnc_isInMedicalFacility.sqf index b1521b288b..bed660a46a 100644 --- a/addons/medical/functions/fnc_isInMedicalFacility.sqf +++ b/addons/medical/functions/fnc_isInMedicalFacility.sqf @@ -37,7 +37,7 @@ _medicalFacility = "USMC_WarfareBFieldhHospital" ]; -_objects = (lineIntersectsWith [_unit modelToWorld [0, 0, (_eyePos select 2)], _unit modelToWorld [0, 0, (_eyePos select 2) +10], _unit]); +_objects = (lineIntersectsWith [_unit modelToWorldVisual [0, 0, (_eyePos select 2)], _unit modelToWorldVisual [0, 0, (_eyePos select 2) +10], _unit]); { if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith { _isInBuilding = true; diff --git a/addons/missileguidance/functions/fnc_guidance_DAGR.sqf b/addons/missileguidance/functions/fnc_guidance_DAGR.sqf index 9599a81161..9055b00a7f 100644 --- a/addons/missileguidance/functions/fnc_guidance_DAGR.sqf +++ b/addons/missileguidance/functions/fnc_guidance_DAGR.sqf @@ -83,7 +83,7 @@ FUNC(guidance_DIRECT_LOAL_PFH) = { if(accTime > 0) then { _outVector = [_dagr, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - // _outVector = _dagr modelToWorld [_yaw, 1, _pitch]; + // _outVector = _dagr modelToWorldVisual [_yaw, 1, _pitch]; // _outVector = ATLtoASL _outVector; _vectorTo = _dagrPos vectorFromTo _outVector; diff --git a/addons/missileguidance/functions/fnc_guidance_LGB.sqf b/addons/missileguidance/functions/fnc_guidance_LGB.sqf index 940c94d34e..47efa46768 100644 --- a/addons/missileguidance/functions/fnc_guidance_LGB.sqf +++ b/addons/missileguidance/functions/fnc_guidance_LGB.sqf @@ -73,7 +73,7 @@ FUNC(guidance_LGB_LOAL_PFH) = { if(accTime > 0) then { _outVector = [_lgb, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - // _outVector = _lgb modelToWorld [_yaw, 1, _pitch]; + // _outVector = _lgb modelToWorldVisual [_yaw, 1, _pitch]; // _outVector = ATLtoASL _outVector; _vectorTo = _lgbPos vectorFromTo _outVector; diff --git a/addons/movement/functions/fnc_handleClimb.sqf b/addons/movement/functions/fnc_handleClimb.sqf index da0f8e0224..39ca9b1e92 100644 --- a/addons/movement/functions/fnc_handleClimb.sqf +++ b/addons/movement/functions/fnc_handleClimb.sqf @@ -21,7 +21,7 @@ private ["_unit", "_anim", "_pos"]; _unit = _this select 0; _anim = _this select 1; -_pos = _unit modelToWorld (_unit selectionPosition "camera"); +_pos = _unit modelToWorldVisual (_unit selectionPosition "camera"); [_unit, "AmovPknlMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); _pos = _pos vectorDiff (_unit selectionPosition "camera"); diff --git a/addons/resting/functions/fnc_getIntersection.sqf b/addons/resting/functions/fnc_getIntersection.sqf index 395b83f0a4..0527a7c514 100644 --- a/addons/resting/functions/fnc_getIntersection.sqf +++ b/addons/resting/functions/fnc_getIntersection.sqf @@ -18,7 +18,7 @@ EXPLODE_3_PVT(_this,_unit,_vehicle,_weapon); private ["_weaponPos", "_weaponDir", "_weaponPosDown"]; -_weaponPos = ATLtoASL (_unit modelToWorld (_unit selectionPosition "RightHand")); +_weaponPos = ATLtoASL (_unit modelToWorldVisual (_unit selectionPosition "RightHand")); _weaponDir = _unit weaponDirection _weapon; _weaponPosDown = _weaponPos vectorAdd [0,0,-MAXHEIGHT]; diff --git a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf index c0b58604b9..6c2c797706 100644 --- a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf +++ b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf @@ -26,7 +26,7 @@ if (count _sound < 3) then {_sound pushBack 1}; if (count _sound < 4) then {_sound pushBack 0}; private "_position"; -_position = _unit modelToWorld (_unit selectionPosition "RightHand"); +_position = _unit modelToWorldVisual (_unit selectionPosition "RightHand"); _position set [2, (_position select 2) + ((getPosASLW _unit select 2) - (getPosATL _unit select 2) max 0)]; playSound3D [_sound select 0, objNull, false, _position, _sound select 1, _sound select 2, _sound select 3]; diff --git a/addons/weaponselect/functions/fnc_playChangeFiremodeSound.sqf b/addons/weaponselect/functions/fnc_playChangeFiremodeSound.sqf index 82901a1b52..ea671a530d 100644 --- a/addons/weaponselect/functions/fnc_playChangeFiremodeSound.sqf +++ b/addons/weaponselect/functions/fnc_playChangeFiremodeSound.sqf @@ -27,7 +27,7 @@ if (count _sound < 4) then {_sound pushBack 0}; private "_position"; -_position = _unit modelToWorld (_unit selectionPosition "RightHand"); +_position = _unit modelToWorldVisual (_unit selectionPosition "RightHand"); _position set [2, (_position select 2) + ((getPosASLW _unit select 2) - (getPosATL _unit select 2) max 0)]; playSound3D [_sound select 0, objNull, false, _position, _sound select 1, _sound select 2, _sound select 3]; From fff8a240e31dc2112f8bbe28c2e507448816dbd3 Mon Sep 17 00:00:00 2001 From: Nou Date: Fri, 3 Apr 2015 15:31:44 -0700 Subject: [PATCH 16/43] Remove compensation for movement, instead use modelToWorldVisual --- addons/interact_menu/functions/fnc_renderBaseMenu.sqf | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index 0f03dc1b50..9a20962a8f 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -39,8 +39,6 @@ if((count _this) > 2) then { _pos = _object modelToWorldVisual (_object selectionPosition (_actionData select 7)); }; }; - // Compensate for movement during the frame to get rid of jittering - _pos = _pos vectorAdd ((visiblePositionASL _object) vectorDiff (getPosASL _object)); }; // For non-self actions, exit if the action is too far away From 1ae6f2daba11b7972eafd4cac31ee5d6c35ac58b Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 15:41:29 -0700 Subject: [PATCH 17/43] Why doesnt flummi's work? --- extensions/CMakeLists.txt | 2 +- extensions/fcs/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index cc233746b6..f0e21e9207 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -21,7 +21,7 @@ else() set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG") endif() -file(GLOB_RECURSE ACE_COMMON_SOURCES common/*.h common/*.hpp common/*.c common/*.cpp) +file(GLOB ACE_COMMON_SOURCES common/*.h common/*.hpp common/*.c common/*.cpp) add_library(ace_common STATIC ${ACE_COMMON_SOURCES}) include_directories(AFTER "common") diff --git a/extensions/fcs/CMakeLists.txt b/extensions/fcs/CMakeLists.txt index 25b7746fe0..2b24542566 100644 --- a/extensions/fcs/CMakeLists.txt +++ b/extensions/fcs/CMakeLists.txt @@ -1,6 +1,6 @@ set(ACE_EXTENSION_NAME "ace_fcs") -file(GLOB_RECURSE SOURCES *.h *.hpp *.c *.cpp) +file(GLOB SOURCES *.h *.hpp *.c *.cpp) add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES}) add_dependencies(${ACE_EXTENSION_NAME} ace_common) SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") From 1672a5f2f92affb4448b5a9c699dff08ea81c452 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 16:17:26 -0700 Subject: [PATCH 18/43] Added: Comanche HUD revamped+stabalized, awesomeness activated. --- addons/aircraft/CfgVehicles.hpp | 24 +- addons/aircraft/Heli_Attack_01_base_F.hpp | 997 ++++++++++++++++++++++ 2 files changed, 998 insertions(+), 23 deletions(-) create mode 100644 addons/aircraft/Heli_Attack_01_base_F.hpp diff --git a/addons/aircraft/CfgVehicles.hpp b/addons/aircraft/CfgVehicles.hpp index e9fb90e61e..02769a2c14 100644 --- a/addons/aircraft/CfgVehicles.hpp +++ b/addons/aircraft/CfgVehicles.hpp @@ -95,29 +95,7 @@ class CfgVehicles { }; }; - class Heli_Attack_01_base_F: Helicopter_Base_F { - lockDetectionSystem = 12; - incomingMissileDetectionSystem = 16; - driverCanEject = 1; - - class Turrets: Turrets { - class MainTurret: MainTurret { - canEject = 1; - showHMD = 1; - weapons[] = {"ACE_gatling_20mm_Comanche","missiles_DAGR","missiles_ASRAAM"}; - magazines[] = {"ACE_500Rnd_20mm_shells_Comanche","4Rnd_AAA_missiles","24Rnd_PG_missiles"}; - }; - }; - - class AnimationSources: AnimationSources { - class Gatling { - weapon = "ACE_gatling_20mm_Comanche"; - }; - class Muzzle_flash { - weapon = "ACE_gatling_20mm_Comanche"; - }; - }; - }; + #include "Heli_Attack_01_base_F.hpp" class B_Heli_Attack_01_F: Heli_Attack_01_base_F {}; diff --git a/addons/aircraft/Heli_Attack_01_base_F.hpp b/addons/aircraft/Heli_Attack_01_base_F.hpp new file mode 100644 index 0000000000..eb77c8a4ea --- /dev/null +++ b/addons/aircraft/Heli_Attack_01_base_F.hpp @@ -0,0 +1,997 @@ +class Heli_Attack_01_base_F: Helicopter_Base_F { + lockDetectionSystem = 12; + incomingMissileDetectionSystem = 16; + driverCanEject = 1; + + class MFD + { + class AirplaneHUD + { + class Bones{}; + class Draw{}; + topLeft = "HUD_top_left"; + topRight = "HUD_top_right"; + bottomLeft = "HUD_bottom_left"; + borderLeft = 0; + borderRight = 0; + borderTop = 0; + borderBottom = 0; + color[] = {0.15,1,0.15,1}; + enableParallax = 0; + helmetMountedDisplay = 1; + helmetPosition[] = {0,0,0}; + helmetRight[] = {0,0,0}; + helmetDown[] = {0,0,0}; + }; + class Kimi_HUD_1 + { + topLeft = "HUD_top_left"; + topRight = "HUD_top_right"; + bottomLeft = "HUD_bottom_left"; + borderLeft = 0; + borderRight = 0; + borderTop = 0; + borderBottom = 0; + color[] = {0.15,1,0.15,1}; + enableParallax = 0; + class Bones + { + class GunnerAim + { + type = "vector"; + source = "weapon"; + pos0[] = {0.5,"0.9 - 0.04 + 0.012"}; + pos10[] = {"0.5 + 0.0111","0.9 - 0.04 + 0.012 + 0.0133"}; + }; + class Target + { + source = "target"; + type = "vector"; + pos0[] = {0.5,0.5}; + pos10[] = {0.85,0.85}; + }; + class Velocity + { + type = "vector"; + source = "velocity"; + pos0[] = {0.5,0.5}; + pos10[] = {0.65,0.65}; + }; + class Velocity_slip + { + type = "vector"; + source = "velocity"; + pos0[] = {0.5,0.845}; + pos10[] = {0.53,0.845}; + }; + class VspeedBone + { + type = "linear"; + source = "vspeed"; + sourceScale = 1; + min = -10; + max = 10; + minPos[] = {0.93,0.2}; + maxPos[] = {0.93,0.8}; + }; + class RadarAltitudeBone + { + type = "linear"; + source = "altitudeAGL"; + sourceScale = 1; + min = 0; + max = 60; + minPos[] = {0.965,0.2}; + maxPos[] = {0.965,0.8}; + }; + class HorizonBankRot + { + type = "rotational"; + source = "horizonBank"; + center[] = {0.5,0.5}; + min = -3.1416; + max = 3.1416; + minAngle = -180; + maxAngle = 180; + aspectRatio = 1; + }; + class ForwardVec + { + type = "vector"; + source = "forward"; + pos0[] = {0,0}; + pos10[] = {0.25,0.25}; + }; + class WeaponAim + { + type = "vector"; + source = "weapon"; + pos0[] = {0.5,0.5}; + pos10[] = {0.75,0.75}; + }; + class Level0 + { + type = "horizon"; + pos0[] = {0.5,0.5}; + pos10[] = {0.78,0.78}; + angle = 0; + }; + class LevelP5: Level0 + { + angle = 5; + }; + class LevelM5: Level0 + { + angle = -5; + }; + class LevelP10: Level0 + { + angle = 10; + }; + class LevelM10: Level0 + { + angle = -10; + }; + class LevelP15: Level0 + { + angle = 15; + }; + class LevelM15: Level0 + { + angle = -15; + }; + class LevelP20: Level0 + { + angle = 20; + }; + class LevelM20: Level0 + { + angle = -20; + }; + class LevelP25: Level0 + { + angle = 25; + }; + class LevelM25: Level0 + { + angle = -25; + }; + class LevelP30: Level0 + { + angle = 30; + }; + class LevelM30: Level0 + { + angle = -30; + }; + class LevelP35: Level0 + { + angle = 35; + }; + class LevelM35: Level0 + { + angle = -35; + }; + class LevelP40: Level0 + { + angle = 40; + }; + class LevelM40: Level0 + { + angle = -40; + }; + class LevelP45: Level0 + { + angle = 45; + }; + class LevelM45: Level0 + { + angle = -45; + }; + class LevelP50: Level0 + { + angle = 50; + }; + class LevelM50: Level0 + { + angle = -50; + }; + }; + class Draw + { + color[] = {0.18,1,0.18}; + alpha = 1; + condition = "on"; + class Horizont + { + clipTL[] = {0.15,0.15}; + clipBR[] = {0.85,0.85}; + class Dimmed + { + class Level0 + { + type = "line"; + points[] = {{ "Level0",{ -0.42,0 },1 },{ "Level0",{ -0.38,0 },1 },{ },{ "Level0",{ -0.37,0 },1 },{ "Level0",{ -0.33,0 },1 },{ },{ "Level0",{ -0.32,0 },1 },{ "Level0",{ -0.28,0 },1 },{ },{ "Level0",{ -0.27,0 },1 },{ "Level0",{ -0.23,0 },1 },{ },{ "Level0",{ -0.22,0 },1 },{ "Level0",{ -0.18,0 },1 },{ },{ "Level0",{ -0.17,0 },1 },{ "Level0",{ -0.13,0 },1 },{ },{ "Level0",{ -0.12,0 },1 },{ "Level0",{ -0.08,0 },1 },{ },{ "Level0",{ 0.42,0 },1 },{ "Level0",{ 0.38,0 },1 },{ },{ "Level0",{ 0.37,0 },1 },{ "Level0",{ 0.33,0 },1 },{ },{ "Level0",{ 0.32,0 },1 },{ "Level0",{ 0.28,0 },1 },{ },{ "Level0",{ 0.27,0 },1 },{ "Level0",{ 0.23,0 },1 },{ },{ "Level0",{ 0.22,0 },1 },{ "Level0",{ 0.18,0 },1 },{ },{ "Level0",{ 0.17,0 },1 },{ "Level0",{ 0.13,0 },1 },{ },{ "Level0",{ 0.12,0 },1 },{ "Level0",{ 0.08,0 },1 }}; + }; + }; + }; + class HorizonBankRot + { + type = "line"; + width = 3; + points[] = {{ "HorizonBankRot",{ 0,0.25 },1 },{ "HorizonBankRot",{ -0.01,0.23 },1 },{ "HorizonBankRot",{ 0.01,0.23 },1 },{ "HorizonBankRot",{ 0,0.25 },1 }}; + }; + class Static_HAD_BOX + { + clipTL[] = {0,1}; + clipBR[] = {1,0}; + type = "line"; + width = 5; + points[] = {{ { "0.5-0.1","0.9-0.04" },1 },{ { "0.5-0.1","0.9+0.04" },1 },{ { "0.5+0.1","0.9+0.04" },1 },{ { "0.5+0.1","0.9-0.04" },1 },{ { "0.5-0.1","0.9-0.04" },1 },{ },{ { "0.5-0.1","0.9-0.04+0.012" },1 },{ { "0.5-0.092","0.9-0.04+0.012" },1 },{ },{ { "0.5+0.1","0.9-0.04+0.012" },1 },{ { "0.5+0.092","0.9-0.04+0.012" },1 },{ },{ { 0.5,"0.9-0.04" },1 },{ { 0.5,"0.9-0.032" },1 },{ },{ { 0.5,"0.9+0.04" },1 },{ { 0.5,"0.9+0.032" },1 },{ }}; + }; + class Gunner_HAD + { + type = "line"; + width = 6; + points[] = {{ "GunnerAim",{ -0.015,-0.008 },1 },{ "GunnerAim",{ -0.015,0.008 },1 },{ "GunnerAim",{ 0.015,0.008 },1 },{ "GunnerAim",{ 0.015,-0.008 },1 },{ "GunnerAim",{ -0.015,-0.008 },1 }}; + }; + class Slip_ball_group + { + class Slip_bars + { + type = "line"; + width = 4; + points[] = {{ { "0.5-0.018","0.9-0.04" },1 },{ { "0.5-0.018","0.9-0.075" },1 },{ },{ { "0.5+0.018","0.9-0.04" },1 },{ { "0.5+0.018","0.9-0.075" },1 }}; + }; + class Slip_ball + { + type = "line"; + width = 6; + points[] = {{ "Velocity_slip",1,{ "0 * 0.75","-0.02 * 0.75" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.75","-0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.75","-0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "0.02 * 0.75","0 * 0.75" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.75","0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.75","0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0 * 0.75","0.02 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.75","0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.75","0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.75","0 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.75","-0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.75","-0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0 * 0.75","-0.02 * 0.75" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.6","-0.02 * 0.6" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.6","-0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.6","-0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "0.02 * 0.6","0 * 0.6" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.6","0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.6","0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0 * 0.6","0.02 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.6","0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.6","0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.6","0 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.6","-0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.6","-0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0 * 0.6","-0.02 * 0.6" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.5","-0.02 * 0.5" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.5","-0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.5","-0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "0.02 * 0.5","0 * 0.5" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.5","0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.5","0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0 * 0.5","0.02 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.5","0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.5","0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.5","0 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.5","-0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.5","-0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0 * 0.5","-0.02 * 0.5" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.4","-0.02 * 0.4" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.4","-0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.4","-0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "0.02 * 0.4","0 * 0.4" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.4","0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.4","0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0 * 0.4","0.02 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.4","0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.4","0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.4","0 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.4","-0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.4","-0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0 * 0.4","-0.02 * 0.4" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.30","-0.02 * 0.30" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.30","-0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.30","-0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "0.02 * 0.30","0 * 0.30" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.30","0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.30","0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0 * 0.30","0.02 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.30","0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.30","0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.30","0 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.30","-0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.30","-0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0 * 0.30","-0.02 * 0.30" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.20","-0.02 * 0.20" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.20","-0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.20","-0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "0.02 * 0.20","0 * 0.20" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.20","0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.20","0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0 * 0.20","0.02 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.20","0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.20","0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.20","0 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.20","-0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.20","-0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0 * 0.20","-0.02 * 0.20" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.1","-0.02 * 0.1" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.1","-0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.1","-0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "0.02 * 0.1","0 * 0.1" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.1","0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.1","0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0 * 0.1","0.02 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.1","0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.1","0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.1","0 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.1","-0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.1","-0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0 * 0.1","-0.02 * 0.1" },1 }}; + }; + }; + class Centerline + { + type = "line"; + width = 5; + points[] = {{ { 0.5,0.48 },1 },{ { 0.5,0.45 },1 },{ },{ { 0.5,0.52 },1 },{ { 0.5,0.55 },1 },{ },{ { 0.48,0.5 },1 },{ { 0.45,0.5 },1 },{ },{ { 0.52,0.5 },1 },{ { 0.55,0.5 },1 },{ }}; + }; + class WeaponName + { + type = "text"; + source = "weapon"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.86 },1}; + right[] = {{ 0.65,0.86 },1}; + down[] = {{ 0.61,0.9 },1}; + }; + class Ammo_GUN + { + type = "group"; + condition = "mgun"; + class Ammo_count_GUN + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class Ammo_RKT + { + type = "group"; + condition = "rocket"; + class Ammo_count_RKT + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class Ammo_AGM + { + type = "group"; + condition = "AAmissile"; + class Ammo_count_AGM + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class Ammo_AAM + { + type = "group"; + condition = "ATmissile"; + class Ammo_count_AAM + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class Ammo_Bomb + { + type = "group"; + condition = "Bomb"; + class Ammo_count_Bomb + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class LightsGroup + { + type = "group"; + condition = "lights"; + class LightsText + { + type = "text"; + source = "static"; + text = "LIGHTS"; + align = "right"; + scale = 1; + pos[] = {{ 0.03,"0.53 + 0.055" },1}; + right[] = {{ 0.07,"0.53 + 0.055" },1}; + down[] = {{ 0.03,"0.53 + 0.095" },1}; + }; + }; + class CollisionLightsGroup + { + type = "group"; + condition = "collisionlights"; + class CollisionLightsText + { + type = "text"; + source = "static"; + text = "A-COL"; + align = "right"; + scale = 1; + pos[] = {{ 0.03,"0.53 + 0.105" },1}; + right[] = {{ 0.07,"0.53 + 0.105" },1}; + down[] = {{ 0.03,"0.53 + 0.145" },1}; + }; + }; + class GearGroup + { + type = "group"; + condition = "ils"; + class GearText + { + type = "text"; + source = "static"; + text = "GEAR"; + align = "right"; + scale = 1; + pos[] = {{ 0.03,"0.53 + 0.155" },1}; + right[] = {{ 0.07,"0.53 + 0.155" },1}; + down[] = {{ 0.03,"0.53 + 0.195" },1}; + }; + }; + class ATMissileTOFGroup + { + condition = "ATmissile"; + type = "group"; + class TOFtext + { + type = "text"; + align = "right"; + source = "static"; + text = "TOF="; + scale = 1; + pos[] = {{ 0.61,0.92 },1}; + right[] = {{ 0.65,0.92 },1}; + down[] = {{ 0.61,0.96 },1}; + }; + class TOFnumber + { + type = "text"; + source = "targetDist"; + sourcescale = 0.0025; + align = "right"; + scale = 1; + pos[] = {{ 0.69,0.92 },1}; + right[] = {{ 0.73,0.92 },1}; + down[] = {{ 0.69,0.96 },1}; + }; + }; + class LaserTOFGroup + { + condition = "Bomb"; + type = "group"; + class TOFtext + { + type = "text"; + align = "right"; + source = "static"; + text = "TOF="; + scale = 1; + pos[] = {{ 0.61,0.92 },1}; + right[] = {{ 0.65,0.92 },1}; + down[] = {{ 0.61,0.96 },1}; + }; + class TOFnumber + { + type = "text"; + source = "targetDist"; + sourcescale = 0.0025; + align = "right"; + scale = 1; + pos[] = {{ 0.69,0.92 },1}; + right[] = {{ 0.73,0.92 },1}; + down[] = {{ 0.69,0.96 },1}; + }; + }; + class RocketTOFGroup + { + condition = "Rocket"; + type = "group"; + class TOFtext + { + type = "text"; + align = "right"; + source = "static"; + text = "TOF="; + scale = 1; + pos[] = {{ 0.61,0.92 },1}; + right[] = {{ 0.65,0.92 },1}; + down[] = {{ 0.61,0.96 },1}; + }; + class TOFnumber + { + type = "text"; + source = "targetDist"; + sourcescale = 0.0025; + align = "right"; + scale = 1; + pos[] = {{ 0.69,0.92 },1}; + right[] = {{ 0.73,0.92 },1}; + down[] = {{ 0.69,0.96 },1}; + }; + }; + class RangeNumber + { + type = "text"; + source = "targetDist"; + sourceScale = 1; + align = "left"; + scale = 1; + pos[] = {{ 0.39,0.89 },1}; + right[] = {{ 0.43,0.89 },1}; + down[] = {{ 0.39,0.93 },1}; + }; + class RangeText + { + type = "text"; + source = "static"; + text = "RNG"; + align = "left"; + scale = 1; + pos[] = {{ 0.39,0.86 },1}; + right[] = {{ 0.43,0.86 },1}; + down[] = {{ 0.39,0.9 },1}; + }; + class SpeedNumber + { + type = "text"; + align = "right"; + scale = 1; + source = "speed"; + sourceScale = 3.6; + pos[] = {{ 0.03,0.475 },1}; + right[] = {{ 0.08,0.475 },1}; + down[] = {{ 0.03,0.525 },1}; + }; + class TorqueNumber + { + condition = "simulRTD"; + class Torque_number + { + type = "text"; + align = "left"; + scale = 1; + source = "rtdRotorTorque"; + sourceScale = 290; + pos[] = {{ 0.065,0.175 },1}; + right[] = {{ 0.115,0.175 },1}; + down[] = {{ 0.065,0.225 },1}; + }; + class Torquetext + { + type = "text"; + source = "static"; + text = "%"; + align = "right"; + scale = 1; + pos[] = {{ 0.07,0.175 },1}; + right[] = {{ 0.12,0.175 },1}; + down[] = {{ 0.07,0.225 },1}; + }; + }; + class AltNumber: SpeedNumber + { + align = "right"; + source = "altitudeAGL"; + sourceScale = 1; + pos[] = {{ 0.83,0.475 },1}; + right[] = {{ 0.88,0.475 },1}; + down[] = {{ 0.83,0.525 },1}; + }; + class ASLNumber + { + type = "text"; + source = "altitudeASL"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.835,0.18 },1}; + right[] = {{ 0.875,0.18 },1}; + down[] = {{ 0.835,0.22 },1}; + }; + class VspeedScalePosta + { + type = "line"; + width = 5; + points[] = {{ { 0.98,0.2 },1 },{ { 1,0.2 },1 },{ },{ { 0.93,0.2 },1 },{ { 0.95,0.2 },1 },{ },{ { 0.98,0.35 },1 },{ { 1,0.35 },1 },{ },{ { 0.93,0.35 },1 },{ { 0.95,0.35 },1 },{ },{ { 0.94,0.38 },1 },{ { 0.95,0.38 },1 },{ },{ { 0.94,0.41 },1 },{ { 0.95,0.41 },1 },{ },{ { 0.94,0.44 },1 },{ { 0.95,0.44 },1 },{ },{ { 0.94,0.47 },1 },{ { 0.95,0.47 },1 },{ },{ { 0.98,0.5 },1 },{ { 1,0.5 },1 },{ },{ { 0.93,0.5 },1 },{ { 0.95,0.5 },1 },{ },{ { 0.94,0.53 },1 },{ { 0.95,0.53 },1 },{ },{ { 0.94,0.56 },1 },{ { 0.95,0.56 },1 },{ },{ { 0.94,0.59 },1 },{ { 0.95,0.59 },1 },{ },{ { 0.94,0.62 },1 },{ { 0.95,0.62 },1 },{ },{ { 0.98,0.65 },1 },{ { 1,0.65 },1 },{ },{ { 0.93,0.65 },1 },{ { 0.95,0.65 },1 },{ },{ { 0.99,0.68 },1 },{ { 0.98,0.68 },1 },{ },{ { 0.99,0.71 },1 },{ { 0.98,0.71 },1 },{ },{ { 0.99,0.74 },1 },{ { 0.98,0.74 },1 },{ },{ { 0.99,0.77 },1 },{ { 0.98,0.77 },1 },{ },{ { 0.98,0.8 },1 },{ { 1,0.8 },1 },{ },{ { 0.93,0.8 },1 },{ { 0.95,0.8 },1 },{ }}; + }; + class RadarAltitudeBand + { + clipTL[] = {0,0.2}; + clipBR[] = {1,0.8}; + hideValue = 201; + class radarbanda + { + type = "line"; + width = 17; + points[] = {{ "RadarAltitudeBone",{ 0,0 },1 },{ "RadarAltitudeBone",{ 0,0.6 },1 }}; + }; + }; + class VspeedBand + { + type = "line"; + width = 3; + points[] = {{ "VspeedBone",{ -0.01,0 },1 },{ "VspeedBone",{ -0.025,-0.015 },1 },{ "VspeedBone",{ -0.025,0.015 },1 },{ "VspeedBone",{ -0.01,0 },1 },{ }}; + }; + class HeadingNumber: SpeedNumber + { + source = "heading"; + sourceScale = 1; + align = "center"; + pos[] = {{ 0.5,0.045 },1}; + right[] = {{ 0.56,0.045 },1}; + down[] = {{ 0.5,"0.045 + 0.06" },1}; + }; + class Center_box + { + type = "line"; + width = 1.5; + points[] = {{ { 0.45,"0.02 + 0.085 - 0.06" },1 },{ { "0.45 + 0.10","0.02 + 0.085 - 0.06" },1 },{ { "0.45 + 0.10","0.02 + 0.085" },1 },{ { 0.45,"0.02 + 0.085" },1 },{ { 0.45,"0.02 + 0.085 - 0.06" },1 }}; + }; + class HeadingArrow + { + type = "line"; + width = 7; + points[] = {{ { "0.5","0.128 + 0.03" },1 },{ { 0.5,0.128 },1 }}; + }; + class HeadingScale_LEFT + { + clipTL[] = {0,0}; + clipBR[] = {0.45,1}; + class Heading_group + { + type = "scale"; + horizontal = 1; + source = "heading"; + sourceScale = 1; + width = 5; + top = 0.12; + center = 0.5; + bottom = 0.88; + lineXleft = "0.03 + 0.085"; + lineYright = "0.02 + 0.085"; + lineXleftMajor = "0.04 + 0.085"; + lineYrightMajor = "0.02 + 0.085"; + majorLineEach = 3; + numberEach = 3; + step = 10; + stepSize = "0.05"; + align = "center"; + scale = 1; + pos[] = {0.12,"0.0 + 0.065"}; + right[] = {0.16,"0.0 + 0.065"}; + down[] = {0.12,"0.04 + 0.065"}; + }; + }; + class HeadingScale_RIGHT + { + clipTL[] = {0.55,0}; + clipBR[] = {1,1}; + class Heading_group + { + type = "scale"; + horizontal = 1; + source = "heading"; + sourceScale = 1; + width = 5; + top = 0.12; + center = 0.5; + bottom = 0.88; + lineXleft = "0.03 + 0.085"; + lineYright = "0.02 + 0.085"; + lineXleftMajor = "0.04 + 0.085"; + lineYrightMajor = "0.02 + 0.085"; + majorLineEach = 3; + numberEach = 3; + step = 10; + stepSize = "0.05"; + align = "center"; + scale = 1; + pos[] = {0.12,"0.0 + 0.065"}; + right[] = {0.16,"0.0 + 0.065"}; + down[] = {0.12,"0.04 + 0.065"}; + }; + }; + class HeadingScale_BOTTOM + { + clipTL[] = {0.45,"0.02 + 0.085"}; + clipBR[] = {"0.45 + 0.10",1}; + class Heading_group + { + type = "scale"; + horizontal = 1; + source = "heading"; + sourceScale = 1; + width = 5; + top = 0.12; + center = 0.5; + bottom = 0.88; + lineXleft = "0.03 + 0.085"; + lineYright = "0.02 + 0.085"; + lineXleftMajor = "0.04 + 0.085"; + lineYrightMajor = "0.02 + 0.085"; + majorLineEach = 3; + numberEach = 3; + step = 10; + stepSize = "0.05"; + align = "center"; + scale = 1; + pos[] = {0.12,"0.0 + 0.065"}; + right[] = {0.16,"0.0 + 0.065"}; + down[] = {0.12,"0.04 + 0.065"}; + }; + }; + class Fuel_Text + { + type = "text"; + source = "static"; + text = "Fuel"; + align = "right"; + scale = 1; + pos[] = {{ 0.03,0.9 },1}; + right[] = {{ 0.07,0.9 },1}; + down[] = {{ 0.03,0.94 },1}; + }; + class Fuel_Number + { + type = "text"; + source = "fuel"; + sourceScale = 100; + align = "right"; + scale = 1; + pos[] = {{ 0.1,0.9 },1}; + right[] = {{ 0.14,0.9 },1}; + down[] = {{ 0.1,0.94 },1}; + }; + }; + helmetMountedDisplay = 1; + helmetPosition[] = {-0.04,0.04,0.1}; + helmetRight[] = {0.08,0,0}; + helmetDown[] = {0,-0.08,0}; + }; + class Kimi_HUD_2 + { + topLeft = "HUD_top_left"; + topRight = "HUD_top_right"; + bottomLeft = "HUD_bottom_left"; + borderLeft = 0; + borderRight = 0; + borderTop = 0; + borderBottom = 0; + color[] = {0.15,1,0.15,1}; + enableParallax = 0; + class Bones + { + class Velocity + { + type = "vector"; + source = "velocity"; + pos0[] = {0.5,0.5}; + pos10[] = {0.75,0.75}; + }; + class ForwardVec1 + { + type = "vector"; + source = "forward"; + pos0[] = {0,0}; + pos10[] = {0.25,0.25}; + }; + class ForwardVec + { + type = "vector"; + source = "forward"; + pos0[] = {0,0}; + pos10[] = {0.253,0.253}; + }; + class WeaponAim + { + type = "vector"; + source = "weapon"; + pos0[] = {0.5,0.5}; + pos10[] = {0.753,0.753}; + }; + class WeaponAim1 + { + type = "vector"; + source = "weapon"; + pos0[] = {0,0}; + pos10[] = {0.253,0.23}; + }; + class Target + { + type = "vector"; + source = "target"; + pos0[] = {0.5,0.5}; + pos10[] = {0.753,0.753}; + }; + class RadarContact + { + type = "fixed"; + pos[] = {0,0}; + }; + }; + class Draw + { + color[] = {0.18,1,0.18}; + alpha = 1; + condition = "on"; + class PlaneMovementCrosshair + { + type = "line"; + width = 7; + points[] = {{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01,-0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01732,-0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.02,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01732,0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01,0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,0.02 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01,0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01732,0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.02,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01732,-0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01,-0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ 0.04,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.02,0 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ -0.04,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.02,0 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.04 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 }}; + }; + class Gunner_AIM + { + type = "group"; + class Circle + { + type = "line"; + width = 6; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.03 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.0325 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.0475 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.03 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.0325 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.0475 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.03,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.0325,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.0475,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.03,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.0325,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.0475,0 },1 }}; + }; + }; + class GunCross + { + condition = "mgun"; + class Circle + { + type = "line"; + width = 9; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.05 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.015 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.05 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.05,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.015,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,0 },1 },{ }}; + }; + }; + class RocketCross + { + condition = "rocket"; + width = 6; + class Circle + { + type = "line"; + width = 6; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ -0.05,-0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,-0.08 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.08 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.05,0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,0.08 },1 },{ }}; + }; + }; + class AT_Aim + { + condition = "ATmissile"; + width = 2; + class Circle + { + type = "line"; + width = 2; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ -0.1,-0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.1,-0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.1,0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.1,0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.1,-0.1 },1 }}; + }; + }; + class AA_aim + { + condition = "AAmissile"; + class Circle + { + type = "line"; + width = 2.5; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","-0.248559 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 4","-0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 4","-0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 4","-0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 4","-0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 4","-0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 4","-0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 4","-0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 4","-0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.25 / 4","0 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 4","0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 4","0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 4","0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 4","0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 4","0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 4","0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 4","0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 4","0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","0.248559 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 4","0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 4","0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 4","0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 4","0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 4","0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 4","0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 4","0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 4","0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.25 / 4","0 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 4","-0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 4","-0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 4","-0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 4","-0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 4","-0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 4","-0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 4","-0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 4","-0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","-0.248559 / 4" },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","-0.248559 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 2","-0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 2","-0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 2","-0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 2","-0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 2","-0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 2","-0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 2","-0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 2","-0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.25 / 2","0 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 2","0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 2","0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 2","0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 2","0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 2","0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 2","0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 2","0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 2","0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","0.248559 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 2","0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 2","0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 2","0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 2","0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 2","0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 2","0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 2","0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 2","0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.25 / 2","0 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 2","-0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 2","-0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 2","-0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 2","-0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 2","-0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 2","-0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 2","-0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 2","-0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","-0.248559 / 2" },1 }}; + }; + }; + class TargetACQ + { + type = "line"; + width = 2; + points[] = {{ "ForwardVec",1,"target",{ 0,-0.06 },1 },{ "ForwardVec",1,"target",{ 0,-0.055 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.05 },1 },{ "ForwardVec",1,"target",{ 0,-0.045 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.04 },1 },{ "ForwardVec",1,"target",{ 0,-0.035 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.03 },1 },{ "ForwardVec",1,"target",{ 0,-0.025 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.02 },1 },{ "ForwardVec",1,"target",{ 0,-0.015 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.01 },1 },{ "ForwardVec",1,"target",{ 0,-0.005 },1 },{ },{ "ForwardVec",1,"target",{ 0,0 },1 },{ "ForwardVec",1,"target",{ 0,0 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.06 },1 },{ "ForwardVec",1,"target",{ 0,0.055 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.05 },1 },{ "ForwardVec",1,"target",{ 0,0.045 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.04 },1 },{ "ForwardVec",1,"target",{ 0,0.035 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.03 },1 },{ "ForwardVec",1,"target",{ 0,0.025 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.02 },1 },{ "ForwardVec",1,"target",{ 0,0.015 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.01 },1 },{ "ForwardVec",1,"target",{ 0,0.005 },1 },{ },{ "ForwardVec",1,"target",{ -0.06,0 },1 },{ "ForwardVec",1,"target",{ -0.055,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.05,0 },1 },{ "ForwardVec",1,"target",{ -0.045,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.04,0 },1 },{ "ForwardVec",1,"target",{ -0.035,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.03,0 },1 },{ "ForwardVec",1,"target",{ -0.025,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.02,0 },1 },{ "ForwardVec",1,"target",{ -0.015,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.01,0 },1 },{ "ForwardVec",1,"target",{ -0.005,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.06,0 },1 },{ "ForwardVec",1,"target",{ 0.055,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.05,0 },1 },{ "ForwardVec",1,"target",{ 0.045,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.04,0 },1 },{ "ForwardVec",1,"target",{ 0.035,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.03,0 },1 },{ "ForwardVec",1,"target",{ 0.025,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.02,0 },1 },{ "ForwardVec",1,"target",{ 0.015,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.01,0 },1 },{ "ForwardVec",1,"target",{ 0.005,0 },1 },{ }}; + }; + class RadarTargets + { + type = "radar"; + pos0[] = {0.5,0.5}; + pos10[] = {0.753,0.753}; + width = 2.5; + points[] = {{ "ForwardVec",1,"RadarContact",{ -0.01,-0.01 },1 },{ "ForwardVec",1,"RadarContact",{ 0.01,-0.01 },1 },{ "ForwardVec",1,"RadarContact",{ 0.01,0.01 },1 },{ "ForwardVec",1,"RadarContact",{ -0.01,0.01 },1 },{ "ForwardVec",1,"RadarContact",{ -0.01,-0.01 },1 }}; + }; + }; + helmetMountedDisplay = 1; + helmetPosition[] = {-0.035,0.035,0.1}; + helmetRight[] = {0.07,0,0}; + helmetDown[] = {0,-0.07,0}; + }; + }; + + class Turrets: Turrets { + class MainTurret: MainTurret { + directionStabilized = 1; + horizontallyStabilized = 1; + + weapons[] = {"ACE_gatling_20mm_Comanche","missiles_DAGR","missiles_ASRAAM"}; + magazines[] = {"ACE_500Rnd_20mm_shells_Comanche","4Rnd_AAA_missiles","24Rnd_PG_missiles"}; + + isCopilot = 1; + showHMD = 1; + CanEject = 1; + startEngine = 0; + minElev = -51; + maxElev = 9; + initElev = 6; + minTurn = -120; + maxTurn = 120; + initTurn = 0; + + class OpticsIn + { + class WideNGS + { + opticsDisplayName = "W"; + initAngleX = 0; + minAngleX = -35; + maxAngleX = 10; + initAngleY = 0; + minAngleY = -100; + maxAngleY = 100; + initFov = 0.466; + minFov = 0.466; + maxFov = 0.466; + visionMode[] = {"Normal","Ti"}; + thermalMode[] = {0,1}; + gunnerOpticsColor[] = {0.15,1,0.15,1}; + gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_03_w_F.p3d"; + directionStabilized = 0; + opticsPPEffects[] = {"OpticsCHAbera2","OpticsBlur2"}; + }; + class Wide + { + opticsDisplayName = "W"; + initAngleX = 0; + minAngleX = -35; + maxAngleX = 10; + initAngleY = 0; + minAngleY = -100; + maxAngleY = 100; + initFov = 0.466; + minFov = 0.466; + maxFov = 0.466; + visionMode[] = {"Normal","Ti"}; + thermalMode[] = {0,1}; + gunnerOpticsColor[] = {0.15,1,0.15,1}; + gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_w_F.p3d"; + directionStabilized = 1; + opticsPPEffects[] = {"OpticsCHAbera2","OpticsBlur2"}; + gunnerOpticsEffect[] = {"TankCommanderOptics1"}; + }; + class WideL: Wide + { + opticsDisplayName = "WL"; + initFov = 0.2; + minFov = 0.2; + maxFov = 0.2; + gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_m_F.p3d"; + gunnerOpticsColor[] = {0,0,0,1}; + directionStabilized = 1; + opticsPPEffects[] = {"OpticsCHAbera2","OpticsBlur2"}; + }; + class Medium: Wide + { + opticsDisplayName = "M"; + initFov = 0.1; + minFov = 0.1; + maxFov = 0.1; + directionStabilized = 1; + gunnerOpticsColor[] = {0,0,0,1}; + gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_m_F.p3d"; + }; + class Narrow: Wide + { + opticsDisplayName = "N"; + gunnerOpticsColor[] = {0,0,0,1}; + gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_n_F.p3d"; + directionStabilized = 1; + initFov = 0.02; + minFov = 0.02; + maxFov = 0.02; + }; + class Narrower: Wide + { + opticsDisplayName = "N"; + gunnerOpticsColor[] = {0,0,0,1}; + gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_n_F.p3d"; + directionStabilized = 1; + initFov = 0.01; + minFov = 0.01; + maxFov = 0.01; + }; + }; + class OpticsOut + { + class Monocular + { + initAngleX = 0; + minAngleX = -30; + maxAngleX = 30; + initAngleY = 0; + minAngleY = -100; + maxAngleY = 100; + initFov = 1.1; + minFov = 0.133; + maxFov = 1.1; + visionMode[] = {"Normal","NVG","Ti"}; + thermalMode[] = {2,3}; + gunnerOpticsModel = ""; + gunnerOpticsEffect[] = {}; + hideUnitInfo = 1; + }; + }; + }; + }; + + class AnimationSources: AnimationSources { + class Gatling { + weapon = "ACE_gatling_20mm_Comanche"; + }; + class Muzzle_flash { + weapon = "ACE_gatling_20mm_Comanche"; + }; + }; +}; \ No newline at end of file From 65388e1146269c2ea02de7c1e63ba24651c75ad2 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 16:46:37 -0700 Subject: [PATCH 19/43] Added: Image Assets Added: ACE_AIR_SAFETY weapon for all aircraft Changed: ACE'ified Kimi code --- addons/aircraft/CfgVehicles.hpp | 2 +- addons/aircraft/CfgWeapons.hpp | 17 + addons/aircraft/Heli_Attack_01_base_F.hpp | 6 +- addons/aircraft/RscInGameUI.hpp | 578 ++++++++++++++++++++++ addons/aircraft/config.cpp | 1 + addons/aircraft/data/Helo_LaserON.paa | Bin 0 -> 24488 bytes 6 files changed, 600 insertions(+), 4 deletions(-) create mode 100644 addons/aircraft/RscInGameUI.hpp create mode 100644 addons/aircraft/data/Helo_LaserON.paa diff --git a/addons/aircraft/CfgVehicles.hpp b/addons/aircraft/CfgVehicles.hpp index 02769a2c14..559b8dc2e1 100644 --- a/addons/aircraft/CfgVehicles.hpp +++ b/addons/aircraft/CfgVehicles.hpp @@ -200,7 +200,7 @@ class CfgVehicles { lockDetectionSystem = 0; incomingMissileDetectionSystem = 16; driverCanEject = 1; - weapons[] = {"M134_minigun","missiles_DAR","CMFlareLauncher"}; + weapons[] = {"M134_minigun","missiles_DAR","CMFlareLauncher", "ACE_AIR_SAFETY" }; magazines[] = {"5000Rnd_762x51_Yellow_Belt","24Rnd_missiles","168Rnd_CMFlare_Chaff_Magazine"}; class Turrets: Turrets { diff --git a/addons/aircraft/CfgWeapons.hpp b/addons/aircraft/CfgWeapons.hpp index c5f22fc3a2..7fd9b8436f 100644 --- a/addons/aircraft/CfgWeapons.hpp +++ b/addons/aircraft/CfgWeapons.hpp @@ -4,6 +4,23 @@ class Mode_Burst; class Mode_FullAuto; class CfgWeapons { + + class RocketPods; + class ACE_AIR_SAFETY : RocketPods + { + CanLock = 0; + displayName = "SAFE"; + displayNameMagazine = "SAFE"; + shortNameMagazine = "SAFE"; + nameSound = "cannon"; + cursor = "EmptyCursor"; + cursorAim = "EmptyCursor"; + magazines[] = {"FakeMagazine"}; + burst = 0; + reloadTime = 0.01; + magazineReloadTime = 0.1; + }; + // Manual Switching Of Flare Mode class SmokeLauncher; class CMFlareLauncher: SmokeLauncher { diff --git a/addons/aircraft/Heli_Attack_01_base_F.hpp b/addons/aircraft/Heli_Attack_01_base_F.hpp index eb77c8a4ea..1ab1f38ce7 100644 --- a/addons/aircraft/Heli_Attack_01_base_F.hpp +++ b/addons/aircraft/Heli_Attack_01_base_F.hpp @@ -23,7 +23,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { helmetRight[] = {0,0,0}; helmetDown[] = {0,0,0}; }; - class Kimi_HUD_1 + class ACE_HUD_1 { topLeft = "HUD_top_left"; topRight = "HUD_top_right"; @@ -715,7 +715,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { helmetRight[] = {0.08,0,0}; helmetDown[] = {0,-0.08,0}; }; - class Kimi_HUD_2 + class ACE_HUD_2 { topLeft = "HUD_top_left"; topRight = "HUD_top_right"; @@ -866,7 +866,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { directionStabilized = 1; horizontallyStabilized = 1; - weapons[] = {"ACE_gatling_20mm_Comanche","missiles_DAGR","missiles_ASRAAM"}; + weapons[] = {"ACE_gatling_20mm_Comanche","missiles_DAGR","missiles_ASRAAM", "ACE_AIR_SAFETY"}; magazines[] = {"ACE_500Rnd_20mm_shells_Comanche","4Rnd_AAA_missiles","24Rnd_PG_missiles"}; isCopilot = 1; diff --git a/addons/aircraft/RscInGameUI.hpp b/addons/aircraft/RscInGameUI.hpp new file mode 100644 index 0000000000..208d971ce4 --- /dev/null +++ b/addons/aircraft/RscInGameUI.hpp @@ -0,0 +1,578 @@ +class RscControlsGroup; +class RscText; +class RangeText: RscText{}; +class RscPicture; +class RscOpticsText; +class RscIGProgress; +class RscOpticsValue; +class VScrollbar; +class HScrollbar; +class RscLadderPicture; +class RscInGameUI +{ + class RscUnitInfo; + class Rsc_ACE_Helo_UI_Turret: RscUnitInfo + { + idd = 300; + controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"}; + class VScrollbar; + class HScrollbar; + class CA_IGUI_elements_group: RscControlsGroup + { + idc = 170; + class VScrollbar: VScrollbar + { + width = 0; + }; + class HScrollbar: HScrollbar + { + height = 0; + }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class controls + { + class CA_Distance: RscText + { + idc = 151; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + x = "24.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Speed: RangeText + { + idc = 188; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "120"; + x = "14.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Alt: RangeText + { + idc = 189; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "3825"; + x = "34.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_VisionMode: RscText + { + idc = 152; + style = 0; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "VIS"; + x = "12.58 * (0.01875 * SafezoneH)"; + y = "8 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_FlirMode: RscText + { + idc = 153; + style = 0; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "BHOT"; + x = "15.78 * (0.01875 * SafezoneH)"; + y = "8 * (0.025 * SafezoneH)"; + w = "4.5 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class ValueGrid: RangeText + { + idc = 172; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "12.20 * (0.01875 * SafezoneH)"; + y = "3.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TextTADS: RangeText + { + idc = 1010; + text = "TADS"; + font = "EtelkaMonospacePro"; + style = 2; + shadow = 0; + x = "12.30 * (0.01875 * SafezoneH)"; + y = "5 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class ValueTime: RangeText + { + idc = 190; + text = "20:28:35"; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "12.1 * (0.01875 * SafezoneH)"; + y = "6.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class CA_Laser: RscText + { + idc = 158; + style = "0x30 + 0x800"; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = PATHTOF(data\Helo_LaserON.paa); + x = "20.45 * (0.01875 * SafezoneH)"; + y = "14.1 * (0.025 * SafezoneH)"; + w = "12.5 * (0.01875 * SafezoneH)"; + h = "12 * (0.025 * SafezoneH)"; + }; + class CA_Heading: RscText + { + idc = 156; + style = 0; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "023"; + x = "24.83 * (0.01875 * SafezoneH)"; + y = "6 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + }; + }; + }; + class Rsc_ACE_Helo_UI_01: RscUnitInfo + { + controls[] = {"WeaponInfoControlsGroupRight","CA_TextFlaresMode","CA_TextFlares","CA_VehicleToggles","CA_Radar"}; + }; + class Rsc_ACE_Helo_UI_02: RscUnitInfo + { + controls[] = {"CA_TextFlaresMode","CA_TextFlares","CA_VehicleToggles","CA_Radar"}; + }; + class Rsc_ACE_Drones_UI_Turret: RscUnitInfo + { + idd = 300; + controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"}; + class CA_IGUI_elements_group: RscControlsGroup + { + idc = 170; + class VScrollbar: VScrollbar + { + width = 0; + }; + class HScrollbar: HScrollbar + { + height = 0; + }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class controls + { + class CA_Distance: RscText + { + idc = 151; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + x = "24.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Speed: RangeText + { + idc = 188; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "120"; + x = "14.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Alt: RangeText + { + idc = 189; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "3825"; + x = "34.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class ValueTime: RangeText + { + idc = 190; + text = "20:28:35"; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "1.75 * (0.01875 * SafezoneH)"; + y = "10.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class CA_VisionMode: RscText + { + idc = 152; + style = 0; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "VIS"; + align = "right"; + x = "2.6 * (0.01875 * SafezoneH)"; + y = "12.0 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.0 * (0.025 * SafezoneH)"; + }; + class CA_FlirMode: RscText + { + idc = 153; + style = 0; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "BHOT"; + align = "right"; + x = "6.18 * (0.01875 * SafezoneH)"; + y = "12.0 * (0.025 * SafezoneH)"; + w = "4.5 * (0.01875 * SafezoneH)"; + h = "1.0 * (0.025 * SafezoneH)"; + }; + class TgT_Grid_text: RangeText + { + idc = 1005; + text = "TGT:"; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "1.20 * (0.01875 * SafezoneH)"; + y = "13.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TGT_ValueGrid: RangeText + { + idc = 172; + font = "EtelkaMonospacePro"; + colorText[] = {0.706,0.0745,0.0196,0.8}; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "5.20 * (0.01875 * SafezoneH)"; + y = "13.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class OWN_Grid_text: RangeText + { + idc = 1005; + text = "OWN:"; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "1.20 * (0.01875 * SafezoneH)"; + y = "15 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class OWN_ValueGrid: RangeText + { + idc = 171; + font = "EtelkaMonospacePro"; + colorText[] = {0.15,1,0.15,0.8}; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "5.20 * (0.01875 * SafezoneH)"; + y = "15 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class CA_Laser: RscText + { + idc = 158; + style = "0x30 + 0x800"; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + align = "right"; + font = "EtelkaMonospacePro"; + text = PATHTOF(data\Helo_LaserON.paa); + x = "20.45 * (0.01875 * SafezoneH)"; + y = "14.1 * (0.025 * SafezoneH)"; + w = "12.5 * (0.01875 * SafezoneH)"; + h = "12 * (0.025 * SafezoneH)"; + }; + class CA_Heading: RscText + { + idc = 156; + style = 0; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "023"; + align = "right"; + x = "25 * (0.01875 * SafezoneH)"; + y = "5 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + }; + }; + }; + class Rsc_ACE_Drones_UI_Pilots: RscUnitInfo + { + idd = 300; + controls[] = {"WeaponInfoControlsGroupRight","CA_BackgroundVehicle","CA_BackgroundVehicleTitle","CA_BackgroundVehicleTitleDark","CA_BackgroundFuel","CA_Vehicle","CA_VehicleRole","CA_HitZones","CA_SpeedBackground","CA_SpeedUnits","CA_Speed","CA_ValueFuel","CA_AltBackground","CA_AltUnits","CA_Alt","CA_VehicleToggles","CA_Radar","DriverOpticsGroup"}; + class DriverOpticsGroup: RscControlsGroup + { + idc = 392; + class VScrollbar: VScrollbar + { + width = 0; + }; + class HScrollbar: HScrollbar + { + height = 0; + }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class controls + { + class TextGrid: RscText + { + style = 0; + sizeEx = "0.02*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + idc = 1005; + text = "GRID:"; + x = "5.8 * (0.01875 * SafezoneH)"; + y = "31.8 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class ValueGrid: TextGrid + { + idc = 189; + text = "382546"; + x = "10.3 * (0.01875 * SafezoneH)"; + y = "31.8 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TextTime: TextGrid + { + idc = 1010; + text = "TIME [UTC]:"; + x = "5.8 * (0.01875 * SafezoneH)"; + y = "32.6 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class ValueTime: TextGrid + { + idc = 101; + text = "20:28:35"; + x = "10 * (0.01875 * SafezoneH)"; + y = "32.6 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TextMag: TextGrid + { + idc = 1011; + text = "CAM MAG:"; + x = "5.8 * (0.01875 * SafezoneH)"; + y = "7 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class OpticsZoom: TextGrid + { + idc = 192; + text = "28x"; + x = "10.3 * (0.01875 * SafezoneH)"; + y = "7 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class BorderLineSpdTop: RscPicture + { + idc = 1203; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; + x = "3.343 * (0.01875 * SafezoneH)"; + y = "12.4 * (0.025 * SafezoneH)"; + w = "3 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class BorderLineSpdBottom: RscPicture + { + idc = 1207; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; + x = "3.343 * (0.01875 * SafezoneH)"; + y = "26.5 * (0.025 * SafezoneH)"; + w = "3 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class BorderLineAltTop: RscPicture + { + idc = 1205; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; + x = "47.16 * (0.01875 * SafezoneH)"; + y = "12.4 * (0.025 * SafezoneH)"; + w = "3 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class BorderLineAltBottom: RscPicture + { + idc = 1206; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; + x = "47.16 * (0.01875 * SafezoneH)"; + y = "26.5 * (0.025 * SafezoneH)"; + w = "3 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TextSpd: TextGrid + { + idc = 1004; + text = "SPD"; + x = "4.8 * (0.01875 * SafezoneH)"; + y = "11.8 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class SpeedValueBorder: RscPicture + { + idc = 1200; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\altimeter_value_ca.paa"; + x = "6.3 * (0.01875 * SafezoneH)"; + y = "19 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "2 * (0.025 * SafezoneH)"; + }; + class CA_Speed: TextGrid + { + idc = 190; + sizeEx = "0.03*SafezoneH"; + text = "120"; + x = "7.5 * (0.01875 * SafezoneH)"; + y = "19.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class AnalogueSpeed: RscLadderPicture + { + idc = 384; + topValue = 1312; + bottomValue = -345; + visibleRange = -1; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\UAVspeedLadder_ca.paa"; + x = "1.5 * (0.01875 * SafezoneH)"; + y = "13 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "14 * (0.025 * SafezoneH)"; + }; + class TextAlt: TextGrid + { + idc = 1006; + text = "ALT"; + x = "46.9 * (0.01875 * SafezoneH)"; + y = "11.8 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class AltValueBorder: RscPicture + { + idc = 1201; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\airspeed_value_ca.paa"; + x = "42.25 * (0.01875 * SafezoneH)"; + y = "19 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "2 * (0.025 * SafezoneH)"; + }; + class CA_Alt: TextGrid + { + idc = 191; + sizeEx = "0.03*SafezoneH"; + style = 1; + text = "3825"; + x = "43 * (0.01875 * SafezoneH)"; + y = "19.5 * (0.025 * SafezoneH)"; + w = "3.2 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class AnalogueAlt: RscLadderPicture + { + idc = 385; + topValue = 14430; + bottomValue = -2110; + visibleRange = -1; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\UAValtLadder_ca.paa"; + x = "47 * (0.01875 * SafezoneH)"; + y = "13 * (0.025 * SafezoneH)"; + w = "2.5 * (0.01875 * SafezoneH)"; + h = "14 * (0.025 * SafezoneH)"; + }; + class AnalogueHorizon: RscLadderPicture + { + idc = 383; + topValue = 90; + bottomValue = -90; + visibleRange = -1; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\horizon_ladder_ca.paa"; + x = "16.75 * (0.01875 * SafezoneH)"; + y = "5 * (0.025 * SafezoneH)"; + w = "20 * (0.01875 * SafezoneH)"; + h = "30 * (0.025 * SafezoneH)"; + }; + class HorizonCenter: RscPicture + { + idc = 1202; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\horizon_aircraft_ca.paa"; + x = "24.75 * (0.01875 * SafezoneH)"; + y = "19 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "2 * (0.025 * SafezoneH)"; + }; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/aircraft/config.cpp b/addons/aircraft/config.cpp index 86135c4bc9..d2b0ed08d7 100644 --- a/addons/aircraft/config.cpp +++ b/addons/aircraft/config.cpp @@ -16,3 +16,4 @@ class CfgPatches { #include "CfgMagazines.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "RscInGameUI.hpp" \ No newline at end of file diff --git a/addons/aircraft/data/Helo_LaserON.paa b/addons/aircraft/data/Helo_LaserON.paa new file mode 100644 index 0000000000000000000000000000000000000000..3a3459e699521383ade981d00ae8209a73d6c0c9 GIT binary patch literal 24488 zcmeHPdrTZf9RBUyZI4Isj)(Q6r8mG?pjM&(kS6SLVChlRMr&(hjM@TiVztzwDTx(? zBYkM=QHtpwK>D)P#Ap<(x!Pp0*Fd0&v1)1}l_o}LsIOWQ6HLPa{$}^)?tnH2?OJG= zO%C>(ot?+``{vu-+nEzb3k&ntE-ze{ZvcR6*RBZ)elC9%#iO`UT$ul)lVSls6t8hQ zpUT7i8vHaH0n(!YG9L%XejdR75z(Zbx5y5dx4ozEwT z38%jG8LNkXR?qTTb?-H2Z_Qabk}fCcs|Os{_xmz@3A&gb*RU6}G|E;{Xudw`s2=d9 z+rc&WWQH8AoZ9EJW?@F>)>Kb1ChV1nk_6bJPdm3JSLc;3kCDT#|U{nG0VgnIZYH!~jOs+ou2%nnS~=0bcQ>fSFXb#0i%}Je zjX=62CN9tG@whFJ3@g;$tjz_X*&^2L5a(U|)Ms>5p*$9h+6+YvX+9g0bMDfSq1Q&z z+QcRce3aL(oYelcRcNxz$#23mXYCF=f1dY4KRE@I^QS5M%C?EZZ2`D~!g_?nPMXy$ zy%Nc6vo>eRR*N2fF^Eu+Vk>GOkRhG%m+`Db9GC;6UFq;AiL{&nR%{1F5X;~R1ukW9 zrvg_qxKV-S3>GNx0E0FKwlbI?5wW=O`hJH~5y)vwH%UZa+*s{vcVV61_|zc*cZGHE zMqc7K6-QhL0bm&%! zVp_katjANFnl6Ffxyul_fO`C9pXtS_`WJpkmraH`Q@!z={xSiJWM0~4s$DFbgfv*$ z@USdm&TW;83791_?jDm(Z1*hgnk2L6uG@d8>wIY+Ii=+IRW{|?!JXwWySq9`qml+X z%xkrqOUYKddCuY3`pZk&OiQphh*omH@rd1=L1D5KL;uk&gyqJ#D%< z1Tua9P?ra?zimkOsQiK9E0?>yv$!uqI!*vauo0ija#rO9{hmYZ=Zmjk+V7G%_l!xO z)*54Mi2!n1?t9x+dWHN%3xZ>nR+1^1&9Kai41$Yx8qU(LWXVG`fgXFghK}HJWZ=R6 zic&o?Okf%2G&{@=6XmK*%EG_Oc7q;Zx|XR26*1P(d%ZlRO8ST17zO~xoDZ%CJ|030 zf%^mZ#}GMif8_qi{V`-faDU|f7$OJmkK7-*KZXnl?vLCbL*&5yk^AF4>5qc?9jk%+ zoi=`F>#A{kof}dapEiZxS{uX6Q>F{A8W-;<&)^?o^n&i`YR`1@p>_Qj?|OVy7l^m5 z%QdZfxIw&oL*pHVuR=oGt2H09y}Su}==^{6z~ikdZl?NK>NtN$qI%d})}vK>(a%dB zz!!F`JU+f>wjO4?Kl1)_eNqOPUvWKfJ@)>%=EQ;-Aqf2o}woV@Jzvihc49?!2baI5@H zj5mJSqG7zl#mCl#Uq*%K!Pdp~KsmeBc!uM9y5k+LeOwPJLt4du)tk7;#8VpZ+bGYS z9pB;N9q#x9J*-E6Xw~j|6s~@LTxCEjJ#s!dpOgWvrkb%jL zhscVZW2UJ`PI1{n{J3QW@#WdCbi9)kcrC_SG}-pt>HOH=G1K-Vw=2`M+b7#z>~BfO zXTjHIdOodQ3E^b-Eqd{73s z9`23j0|ErVplX_j^`^4c<>6%qCj>LutFyy{tC7WVx9wss=GXAH9qSu&Tb=A^E$hZA zSbN0W?2_+7u%Pj6^P+M6OI(DNx$J@Z7p5T2F3Dl-Ntxnf4-+6ee*#{VxA*=j=rbba z-K*XZJ|>jsPq=A)v+TH;eibM%mTo!>Scb{cCRjaJz0ROaEyPpSHHAf*7L-v+VQ>++ zF41%KT*Zcf?55hDaQP!3f_^O;LDd`Cu#t6B!TDbV)|TLpULPbOYtxPJdR*w*Zv#3i P@@asgI3fgFuh#w_Y~cvI literal 0 HcmV?d00001 From 583347aaaba38608828322e894745f75b7d488ce Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 17:28:33 -0700 Subject: [PATCH 20/43] tab cleanup, javelin work. --- addons/aircraft/CfgWeapons.hpp | 28 +- addons/aircraft/Heli_Attack_01_base_F.hpp | 1712 ++++++++--------- addons/aircraft/RscInGameUI.hpp | 1130 +++++------ addons/wep_javelin/CfgEventhandlers.hpp | 18 +- addons/wep_javelin/CfgOptics.hpp | 219 ++- .../wep_javelin/data/sound/javelin_locked.ogg | Bin 0 -> 5108 bytes .../data/sound/javelin_locking.ogg | Bin 0 -> 4778 bytes addons/wep_javelin/script_component.hpp | 4 +- 8 files changed, 1629 insertions(+), 1482 deletions(-) create mode 100644 addons/wep_javelin/data/sound/javelin_locked.ogg create mode 100644 addons/wep_javelin/data/sound/javelin_locking.ogg diff --git a/addons/aircraft/CfgWeapons.hpp b/addons/aircraft/CfgWeapons.hpp index 7fd9b8436f..917ba1c174 100644 --- a/addons/aircraft/CfgWeapons.hpp +++ b/addons/aircraft/CfgWeapons.hpp @@ -6,20 +6,20 @@ class Mode_FullAuto; class CfgWeapons { class RocketPods; - class ACE_AIR_SAFETY : RocketPods - { - CanLock = 0; - displayName = "SAFE"; - displayNameMagazine = "SAFE"; - shortNameMagazine = "SAFE"; - nameSound = "cannon"; - cursor = "EmptyCursor"; - cursorAim = "EmptyCursor"; - magazines[] = {"FakeMagazine"}; - burst = 0; - reloadTime = 0.01; - magazineReloadTime = 0.1; - }; + class ACE_AIR_SAFETY : RocketPods + { + CanLock = 0; + displayName = "SAFE"; + displayNameMagazine = "SAFE"; + shortNameMagazine = "SAFE"; + nameSound = "cannon"; + cursor = "EmptyCursor"; + cursorAim = "EmptyCursor"; + magazines[] = {"FakeMagazine"}; + burst = 0; + reloadTime = 0.01; + magazineReloadTime = 0.1; + }; // Manual Switching Of Flare Mode class SmokeLauncher; diff --git a/addons/aircraft/Heli_Attack_01_base_F.hpp b/addons/aircraft/Heli_Attack_01_base_F.hpp index 1ab1f38ce7..ee271f826a 100644 --- a/addons/aircraft/Heli_Attack_01_base_F.hpp +++ b/addons/aircraft/Heli_Attack_01_base_F.hpp @@ -4,862 +4,862 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { driverCanEject = 1; class MFD - { - class AirplaneHUD - { - class Bones{}; - class Draw{}; - topLeft = "HUD_top_left"; - topRight = "HUD_top_right"; - bottomLeft = "HUD_bottom_left"; - borderLeft = 0; - borderRight = 0; - borderTop = 0; - borderBottom = 0; - color[] = {0.15,1,0.15,1}; - enableParallax = 0; - helmetMountedDisplay = 1; - helmetPosition[] = {0,0,0}; - helmetRight[] = {0,0,0}; - helmetDown[] = {0,0,0}; - }; - class ACE_HUD_1 - { - topLeft = "HUD_top_left"; - topRight = "HUD_top_right"; - bottomLeft = "HUD_bottom_left"; - borderLeft = 0; - borderRight = 0; - borderTop = 0; - borderBottom = 0; - color[] = {0.15,1,0.15,1}; - enableParallax = 0; - class Bones - { - class GunnerAim - { - type = "vector"; - source = "weapon"; - pos0[] = {0.5,"0.9 - 0.04 + 0.012"}; - pos10[] = {"0.5 + 0.0111","0.9 - 0.04 + 0.012 + 0.0133"}; - }; - class Target - { - source = "target"; - type = "vector"; - pos0[] = {0.5,0.5}; - pos10[] = {0.85,0.85}; - }; - class Velocity - { - type = "vector"; - source = "velocity"; - pos0[] = {0.5,0.5}; - pos10[] = {0.65,0.65}; - }; - class Velocity_slip - { - type = "vector"; - source = "velocity"; - pos0[] = {0.5,0.845}; - pos10[] = {0.53,0.845}; - }; - class VspeedBone - { - type = "linear"; - source = "vspeed"; - sourceScale = 1; - min = -10; - max = 10; - minPos[] = {0.93,0.2}; - maxPos[] = {0.93,0.8}; - }; - class RadarAltitudeBone - { - type = "linear"; - source = "altitudeAGL"; - sourceScale = 1; - min = 0; - max = 60; - minPos[] = {0.965,0.2}; - maxPos[] = {0.965,0.8}; - }; - class HorizonBankRot - { - type = "rotational"; - source = "horizonBank"; - center[] = {0.5,0.5}; - min = -3.1416; - max = 3.1416; - minAngle = -180; - maxAngle = 180; - aspectRatio = 1; - }; - class ForwardVec - { - type = "vector"; - source = "forward"; - pos0[] = {0,0}; - pos10[] = {0.25,0.25}; - }; - class WeaponAim - { - type = "vector"; - source = "weapon"; - pos0[] = {0.5,0.5}; - pos10[] = {0.75,0.75}; - }; - class Level0 - { - type = "horizon"; - pos0[] = {0.5,0.5}; - pos10[] = {0.78,0.78}; - angle = 0; - }; - class LevelP5: Level0 - { - angle = 5; - }; - class LevelM5: Level0 - { - angle = -5; - }; - class LevelP10: Level0 - { - angle = 10; - }; - class LevelM10: Level0 - { - angle = -10; - }; - class LevelP15: Level0 - { - angle = 15; - }; - class LevelM15: Level0 - { - angle = -15; - }; - class LevelP20: Level0 - { - angle = 20; - }; - class LevelM20: Level0 - { - angle = -20; - }; - class LevelP25: Level0 - { - angle = 25; - }; - class LevelM25: Level0 - { - angle = -25; - }; - class LevelP30: Level0 - { - angle = 30; - }; - class LevelM30: Level0 - { - angle = -30; - }; - class LevelP35: Level0 - { - angle = 35; - }; - class LevelM35: Level0 - { - angle = -35; - }; - class LevelP40: Level0 - { - angle = 40; - }; - class LevelM40: Level0 - { - angle = -40; - }; - class LevelP45: Level0 - { - angle = 45; - }; - class LevelM45: Level0 - { - angle = -45; - }; - class LevelP50: Level0 - { - angle = 50; - }; - class LevelM50: Level0 - { - angle = -50; - }; - }; - class Draw - { - color[] = {0.18,1,0.18}; - alpha = 1; - condition = "on"; - class Horizont - { - clipTL[] = {0.15,0.15}; - clipBR[] = {0.85,0.85}; - class Dimmed - { - class Level0 - { - type = "line"; - points[] = {{ "Level0",{ -0.42,0 },1 },{ "Level0",{ -0.38,0 },1 },{ },{ "Level0",{ -0.37,0 },1 },{ "Level0",{ -0.33,0 },1 },{ },{ "Level0",{ -0.32,0 },1 },{ "Level0",{ -0.28,0 },1 },{ },{ "Level0",{ -0.27,0 },1 },{ "Level0",{ -0.23,0 },1 },{ },{ "Level0",{ -0.22,0 },1 },{ "Level0",{ -0.18,0 },1 },{ },{ "Level0",{ -0.17,0 },1 },{ "Level0",{ -0.13,0 },1 },{ },{ "Level0",{ -0.12,0 },1 },{ "Level0",{ -0.08,0 },1 },{ },{ "Level0",{ 0.42,0 },1 },{ "Level0",{ 0.38,0 },1 },{ },{ "Level0",{ 0.37,0 },1 },{ "Level0",{ 0.33,0 },1 },{ },{ "Level0",{ 0.32,0 },1 },{ "Level0",{ 0.28,0 },1 },{ },{ "Level0",{ 0.27,0 },1 },{ "Level0",{ 0.23,0 },1 },{ },{ "Level0",{ 0.22,0 },1 },{ "Level0",{ 0.18,0 },1 },{ },{ "Level0",{ 0.17,0 },1 },{ "Level0",{ 0.13,0 },1 },{ },{ "Level0",{ 0.12,0 },1 },{ "Level0",{ 0.08,0 },1 }}; - }; - }; - }; - class HorizonBankRot - { - type = "line"; - width = 3; - points[] = {{ "HorizonBankRot",{ 0,0.25 },1 },{ "HorizonBankRot",{ -0.01,0.23 },1 },{ "HorizonBankRot",{ 0.01,0.23 },1 },{ "HorizonBankRot",{ 0,0.25 },1 }}; - }; - class Static_HAD_BOX - { - clipTL[] = {0,1}; - clipBR[] = {1,0}; - type = "line"; - width = 5; - points[] = {{ { "0.5-0.1","0.9-0.04" },1 },{ { "0.5-0.1","0.9+0.04" },1 },{ { "0.5+0.1","0.9+0.04" },1 },{ { "0.5+0.1","0.9-0.04" },1 },{ { "0.5-0.1","0.9-0.04" },1 },{ },{ { "0.5-0.1","0.9-0.04+0.012" },1 },{ { "0.5-0.092","0.9-0.04+0.012" },1 },{ },{ { "0.5+0.1","0.9-0.04+0.012" },1 },{ { "0.5+0.092","0.9-0.04+0.012" },1 },{ },{ { 0.5,"0.9-0.04" },1 },{ { 0.5,"0.9-0.032" },1 },{ },{ { 0.5,"0.9+0.04" },1 },{ { 0.5,"0.9+0.032" },1 },{ }}; - }; - class Gunner_HAD - { - type = "line"; - width = 6; - points[] = {{ "GunnerAim",{ -0.015,-0.008 },1 },{ "GunnerAim",{ -0.015,0.008 },1 },{ "GunnerAim",{ 0.015,0.008 },1 },{ "GunnerAim",{ 0.015,-0.008 },1 },{ "GunnerAim",{ -0.015,-0.008 },1 }}; - }; - class Slip_ball_group - { - class Slip_bars - { - type = "line"; - width = 4; - points[] = {{ { "0.5-0.018","0.9-0.04" },1 },{ { "0.5-0.018","0.9-0.075" },1 },{ },{ { "0.5+0.018","0.9-0.04" },1 },{ { "0.5+0.018","0.9-0.075" },1 }}; - }; - class Slip_ball - { - type = "line"; - width = 6; - points[] = {{ "Velocity_slip",1,{ "0 * 0.75","-0.02 * 0.75" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.75","-0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.75","-0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "0.02 * 0.75","0 * 0.75" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.75","0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.75","0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0 * 0.75","0.02 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.75","0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.75","0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.75","0 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.75","-0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.75","-0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0 * 0.75","-0.02 * 0.75" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.6","-0.02 * 0.6" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.6","-0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.6","-0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "0.02 * 0.6","0 * 0.6" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.6","0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.6","0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0 * 0.6","0.02 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.6","0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.6","0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.6","0 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.6","-0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.6","-0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0 * 0.6","-0.02 * 0.6" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.5","-0.02 * 0.5" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.5","-0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.5","-0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "0.02 * 0.5","0 * 0.5" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.5","0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.5","0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0 * 0.5","0.02 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.5","0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.5","0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.5","0 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.5","-0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.5","-0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0 * 0.5","-0.02 * 0.5" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.4","-0.02 * 0.4" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.4","-0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.4","-0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "0.02 * 0.4","0 * 0.4" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.4","0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.4","0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0 * 0.4","0.02 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.4","0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.4","0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.4","0 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.4","-0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.4","-0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0 * 0.4","-0.02 * 0.4" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.30","-0.02 * 0.30" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.30","-0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.30","-0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "0.02 * 0.30","0 * 0.30" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.30","0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.30","0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0 * 0.30","0.02 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.30","0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.30","0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.30","0 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.30","-0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.30","-0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0 * 0.30","-0.02 * 0.30" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.20","-0.02 * 0.20" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.20","-0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.20","-0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "0.02 * 0.20","0 * 0.20" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.20","0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.20","0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0 * 0.20","0.02 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.20","0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.20","0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.20","0 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.20","-0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.20","-0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0 * 0.20","-0.02 * 0.20" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.1","-0.02 * 0.1" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.1","-0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.1","-0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "0.02 * 0.1","0 * 0.1" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.1","0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.1","0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0 * 0.1","0.02 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.1","0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.1","0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.1","0 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.1","-0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.1","-0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0 * 0.1","-0.02 * 0.1" },1 }}; - }; - }; - class Centerline - { - type = "line"; - width = 5; - points[] = {{ { 0.5,0.48 },1 },{ { 0.5,0.45 },1 },{ },{ { 0.5,0.52 },1 },{ { 0.5,0.55 },1 },{ },{ { 0.48,0.5 },1 },{ { 0.45,0.5 },1 },{ },{ { 0.52,0.5 },1 },{ { 0.55,0.5 },1 },{ }}; - }; - class WeaponName - { - type = "text"; - source = "weapon"; - sourceScale = 1; - align = "right"; - scale = 1; - pos[] = {{ 0.61,0.86 },1}; - right[] = {{ 0.65,0.86 },1}; - down[] = {{ 0.61,0.9 },1}; - }; - class Ammo_GUN - { - type = "group"; - condition = "mgun"; - class Ammo_count_GUN - { - type = "text"; - source = "ammo"; - sourceScale = 1; - align = "right"; - scale = 1; - pos[] = {{ 0.61,0.89 },1}; - right[] = {{ 0.65,0.89 },1}; - down[] = {{ 0.61,0.93 },1}; - }; - }; - class Ammo_RKT - { - type = "group"; - condition = "rocket"; - class Ammo_count_RKT - { - type = "text"; - source = "ammo"; - sourceScale = 1; - align = "right"; - scale = 1; - pos[] = {{ 0.61,0.89 },1}; - right[] = {{ 0.65,0.89 },1}; - down[] = {{ 0.61,0.93 },1}; - }; - }; - class Ammo_AGM - { - type = "group"; - condition = "AAmissile"; - class Ammo_count_AGM - { - type = "text"; - source = "ammo"; - sourceScale = 1; - align = "right"; - scale = 1; - pos[] = {{ 0.61,0.89 },1}; - right[] = {{ 0.65,0.89 },1}; - down[] = {{ 0.61,0.93 },1}; - }; - }; - class Ammo_AAM - { - type = "group"; - condition = "ATmissile"; - class Ammo_count_AAM - { - type = "text"; - source = "ammo"; - sourceScale = 1; - align = "right"; - scale = 1; - pos[] = {{ 0.61,0.89 },1}; - right[] = {{ 0.65,0.89 },1}; - down[] = {{ 0.61,0.93 },1}; - }; - }; - class Ammo_Bomb - { - type = "group"; - condition = "Bomb"; - class Ammo_count_Bomb - { - type = "text"; - source = "ammo"; - sourceScale = 1; - align = "right"; - scale = 1; - pos[] = {{ 0.61,0.89 },1}; - right[] = {{ 0.65,0.89 },1}; - down[] = {{ 0.61,0.93 },1}; - }; - }; - class LightsGroup - { - type = "group"; - condition = "lights"; - class LightsText - { - type = "text"; - source = "static"; - text = "LIGHTS"; - align = "right"; - scale = 1; - pos[] = {{ 0.03,"0.53 + 0.055" },1}; - right[] = {{ 0.07,"0.53 + 0.055" },1}; - down[] = {{ 0.03,"0.53 + 0.095" },1}; - }; - }; - class CollisionLightsGroup - { - type = "group"; - condition = "collisionlights"; - class CollisionLightsText - { - type = "text"; - source = "static"; - text = "A-COL"; - align = "right"; - scale = 1; - pos[] = {{ 0.03,"0.53 + 0.105" },1}; - right[] = {{ 0.07,"0.53 + 0.105" },1}; - down[] = {{ 0.03,"0.53 + 0.145" },1}; - }; - }; - class GearGroup - { - type = "group"; - condition = "ils"; - class GearText - { - type = "text"; - source = "static"; - text = "GEAR"; - align = "right"; - scale = 1; - pos[] = {{ 0.03,"0.53 + 0.155" },1}; - right[] = {{ 0.07,"0.53 + 0.155" },1}; - down[] = {{ 0.03,"0.53 + 0.195" },1}; - }; - }; - class ATMissileTOFGroup - { - condition = "ATmissile"; - type = "group"; - class TOFtext - { - type = "text"; - align = "right"; - source = "static"; - text = "TOF="; - scale = 1; - pos[] = {{ 0.61,0.92 },1}; - right[] = {{ 0.65,0.92 },1}; - down[] = {{ 0.61,0.96 },1}; - }; - class TOFnumber - { - type = "text"; - source = "targetDist"; - sourcescale = 0.0025; - align = "right"; - scale = 1; - pos[] = {{ 0.69,0.92 },1}; - right[] = {{ 0.73,0.92 },1}; - down[] = {{ 0.69,0.96 },1}; - }; - }; - class LaserTOFGroup - { - condition = "Bomb"; - type = "group"; - class TOFtext - { - type = "text"; - align = "right"; - source = "static"; - text = "TOF="; - scale = 1; - pos[] = {{ 0.61,0.92 },1}; - right[] = {{ 0.65,0.92 },1}; - down[] = {{ 0.61,0.96 },1}; - }; - class TOFnumber - { - type = "text"; - source = "targetDist"; - sourcescale = 0.0025; - align = "right"; - scale = 1; - pos[] = {{ 0.69,0.92 },1}; - right[] = {{ 0.73,0.92 },1}; - down[] = {{ 0.69,0.96 },1}; - }; - }; - class RocketTOFGroup - { - condition = "Rocket"; - type = "group"; - class TOFtext - { - type = "text"; - align = "right"; - source = "static"; - text = "TOF="; - scale = 1; - pos[] = {{ 0.61,0.92 },1}; - right[] = {{ 0.65,0.92 },1}; - down[] = {{ 0.61,0.96 },1}; - }; - class TOFnumber - { - type = "text"; - source = "targetDist"; - sourcescale = 0.0025; - align = "right"; - scale = 1; - pos[] = {{ 0.69,0.92 },1}; - right[] = {{ 0.73,0.92 },1}; - down[] = {{ 0.69,0.96 },1}; - }; - }; - class RangeNumber - { - type = "text"; - source = "targetDist"; - sourceScale = 1; - align = "left"; - scale = 1; - pos[] = {{ 0.39,0.89 },1}; - right[] = {{ 0.43,0.89 },1}; - down[] = {{ 0.39,0.93 },1}; - }; - class RangeText - { - type = "text"; - source = "static"; - text = "RNG"; - align = "left"; - scale = 1; - pos[] = {{ 0.39,0.86 },1}; - right[] = {{ 0.43,0.86 },1}; - down[] = {{ 0.39,0.9 },1}; - }; - class SpeedNumber - { - type = "text"; - align = "right"; - scale = 1; - source = "speed"; - sourceScale = 3.6; - pos[] = {{ 0.03,0.475 },1}; - right[] = {{ 0.08,0.475 },1}; - down[] = {{ 0.03,0.525 },1}; - }; - class TorqueNumber - { - condition = "simulRTD"; - class Torque_number - { - type = "text"; - align = "left"; - scale = 1; - source = "rtdRotorTorque"; - sourceScale = 290; - pos[] = {{ 0.065,0.175 },1}; - right[] = {{ 0.115,0.175 },1}; - down[] = {{ 0.065,0.225 },1}; - }; - class Torquetext - { - type = "text"; - source = "static"; - text = "%"; - align = "right"; - scale = 1; - pos[] = {{ 0.07,0.175 },1}; - right[] = {{ 0.12,0.175 },1}; - down[] = {{ 0.07,0.225 },1}; - }; - }; - class AltNumber: SpeedNumber - { - align = "right"; - source = "altitudeAGL"; - sourceScale = 1; - pos[] = {{ 0.83,0.475 },1}; - right[] = {{ 0.88,0.475 },1}; - down[] = {{ 0.83,0.525 },1}; - }; - class ASLNumber - { - type = "text"; - source = "altitudeASL"; - sourceScale = 1; - align = "right"; - scale = 1; - pos[] = {{ 0.835,0.18 },1}; - right[] = {{ 0.875,0.18 },1}; - down[] = {{ 0.835,0.22 },1}; - }; - class VspeedScalePosta - { - type = "line"; - width = 5; - points[] = {{ { 0.98,0.2 },1 },{ { 1,0.2 },1 },{ },{ { 0.93,0.2 },1 },{ { 0.95,0.2 },1 },{ },{ { 0.98,0.35 },1 },{ { 1,0.35 },1 },{ },{ { 0.93,0.35 },1 },{ { 0.95,0.35 },1 },{ },{ { 0.94,0.38 },1 },{ { 0.95,0.38 },1 },{ },{ { 0.94,0.41 },1 },{ { 0.95,0.41 },1 },{ },{ { 0.94,0.44 },1 },{ { 0.95,0.44 },1 },{ },{ { 0.94,0.47 },1 },{ { 0.95,0.47 },1 },{ },{ { 0.98,0.5 },1 },{ { 1,0.5 },1 },{ },{ { 0.93,0.5 },1 },{ { 0.95,0.5 },1 },{ },{ { 0.94,0.53 },1 },{ { 0.95,0.53 },1 },{ },{ { 0.94,0.56 },1 },{ { 0.95,0.56 },1 },{ },{ { 0.94,0.59 },1 },{ { 0.95,0.59 },1 },{ },{ { 0.94,0.62 },1 },{ { 0.95,0.62 },1 },{ },{ { 0.98,0.65 },1 },{ { 1,0.65 },1 },{ },{ { 0.93,0.65 },1 },{ { 0.95,0.65 },1 },{ },{ { 0.99,0.68 },1 },{ { 0.98,0.68 },1 },{ },{ { 0.99,0.71 },1 },{ { 0.98,0.71 },1 },{ },{ { 0.99,0.74 },1 },{ { 0.98,0.74 },1 },{ },{ { 0.99,0.77 },1 },{ { 0.98,0.77 },1 },{ },{ { 0.98,0.8 },1 },{ { 1,0.8 },1 },{ },{ { 0.93,0.8 },1 },{ { 0.95,0.8 },1 },{ }}; - }; - class RadarAltitudeBand - { - clipTL[] = {0,0.2}; - clipBR[] = {1,0.8}; - hideValue = 201; - class radarbanda - { - type = "line"; - width = 17; - points[] = {{ "RadarAltitudeBone",{ 0,0 },1 },{ "RadarAltitudeBone",{ 0,0.6 },1 }}; - }; - }; - class VspeedBand - { - type = "line"; - width = 3; - points[] = {{ "VspeedBone",{ -0.01,0 },1 },{ "VspeedBone",{ -0.025,-0.015 },1 },{ "VspeedBone",{ -0.025,0.015 },1 },{ "VspeedBone",{ -0.01,0 },1 },{ }}; - }; - class HeadingNumber: SpeedNumber - { - source = "heading"; - sourceScale = 1; - align = "center"; - pos[] = {{ 0.5,0.045 },1}; - right[] = {{ 0.56,0.045 },1}; - down[] = {{ 0.5,"0.045 + 0.06" },1}; - }; - class Center_box - { - type = "line"; - width = 1.5; - points[] = {{ { 0.45,"0.02 + 0.085 - 0.06" },1 },{ { "0.45 + 0.10","0.02 + 0.085 - 0.06" },1 },{ { "0.45 + 0.10","0.02 + 0.085" },1 },{ { 0.45,"0.02 + 0.085" },1 },{ { 0.45,"0.02 + 0.085 - 0.06" },1 }}; - }; - class HeadingArrow - { - type = "line"; - width = 7; - points[] = {{ { "0.5","0.128 + 0.03" },1 },{ { 0.5,0.128 },1 }}; - }; - class HeadingScale_LEFT - { - clipTL[] = {0,0}; - clipBR[] = {0.45,1}; - class Heading_group - { - type = "scale"; - horizontal = 1; - source = "heading"; - sourceScale = 1; - width = 5; - top = 0.12; - center = 0.5; - bottom = 0.88; - lineXleft = "0.03 + 0.085"; - lineYright = "0.02 + 0.085"; - lineXleftMajor = "0.04 + 0.085"; - lineYrightMajor = "0.02 + 0.085"; - majorLineEach = 3; - numberEach = 3; - step = 10; - stepSize = "0.05"; - align = "center"; - scale = 1; - pos[] = {0.12,"0.0 + 0.065"}; - right[] = {0.16,"0.0 + 0.065"}; - down[] = {0.12,"0.04 + 0.065"}; - }; - }; - class HeadingScale_RIGHT - { - clipTL[] = {0.55,0}; - clipBR[] = {1,1}; - class Heading_group - { - type = "scale"; - horizontal = 1; - source = "heading"; - sourceScale = 1; - width = 5; - top = 0.12; - center = 0.5; - bottom = 0.88; - lineXleft = "0.03 + 0.085"; - lineYright = "0.02 + 0.085"; - lineXleftMajor = "0.04 + 0.085"; - lineYrightMajor = "0.02 + 0.085"; - majorLineEach = 3; - numberEach = 3; - step = 10; - stepSize = "0.05"; - align = "center"; - scale = 1; - pos[] = {0.12,"0.0 + 0.065"}; - right[] = {0.16,"0.0 + 0.065"}; - down[] = {0.12,"0.04 + 0.065"}; - }; - }; - class HeadingScale_BOTTOM - { - clipTL[] = {0.45,"0.02 + 0.085"}; - clipBR[] = {"0.45 + 0.10",1}; - class Heading_group - { - type = "scale"; - horizontal = 1; - source = "heading"; - sourceScale = 1; - width = 5; - top = 0.12; - center = 0.5; - bottom = 0.88; - lineXleft = "0.03 + 0.085"; - lineYright = "0.02 + 0.085"; - lineXleftMajor = "0.04 + 0.085"; - lineYrightMajor = "0.02 + 0.085"; - majorLineEach = 3; - numberEach = 3; - step = 10; - stepSize = "0.05"; - align = "center"; - scale = 1; - pos[] = {0.12,"0.0 + 0.065"}; - right[] = {0.16,"0.0 + 0.065"}; - down[] = {0.12,"0.04 + 0.065"}; - }; - }; - class Fuel_Text - { - type = "text"; - source = "static"; - text = "Fuel"; - align = "right"; - scale = 1; - pos[] = {{ 0.03,0.9 },1}; - right[] = {{ 0.07,0.9 },1}; - down[] = {{ 0.03,0.94 },1}; - }; - class Fuel_Number - { - type = "text"; - source = "fuel"; - sourceScale = 100; - align = "right"; - scale = 1; - pos[] = {{ 0.1,0.9 },1}; - right[] = {{ 0.14,0.9 },1}; - down[] = {{ 0.1,0.94 },1}; - }; - }; - helmetMountedDisplay = 1; - helmetPosition[] = {-0.04,0.04,0.1}; - helmetRight[] = {0.08,0,0}; - helmetDown[] = {0,-0.08,0}; - }; - class ACE_HUD_2 - { - topLeft = "HUD_top_left"; - topRight = "HUD_top_right"; - bottomLeft = "HUD_bottom_left"; - borderLeft = 0; - borderRight = 0; - borderTop = 0; - borderBottom = 0; - color[] = {0.15,1,0.15,1}; - enableParallax = 0; - class Bones - { - class Velocity - { - type = "vector"; - source = "velocity"; - pos0[] = {0.5,0.5}; - pos10[] = {0.75,0.75}; - }; - class ForwardVec1 - { - type = "vector"; - source = "forward"; - pos0[] = {0,0}; - pos10[] = {0.25,0.25}; - }; - class ForwardVec - { - type = "vector"; - source = "forward"; - pos0[] = {0,0}; - pos10[] = {0.253,0.253}; - }; - class WeaponAim - { - type = "vector"; - source = "weapon"; - pos0[] = {0.5,0.5}; - pos10[] = {0.753,0.753}; - }; - class WeaponAim1 - { - type = "vector"; - source = "weapon"; - pos0[] = {0,0}; - pos10[] = {0.253,0.23}; - }; - class Target - { - type = "vector"; - source = "target"; - pos0[] = {0.5,0.5}; - pos10[] = {0.753,0.753}; - }; - class RadarContact - { - type = "fixed"; - pos[] = {0,0}; - }; - }; - class Draw - { - color[] = {0.18,1,0.18}; - alpha = 1; - condition = "on"; - class PlaneMovementCrosshair - { - type = "line"; - width = 7; - points[] = {{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01,-0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01732,-0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.02,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01732,0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01,0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,0.02 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01,0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01732,0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.02,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01732,-0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01,-0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ 0.04,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.02,0 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ -0.04,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.02,0 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.04 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 }}; - }; - class Gunner_AIM - { - type = "group"; - class Circle - { - type = "line"; - width = 6; - points[] = {{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.03 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.0325 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.0475 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.03 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.0325 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.0475 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.03,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.0325,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.0475,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.03,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.0325,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.0475,0 },1 }}; - }; - }; - class GunCross - { - condition = "mgun"; - class Circle - { - type = "line"; - width = 9; - points[] = {{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.05 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.015 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.05 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.05,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.015,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,0 },1 },{ }}; - }; - }; - class RocketCross - { - condition = "rocket"; - width = 6; - class Circle - { - type = "line"; - width = 6; - points[] = {{ "ForwardVec",1,"WeaponAim",1,{ -0.05,-0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,-0.08 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.08 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.05,0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,0.08 },1 },{ }}; - }; - }; - class AT_Aim - { - condition = "ATmissile"; - width = 2; - class Circle - { - type = "line"; - width = 2; - points[] = {{ "ForwardVec",1,"WeaponAim",1,{ -0.1,-0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.1,-0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.1,0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.1,0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.1,-0.1 },1 }}; - }; - }; - class AA_aim - { - condition = "AAmissile"; - class Circle - { - type = "line"; - width = 2.5; - points[] = {{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","-0.248559 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 4","-0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 4","-0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 4","-0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 4","-0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 4","-0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 4","-0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 4","-0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 4","-0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.25 / 4","0 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 4","0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 4","0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 4","0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 4","0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 4","0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 4","0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 4","0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 4","0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","0.248559 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 4","0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 4","0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 4","0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 4","0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 4","0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 4","0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 4","0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 4","0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.25 / 4","0 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 4","-0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 4","-0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 4","-0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 4","-0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 4","-0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 4","-0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 4","-0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 4","-0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","-0.248559 / 4" },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","-0.248559 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 2","-0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 2","-0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 2","-0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 2","-0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 2","-0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 2","-0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 2","-0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 2","-0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.25 / 2","0 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 2","0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 2","0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 2","0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 2","0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 2","0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 2","0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 2","0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 2","0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","0.248559 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 2","0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 2","0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 2","0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 2","0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 2","0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 2","0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 2","0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 2","0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.25 / 2","0 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 2","-0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 2","-0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 2","-0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 2","-0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 2","-0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 2","-0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 2","-0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 2","-0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","-0.248559 / 2" },1 }}; - }; - }; - class TargetACQ - { - type = "line"; - width = 2; - points[] = {{ "ForwardVec",1,"target",{ 0,-0.06 },1 },{ "ForwardVec",1,"target",{ 0,-0.055 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.05 },1 },{ "ForwardVec",1,"target",{ 0,-0.045 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.04 },1 },{ "ForwardVec",1,"target",{ 0,-0.035 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.03 },1 },{ "ForwardVec",1,"target",{ 0,-0.025 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.02 },1 },{ "ForwardVec",1,"target",{ 0,-0.015 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.01 },1 },{ "ForwardVec",1,"target",{ 0,-0.005 },1 },{ },{ "ForwardVec",1,"target",{ 0,0 },1 },{ "ForwardVec",1,"target",{ 0,0 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.06 },1 },{ "ForwardVec",1,"target",{ 0,0.055 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.05 },1 },{ "ForwardVec",1,"target",{ 0,0.045 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.04 },1 },{ "ForwardVec",1,"target",{ 0,0.035 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.03 },1 },{ "ForwardVec",1,"target",{ 0,0.025 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.02 },1 },{ "ForwardVec",1,"target",{ 0,0.015 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.01 },1 },{ "ForwardVec",1,"target",{ 0,0.005 },1 },{ },{ "ForwardVec",1,"target",{ -0.06,0 },1 },{ "ForwardVec",1,"target",{ -0.055,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.05,0 },1 },{ "ForwardVec",1,"target",{ -0.045,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.04,0 },1 },{ "ForwardVec",1,"target",{ -0.035,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.03,0 },1 },{ "ForwardVec",1,"target",{ -0.025,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.02,0 },1 },{ "ForwardVec",1,"target",{ -0.015,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.01,0 },1 },{ "ForwardVec",1,"target",{ -0.005,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.06,0 },1 },{ "ForwardVec",1,"target",{ 0.055,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.05,0 },1 },{ "ForwardVec",1,"target",{ 0.045,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.04,0 },1 },{ "ForwardVec",1,"target",{ 0.035,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.03,0 },1 },{ "ForwardVec",1,"target",{ 0.025,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.02,0 },1 },{ "ForwardVec",1,"target",{ 0.015,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.01,0 },1 },{ "ForwardVec",1,"target",{ 0.005,0 },1 },{ }}; - }; - class RadarTargets - { - type = "radar"; - pos0[] = {0.5,0.5}; - pos10[] = {0.753,0.753}; - width = 2.5; - points[] = {{ "ForwardVec",1,"RadarContact",{ -0.01,-0.01 },1 },{ "ForwardVec",1,"RadarContact",{ 0.01,-0.01 },1 },{ "ForwardVec",1,"RadarContact",{ 0.01,0.01 },1 },{ "ForwardVec",1,"RadarContact",{ -0.01,0.01 },1 },{ "ForwardVec",1,"RadarContact",{ -0.01,-0.01 },1 }}; - }; - }; - helmetMountedDisplay = 1; - helmetPosition[] = {-0.035,0.035,0.1}; - helmetRight[] = {0.07,0,0}; - helmetDown[] = {0,-0.07,0}; - }; - }; + { + class AirplaneHUD + { + class Bones{}; + class Draw{}; + topLeft = "HUD_top_left"; + topRight = "HUD_top_right"; + bottomLeft = "HUD_bottom_left"; + borderLeft = 0; + borderRight = 0; + borderTop = 0; + borderBottom = 0; + color[] = {0.15,1,0.15,1}; + enableParallax = 0; + helmetMountedDisplay = 1; + helmetPosition[] = {0,0,0}; + helmetRight[] = {0,0,0}; + helmetDown[] = {0,0,0}; + }; + class ACE_HUD_1 + { + topLeft = "HUD_top_left"; + topRight = "HUD_top_right"; + bottomLeft = "HUD_bottom_left"; + borderLeft = 0; + borderRight = 0; + borderTop = 0; + borderBottom = 0; + color[] = {0.15,1,0.15,1}; + enableParallax = 0; + class Bones + { + class GunnerAim + { + type = "vector"; + source = "weapon"; + pos0[] = {0.5,"0.9 - 0.04 + 0.012"}; + pos10[] = {"0.5 + 0.0111","0.9 - 0.04 + 0.012 + 0.0133"}; + }; + class Target + { + source = "target"; + type = "vector"; + pos0[] = {0.5,0.5}; + pos10[] = {0.85,0.85}; + }; + class Velocity + { + type = "vector"; + source = "velocity"; + pos0[] = {0.5,0.5}; + pos10[] = {0.65,0.65}; + }; + class Velocity_slip + { + type = "vector"; + source = "velocity"; + pos0[] = {0.5,0.845}; + pos10[] = {0.53,0.845}; + }; + class VspeedBone + { + type = "linear"; + source = "vspeed"; + sourceScale = 1; + min = -10; + max = 10; + minPos[] = {0.93,0.2}; + maxPos[] = {0.93,0.8}; + }; + class RadarAltitudeBone + { + type = "linear"; + source = "altitudeAGL"; + sourceScale = 1; + min = 0; + max = 60; + minPos[] = {0.965,0.2}; + maxPos[] = {0.965,0.8}; + }; + class HorizonBankRot + { + type = "rotational"; + source = "horizonBank"; + center[] = {0.5,0.5}; + min = -3.1416; + max = 3.1416; + minAngle = -180; + maxAngle = 180; + aspectRatio = 1; + }; + class ForwardVec + { + type = "vector"; + source = "forward"; + pos0[] = {0,0}; + pos10[] = {0.25,0.25}; + }; + class WeaponAim + { + type = "vector"; + source = "weapon"; + pos0[] = {0.5,0.5}; + pos10[] = {0.75,0.75}; + }; + class Level0 + { + type = "horizon"; + pos0[] = {0.5,0.5}; + pos10[] = {0.78,0.78}; + angle = 0; + }; + class LevelP5: Level0 + { + angle = 5; + }; + class LevelM5: Level0 + { + angle = -5; + }; + class LevelP10: Level0 + { + angle = 10; + }; + class LevelM10: Level0 + { + angle = -10; + }; + class LevelP15: Level0 + { + angle = 15; + }; + class LevelM15: Level0 + { + angle = -15; + }; + class LevelP20: Level0 + { + angle = 20; + }; + class LevelM20: Level0 + { + angle = -20; + }; + class LevelP25: Level0 + { + angle = 25; + }; + class LevelM25: Level0 + { + angle = -25; + }; + class LevelP30: Level0 + { + angle = 30; + }; + class LevelM30: Level0 + { + angle = -30; + }; + class LevelP35: Level0 + { + angle = 35; + }; + class LevelM35: Level0 + { + angle = -35; + }; + class LevelP40: Level0 + { + angle = 40; + }; + class LevelM40: Level0 + { + angle = -40; + }; + class LevelP45: Level0 + { + angle = 45; + }; + class LevelM45: Level0 + { + angle = -45; + }; + class LevelP50: Level0 + { + angle = 50; + }; + class LevelM50: Level0 + { + angle = -50; + }; + }; + class Draw + { + color[] = {0.18,1,0.18}; + alpha = 1; + condition = "on"; + class Horizont + { + clipTL[] = {0.15,0.15}; + clipBR[] = {0.85,0.85}; + class Dimmed + { + class Level0 + { + type = "line"; + points[] = {{ "Level0",{ -0.42,0 },1 },{ "Level0",{ -0.38,0 },1 },{ },{ "Level0",{ -0.37,0 },1 },{ "Level0",{ -0.33,0 },1 },{ },{ "Level0",{ -0.32,0 },1 },{ "Level0",{ -0.28,0 },1 },{ },{ "Level0",{ -0.27,0 },1 },{ "Level0",{ -0.23,0 },1 },{ },{ "Level0",{ -0.22,0 },1 },{ "Level0",{ -0.18,0 },1 },{ },{ "Level0",{ -0.17,0 },1 },{ "Level0",{ -0.13,0 },1 },{ },{ "Level0",{ -0.12,0 },1 },{ "Level0",{ -0.08,0 },1 },{ },{ "Level0",{ 0.42,0 },1 },{ "Level0",{ 0.38,0 },1 },{ },{ "Level0",{ 0.37,0 },1 },{ "Level0",{ 0.33,0 },1 },{ },{ "Level0",{ 0.32,0 },1 },{ "Level0",{ 0.28,0 },1 },{ },{ "Level0",{ 0.27,0 },1 },{ "Level0",{ 0.23,0 },1 },{ },{ "Level0",{ 0.22,0 },1 },{ "Level0",{ 0.18,0 },1 },{ },{ "Level0",{ 0.17,0 },1 },{ "Level0",{ 0.13,0 },1 },{ },{ "Level0",{ 0.12,0 },1 },{ "Level0",{ 0.08,0 },1 }}; + }; + }; + }; + class HorizonBankRot + { + type = "line"; + width = 3; + points[] = {{ "HorizonBankRot",{ 0,0.25 },1 },{ "HorizonBankRot",{ -0.01,0.23 },1 },{ "HorizonBankRot",{ 0.01,0.23 },1 },{ "HorizonBankRot",{ 0,0.25 },1 }}; + }; + class Static_HAD_BOX + { + clipTL[] = {0,1}; + clipBR[] = {1,0}; + type = "line"; + width = 5; + points[] = {{ { "0.5-0.1","0.9-0.04" },1 },{ { "0.5-0.1","0.9+0.04" },1 },{ { "0.5+0.1","0.9+0.04" },1 },{ { "0.5+0.1","0.9-0.04" },1 },{ { "0.5-0.1","0.9-0.04" },1 },{ },{ { "0.5-0.1","0.9-0.04+0.012" },1 },{ { "0.5-0.092","0.9-0.04+0.012" },1 },{ },{ { "0.5+0.1","0.9-0.04+0.012" },1 },{ { "0.5+0.092","0.9-0.04+0.012" },1 },{ },{ { 0.5,"0.9-0.04" },1 },{ { 0.5,"0.9-0.032" },1 },{ },{ { 0.5,"0.9+0.04" },1 },{ { 0.5,"0.9+0.032" },1 },{ }}; + }; + class Gunner_HAD + { + type = "line"; + width = 6; + points[] = {{ "GunnerAim",{ -0.015,-0.008 },1 },{ "GunnerAim",{ -0.015,0.008 },1 },{ "GunnerAim",{ 0.015,0.008 },1 },{ "GunnerAim",{ 0.015,-0.008 },1 },{ "GunnerAim",{ -0.015,-0.008 },1 }}; + }; + class Slip_ball_group + { + class Slip_bars + { + type = "line"; + width = 4; + points[] = {{ { "0.5-0.018","0.9-0.04" },1 },{ { "0.5-0.018","0.9-0.075" },1 },{ },{ { "0.5+0.018","0.9-0.04" },1 },{ { "0.5+0.018","0.9-0.075" },1 }}; + }; + class Slip_ball + { + type = "line"; + width = 6; + points[] = {{ "Velocity_slip",1,{ "0 * 0.75","-0.02 * 0.75" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.75","-0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.75","-0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "0.02 * 0.75","0 * 0.75" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.75","0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.75","0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0 * 0.75","0.02 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.75","0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.75","0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.75","0 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.75","-0.0099999998 * 0.75" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.75","-0.01732 * 0.75" },1 },{ "Velocity_slip",1,{ "0 * 0.75","-0.02 * 0.75" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.6","-0.02 * 0.6" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.6","-0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.6","-0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "0.02 * 0.6","0 * 0.6" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.6","0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.6","0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0 * 0.6","0.02 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.6","0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.6","0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.6","0 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.6","-0.0099999998 * 0.6" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.6","-0.01732 * 0.6" },1 },{ "Velocity_slip",1,{ "0 * 0.6","-0.02 * 0.6" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.5","-0.02 * 0.5" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.5","-0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.5","-0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "0.02 * 0.5","0 * 0.5" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.5","0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.5","0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0 * 0.5","0.02 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.5","0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.5","0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.5","0 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.5","-0.0099999998 * 0.5" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.5","-0.01732 * 0.5" },1 },{ "Velocity_slip",1,{ "0 * 0.5","-0.02 * 0.5" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.4","-0.02 * 0.4" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.4","-0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.4","-0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "0.02 * 0.4","0 * 0.4" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.4","0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.4","0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0 * 0.4","0.02 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.4","0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.4","0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.4","0 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.4","-0.0099999998 * 0.4" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.4","-0.01732 * 0.4" },1 },{ "Velocity_slip",1,{ "0 * 0.4","-0.02 * 0.4" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.30","-0.02 * 0.30" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.30","-0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.30","-0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "0.02 * 0.30","0 * 0.30" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.30","0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.30","0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0 * 0.30","0.02 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.30","0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.30","0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.30","0 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.30","-0.0099999998 * 0.30" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.30","-0.01732 * 0.30" },1 },{ "Velocity_slip",1,{ "0 * 0.30","-0.02 * 0.30" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.20","-0.02 * 0.20" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.20","-0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.20","-0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "0.02 * 0.20","0 * 0.20" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.20","0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.20","0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0 * 0.20","0.02 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.20","0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.20","0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.20","0 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.20","-0.0099999998 * 0.20" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.20","-0.01732 * 0.20" },1 },{ "Velocity_slip",1,{ "0 * 0.20","-0.02 * 0.20" },1 },{ },{ "Velocity_slip",1,{ "0 * 0.1","-0.02 * 0.1" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.1","-0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.1","-0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "0.02 * 0.1","0 * 0.1" },1 },{ "Velocity_slip",1,{ "0.01732 * 0.1","0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "0.0099999998 * 0.1","0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0 * 0.1","0.02 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.1","0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.1","0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.02 * 0.1","0 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.01732 * 0.1","-0.0099999998 * 0.1" },1 },{ "Velocity_slip",1,{ "-0.0099999998 * 0.1","-0.01732 * 0.1" },1 },{ "Velocity_slip",1,{ "0 * 0.1","-0.02 * 0.1" },1 }}; + }; + }; + class Centerline + { + type = "line"; + width = 5; + points[] = {{ { 0.5,0.48 },1 },{ { 0.5,0.45 },1 },{ },{ { 0.5,0.52 },1 },{ { 0.5,0.55 },1 },{ },{ { 0.48,0.5 },1 },{ { 0.45,0.5 },1 },{ },{ { 0.52,0.5 },1 },{ { 0.55,0.5 },1 },{ }}; + }; + class WeaponName + { + type = "text"; + source = "weapon"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.86 },1}; + right[] = {{ 0.65,0.86 },1}; + down[] = {{ 0.61,0.9 },1}; + }; + class Ammo_GUN + { + type = "group"; + condition = "mgun"; + class Ammo_count_GUN + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class Ammo_RKT + { + type = "group"; + condition = "rocket"; + class Ammo_count_RKT + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class Ammo_AGM + { + type = "group"; + condition = "AAmissile"; + class Ammo_count_AGM + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class Ammo_AAM + { + type = "group"; + condition = "ATmissile"; + class Ammo_count_AAM + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class Ammo_Bomb + { + type = "group"; + condition = "Bomb"; + class Ammo_count_Bomb + { + type = "text"; + source = "ammo"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.61,0.89 },1}; + right[] = {{ 0.65,0.89 },1}; + down[] = {{ 0.61,0.93 },1}; + }; + }; + class LightsGroup + { + type = "group"; + condition = "lights"; + class LightsText + { + type = "text"; + source = "static"; + text = "LIGHTS"; + align = "right"; + scale = 1; + pos[] = {{ 0.03,"0.53 + 0.055" },1}; + right[] = {{ 0.07,"0.53 + 0.055" },1}; + down[] = {{ 0.03,"0.53 + 0.095" },1}; + }; + }; + class CollisionLightsGroup + { + type = "group"; + condition = "collisionlights"; + class CollisionLightsText + { + type = "text"; + source = "static"; + text = "A-COL"; + align = "right"; + scale = 1; + pos[] = {{ 0.03,"0.53 + 0.105" },1}; + right[] = {{ 0.07,"0.53 + 0.105" },1}; + down[] = {{ 0.03,"0.53 + 0.145" },1}; + }; + }; + class GearGroup + { + type = "group"; + condition = "ils"; + class GearText + { + type = "text"; + source = "static"; + text = "GEAR"; + align = "right"; + scale = 1; + pos[] = {{ 0.03,"0.53 + 0.155" },1}; + right[] = {{ 0.07,"0.53 + 0.155" },1}; + down[] = {{ 0.03,"0.53 + 0.195" },1}; + }; + }; + class ATMissileTOFGroup + { + condition = "ATmissile"; + type = "group"; + class TOFtext + { + type = "text"; + align = "right"; + source = "static"; + text = "TOF="; + scale = 1; + pos[] = {{ 0.61,0.92 },1}; + right[] = {{ 0.65,0.92 },1}; + down[] = {{ 0.61,0.96 },1}; + }; + class TOFnumber + { + type = "text"; + source = "targetDist"; + sourcescale = 0.0025; + align = "right"; + scale = 1; + pos[] = {{ 0.69,0.92 },1}; + right[] = {{ 0.73,0.92 },1}; + down[] = {{ 0.69,0.96 },1}; + }; + }; + class LaserTOFGroup + { + condition = "Bomb"; + type = "group"; + class TOFtext + { + type = "text"; + align = "right"; + source = "static"; + text = "TOF="; + scale = 1; + pos[] = {{ 0.61,0.92 },1}; + right[] = {{ 0.65,0.92 },1}; + down[] = {{ 0.61,0.96 },1}; + }; + class TOFnumber + { + type = "text"; + source = "targetDist"; + sourcescale = 0.0025; + align = "right"; + scale = 1; + pos[] = {{ 0.69,0.92 },1}; + right[] = {{ 0.73,0.92 },1}; + down[] = {{ 0.69,0.96 },1}; + }; + }; + class RocketTOFGroup + { + condition = "Rocket"; + type = "group"; + class TOFtext + { + type = "text"; + align = "right"; + source = "static"; + text = "TOF="; + scale = 1; + pos[] = {{ 0.61,0.92 },1}; + right[] = {{ 0.65,0.92 },1}; + down[] = {{ 0.61,0.96 },1}; + }; + class TOFnumber + { + type = "text"; + source = "targetDist"; + sourcescale = 0.0025; + align = "right"; + scale = 1; + pos[] = {{ 0.69,0.92 },1}; + right[] = {{ 0.73,0.92 },1}; + down[] = {{ 0.69,0.96 },1}; + }; + }; + class RangeNumber + { + type = "text"; + source = "targetDist"; + sourceScale = 1; + align = "left"; + scale = 1; + pos[] = {{ 0.39,0.89 },1}; + right[] = {{ 0.43,0.89 },1}; + down[] = {{ 0.39,0.93 },1}; + }; + class RangeText + { + type = "text"; + source = "static"; + text = "RNG"; + align = "left"; + scale = 1; + pos[] = {{ 0.39,0.86 },1}; + right[] = {{ 0.43,0.86 },1}; + down[] = {{ 0.39,0.9 },1}; + }; + class SpeedNumber + { + type = "text"; + align = "right"; + scale = 1; + source = "speed"; + sourceScale = 3.6; + pos[] = {{ 0.03,0.475 },1}; + right[] = {{ 0.08,0.475 },1}; + down[] = {{ 0.03,0.525 },1}; + }; + class TorqueNumber + { + condition = "simulRTD"; + class Torque_number + { + type = "text"; + align = "left"; + scale = 1; + source = "rtdRotorTorque"; + sourceScale = 290; + pos[] = {{ 0.065,0.175 },1}; + right[] = {{ 0.115,0.175 },1}; + down[] = {{ 0.065,0.225 },1}; + }; + class Torquetext + { + type = "text"; + source = "static"; + text = "%"; + align = "right"; + scale = 1; + pos[] = {{ 0.07,0.175 },1}; + right[] = {{ 0.12,0.175 },1}; + down[] = {{ 0.07,0.225 },1}; + }; + }; + class AltNumber: SpeedNumber + { + align = "right"; + source = "altitudeAGL"; + sourceScale = 1; + pos[] = {{ 0.83,0.475 },1}; + right[] = {{ 0.88,0.475 },1}; + down[] = {{ 0.83,0.525 },1}; + }; + class ASLNumber + { + type = "text"; + source = "altitudeASL"; + sourceScale = 1; + align = "right"; + scale = 1; + pos[] = {{ 0.835,0.18 },1}; + right[] = {{ 0.875,0.18 },1}; + down[] = {{ 0.835,0.22 },1}; + }; + class VspeedScalePosta + { + type = "line"; + width = 5; + points[] = {{ { 0.98,0.2 },1 },{ { 1,0.2 },1 },{ },{ { 0.93,0.2 },1 },{ { 0.95,0.2 },1 },{ },{ { 0.98,0.35 },1 },{ { 1,0.35 },1 },{ },{ { 0.93,0.35 },1 },{ { 0.95,0.35 },1 },{ },{ { 0.94,0.38 },1 },{ { 0.95,0.38 },1 },{ },{ { 0.94,0.41 },1 },{ { 0.95,0.41 },1 },{ },{ { 0.94,0.44 },1 },{ { 0.95,0.44 },1 },{ },{ { 0.94,0.47 },1 },{ { 0.95,0.47 },1 },{ },{ { 0.98,0.5 },1 },{ { 1,0.5 },1 },{ },{ { 0.93,0.5 },1 },{ { 0.95,0.5 },1 },{ },{ { 0.94,0.53 },1 },{ { 0.95,0.53 },1 },{ },{ { 0.94,0.56 },1 },{ { 0.95,0.56 },1 },{ },{ { 0.94,0.59 },1 },{ { 0.95,0.59 },1 },{ },{ { 0.94,0.62 },1 },{ { 0.95,0.62 },1 },{ },{ { 0.98,0.65 },1 },{ { 1,0.65 },1 },{ },{ { 0.93,0.65 },1 },{ { 0.95,0.65 },1 },{ },{ { 0.99,0.68 },1 },{ { 0.98,0.68 },1 },{ },{ { 0.99,0.71 },1 },{ { 0.98,0.71 },1 },{ },{ { 0.99,0.74 },1 },{ { 0.98,0.74 },1 },{ },{ { 0.99,0.77 },1 },{ { 0.98,0.77 },1 },{ },{ { 0.98,0.8 },1 },{ { 1,0.8 },1 },{ },{ { 0.93,0.8 },1 },{ { 0.95,0.8 },1 },{ }}; + }; + class RadarAltitudeBand + { + clipTL[] = {0,0.2}; + clipBR[] = {1,0.8}; + hideValue = 201; + class radarbanda + { + type = "line"; + width = 17; + points[] = {{ "RadarAltitudeBone",{ 0,0 },1 },{ "RadarAltitudeBone",{ 0,0.6 },1 }}; + }; + }; + class VspeedBand + { + type = "line"; + width = 3; + points[] = {{ "VspeedBone",{ -0.01,0 },1 },{ "VspeedBone",{ -0.025,-0.015 },1 },{ "VspeedBone",{ -0.025,0.015 },1 },{ "VspeedBone",{ -0.01,0 },1 },{ }}; + }; + class HeadingNumber: SpeedNumber + { + source = "heading"; + sourceScale = 1; + align = "center"; + pos[] = {{ 0.5,0.045 },1}; + right[] = {{ 0.56,0.045 },1}; + down[] = {{ 0.5,"0.045 + 0.06" },1}; + }; + class Center_box + { + type = "line"; + width = 1.5; + points[] = {{ { 0.45,"0.02 + 0.085 - 0.06" },1 },{ { "0.45 + 0.10","0.02 + 0.085 - 0.06" },1 },{ { "0.45 + 0.10","0.02 + 0.085" },1 },{ { 0.45,"0.02 + 0.085" },1 },{ { 0.45,"0.02 + 0.085 - 0.06" },1 }}; + }; + class HeadingArrow + { + type = "line"; + width = 7; + points[] = {{ { "0.5","0.128 + 0.03" },1 },{ { 0.5,0.128 },1 }}; + }; + class HeadingScale_LEFT + { + clipTL[] = {0,0}; + clipBR[] = {0.45,1}; + class Heading_group + { + type = "scale"; + horizontal = 1; + source = "heading"; + sourceScale = 1; + width = 5; + top = 0.12; + center = 0.5; + bottom = 0.88; + lineXleft = "0.03 + 0.085"; + lineYright = "0.02 + 0.085"; + lineXleftMajor = "0.04 + 0.085"; + lineYrightMajor = "0.02 + 0.085"; + majorLineEach = 3; + numberEach = 3; + step = 10; + stepSize = "0.05"; + align = "center"; + scale = 1; + pos[] = {0.12,"0.0 + 0.065"}; + right[] = {0.16,"0.0 + 0.065"}; + down[] = {0.12,"0.04 + 0.065"}; + }; + }; + class HeadingScale_RIGHT + { + clipTL[] = {0.55,0}; + clipBR[] = {1,1}; + class Heading_group + { + type = "scale"; + horizontal = 1; + source = "heading"; + sourceScale = 1; + width = 5; + top = 0.12; + center = 0.5; + bottom = 0.88; + lineXleft = "0.03 + 0.085"; + lineYright = "0.02 + 0.085"; + lineXleftMajor = "0.04 + 0.085"; + lineYrightMajor = "0.02 + 0.085"; + majorLineEach = 3; + numberEach = 3; + step = 10; + stepSize = "0.05"; + align = "center"; + scale = 1; + pos[] = {0.12,"0.0 + 0.065"}; + right[] = {0.16,"0.0 + 0.065"}; + down[] = {0.12,"0.04 + 0.065"}; + }; + }; + class HeadingScale_BOTTOM + { + clipTL[] = {0.45,"0.02 + 0.085"}; + clipBR[] = {"0.45 + 0.10",1}; + class Heading_group + { + type = "scale"; + horizontal = 1; + source = "heading"; + sourceScale = 1; + width = 5; + top = 0.12; + center = 0.5; + bottom = 0.88; + lineXleft = "0.03 + 0.085"; + lineYright = "0.02 + 0.085"; + lineXleftMajor = "0.04 + 0.085"; + lineYrightMajor = "0.02 + 0.085"; + majorLineEach = 3; + numberEach = 3; + step = 10; + stepSize = "0.05"; + align = "center"; + scale = 1; + pos[] = {0.12,"0.0 + 0.065"}; + right[] = {0.16,"0.0 + 0.065"}; + down[] = {0.12,"0.04 + 0.065"}; + }; + }; + class Fuel_Text + { + type = "text"; + source = "static"; + text = "Fuel"; + align = "right"; + scale = 1; + pos[] = {{ 0.03,0.9 },1}; + right[] = {{ 0.07,0.9 },1}; + down[] = {{ 0.03,0.94 },1}; + }; + class Fuel_Number + { + type = "text"; + source = "fuel"; + sourceScale = 100; + align = "right"; + scale = 1; + pos[] = {{ 0.1,0.9 },1}; + right[] = {{ 0.14,0.9 },1}; + down[] = {{ 0.1,0.94 },1}; + }; + }; + helmetMountedDisplay = 1; + helmetPosition[] = {-0.04,0.04,0.1}; + helmetRight[] = {0.08,0,0}; + helmetDown[] = {0,-0.08,0}; + }; + class ACE_HUD_2 + { + topLeft = "HUD_top_left"; + topRight = "HUD_top_right"; + bottomLeft = "HUD_bottom_left"; + borderLeft = 0; + borderRight = 0; + borderTop = 0; + borderBottom = 0; + color[] = {0.15,1,0.15,1}; + enableParallax = 0; + class Bones + { + class Velocity + { + type = "vector"; + source = "velocity"; + pos0[] = {0.5,0.5}; + pos10[] = {0.75,0.75}; + }; + class ForwardVec1 + { + type = "vector"; + source = "forward"; + pos0[] = {0,0}; + pos10[] = {0.25,0.25}; + }; + class ForwardVec + { + type = "vector"; + source = "forward"; + pos0[] = {0,0}; + pos10[] = {0.253,0.253}; + }; + class WeaponAim + { + type = "vector"; + source = "weapon"; + pos0[] = {0.5,0.5}; + pos10[] = {0.753,0.753}; + }; + class WeaponAim1 + { + type = "vector"; + source = "weapon"; + pos0[] = {0,0}; + pos10[] = {0.253,0.23}; + }; + class Target + { + type = "vector"; + source = "target"; + pos0[] = {0.5,0.5}; + pos10[] = {0.753,0.753}; + }; + class RadarContact + { + type = "fixed"; + pos[] = {0,0}; + }; + }; + class Draw + { + color[] = {0.18,1,0.18}; + alpha = 1; + condition = "on"; + class PlaneMovementCrosshair + { + type = "line"; + width = 7; + points[] = {{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01,-0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01732,-0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.02,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01732,0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.01,0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,0.02 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01,0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01732,0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.02,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01732,-0.01 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.01,-0.01732 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ 0.04,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0.02,0 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ -0.04,0 },1 },{ "ForwardVec1",1,"Velocity",1,{ -0.02,0 },1 },{ },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.04 },1 },{ "ForwardVec1",1,"Velocity",1,{ 0,-0.02 },1 }}; + }; + class Gunner_AIM + { + type = "group"; + class Circle + { + type = "line"; + width = 6; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.03 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.0325 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.0475 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.03 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.0325 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.0475 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.03,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.0325,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.0475,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.03,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.0325,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.0475,0 },1 }}; + }; + }; + class GunCross + { + condition = "mgun"; + class Circle + { + type = "line"; + width = 9; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.05 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.015 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.015 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.05 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.05,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.015,0 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0.015,0 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,0 },1 },{ }}; + }; + }; + class RocketCross + { + condition = "rocket"; + width = 6; + class Circle + { + type = "line"; + width = 6; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ -0.05,-0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,-0.08 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ 0,-0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0,0.08 },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ -0.05,0.08 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.05,0.08 },1 },{ }}; + }; + }; + class AT_Aim + { + condition = "ATmissile"; + width = 2; + class Circle + { + type = "line"; + width = 2; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ -0.1,-0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.1,-0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ 0.1,0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.1,0.1 },1 },{ "ForwardVec",1,"WeaponAim",1,{ -0.1,-0.1 },1 }}; + }; + }; + class AA_aim + { + condition = "AAmissile"; + class Circle + { + type = "line"; + width = 2.5; + points[] = {{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","-0.248559 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 4","-0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 4","-0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 4","-0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 4","-0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 4","-0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 4","-0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 4","-0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 4","-0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.25 / 4","0 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 4","0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 4","0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 4","0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 4","0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 4","0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 4","0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 4","0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 4","0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","0.248559 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 4","0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 4","0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 4","0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 4","0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 4","0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 4","0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 4","0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 4","0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.25 / 4","0 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 4","-0.0431499 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 4","-0.0850072 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 4","-0.12428 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 4","-0.159774 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 4","-0.190396 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 4","-0.215252 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 4","-0.233571 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 4","-0.244781 / 4" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 4","-0.248559 / 4" },1 },{ },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","-0.248559 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 2","-0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 2","-0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 2","-0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 2","-0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 2","-0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 2","-0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 2","-0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 2","-0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.25 / 2","0 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2462 / 2","0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.234925 / 2","0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.2165 / 2","0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1915 / 2","0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.1607 / 2","0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.125 / 2","0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0855 / 2","0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0.0434 / 2","0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","0.248559 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 2","0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 2","0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 2","0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 2","0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 2","0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 2","0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 2","0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 2","0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.25 / 2","0 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2462 / 2","-0.0431499 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.234925 / 2","-0.0850072 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.2165 / 2","-0.12428 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1915 / 2","-0.159774 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.1607 / 2","-0.190396 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.125 / 2","-0.215252 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0855 / 2","-0.233571 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "-0.0434 / 2","-0.244781 / 2" },1 },{ "ForwardVec",1,"WeaponAim",1,{ "0 / 2","-0.248559 / 2" },1 }}; + }; + }; + class TargetACQ + { + type = "line"; + width = 2; + points[] = {{ "ForwardVec",1,"target",{ 0,-0.06 },1 },{ "ForwardVec",1,"target",{ 0,-0.055 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.05 },1 },{ "ForwardVec",1,"target",{ 0,-0.045 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.04 },1 },{ "ForwardVec",1,"target",{ 0,-0.035 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.03 },1 },{ "ForwardVec",1,"target",{ 0,-0.025 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.02 },1 },{ "ForwardVec",1,"target",{ 0,-0.015 },1 },{ },{ "ForwardVec",1,"target",{ 0,-0.01 },1 },{ "ForwardVec",1,"target",{ 0,-0.005 },1 },{ },{ "ForwardVec",1,"target",{ 0,0 },1 },{ "ForwardVec",1,"target",{ 0,0 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.06 },1 },{ "ForwardVec",1,"target",{ 0,0.055 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.05 },1 },{ "ForwardVec",1,"target",{ 0,0.045 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.04 },1 },{ "ForwardVec",1,"target",{ 0,0.035 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.03 },1 },{ "ForwardVec",1,"target",{ 0,0.025 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.02 },1 },{ "ForwardVec",1,"target",{ 0,0.015 },1 },{ },{ "ForwardVec",1,"target",{ 0,0.01 },1 },{ "ForwardVec",1,"target",{ 0,0.005 },1 },{ },{ "ForwardVec",1,"target",{ -0.06,0 },1 },{ "ForwardVec",1,"target",{ -0.055,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.05,0 },1 },{ "ForwardVec",1,"target",{ -0.045,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.04,0 },1 },{ "ForwardVec",1,"target",{ -0.035,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.03,0 },1 },{ "ForwardVec",1,"target",{ -0.025,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.02,0 },1 },{ "ForwardVec",1,"target",{ -0.015,0 },1 },{ },{ "ForwardVec",1,"target",{ -0.01,0 },1 },{ "ForwardVec",1,"target",{ -0.005,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.06,0 },1 },{ "ForwardVec",1,"target",{ 0.055,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.05,0 },1 },{ "ForwardVec",1,"target",{ 0.045,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.04,0 },1 },{ "ForwardVec",1,"target",{ 0.035,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.03,0 },1 },{ "ForwardVec",1,"target",{ 0.025,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.02,0 },1 },{ "ForwardVec",1,"target",{ 0.015,0 },1 },{ },{ "ForwardVec",1,"target",{ 0.01,0 },1 },{ "ForwardVec",1,"target",{ 0.005,0 },1 },{ }}; + }; + class RadarTargets + { + type = "radar"; + pos0[] = {0.5,0.5}; + pos10[] = {0.753,0.753}; + width = 2.5; + points[] = {{ "ForwardVec",1,"RadarContact",{ -0.01,-0.01 },1 },{ "ForwardVec",1,"RadarContact",{ 0.01,-0.01 },1 },{ "ForwardVec",1,"RadarContact",{ 0.01,0.01 },1 },{ "ForwardVec",1,"RadarContact",{ -0.01,0.01 },1 },{ "ForwardVec",1,"RadarContact",{ -0.01,-0.01 },1 }}; + }; + }; + helmetMountedDisplay = 1; + helmetPosition[] = {-0.035,0.035,0.1}; + helmetRight[] = {0.07,0,0}; + helmetDown[] = {0,-0.07,0}; + }; + }; class Turrets: Turrets { class MainTurret: MainTurret { diff --git a/addons/aircraft/RscInGameUI.hpp b/addons/aircraft/RscInGameUI.hpp index 208d971ce4..8255de35a6 100644 --- a/addons/aircraft/RscInGameUI.hpp +++ b/addons/aircraft/RscInGameUI.hpp @@ -10,569 +10,569 @@ class HScrollbar; class RscLadderPicture; class RscInGameUI { - class RscUnitInfo; - class Rsc_ACE_Helo_UI_Turret: RscUnitInfo - { - idd = 300; - controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"}; - class VScrollbar; - class HScrollbar; - class CA_IGUI_elements_group: RscControlsGroup - { - idc = 170; - class VScrollbar: VScrollbar - { - width = 0; - }; - class HScrollbar: HScrollbar - { - height = 0; - }; - x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; - y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; - w = "53.5 * (0.01875 * SafezoneH)"; - h = "40 * (0.025 * SafezoneH)"; - class controls - { - class CA_Distance: RscText - { - idc = 151; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - x = "24.78 * (0.01875 * SafezoneH)"; - y = "30.88 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class CA_Speed: RangeText - { - idc = 188; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "120"; - x = "14.78 * (0.01875 * SafezoneH)"; - y = "30.88 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class CA_Alt: RangeText - { - idc = 189; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "3825"; - x = "34.78 * (0.01875 * SafezoneH)"; - y = "30.88 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class CA_VisionMode: RscText - { - idc = 152; - style = 0; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "VIS"; - x = "12.58 * (0.01875 * SafezoneH)"; - y = "8 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class CA_FlirMode: RscText - { - idc = 153; - style = 0; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "BHOT"; - x = "15.78 * (0.01875 * SafezoneH)"; - y = "8 * (0.025 * SafezoneH)"; - w = "4.5 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class ValueGrid: RangeText - { - idc = 172; - font = "EtelkaMonospacePro"; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - x = "12.20 * (0.01875 * SafezoneH)"; - y = "3.5 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class TextTADS: RangeText - { - idc = 1010; - text = "TADS"; - font = "EtelkaMonospacePro"; - style = 2; - shadow = 0; - x = "12.30 * (0.01875 * SafezoneH)"; - y = "5 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class ValueTime: RangeText - { - idc = 190; - text = "20:28:35"; - font = "EtelkaMonospacePro"; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - x = "12.1 * (0.01875 * SafezoneH)"; - y = "6.5 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class CA_Laser: RscText - { - idc = 158; - style = "0x30 + 0x800"; - sizeEx = "0.038*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = PATHTOF(data\Helo_LaserON.paa); - x = "20.45 * (0.01875 * SafezoneH)"; - y = "14.1 * (0.025 * SafezoneH)"; - w = "12.5 * (0.01875 * SafezoneH)"; - h = "12 * (0.025 * SafezoneH)"; - }; - class CA_Heading: RscText - { - idc = 156; - style = 0; - sizeEx = "0.038*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "023"; - x = "24.83 * (0.01875 * SafezoneH)"; - y = "6 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - }; - }; - }; - class Rsc_ACE_Helo_UI_01: RscUnitInfo - { - controls[] = {"WeaponInfoControlsGroupRight","CA_TextFlaresMode","CA_TextFlares","CA_VehicleToggles","CA_Radar"}; - }; - class Rsc_ACE_Helo_UI_02: RscUnitInfo - { - controls[] = {"CA_TextFlaresMode","CA_TextFlares","CA_VehicleToggles","CA_Radar"}; - }; - class Rsc_ACE_Drones_UI_Turret: RscUnitInfo - { - idd = 300; - controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"}; - class CA_IGUI_elements_group: RscControlsGroup - { - idc = 170; - class VScrollbar: VScrollbar - { - width = 0; - }; - class HScrollbar: HScrollbar - { - height = 0; - }; - x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; - y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; - w = "53.5 * (0.01875 * SafezoneH)"; - h = "40 * (0.025 * SafezoneH)"; - class controls - { - class CA_Distance: RscText - { - idc = 151; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - x = "24.78 * (0.01875 * SafezoneH)"; - y = "30.88 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class CA_Speed: RangeText - { - idc = 188; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "120"; - x = "14.78 * (0.01875 * SafezoneH)"; - y = "30.88 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class CA_Alt: RangeText - { - idc = 189; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "3825"; - x = "34.78 * (0.01875 * SafezoneH)"; - y = "30.88 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class ValueTime: RangeText - { - idc = 190; - text = "20:28:35"; - font = "EtelkaMonospacePro"; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - x = "1.75 * (0.01875 * SafezoneH)"; - y = "10.5 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class CA_VisionMode: RscText - { - idc = 152; - style = 0; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "VIS"; - align = "right"; - x = "2.6 * (0.01875 * SafezoneH)"; - y = "12.0 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.0 * (0.025 * SafezoneH)"; - }; - class CA_FlirMode: RscText - { - idc = 153; - style = 0; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "BHOT"; - align = "right"; - x = "6.18 * (0.01875 * SafezoneH)"; - y = "12.0 * (0.025 * SafezoneH)"; - w = "4.5 * (0.01875 * SafezoneH)"; - h = "1.0 * (0.025 * SafezoneH)"; - }; - class TgT_Grid_text: RangeText - { - idc = 1005; - text = "TGT:"; - font = "EtelkaMonospacePro"; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - x = "1.20 * (0.01875 * SafezoneH)"; - y = "13.5 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class TGT_ValueGrid: RangeText - { - idc = 172; - font = "EtelkaMonospacePro"; - colorText[] = {0.706,0.0745,0.0196,0.8}; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - x = "5.20 * (0.01875 * SafezoneH)"; - y = "13.5 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class OWN_Grid_text: RangeText - { - idc = 1005; - text = "OWN:"; - font = "EtelkaMonospacePro"; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - x = "1.20 * (0.01875 * SafezoneH)"; - y = "15 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class OWN_ValueGrid: RangeText - { - idc = 171; - font = "EtelkaMonospacePro"; - colorText[] = {0.15,1,0.15,0.8}; - style = 2; - sizeEx = "0.0295*SafezoneH"; - shadow = 0; - x = "5.20 * (0.01875 * SafezoneH)"; - y = "15 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class CA_Laser: RscText - { - idc = 158; - style = "0x30 + 0x800"; - sizeEx = "0.038*SafezoneH"; - shadow = 0; - align = "right"; - font = "EtelkaMonospacePro"; - text = PATHTOF(data\Helo_LaserON.paa); - x = "20.45 * (0.01875 * SafezoneH)"; - y = "14.1 * (0.025 * SafezoneH)"; - w = "12.5 * (0.01875 * SafezoneH)"; - h = "12 * (0.025 * SafezoneH)"; - }; - class CA_Heading: RscText - { - idc = 156; - style = 0; - sizeEx = "0.038*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "023"; - align = "right"; - x = "25 * (0.01875 * SafezoneH)"; - y = "5 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - }; - }; - }; - class Rsc_ACE_Drones_UI_Pilots: RscUnitInfo - { - idd = 300; - controls[] = {"WeaponInfoControlsGroupRight","CA_BackgroundVehicle","CA_BackgroundVehicleTitle","CA_BackgroundVehicleTitleDark","CA_BackgroundFuel","CA_Vehicle","CA_VehicleRole","CA_HitZones","CA_SpeedBackground","CA_SpeedUnits","CA_Speed","CA_ValueFuel","CA_AltBackground","CA_AltUnits","CA_Alt","CA_VehicleToggles","CA_Radar","DriverOpticsGroup"}; - class DriverOpticsGroup: RscControlsGroup - { - idc = 392; - class VScrollbar: VScrollbar - { - width = 0; - }; - class HScrollbar: HScrollbar - { - height = 0; - }; - x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; - y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; - w = "53.5 * (0.01875 * SafezoneH)"; - h = "40 * (0.025 * SafezoneH)"; - class controls - { - class TextGrid: RscText - { - style = 0; - sizeEx = "0.02*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - idc = 1005; - text = "GRID:"; - x = "5.8 * (0.01875 * SafezoneH)"; - y = "31.8 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class ValueGrid: TextGrid - { - idc = 189; - text = "382546"; - x = "10.3 * (0.01875 * SafezoneH)"; - y = "31.8 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class TextTime: TextGrid - { - idc = 1010; - text = "TIME [UTC]:"; - x = "5.8 * (0.01875 * SafezoneH)"; - y = "32.6 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class ValueTime: TextGrid - { - idc = 101; - text = "20:28:35"; - x = "10 * (0.01875 * SafezoneH)"; - y = "32.6 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class TextMag: TextGrid - { - idc = 1011; - text = "CAM MAG:"; - x = "5.8 * (0.01875 * SafezoneH)"; - y = "7 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class OpticsZoom: TextGrid - { - idc = 192; - text = "28x"; - x = "10.3 * (0.01875 * SafezoneH)"; - y = "7 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class BorderLineSpdTop: RscPicture - { - idc = 1203; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; - x = "3.343 * (0.01875 * SafezoneH)"; - y = "12.4 * (0.025 * SafezoneH)"; - w = "3 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class BorderLineSpdBottom: RscPicture - { - idc = 1207; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; - x = "3.343 * (0.01875 * SafezoneH)"; - y = "26.5 * (0.025 * SafezoneH)"; - w = "3 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class BorderLineAltTop: RscPicture - { - idc = 1205; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; - x = "47.16 * (0.01875 * SafezoneH)"; - y = "12.4 * (0.025 * SafezoneH)"; - w = "3 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class BorderLineAltBottom: RscPicture - { - idc = 1206; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; - x = "47.16 * (0.01875 * SafezoneH)"; - y = "26.5 * (0.025 * SafezoneH)"; - w = "3 * (0.01875 * SafezoneH)"; - h = "1 * (0.025 * SafezoneH)"; - }; - class TextSpd: TextGrid - { - idc = 1004; - text = "SPD"; - x = "4.8 * (0.01875 * SafezoneH)"; - y = "11.8 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class SpeedValueBorder: RscPicture - { - idc = 1200; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\altimeter_value_ca.paa"; - x = "6.3 * (0.01875 * SafezoneH)"; - y = "19 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "2 * (0.025 * SafezoneH)"; - }; - class CA_Speed: TextGrid - { - idc = 190; - sizeEx = "0.03*SafezoneH"; - text = "120"; - x = "7.5 * (0.01875 * SafezoneH)"; - y = "19.5 * (0.025 * SafezoneH)"; - w = "6 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class AnalogueSpeed: RscLadderPicture - { - idc = 384; - topValue = 1312; - bottomValue = -345; - visibleRange = -1; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\UAVspeedLadder_ca.paa"; - x = "1.5 * (0.01875 * SafezoneH)"; - y = "13 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "14 * (0.025 * SafezoneH)"; - }; - class TextAlt: TextGrid - { - idc = 1006; - text = "ALT"; - x = "46.9 * (0.01875 * SafezoneH)"; - y = "11.8 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class AltValueBorder: RscPicture - { - idc = 1201; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\airspeed_value_ca.paa"; - x = "42.25 * (0.01875 * SafezoneH)"; - y = "19 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "2 * (0.025 * SafezoneH)"; - }; - class CA_Alt: TextGrid - { - idc = 191; - sizeEx = "0.03*SafezoneH"; - style = 1; - text = "3825"; - x = "43 * (0.01875 * SafezoneH)"; - y = "19.5 * (0.025 * SafezoneH)"; - w = "3.2 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; - }; - class AnalogueAlt: RscLadderPicture - { - idc = 385; - topValue = 14430; - bottomValue = -2110; - visibleRange = -1; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\UAValtLadder_ca.paa"; - x = "47 * (0.01875 * SafezoneH)"; - y = "13 * (0.025 * SafezoneH)"; - w = "2.5 * (0.01875 * SafezoneH)"; - h = "14 * (0.025 * SafezoneH)"; - }; - class AnalogueHorizon: RscLadderPicture - { - idc = 383; - topValue = 90; - bottomValue = -90; - visibleRange = -1; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\horizon_ladder_ca.paa"; - x = "16.75 * (0.01875 * SafezoneH)"; - y = "5 * (0.025 * SafezoneH)"; - w = "20 * (0.01875 * SafezoneH)"; - h = "30 * (0.025 * SafezoneH)"; - }; - class HorizonCenter: RscPicture - { - idc = 1202; - text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\horizon_aircraft_ca.paa"; - x = "24.75 * (0.01875 * SafezoneH)"; - y = "19 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "2 * (0.025 * SafezoneH)"; - }; - }; - }; - }; + class RscUnitInfo; + class Rsc_ACE_Helo_UI_Turret: RscUnitInfo + { + idd = 300; + controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"}; + class VScrollbar; + class HScrollbar; + class CA_IGUI_elements_group: RscControlsGroup + { + idc = 170; + class VScrollbar: VScrollbar + { + width = 0; + }; + class HScrollbar: HScrollbar + { + height = 0; + }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class controls + { + class CA_Distance: RscText + { + idc = 151; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + x = "24.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Speed: RangeText + { + idc = 188; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "120"; + x = "14.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Alt: RangeText + { + idc = 189; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "3825"; + x = "34.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_VisionMode: RscText + { + idc = 152; + style = 0; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "VIS"; + x = "12.58 * (0.01875 * SafezoneH)"; + y = "8 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_FlirMode: RscText + { + idc = 153; + style = 0; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "BHOT"; + x = "15.78 * (0.01875 * SafezoneH)"; + y = "8 * (0.025 * SafezoneH)"; + w = "4.5 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class ValueGrid: RangeText + { + idc = 172; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "12.20 * (0.01875 * SafezoneH)"; + y = "3.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TextTADS: RangeText + { + idc = 1010; + text = "TADS"; + font = "EtelkaMonospacePro"; + style = 2; + shadow = 0; + x = "12.30 * (0.01875 * SafezoneH)"; + y = "5 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class ValueTime: RangeText + { + idc = 190; + text = "20:28:35"; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "12.1 * (0.01875 * SafezoneH)"; + y = "6.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class CA_Laser: RscText + { + idc = 158; + style = "0x30 + 0x800"; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = PATHTOF(data\Helo_LaserON.paa); + x = "20.45 * (0.01875 * SafezoneH)"; + y = "14.1 * (0.025 * SafezoneH)"; + w = "12.5 * (0.01875 * SafezoneH)"; + h = "12 * (0.025 * SafezoneH)"; + }; + class CA_Heading: RscText + { + idc = 156; + style = 0; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "023"; + x = "24.83 * (0.01875 * SafezoneH)"; + y = "6 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + }; + }; + }; + class Rsc_ACE_Helo_UI_01: RscUnitInfo + { + controls[] = {"WeaponInfoControlsGroupRight","CA_TextFlaresMode","CA_TextFlares","CA_VehicleToggles","CA_Radar"}; + }; + class Rsc_ACE_Helo_UI_02: RscUnitInfo + { + controls[] = {"CA_TextFlaresMode","CA_TextFlares","CA_VehicleToggles","CA_Radar"}; + }; + class Rsc_ACE_Drones_UI_Turret: RscUnitInfo + { + idd = 300; + controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"}; + class CA_IGUI_elements_group: RscControlsGroup + { + idc = 170; + class VScrollbar: VScrollbar + { + width = 0; + }; + class HScrollbar: HScrollbar + { + height = 0; + }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class controls + { + class CA_Distance: RscText + { + idc = 151; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + x = "24.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Speed: RangeText + { + idc = 188; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "120"; + x = "14.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Alt: RangeText + { + idc = 189; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "3825"; + x = "34.78 * (0.01875 * SafezoneH)"; + y = "30.88 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class ValueTime: RangeText + { + idc = 190; + text = "20:28:35"; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "1.75 * (0.01875 * SafezoneH)"; + y = "10.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class CA_VisionMode: RscText + { + idc = 152; + style = 0; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "VIS"; + align = "right"; + x = "2.6 * (0.01875 * SafezoneH)"; + y = "12.0 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.0 * (0.025 * SafezoneH)"; + }; + class CA_FlirMode: RscText + { + idc = 153; + style = 0; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "BHOT"; + align = "right"; + x = "6.18 * (0.01875 * SafezoneH)"; + y = "12.0 * (0.025 * SafezoneH)"; + w = "4.5 * (0.01875 * SafezoneH)"; + h = "1.0 * (0.025 * SafezoneH)"; + }; + class TgT_Grid_text: RangeText + { + idc = 1005; + text = "TGT:"; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "1.20 * (0.01875 * SafezoneH)"; + y = "13.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TGT_ValueGrid: RangeText + { + idc = 172; + font = "EtelkaMonospacePro"; + colorText[] = {0.706,0.0745,0.0196,0.8}; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "5.20 * (0.01875 * SafezoneH)"; + y = "13.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class OWN_Grid_text: RangeText + { + idc = 1005; + text = "OWN:"; + font = "EtelkaMonospacePro"; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "1.20 * (0.01875 * SafezoneH)"; + y = "15 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class OWN_ValueGrid: RangeText + { + idc = 171; + font = "EtelkaMonospacePro"; + colorText[] = {0.15,1,0.15,0.8}; + style = 2; + sizeEx = "0.0295*SafezoneH"; + shadow = 0; + x = "5.20 * (0.01875 * SafezoneH)"; + y = "15 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class CA_Laser: RscText + { + idc = 158; + style = "0x30 + 0x800"; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + align = "right"; + font = "EtelkaMonospacePro"; + text = PATHTOF(data\Helo_LaserON.paa); + x = "20.45 * (0.01875 * SafezoneH)"; + y = "14.1 * (0.025 * SafezoneH)"; + w = "12.5 * (0.01875 * SafezoneH)"; + h = "12 * (0.025 * SafezoneH)"; + }; + class CA_Heading: RscText + { + idc = 156; + style = 0; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "023"; + align = "right"; + x = "25 * (0.01875 * SafezoneH)"; + y = "5 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + }; + }; + }; + class Rsc_ACE_Drones_UI_Pilots: RscUnitInfo + { + idd = 300; + controls[] = {"WeaponInfoControlsGroupRight","CA_BackgroundVehicle","CA_BackgroundVehicleTitle","CA_BackgroundVehicleTitleDark","CA_BackgroundFuel","CA_Vehicle","CA_VehicleRole","CA_HitZones","CA_SpeedBackground","CA_SpeedUnits","CA_Speed","CA_ValueFuel","CA_AltBackground","CA_AltUnits","CA_Alt","CA_VehicleToggles","CA_Radar","DriverOpticsGroup"}; + class DriverOpticsGroup: RscControlsGroup + { + idc = 392; + class VScrollbar: VScrollbar + { + width = 0; + }; + class HScrollbar: HScrollbar + { + height = 0; + }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class controls + { + class TextGrid: RscText + { + style = 0; + sizeEx = "0.02*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + idc = 1005; + text = "GRID:"; + x = "5.8 * (0.01875 * SafezoneH)"; + y = "31.8 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class ValueGrid: TextGrid + { + idc = 189; + text = "382546"; + x = "10.3 * (0.01875 * SafezoneH)"; + y = "31.8 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TextTime: TextGrid + { + idc = 1010; + text = "TIME [UTC]:"; + x = "5.8 * (0.01875 * SafezoneH)"; + y = "32.6 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class ValueTime: TextGrid + { + idc = 101; + text = "20:28:35"; + x = "10 * (0.01875 * SafezoneH)"; + y = "32.6 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TextMag: TextGrid + { + idc = 1011; + text = "CAM MAG:"; + x = "5.8 * (0.01875 * SafezoneH)"; + y = "7 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class OpticsZoom: TextGrid + { + idc = 192; + text = "28x"; + x = "10.3 * (0.01875 * SafezoneH)"; + y = "7 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class BorderLineSpdTop: RscPicture + { + idc = 1203; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; + x = "3.343 * (0.01875 * SafezoneH)"; + y = "12.4 * (0.025 * SafezoneH)"; + w = "3 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class BorderLineSpdBottom: RscPicture + { + idc = 1207; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; + x = "3.343 * (0.01875 * SafezoneH)"; + y = "26.5 * (0.025 * SafezoneH)"; + w = "3 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class BorderLineAltTop: RscPicture + { + idc = 1205; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; + x = "47.16 * (0.01875 * SafezoneH)"; + y = "12.4 * (0.025 * SafezoneH)"; + w = "3 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class BorderLineAltBottom: RscPicture + { + idc = 1206; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\border_line_ca.paa"; + x = "47.16 * (0.01875 * SafezoneH)"; + y = "26.5 * (0.025 * SafezoneH)"; + w = "3 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class TextSpd: TextGrid + { + idc = 1004; + text = "SPD"; + x = "4.8 * (0.01875 * SafezoneH)"; + y = "11.8 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class SpeedValueBorder: RscPicture + { + idc = 1200; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\altimeter_value_ca.paa"; + x = "6.3 * (0.01875 * SafezoneH)"; + y = "19 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "2 * (0.025 * SafezoneH)"; + }; + class CA_Speed: TextGrid + { + idc = 190; + sizeEx = "0.03*SafezoneH"; + text = "120"; + x = "7.5 * (0.01875 * SafezoneH)"; + y = "19.5 * (0.025 * SafezoneH)"; + w = "6 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class AnalogueSpeed: RscLadderPicture + { + idc = 384; + topValue = 1312; + bottomValue = -345; + visibleRange = -1; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\UAVspeedLadder_ca.paa"; + x = "1.5 * (0.01875 * SafezoneH)"; + y = "13 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "14 * (0.025 * SafezoneH)"; + }; + class TextAlt: TextGrid + { + idc = 1006; + text = "ALT"; + x = "46.9 * (0.01875 * SafezoneH)"; + y = "11.8 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class AltValueBorder: RscPicture + { + idc = 1201; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\airspeed_value_ca.paa"; + x = "42.25 * (0.01875 * SafezoneH)"; + y = "19 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "2 * (0.025 * SafezoneH)"; + }; + class CA_Alt: TextGrid + { + idc = 191; + sizeEx = "0.03*SafezoneH"; + style = 1; + text = "3825"; + x = "43 * (0.01875 * SafezoneH)"; + y = "19.5 * (0.025 * SafezoneH)"; + w = "3.2 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class AnalogueAlt: RscLadderPicture + { + idc = 385; + topValue = 14430; + bottomValue = -2110; + visibleRange = -1; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\UAValtLadder_ca.paa"; + x = "47 * (0.01875 * SafezoneH)"; + y = "13 * (0.025 * SafezoneH)"; + w = "2.5 * (0.01875 * SafezoneH)"; + h = "14 * (0.025 * SafezoneH)"; + }; + class AnalogueHorizon: RscLadderPicture + { + idc = 383; + topValue = 90; + bottomValue = -90; + visibleRange = -1; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\horizon_ladder_ca.paa"; + x = "16.75 * (0.01875 * SafezoneH)"; + y = "5 * (0.025 * SafezoneH)"; + w = "20 * (0.01875 * SafezoneH)"; + h = "30 * (0.025 * SafezoneH)"; + }; + class HorizonCenter: RscPicture + { + idc = 1202; + text = "\A3\Ui_f\data\IGUI\Cfg\HelicopterHUD\horizon_aircraft_ca.paa"; + x = "24.75 * (0.01875 * SafezoneH)"; + y = "19 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "2 * (0.025 * SafezoneH)"; + }; + }; + }; + }; }; \ No newline at end of file diff --git a/addons/wep_javelin/CfgEventhandlers.hpp b/addons/wep_javelin/CfgEventhandlers.hpp index 70e16353cd..8ed96c366f 100644 --- a/addons/wep_javelin/CfgEventhandlers.hpp +++ b/addons/wep_javelin/CfgEventhandlers.hpp @@ -1,17 +1,17 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_pre_init)); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_pre_init)); + }; }; class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_post_init)); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_post_init)); + }; }; class Extended_FiredBIS_EventHandlers { - class CAManBase { - ADDON = QUOTE(_this call FUNC(fired)); - }; + class CAManBase { + ADDON = QUOTE(_this call FUNC(fired)); + }; }; \ No newline at end of file diff --git a/addons/wep_javelin/CfgOptics.hpp b/addons/wep_javelin/CfgOptics.hpp index 53f36710fb..72d49ac528 100644 --- a/addons/wep_javelin/CfgOptics.hpp +++ b/addons/wep_javelin/CfgOptics.hpp @@ -5,46 +5,193 @@ class RscMapControl; // Taken from AGM for optics management. class RscInGameUI { - class RscOptics_titan { - - class CA_javelin_elements_group: RscControlsGroup { - class Controls { - class CA_Javelin_Day_mode_off: RscPicture {}; - class CA_Javelin_SEEK_off: CA_Javelin_Day_mode_off { - idc = 1005; - }; - // From AGM - class GetLockedTarget: RscMapControl { - onDraw = QUOTE(_this call FUNC(onGetLockedTarget)); - idc = -1; - w = 0; - h = 0; - }; - }; - }; - }; + class RscOptics_titan { + idd = 300; + controls[] = {"CA_javelin_elements_group"}; + class CA_javelin_elements_group: RscControlsGroup + { + x = "SafezoneX"; + y = "SafezoneY"; + w = "SafezoneW"; + h = "SafezoneH"; + idc = 170; + class VScrollbar: VScrollbar + { + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + color[] = {1,1,1,0}; + width = 0.001; + }; + class HScrollbar: HScrollbar + { + color[] = {1,1,1,0}; + height = 0.001; + }; + class Controls + { + class GetLockedTarget: RscMapControl { + onDraw = QUOTE(_this call FUNC(onGetLockedTarget)); + idc = -1; + w = 0; + h = 0; + }; + + class CA_Javelin_Day_mode_off: RscPicture { + idc = 1001; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.03/4)*3*SafezoneH - SafezoneX"; + y = "SafezoneY+SafezoneH*0.031 - SafezoneY"; + w = "0.1045752* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; + h = "SafezoneH*0.1045752"; + colorText[] = {0.2941,0.2941,0.2941,1.0}; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\day_co.paa"; + }; + + class CA_Javelin_Day_mode: CA_Javelin_Day_mode_off { + idc = 160; + colorText[] = {0.2941,0.8745,0.2157,1.0}; + }; + class CA_Javelin_WFOV_mode_off: CA_Javelin_Day_mode_off { + idc = 1004; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\wfov_co.paa"; + }; + + class CA_Javelin_WFOV_mode_group: RscControlsGroup { + x = "SafezoneX"; + y = "SafezoneY"; + w = "SafezoneW"; + h = "SafezoneH"; + idc = 163; + class VScrollbar: VScrollbar { + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + color[] = {1,1,1,0}; + width = 0.001; + }; + class HScrollbar: HScrollbar { + color[] = {1,1,1,0}; + height = 0.001; + }; + class Controls { + class CA_Javelin_WFOV_mode: CA_Javelin_WFOV_mode_off { + idc = -1; + y = "0.031*SafeZoneH - SafezoneY"; + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; + colorText[] = {0.2941,0.8745,0.2157,1.0}; + }; + }; + }; + class CA_Javelin_NFOV_mode_off: CA_Javelin_Day_mode_off { + idc = 1003; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\nfov_co.paa"; + }; + class CA_Javelin_NFOV_mode_group: RscControlsGroup { + x = "SafezoneX"; + y = "SafezoneY"; + w = "SafezoneW-SafezoneX"; + h = "SafezoneH-SafezoneY"; + idc = 162; + class VScrollbar: VScrollbar + { + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + color[] = {1,1,1,0}; + width = 0.001; + }; + class HScrollbar: HScrollbar { + color[] = {1,1,1,0}; + height = 0.001; + }; + class Controls { + class CA_Javelin_NFOV_mode: CA_Javelin_NFOV_mode_off { + idc = -1; + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; + y = "0.031*SafeZoneH - SafezoneY"; + colorText[] = {0.2941,0.8745,0.2157,1.0}; + }; + }; + }; + class CA_Javelin_SEEK_off: CA_Javelin_Day_mode_off { + idc = 1005; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.863/4)*3*SafezoneH - SafezoneX"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\seek_co.paa"; + }; + class CA_Javelin_SEEK: CA_Javelin_SEEK_off { + idc = 166; + colorText[] = {0.2941,0.8745,0.2157,1.0}; + }; + class CA_Javelin_Missle_off: CA_Javelin_Day_mode_off { + idc = 1032; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (-0.134/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; + colorText[] = {0.2941,0.2941,0.2941,1.0}; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\missle_co.paa"; + }; + class CA_Javelin_Missle: CA_Javelin_Missle_off { + idc = 167; + colorText[] = {0.9255,0.5216,0.1216,1.0}; + }; + class CA_Javelin_CLU_off: CA_Javelin_Missle_off { + idc = 1027; + y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\clu_co.paa"; + }; + class CA_Javelin_HangFire_off: CA_Javelin_Missle_off { + idc = 1028; + y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\hangfire_co.paa"; + }; + class CA_Javelin_TOP_off: CA_Javelin_Day_mode_off { + idc = 1006; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\top_co.paa"; + }; + class CA_Javelin_DIR: CA_Javelin_Day_mode { + idc = 1007; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\dir_co.paa"; + }; + class CA_Javelin_FLTR_mode_off: CA_Javelin_Day_mode_off { + idc = 1002; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\fltr_co.paa"; + }; + class CA_Javelin_FLTR_mode: CA_Javelin_FLTR_mode_off { + idc = 161; + colorText[] = {0.2941,0.8745,0.2157,1.0}; + }; + }; + }; + }; }; -// on colorText[] = {0.2941, 0.8745, 0.2157, 1.0}; -// off colorText[] = {0.2941, 0.2941, 0.2941, 1.0}; -// orange colorText[] = {0.9255, 0.5216, 0.1216, 1.0}; +// on colorText[] = {0.2941, 0.8745, 0.2157, 1.0}; +// off colorText[] = {0.2941, 0.2941, 0.2941, 1.0}; +// orange colorText[] = {0.9255, 0.5216, 0.1216, 1.0}; /* -CA_javelin_elements_group: 170 -CA_Javelin_Day_mode_off: 1001 -CA_Javelin_Day_mode: 160 -CA_Javelin_WFOV_mode_off: 1004 +CA_javelin_elements_group: 170 +CA_Javelin_Day_mode_off: 1001 +CA_Javelin_Day_mode: 160 +CA_Javelin_WFOV_mode_off: 1004 CA_Javelin_WFOV_mode_group: 163 -CA_Javelin_NFOV_mode_off: 1003 +CA_Javelin_NFOV_mode_off: 1003 CA_Javelin_NFOV_mode_group: 162 -CA_Javelin_SEEK_off: 1005 //1001 -CA_Javelin_SEEK: 166 -CA_Javelin_Missle_off: 1032 -CA_Javelin_Missle: 167 -CA_Javelin_CLU_off: 1027 -CA_Javelin_HangFire_off: 1028 -CA_Javelin_TOP_off: 1006 -CA_Javelin_DIR: 1007 -CA_Javelin_FLTR_mode_off: 1002 -CA_Javelin_FLTR_mode: 161 +CA_Javelin_SEEK_off: 1005 //1001 +CA_Javelin_SEEK: 166 +CA_Javelin_Missle_off: 1032 +CA_Javelin_Missle: 167 +CA_Javelin_CLU_off: 1027 +CA_Javelin_HangFire_off: 1028 +CA_Javelin_TOP_off: 1006 +CA_Javelin_DIR: 1007 +CA_Javelin_FLTR_mode_off: 1002 +CA_Javelin_FLTR_mode: 161 */ \ No newline at end of file diff --git a/addons/wep_javelin/data/sound/javelin_locked.ogg b/addons/wep_javelin/data/sound/javelin_locked.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5002405b1a778702ba9b1287ca5eed577677b4d2 GIT binary patch literal 5108 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 O9CM`qec)o9&OZR%u#%Gi literal 0 HcmV?d00001 diff --git a/addons/wep_javelin/data/sound/javelin_locking.ogg b/addons/wep_javelin/data/sound/javelin_locking.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dca0ca73b23f8ad051dac07edd056d7a04adb91c GIT binary patch literal 4778 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 literal 0 HcmV?d00001 diff --git a/addons/wep_javelin/script_component.hpp b/addons/wep_javelin/script_component.hpp index 3c21d429f2..757b3b012c 100644 --- a/addons/wep_javelin/script_component.hpp +++ b/addons/wep_javelin/script_component.hpp @@ -2,11 +2,11 @@ #include "\z\ace\Addons\main\script_mod.hpp" #ifdef DEBUG_ENABLED_WEP_JAVELIN - #define DEBUG_MODE_FULL + #define DEBUG_MODE_FULL #endif #ifdef DEBUG_SETTINGS_WEP_JAVELIN - #define DEBUG_SETTINGS DEBUG_SETTINGS_WEP_JAVELIN + #define DEBUG_SETTINGS DEBUG_SETTINGS_WEP_JAVELIN #endif #include "\z\ace\Addons\main\script_macros.hpp" From 8710bee3b8a42935b57608a14bd3eeedb3154a00 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 20:27:52 -0700 Subject: [PATCH 21/43] Titan Work. --- addons/wep_javelin/CfgOptics.hpp | 77 +++++++++++----------- addons/wep_javelin/CfgSounds.hpp | 11 ++++ addons/wep_javelin/config.cpp | 3 +- addons/wep_javelin/functions/fnc_fired.sqf | 60 +++++++---------- 4 files changed, 78 insertions(+), 73 deletions(-) create mode 100644 addons/wep_javelin/CfgSounds.hpp diff --git a/addons/wep_javelin/CfgOptics.hpp b/addons/wep_javelin/CfgOptics.hpp index 72d49ac528..0622ce264f 100644 --- a/addons/wep_javelin/CfgOptics.hpp +++ b/addons/wep_javelin/CfgOptics.hpp @@ -1,14 +1,17 @@ class RscControlsGroup; class RscPicture; class RscMapControl; +class VScrollbar; +class HScrollbar; + // Taken from AGM for optics management. class RscInGameUI { class RscOptics_titan { idd = 300; - controls[] = {"CA_javelin_elements_group"}; - class CA_javelin_elements_group: RscControlsGroup + controls[] = {"ACE_Titan_elements_group"}; + class ACE_Titan_elements_group: RscControlsGroup { x = "SafezoneX"; y = "SafezoneY"; @@ -37,7 +40,7 @@ class RscInGameUI { h = 0; }; - class CA_Javelin_Day_mode_off: RscPicture { + class ACE_Titan_Day_mode_off: RscPicture { idc = 1001; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.03/4)*3*SafezoneH - SafezoneX"; y = "SafezoneY+SafezoneH*0.031 - SafezoneY"; @@ -47,17 +50,17 @@ class RscInGameUI { text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\day_co.paa"; }; - class CA_Javelin_Day_mode: CA_Javelin_Day_mode_off { + class ACE_Titan_Day_mode: ACE_Titan_Day_mode_off { idc = 160; colorText[] = {0.2941,0.8745,0.2157,1.0}; }; - class CA_Javelin_WFOV_mode_off: CA_Javelin_Day_mode_off { + class ACE_Titan_WFOV_mode_off: ACE_Titan_Day_mode_off { idc = 1004; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\wfov_co.paa"; }; - class CA_Javelin_WFOV_mode_group: RscControlsGroup { + class ACE_Titan_WFOV_mode_group: RscControlsGroup { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW"; @@ -75,7 +78,7 @@ class RscInGameUI { height = 0.001; }; class Controls { - class CA_Javelin_WFOV_mode: CA_Javelin_WFOV_mode_off { + class ACE_Titan_WFOV_mode: ACE_Titan_WFOV_mode_off { idc = -1; y = "0.031*SafeZoneH - SafezoneY"; x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; @@ -83,12 +86,12 @@ class RscInGameUI { }; }; }; - class CA_Javelin_NFOV_mode_off: CA_Javelin_Day_mode_off { + class ACE_Titan_NFOV_mode_off: ACE_Titan_Day_mode_off { idc = 1003; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\nfov_co.paa"; }; - class CA_Javelin_NFOV_mode_group: RscControlsGroup { + class ACE_Titan_NFOV_mode_group: RscControlsGroup { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW-SafezoneX"; @@ -107,7 +110,7 @@ class RscInGameUI { height = 0.001; }; class Controls { - class CA_Javelin_NFOV_mode: CA_Javelin_NFOV_mode_off { + class ACE_Titan_NFOV_mode: ACE_Titan_NFOV_mode_off { idc = -1; x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; y = "0.031*SafeZoneH - SafezoneY"; @@ -115,55 +118,55 @@ class RscInGameUI { }; }; }; - class CA_Javelin_SEEK_off: CA_Javelin_Day_mode_off { + class ACE_Titan_SEEK_off: ACE_Titan_Day_mode_off { idc = 1005; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.863/4)*3*SafezoneH - SafezoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\seek_co.paa"; }; - class CA_Javelin_SEEK: CA_Javelin_SEEK_off { + class ACE_Titan_SEEK: ACE_Titan_SEEK_off { idc = 166; colorText[] = {0.2941,0.8745,0.2157,1.0}; }; - class CA_Javelin_Missle_off: CA_Javelin_Day_mode_off { + class ACE_Titan_Missle_off: ACE_Titan_Day_mode_off { idc = 1032; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (-0.134/4)*3*SafezoneH - SafezoneX"; y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; colorText[] = {0.2941,0.2941,0.2941,1.0}; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\missle_co.paa"; }; - class CA_Javelin_Missle: CA_Javelin_Missle_off { + class ACE_Titan_Missle: ACE_Titan_Missle_off { idc = 167; colorText[] = {0.9255,0.5216,0.1216,1.0}; }; - class CA_Javelin_CLU_off: CA_Javelin_Missle_off { + class ACE_Titan_CLU_off: ACE_Titan_Missle_off { idc = 1027; y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\clu_co.paa"; }; - class CA_Javelin_HangFire_off: CA_Javelin_Missle_off { + class ACE_Titan_HangFire_off: ACE_Titan_Missle_off { idc = 1028; y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\hangfire_co.paa"; }; - class CA_Javelin_TOP_off: CA_Javelin_Day_mode_off { + class ACE_Titan_TOP_off: ACE_Titan_Day_mode_off { idc = 1006; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\top_co.paa"; }; - class CA_Javelin_DIR: CA_Javelin_Day_mode { + class ACE_Titan_DIR: ACE_Titan_Day_mode { idc = 1007; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\dir_co.paa"; }; - class CA_Javelin_FLTR_mode_off: CA_Javelin_Day_mode_off { + class ACE_Titan_FLTR_mode_off: ACE_Titan_Day_mode_off { idc = 1002; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\fltr_co.paa"; }; - class CA_Javelin_FLTR_mode: CA_Javelin_FLTR_mode_off { + class ACE_Titan_FLTR_mode: ACE_Titan_FLTR_mode_off { idc = 161; colorText[] = {0.2941,0.8745,0.2157,1.0}; }; @@ -177,21 +180,21 @@ class RscInGameUI { // orange colorText[] = {0.9255, 0.5216, 0.1216, 1.0}; /* -CA_javelin_elements_group: 170 -CA_Javelin_Day_mode_off: 1001 -CA_Javelin_Day_mode: 160 -CA_Javelin_WFOV_mode_off: 1004 -CA_Javelin_WFOV_mode_group: 163 -CA_Javelin_NFOV_mode_off: 1003 -CA_Javelin_NFOV_mode_group: 162 -CA_Javelin_SEEK_off: 1005 //1001 -CA_Javelin_SEEK: 166 -CA_Javelin_Missle_off: 1032 -CA_Javelin_Missle: 167 -CA_Javelin_CLU_off: 1027 -CA_Javelin_HangFire_off: 1028 -CA_Javelin_TOP_off: 1006 -CA_Javelin_DIR: 1007 -CA_Javelin_FLTR_mode_off: 1002 -CA_Javelin_FLTR_mode: 161 +ACE_Titan_elements_group: 170 +ACE_Titan_Day_mode_off: 1001 +ACE_Titan_Day_mode: 160 +ACE_Titan_WFOV_mode_off: 1004 +ACE_Titan_WFOV_mode_group: 163 +ACE_Titan_NFOV_mode_off: 1003 +ACE_Titan_NFOV_mode_group: 162 +ACE_Titan_SEEK_off: 1005 //1001 +ACE_Titan_SEEK: 166 +ACE_Titan_Missle_off: 1032 +ACE_Titan_Missle: 167 +ACE_Titan_CLU_off: 1027 +ACE_Titan_HangFire_off: 1028 +ACE_Titan_TOP_off: 1006 +ACE_Titan_DIR: 1007 +ACE_Titan_FLTR_mode_off: 1002 +ACE_Titan_FLTR_mode: 161 */ \ No newline at end of file diff --git a/addons/wep_javelin/CfgSounds.hpp b/addons/wep_javelin/CfgSounds.hpp new file mode 100644 index 0000000000..6c87219f78 --- /dev/null +++ b/addons/wep_javelin/CfgSounds.hpp @@ -0,0 +1,11 @@ + +class CfgSounds { + class ACE_Javelin_Locking { + sound[] = {PATHTOF(data\sounds\javelin_locking.ogg), 1, 1, 200}; + titles[] = {}; + }; + class ACE_Javelin_Locked { + sound[] = {PATHTOF(data\sounds\javelin_locked.ogg), 1, 1, 200}; + titles[] = {}; + }; +}; diff --git a/addons/wep_javelin/config.cpp b/addons/wep_javelin/config.cpp index 0c8fae6154..3c38d9263f 100644 --- a/addons/wep_javelin/config.cpp +++ b/addons/wep_javelin/config.cpp @@ -11,4 +11,5 @@ class CfgPatches { }; #include "CfgEventhandlers.hpp" -#include "CfgOptics.hpp" \ No newline at end of file +#include "CfgOptics.hpp" +#include "CfgSounds.hpp" \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_fired.sqf b/addons/wep_javelin/functions/fnc_fired.sqf index d576975c96..ee5d53c6e8 100644 --- a/addons/wep_javelin/functions/fnc_fired.sqf +++ b/addons/wep_javelin/functions/fnc_fired.sqf @@ -1,49 +1,39 @@ -//#define DEBUG_MODE_FULL +#define DEBUG_MODE_FULL #include "script_component.hpp" //_this=[TEST_AI_HELICOPTER,"missiles_DAGR","missiles_DAGR","Far_AI","M_PG_AT","24Rnd_PG_missiles",163988: rocket_01_fly_f.p3d] -TRACE_1("enter", _this); +TRACE_1("Launch", _this); PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); FUNC(guidance_Javelin_LOBL_HI_PFH) = { TRACE_1("enter", _this); - private["_pitch", "_yaw", "_wentTerminal", "_target", "_targetPos", "_curVelocity", "_missile" ]; + private["_pitch", "_yaw", "_wentTerminal", "_target", "_targetPos", "_curVelocity", "_missile", "_launchPos", "_targetStartPos" ]; _args = _this select 0; //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); _shooter = _args select 0; _missile = _args select 6; - if((count _this) > 2) then { - _wentTerminal = _this select 2; + if((count _args) > 7) then { + _saveArgs = _args select 7; + _target = _saveArgs select 0; + _targetStartPos = _saveArgs select 1; + _launchPos = _saveArgs select 2; + _wentTerminal = _saveArgs select 3; } else { - _this set[2, false]; - _wentTerminal = false; - }; - - if((count _this) > 3) then { - _targets = _this select 3; - _target = _targets select 0; - _targetPos = _targets select 1; - } else { - _this set[3, [GVAR(currentTarget),GVAR(currentTargetPos)] ]; + _wentTerminal = false; + _launchPos = getPosASL _shooter; _target = GVAR(currentTarget); - _targetPos = GVAR(currentTargetPos); + _targetStartPos = GVAR(currentTargetPos); }; + _targetPos = getPosASL _target; _curVelocity = velocity _missile; + TRACE_4("", _target, _targetPos, _launchPos, _targetStartPos); + if(!alive _missile || isNull _missile) exitWith { [(_this select 1)] call cba_fnc_removePerFrameHandler; }; - - - _launchPos = _shooter getVariable [QGVAR(launchPos), nil]; - if(isNil "_launchPos") then { - TRACE_1("Setting launch parameters", ""); - _launchPos = getPosASL _shooter; - _shooter setVariable [QGVAR(launchPos), _launchPos, false]; - _shooter setVariable [QGVAR(launchTime), diag_tickTime, false]; - }; - + _addHeight = [0,0,0]; if(!isNil "_target") then { @@ -58,10 +48,10 @@ FUNC(guidance_Javelin_LOBL_HI_PFH) = { if((count _targetPos) > 0) then { _distanceToTarget = [(_missilePos select 0), (_missilePos select 1), (_targetPos select 2)] vectorDistance _targetPos; - _defPitch = 0.25; - if( (_missilePos select 2) < (_targetPos select 2) + 160 && !_wentTerminal) then { - _addHeight = [0,0,(_targetPos select 2) + ( (_distanceToTarget * 2) + 160)]; + + if( (_missilePos select 2) < (_targetPos select 2) + 200 && !_wentTerminal) then { + _addHeight = [0,0,(_targetPos select 2) + ( (_distanceToTarget * 2) + 200)]; TRACE_1("Climb phase", _addHeight); } else { _wentTerminal = true; @@ -70,7 +60,8 @@ FUNC(guidance_Javelin_LOBL_HI_PFH) = { }; _targetPos = _targetPos vectorAdd _addHeight; - _defYaw = 0.0035; + _defPitch = 0.25; + _defYaw = 0.035; _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); _yaw = 0.0; @@ -104,11 +95,6 @@ FUNC(guidance_Javelin_LOBL_HI_PFH) = { drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _missilePos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _missilePos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; MARKERCOUNT = MARKERCOUNT + 1; #endif @@ -127,6 +113,10 @@ FUNC(guidance_Javelin_LOBL_HI_PFH) = { #endif }; }; + + _saveArgs = [_target,_targetStartPos, _launchPos, _wentTerminal]; + _args set[7, _saveArgs ]; + _this set[0, _args]; }; FUNC(guidance_Javelin_LOBL_HI) = { From 2e6a9c496744d9cca620d870948db462b48ae6bd Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 3 Apr 2015 21:07:04 -0700 Subject: [PATCH 22/43] Placeholder sounds for jav/titan locking. accurate fire tweaks --- addons/wep_javelin/CfgSounds.hpp | 10 ++++++---- .../data/{sound => sounds}/javelin_locked.ogg | Bin .../{sound => sounds}/javelin_locking.ogg | Bin .../functions/fnc_onGetLockedTarget.sqf | 18 +++++++++++++++++- 4 files changed, 23 insertions(+), 5 deletions(-) rename addons/wep_javelin/data/{sound => sounds}/javelin_locked.ogg (100%) rename addons/wep_javelin/data/{sound => sounds}/javelin_locking.ogg (100%) diff --git a/addons/wep_javelin/CfgSounds.hpp b/addons/wep_javelin/CfgSounds.hpp index 6c87219f78..0af40b9485 100644 --- a/addons/wep_javelin/CfgSounds.hpp +++ b/addons/wep_javelin/CfgSounds.hpp @@ -1,11 +1,13 @@ class CfgSounds { class ACE_Javelin_Locking { - sound[] = {PATHTOF(data\sounds\javelin_locking.ogg), 1, 1, 200}; - titles[] = {}; + name = "ACE_Javelin_Locking"; + sound[] = {PATHTOF(data\sounds\javelin_locking.ogg), db+0, 1.0}; + titles[] = {}; }; class ACE_Javelin_Locked { - sound[] = {PATHTOF(data\sounds\javelin_locked.ogg), 1, 1, 200}; - titles[] = {}; + name = "ACE_Javelin_Locked"; + sound[] = {PATHTOF(data\sounds\javelin_locked.ogg), db+0, 1.0}; + titles[] = {}; }; }; diff --git a/addons/wep_javelin/data/sound/javelin_locked.ogg b/addons/wep_javelin/data/sounds/javelin_locked.ogg similarity index 100% rename from addons/wep_javelin/data/sound/javelin_locked.ogg rename to addons/wep_javelin/data/sounds/javelin_locked.ogg diff --git a/addons/wep_javelin/data/sound/javelin_locking.ogg b/addons/wep_javelin/data/sounds/javelin_locking.ogg similarity index 100% rename from addons/wep_javelin/data/sound/javelin_locking.ogg rename to addons/wep_javelin/data/sounds/javelin_locking.ogg diff --git a/addons/wep_javelin/functions/fnc_onGetLockedTarget.sqf b/addons/wep_javelin/functions/fnc_onGetLockedTarget.sqf index 3cc5d685c2..e96520e7f7 100644 --- a/addons/wep_javelin/functions/fnc_onGetLockedTarget.sqf +++ b/addons/wep_javelin/functions/fnc_onGetLockedTarget.sqf @@ -5,4 +5,20 @@ GVAR(currentTarget) = cursorTarget; GVAR(currentTargetPos) = screenToWorld [0.5,0.5]; -TRACE_2("Tracking optics target draw", GVAR(currentTarget), GVAR(currentTargetPos)); \ No newline at end of file +TRACE_2("Tracking optics target draw", GVAR(currentTarget), GVAR(currentTargetPos)); + +if(isNil QGVAR(nextSoundPlay)) then { + GVAR(nextSoundPlay) = diag_tickTime + 0.25; +}; + +hint format["T: %1", GVAR(currentTarget)]; + +if(diag_tickTime > GVAR(nextSoundPlay) ) then { + GVAR(nextSoundPlay) = diag_tickTime + 0.25; + + if(!isNull GVAR(currentTarget)) then { + playSound "ACE_Javelin_Locked"; + } else { + playSound "ACE_Javelin_Locking"; + }; +}; From 9d06d7c7caaf381bf30fbe06c13bb51392d38934 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 4 Apr 2015 09:09:42 -0700 Subject: [PATCH 23/43] readme/author updates. --- addons/aircraft/README.md | 1 + addons/aircraft/config.cpp | 2 +- addons/wep_javelin/README.md | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/aircraft/README.md b/addons/aircraft/README.md index b212d311b9..5c3de5c6d4 100644 --- a/addons/aircraft/README.md +++ b/addons/aircraft/README.md @@ -10,3 +10,4 @@ The people responsible for merging changes to this component or answering potent - [KoffeinFlummi](https://github.com/KoffeinFlummi) - [commy2](https://github.com/commy2) +- [jaynus](https://github.com/walterpearce) \ No newline at end of file diff --git a/addons/aircraft/config.cpp b/addons/aircraft/config.cpp index d2b0ed08d7..2ce2d0dc10 100644 --- a/addons/aircraft/config.cpp +++ b/addons/aircraft/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {"KoffeinFlummi","Crusty","commy2"}; + author[] = {"KoffeinFlummi","Crusty","commy2","jaynus","Kimi"}; authorUrl = "https://github.com/KoffeinFlummi/"; VERSION_CONFIG; }; diff --git a/addons/wep_javelin/README.md b/addons/wep_javelin/README.md index 18bd8c6b3f..df3ad9b29d 100644 --- a/addons/wep_javelin/README.md +++ b/addons/wep_javelin/README.md @@ -8,5 +8,5 @@ Adds the Javelin AT launcher. The people responsible for merging changes to this component or answering potential questions. -- [walterpearce](https://github.com/walterpearce) +- [jaynus](https://github.com/walterpearce) - [NouberNou](https://github.com/NouberNou) From aee7eb94069cb00eeef733f1c522316961078ebf Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 4 Apr 2015 16:55:53 -0700 Subject: [PATCH 24/43] Working save. --- addons/fcs/XEH_clientInit.sqf | 2 +- addons/wep_javelin/CfgEventhandlers.hpp | 1 + addons/wep_javelin/CfgOptics.hpp | 200 -------- addons/wep_javelin/RscInGameUI.hpp | 454 ++++++++++++++++++ addons/wep_javelin/XEH_clientInit.sqf | 3 + addons/wep_javelin/XEH_post_init.sqf | 1 - addons/wep_javelin/XEH_pre_init.sqf | 12 +- addons/wep_javelin/config.cpp | 2 +- addons/wep_javelin/data/jav_disp.paa | Bin 0 -> 64455 bytes addons/wep_javelin/data/jav_ring.paa | Bin 0 -> 50028 bytes .../wep_javelin/data/javelin_ui_border_ca.paa | Bin 0 -> 151447 bytes .../functions/fnc_cycleFireMode.sqf | 19 + addons/wep_javelin/functions/fnc_fired.sqf | 77 +-- .../wep_javelin/functions/fnc_lockKeyDown.sqf | 3 + .../wep_javelin/functions/fnc_lockKeyUp.sqf | 3 + .../functions/fnc_onGetLockedTarget.sqf | 24 - .../wep_javelin/functions/fnc_onOpticDraw.sqf | 104 ++++ .../wep_javelin/functions/fnc_onOpticLoad.sqf | 14 + addons/wep_javelin/initKeybinds.sqf | 30 ++ addons/wep_javelin/script_component.hpp | 41 ++ addons/wep_javelin/stringtable.xml | 24 + 21 files changed, 756 insertions(+), 258 deletions(-) delete mode 100644 addons/wep_javelin/CfgOptics.hpp create mode 100644 addons/wep_javelin/RscInGameUI.hpp create mode 100644 addons/wep_javelin/XEH_clientInit.sqf create mode 100644 addons/wep_javelin/data/jav_disp.paa create mode 100644 addons/wep_javelin/data/jav_ring.paa create mode 100644 addons/wep_javelin/data/javelin_ui_border_ca.paa create mode 100644 addons/wep_javelin/functions/fnc_cycleFireMode.sqf create mode 100644 addons/wep_javelin/functions/fnc_lockKeyDown.sqf create mode 100644 addons/wep_javelin/functions/fnc_lockKeyUp.sqf delete mode 100644 addons/wep_javelin/functions/fnc_onGetLockedTarget.sqf create mode 100644 addons/wep_javelin/functions/fnc_onOpticDraw.sqf create mode 100644 addons/wep_javelin/functions/fnc_onOpticLoad.sqf create mode 100644 addons/wep_javelin/initKeybinds.sqf create mode 100644 addons/wep_javelin/stringtable.xml diff --git a/addons/fcs/XEH_clientInit.sqf b/addons/fcs/XEH_clientInit.sqf index 49f04d44e7..094a49faeb 100644 --- a/addons/fcs/XEH_clientInit.sqf +++ b/addons/fcs/XEH_clientInit.sqf @@ -7,4 +7,4 @@ GVAR(position) = [0,0,0]; #include "initKeybinds.sqf" // Register event for global updates -[QGVAR(forceUpdate), FUNC(onForceUpdate)] call ace_common_fnc_addEventHandler \ No newline at end of file +[QGVAR(forceUpdate), FUNC(onForceUpdate)] call ace_common_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/wep_javelin/CfgEventhandlers.hpp b/addons/wep_javelin/CfgEventhandlers.hpp index 8ed96c366f..a61ea9c746 100644 --- a/addons/wep_javelin/CfgEventhandlers.hpp +++ b/addons/wep_javelin/CfgEventhandlers.hpp @@ -7,6 +7,7 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_post_init)); + clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); }; }; diff --git a/addons/wep_javelin/CfgOptics.hpp b/addons/wep_javelin/CfgOptics.hpp deleted file mode 100644 index 0622ce264f..0000000000 --- a/addons/wep_javelin/CfgOptics.hpp +++ /dev/null @@ -1,200 +0,0 @@ -class RscControlsGroup; -class RscPicture; -class RscMapControl; -class VScrollbar; -class HScrollbar; - - -// Taken from AGM for optics management. - -class RscInGameUI { - class RscOptics_titan { - idd = 300; - controls[] = {"ACE_Titan_elements_group"}; - class ACE_Titan_elements_group: RscControlsGroup - { - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW"; - h = "SafezoneH"; - idc = 170; - class VScrollbar: VScrollbar - { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar: HScrollbar - { - color[] = {1,1,1,0}; - height = 0.001; - }; - class Controls - { - class GetLockedTarget: RscMapControl { - onDraw = QUOTE(_this call FUNC(onGetLockedTarget)); - idc = -1; - w = 0; - h = 0; - }; - - class ACE_Titan_Day_mode_off: RscPicture { - idc = 1001; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.03/4)*3*SafezoneH - SafezoneX"; - y = "SafezoneY+SafezoneH*0.031 - SafezoneY"; - w = "0.1045752* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; - h = "SafezoneH*0.1045752"; - colorText[] = {0.2941,0.2941,0.2941,1.0}; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\day_co.paa"; - }; - - class ACE_Titan_Day_mode: ACE_Titan_Day_mode_off { - idc = 160; - colorText[] = {0.2941,0.8745,0.2157,1.0}; - }; - class ACE_Titan_WFOV_mode_off: ACE_Titan_Day_mode_off { - idc = 1004; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\wfov_co.paa"; - }; - - class ACE_Titan_WFOV_mode_group: RscControlsGroup { - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW"; - h = "SafezoneH"; - idc = 163; - class VScrollbar: VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar: HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; - class Controls { - class ACE_Titan_WFOV_mode: ACE_Titan_WFOV_mode_off { - idc = -1; - y = "0.031*SafeZoneH - SafezoneY"; - x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; - colorText[] = {0.2941,0.8745,0.2157,1.0}; - }; - }; - }; - class ACE_Titan_NFOV_mode_off: ACE_Titan_Day_mode_off { - idc = 1003; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\nfov_co.paa"; - }; - class ACE_Titan_NFOV_mode_group: RscControlsGroup { - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW-SafezoneX"; - h = "SafezoneH-SafezoneY"; - idc = 162; - class VScrollbar: VScrollbar - { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar: HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; - class Controls { - class ACE_Titan_NFOV_mode: ACE_Titan_NFOV_mode_off { - idc = -1; - x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; - y = "0.031*SafeZoneH - SafezoneY"; - colorText[] = {0.2941,0.8745,0.2157,1.0}; - }; - }; - }; - class ACE_Titan_SEEK_off: ACE_Titan_Day_mode_off { - idc = 1005; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.863/4)*3*SafezoneH - SafezoneX"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\seek_co.paa"; - }; - class ACE_Titan_SEEK: ACE_Titan_SEEK_off { - idc = 166; - colorText[] = {0.2941,0.8745,0.2157,1.0}; - }; - class ACE_Titan_Missle_off: ACE_Titan_Day_mode_off { - idc = 1032; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (-0.134/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; - colorText[] = {0.2941,0.2941,0.2941,1.0}; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\missle_co.paa"; - }; - class ACE_Titan_Missle: ACE_Titan_Missle_off { - idc = 167; - colorText[] = {0.9255,0.5216,0.1216,1.0}; - }; - class ACE_Titan_CLU_off: ACE_Titan_Missle_off { - idc = 1027; - y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\clu_co.paa"; - }; - class ACE_Titan_HangFire_off: ACE_Titan_Missle_off { - idc = 1028; - y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\hangfire_co.paa"; - }; - class ACE_Titan_TOP_off: ACE_Titan_Day_mode_off { - idc = 1006; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\top_co.paa"; - }; - class ACE_Titan_DIR: ACE_Titan_Day_mode { - idc = 1007; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\dir_co.paa"; - }; - class ACE_Titan_FLTR_mode_off: ACE_Titan_Day_mode_off { - idc = 1002; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\fltr_co.paa"; - }; - class ACE_Titan_FLTR_mode: ACE_Titan_FLTR_mode_off { - idc = 161; - colorText[] = {0.2941,0.8745,0.2157,1.0}; - }; - }; - }; - }; -}; - -// on colorText[] = {0.2941, 0.8745, 0.2157, 1.0}; -// off colorText[] = {0.2941, 0.2941, 0.2941, 1.0}; -// orange colorText[] = {0.9255, 0.5216, 0.1216, 1.0}; - -/* -ACE_Titan_elements_group: 170 -ACE_Titan_Day_mode_off: 1001 -ACE_Titan_Day_mode: 160 -ACE_Titan_WFOV_mode_off: 1004 -ACE_Titan_WFOV_mode_group: 163 -ACE_Titan_NFOV_mode_off: 1003 -ACE_Titan_NFOV_mode_group: 162 -ACE_Titan_SEEK_off: 1005 //1001 -ACE_Titan_SEEK: 166 -ACE_Titan_Missle_off: 1032 -ACE_Titan_Missle: 167 -ACE_Titan_CLU_off: 1027 -ACE_Titan_HangFire_off: 1028 -ACE_Titan_TOP_off: 1006 -ACE_Titan_DIR: 1007 -ACE_Titan_FLTR_mode_off: 1002 -ACE_Titan_FLTR_mode: 161 -*/ \ No newline at end of file diff --git a/addons/wep_javelin/RscInGameUI.hpp b/addons/wep_javelin/RscInGameUI.hpp new file mode 100644 index 0000000000..aab84b2472 --- /dev/null +++ b/addons/wep_javelin/RscInGameUI.hpp @@ -0,0 +1,454 @@ +class RscOpticsValue; +class RscControlsGroup; +class RscPicture; +class RscMapControl; +class VScrollbar; +class HScrollbar; +class RscLine; + + +// Taken from AGM for optics management. + +class RscInGameUI { + class RscOptics_titan { + idd = 300; + controls[] = {"ACE_javelin_elements_group"}; + onLoad = QUOTE(_this call FUNC(onOpticLoad)); + onUnload = "uiNameSpace setVariable ['ACE_RscOptics_javelin',nil];"; + + class CA_Distance: RscOpticsValue { + idc = 151; + sizeEx = "0"; + colorText[] = {0,0,0,0}; + x = 0; + y = 0; + w = 0; + h = 0; + }; + + class ACE_javelin_elements_group: RscControlsGroup + { + x = "SafezoneX"; + y = "SafezoneY"; + w = "SafezoneW"; + h = "SafezoneH"; + idc = 170; + class VScrollbar { + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + color[] = {1,1,1,0}; + width = 0.001; + }; + class HScrollbar { + color[] = {1,1,1,0}; + height = 0.001; + }; + class Controls { + class JavelinLocking : RscMapControl { + onDraw = QUOTE(_this call FUNC(onOpticDraw)); + idc = -1; + w = 0; + h = 0; + }; + + class ACE_javelin_Day_mode_off: RscPicture { + idc = 1001; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.03/4)*3*SafezoneH - SafezoneX"; + y = "SafezoneY+SafezoneH*0.031 - SafezoneY"; + w = "0.1045752* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; + h = "SafezoneH*0.1045752"; + colorText[] = {0.2941,0.2941,0.2941,1}; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\day_co.paa"; + }; + class ACE_javelin_Day_mode: ACE_javelin_Day_mode_off { + idc = 160; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class ACE_javelin_WFOV_mode_off: ACE_javelin_Day_mode_off { + idc = 1004; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\wfov_co.paa"; + }; + class ACE_javelin_WFOV_mode_group: RscControlsGroup { + x = "SafezoneX"; + y = "SafezoneY"; + w = "SafezoneW"; + h = "SafezoneH"; + idc = 163; + class VScrollbar { + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + color[] = {1,1,1,0}; + width = 0.001; + }; + class HScrollbar { + color[] = {1,1,1,0}; + height = 0.001; + }; + class Controls { + class ACE_javelin_WFOV_mode: ACE_javelin_WFOV_mode_off { + idc = -1; + y = "0.031*SafezoneH - SafezoneY"; + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class StadiaL: RscLine { + x = "0.4899*SafezoneW - SafezoneX"; + y = "0.171*SafezoneH - SafezoneY"; + w = 0; + h = "0.049*SafezoneH"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class StadiaR: RscLine { + x = "0.5109*SafezoneW- SafezoneX"; + y = "0.171*SafezoneH - SafezoneY"; + w = 0; + h = "0.049*SafezoneH"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class BracketL: RscLine { + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.293/4)*3*SafezoneH - SafezoneX"; + y = "0.4677*SafezoneH - SafezoneY"; + w = 0; + h = "0.0646*SafezoneH"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class BracketR: RscLine { + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.70/4)*3*SafezoneH - SafezoneX"; + y = "0.4677*SafezoneH - SafezoneY"; + w = 0; + h = "0.0646*SafezoneH"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class BracketT: RscLine { + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.467/4)*3*SafezoneH - SafezoneX"; + y = "0.3535*SafezoneH - SafezoneY"; + w = "0.065* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; + h = 0; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class BracketB: RscLine { + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.467/4)*3*SafezoneH - SafezoneX"; + y = "0.6465*SafezoneH - SafezoneY"; + w = "0.065* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; + h = 0; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + }; + }; + class ACE_javelin_NFOV_mode_off: ACE_javelin_Day_mode_off { + idc = 1003; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\nfov_co.paa"; + }; + class ACE_javelin_NFOV_mode_group: RscControlsGroup { + x = "SafezoneX"; + y = "SafezoneY"; + w = "SafezoneW-SafezoneX"; + h = "SafezoneH-SafezoneY"; + idc = 162; + class VScrollbar { + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + color[] = {1,1,1,0}; + width = 0.001; + }; + class HScrollbar { + color[] = {1,1,1,0}; + height = 0.001; + }; + class Controls { + class ACE_javelin_NFOV_mode: ACE_javelin_NFOV_mode_off { + idc = 699003; + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; + y = "0.031*SafezoneH - SafezoneY"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class StadiaL: RscLine { + x = "0.4788*SafezoneW - SafezoneX"; + y = "0.171*SafezoneH - SafezoneY"; + w = 0; + h = "0.049*SafezoneH"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class StadiaR: RscLine { + x = "0.5212*SafezoneW - SafezoneX"; + y = "0.171*SafezoneH - SafezoneY"; + w = 0; + h = "0.049*SafezoneH"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class LineHL: RscLine { + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.01/4)*3*SafezoneH - SafezoneX"; + y = "SafezoneH*0.5 - SafezoneY"; + w = "0.29* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; + h = "SafezoneH*0.0"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class LineHR: RscLine { + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.695/4)*3*SafezoneH - SafezoneX"; + y = "SafezoneH*0.5 - SafezoneY"; + w = "0.29* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; + h = "SafezoneH*0.0"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class LineVT: RscLine { + x = "0.5*SafezoneW - SafezoneX"; + y = "0.171*SafezoneH - SafezoneY"; + w = 0; + h = "0.1825*SafezoneH"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class LineVB: RscLine { + x = "0.5*SafezoneW - SafezoneX"; + y = "0.6465*SafezoneH - SafezoneY"; + w = 0; + h = "0.1895*SafezoneH"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + }; + }; + class TargetingConstrains: RscControlsGroup { + idc = 699100; + x = "SafezoneX"; + y = "SafezoneY"; + w = "SafezoneW-SafezoneX"; + h = "SafezoneH-SafezoneY"; + class VScrollbar { + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + color[] = {1,1,1,0}; + width = 0.001; + }; + class HScrollbar { + color[] = {1,1,1,0}; + height = 0.001; + }; + class Controls { + class Top: RscPicture { + idc = 699101; + text = "#(argb,8,8,3)color(1,1,1,1)"; + colorText[] = {0.2941,0.2941,0.2941,1}; + x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; + y = "0.15*SafezoneH-SafezoneY"; + w = "(3/4)*SafezoneH"; + h = "0.21*SafezoneH"; + }; + class Bottom: Top { + idc = 699102; + y = "0.64*SafezoneH-SafezoneY"; + }; + class Left: Top { + idc = 699103; + x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; + y = "0.36*SafezoneH-SafezoneY"; + w = "0.31*(3/4)*SafezoneH"; + h = "0.28*SafezoneH"; + }; + class Right: Left { + idc = 699104; + x = "((SafezoneW -(3/4)*SafezoneH)/2)+ 0.69*(3/4)*SafezoneH - SafezoneX"; + }; + class OpticsBorders: RscPicture { + idc = 699105; + text = PATHTOF(data\javelin_ui_border_ca.paa); + colorText[] = {0,0,0,1}; + x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; + y = "0.15*SafezoneH-SafezoneY"; + w = "(3/4)*SafezoneH"; + h = "0.7*SafezoneH"; + }; + }; + }; + class TargetingGate: TargetingConstrains { + idc = 699200; + class Controls { + class TargetingGateTL: TargetingConstrains { + x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; + y = "0.15*SafezoneH - SafezoneY"; + idc = 699201; + class Controls { + class LineH: RscLine { + idc = 699210; + x = "0"; + y = "0"; + w = "0.025*(3/4)*SafezoneH"; + h = "0"; + colorText[] = {0.8745,0.8745,0.8745,1}; + }; + class LineV: LineH { + idc = 699211; + w = "0"; + h = "0.025*SafezoneH"; + }; + }; + }; + class TargetingGateTR: TargetingGateTL { + x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX + 0.975*(3/4)*SafezoneH"; + y = "0.15*SafezoneH - SafezoneY"; + idc = 699202; + class Controls { + class LineH: RscLine { + idc = 699220; + x = "0"; + y = "0"; + w = "0.025*(3/4)*SafezoneH"; + h = "0"; + colorText[] = {0.8745,0.8745,0.8745,1}; + }; + class LineV: LineH { + idc = 699221; + x = "0.025*(3/4)*SafezoneH"; + w = "0"; + h = "0.025*SafezoneH"; + }; + }; + }; + class TargetingGateBL: TargetingGateTL { + x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; + y = "0.825*SafezoneH - SafezoneY"; + idc = 699203; + class Controls { + class LineH: RscLine { + x = "0"; + y = "0.025*SafezoneH"; + w = "0.025*(3/4)*SafezoneH"; + h = "0"; + colorText[] = {0.8745,0.8745,0.8745,1}; + }; + class LineV: LineH { + y = "0"; + w = "0"; + h = "0.025*SafezoneH"; + }; + }; + }; + class TargetingGateBR: TargetingGateBL { + x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX + 0.975*(3/4)*SafezoneH"; + y = "0.825*SafezoneH - SafezoneY"; + idc = 699204; + class Controls { + class LineH: RscLine { + x = "0"; + y = "0.025*SafezoneH"; + w = "0.025*(3/4)*SafezoneH"; + h = "0"; + colorText[] = {0.8745,0.8745,0.8745,1}; + }; + class LineV: LineH { + x = "0.025*(3/4)*SafezoneH"; + y = "0"; + w = "0"; + h = "0.025*SafezoneH"; + }; + }; + }; + }; + }; + class TargetingLines: TargetingConstrains { + idc = 699300; + class Controls { + class LineH: RscLine { + idc = 699301; + x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; + y = "0.5*SafezoneH - SafezoneY"; + w = "(3/4)*SafezoneH"; + h = "0"; + colorText[] = {0.8745,0.8745,0.8745,1}; + }; + class LineV: RscLine { + idc = 699302; + x = "0.5*SafezoneW - SafezoneX"; + y = "0.15*SafezoneH - SafezoneY"; + w = "0"; + h = "0.7*SafezoneH"; + colorText[] = {0.8745,0.8745,0.8745,1}; + }; + }; + }; + class ACE_javelin_SEEK_off: ACE_javelin_Day_mode_off { + idc = 699000; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.863/4)*3*SafezoneH - SafezoneX"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\seek_co.paa"; + }; + class ACE_javelin_SEEK: ACE_javelin_SEEK_off { + idc = 166; + colorText[] = {0.2941,0.8745,0.2157,0}; + }; + class ACE_javelin_Missle_off: ACE_javelin_Day_mode_off { + idc = 1032; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (-0.134/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; + colorText[] = {0.2941,0.2941,0.2941,1}; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\missle_co.paa"; + }; + class ACE_javelin_Missle: ACE_javelin_Missle_off { + idc = 167; + colorText[] = {0.9255,0.5216,0.1216,0}; + }; + class ACE_javelin_CLU_off: ACE_javelin_Missle_off { + idc = 1027; + y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\clu_co.paa"; + }; + class ACE_javelin_HangFire_off: ACE_javelin_Missle_off { + idc = 1028; + y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\hangfire_co.paa"; + }; + class ACE_javelin_TOP_off: ACE_javelin_Day_mode_off { + idc = 699001; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\top_co.paa"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class ACE_javelin_DIR: ACE_javelin_Day_mode { + idc = 699002; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\dir_co.paa"; + colorText[] = {0.2941,0.2941,0.2941,1}; + }; + class ACE_javelin_FLTR_mode_off: ACE_javelin_Day_mode_off { + idc = 1002; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\fltr_co.paa"; + }; + class ACE_javelin_FLTR_mode: ACE_javelin_FLTR_mode_off { + idc = 161; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + }; + }; + }; +}; + +// on colorText[] = {0.2941, 0.8745, 0.2157, 1.0}; +// off colorText[] = {0.2941, 0.2941, 0.2941, 1.0}; +// orange colorText[] = {0.9255, 0.5216, 0.1216, 1.0}; + +/* +ACE_Titan_elements_group: 170 +ACE_Titan_Day_mode_off: 1001 +ACE_Titan_Day_mode: 160 +ACE_Titan_WFOV_mode_off: 1004 +ACE_Titan_WFOV_mode_group: 163 +ACE_Titan_NFOV_mode_off: 1003 +ACE_Titan_NFOV_mode_group: 162 +ACE_Titan_SEEK_off: 1005 //1001 +ACE_Titan_SEEK: 166 +ACE_Titan_Missle_off: 1032 +ACE_Titan_Missle: 167 +ACE_Titan_CLU_off: 1027 +ACE_Titan_HangFire_off: 1028 +ACE_Titan_TOP_off: 1006 +ACE_Titan_DIR: 1007 +ACE_Titan_FLTR_mode_off: 1002 +ACE_Titan_FLTR_mode: 161 +*/ \ No newline at end of file diff --git a/addons/wep_javelin/XEH_clientInit.sqf b/addons/wep_javelin/XEH_clientInit.sqf new file mode 100644 index 0000000000..1d3b546e39 --- /dev/null +++ b/addons/wep_javelin/XEH_clientInit.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "initKeybinds.sqf" \ No newline at end of file diff --git a/addons/wep_javelin/XEH_post_init.sqf b/addons/wep_javelin/XEH_post_init.sqf index 6904ee6c47..dc30361926 100644 --- a/addons/wep_javelin/XEH_post_init.sqf +++ b/addons/wep_javelin/XEH_post_init.sqf @@ -1,3 +1,2 @@ #include "script_component.hpp" -NO_DEDICATED; diff --git a/addons/wep_javelin/XEH_pre_init.sqf b/addons/wep_javelin/XEH_pre_init.sqf index f826c6cf93..1b6682f0fc 100644 --- a/addons/wep_javelin/XEH_pre_init.sqf +++ b/addons/wep_javelin/XEH_pre_init.sqf @@ -1,7 +1,15 @@ #include "script_component.hpp" PREP(fired); -PREP(onGetLockedTarget); PREP(translateToWeaponSpace); -PREP(translateToModelSpace); \ No newline at end of file +PREP(translateToModelSpace); + +PREP(lockKeyDown); +PREP(lockKeyUp); +PREP(cycleFireMode); + +PREP(onOpticLoad); +PREP(onOpticDraw); + +GVAR(isLockKeyDown) = false; \ No newline at end of file diff --git a/addons/wep_javelin/config.cpp b/addons/wep_javelin/config.cpp index 3c38d9263f..fa062944fc 100644 --- a/addons/wep_javelin/config.cpp +++ b/addons/wep_javelin/config.cpp @@ -11,5 +11,5 @@ class CfgPatches { }; #include "CfgEventhandlers.hpp" -#include "CfgOptics.hpp" +#include "RscInGameUI.hpp" #include "CfgSounds.hpp" \ No newline at end of file diff --git a/addons/wep_javelin/data/jav_disp.paa b/addons/wep_javelin/data/jav_disp.paa new file mode 100644 index 0000000000000000000000000000000000000000..fc60af24d5388edd7c93738b043e70ca28a88551 GIT binary patch literal 64455 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

11WgQB@L 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 &ecrd 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 literal 0 HcmV?d00001 diff --git a/addons/wep_javelin/data/javelin_ui_border_ca.paa b/addons/wep_javelin/data/javelin_ui_border_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..29e9ad6f4be91556e5480e4086fe6c03bc1d459f GIT binary patch literal 151447 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 G`!eS|!O0ItK^_k&n7%$!A8>BnnM*E6;Krxhc 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 literal 0 HcmV?d00001 diff --git a/addons/wep_javelin/functions/fnc_cycleFireMode.sqf b/addons/wep_javelin/functions/fnc_cycleFireMode.sqf new file mode 100644 index 0000000000..7902c6d265 --- /dev/null +++ b/addons/wep_javelin/functions/fnc_cycleFireMode.sqf @@ -0,0 +1,19 @@ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + +private["_player", "_currentFireMode"]; + +_currentFireMode = ACE_player getVariable["ACE_FIRE_SELECTION", ACE_JAV_FIREMODE_TOP]; +if(_currentFireMode == ACE_JAV_FIREMODE_DIR) then { + _currentFireMode = ACE_JAV_FIREMODE_TOP; + + __JavelinIGUITop ctrlSetTextColor __ColorGreen; + __JavelinIGUIDir ctrlSetTextColor __ColorGray; +} else { + _currentFireMode = ACE_JAV_FIREMODE_DIR; + + __JavelinIGUITop ctrlSetTextColor __ColorGray; + __JavelinIGUIDir ctrlSetTextColor __ColorGreen; +}; +ACE_player setVariable["ACE_FIRE_SELECTION", _currentFireMode, false]; diff --git a/addons/wep_javelin/functions/fnc_fired.sqf b/addons/wep_javelin/functions/fnc_fired.sqf index ee5d53c6e8..795c244375 100644 --- a/addons/wep_javelin/functions/fnc_fired.sqf +++ b/addons/wep_javelin/functions/fnc_fired.sqf @@ -4,9 +4,14 @@ TRACE_1("Launch", _this); PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -FUNC(guidance_Javelin_LOBL_HI_PFH) = { +FUNC(guidance_Javelin_LOBL_DIR_PFH) = { + +}; + +FUNC(guidance_Javelin_LOBL_TOP_PFH) = { TRACE_1("enter", _this); - private["_pitch", "_yaw", "_wentTerminal", "_target", "_targetPos", "_curVelocity", "_missile", "_launchPos", "_targetStartPos" ]; + private["_pitch", "_yaw", "_wentTerminal", "_target", "_targetPos", "_curVelocity", "_missile", + "_launchPos", "_targetStartPos", "_defPitch", "_defYaw"]; _args = _this select 0; //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); _shooter = _args select 0; @@ -21,18 +26,18 @@ FUNC(guidance_Javelin_LOBL_HI_PFH) = { } else { _wentTerminal = false; _launchPos = getPosASL _shooter; - _target = GVAR(currentTarget); - _targetStartPos = GVAR(currentTargetPos); + _target = ACE_player getVariable[QGVAR(currentTarget), objNull]; + _targetStartPos = ACE_player getVariable[QGVAR(currentTargetPos), [0,0,0]]; }; + if(!alive _missile || isNull _missile || isNull _target) exitWith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + _targetPos = getPosASL _target; _curVelocity = velocity _missile; TRACE_4("", _target, _targetPos, _launchPos, _targetStartPos); - - if(!alive _missile || isNull _missile) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; _addHeight = [0,0,0]; if(!isNil "_target") then { @@ -47,22 +52,25 @@ FUNC(guidance_Javelin_LOBL_HI_PFH) = { TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); if((count _targetPos) > 0) then { _distanceToTarget = [(_missilePos select 0), (_missilePos select 1), (_targetPos select 2)] vectorDistance _targetPos; - - - + if( (_missilePos select 2) < (_targetPos select 2) + 200 && !_wentTerminal) then { - _addHeight = [0,0,(_targetPos select 2) + ( (_distanceToTarget * 2) + 200)]; - TRACE_1("Climb phase", _addHeight); + _addHeight = [0,0, ( (_distanceToTarget * 2) + 400)]; + + _defPitch = 0.25; + _defYaw = 0.035; + + TRACE_1("Climb phase", _addHeight); } else { _wentTerminal = true; _this set[2, _wentTerminal]; - TRACE_1("TERMINAL", ""); + + _defPitch = 0.25; + _defYaw = 0.25; + + TRACE_1("TERMINAL", ""); }; _targetPos = _targetPos vectorAdd _addHeight; - - _defPitch = 0.25; - _defYaw = 0.035; - + _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); _yaw = 0.0; TRACE_5("", _missile, _xVec, _yVec, _zVec, _targetPos); @@ -119,23 +127,34 @@ FUNC(guidance_Javelin_LOBL_HI_PFH) = { _this set[0, _args]; }; -FUNC(guidance_Javelin_LOBL_HI) = { +FUNC(guidance_Javelin_LOBL_TOP) = { PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); GVAR(lastTime) = time; - [FUNC(guidance_Javelin_LOBL_HI_PFH), 0, _this] call cba_fnc_addPerFrameHandler; + [FUNC(guidance_Javelin_LOBL_TOP_PFH), 0, _this] call cba_fnc_addPerFrameHandler; +}; + +FUNC(guidance_Javelin_LOBL_DIR) = { + PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + + GVAR(lastTime) = time; + [FUNC(guidance_Javelin_LOBL_DIR_PFH), 0, _this] call cba_fnc_addPerFrameHandler; }; if(!local _shooter) exitWith { false }; if(_ammo == "M_Titan_AT") then { - _fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_DEFAULT_FIRE_SELECTION]; + _fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_JAV_FIREMODE_TOP]; - switch (_fireMode select 0) do { - // Default to FIREMODE_DIRECT_LOAL - // FIREMODE_DIRECT_LOAL - default { - LOG("Initiating Javelin FIREMODE_LOBL_HI"); - _this call FUNC(guidance_Javelin_LOBL_HI); - }; -}; + switch (_fireMode) do { + // Default to FIREMODE_DIRECT_LOAL + // FIREMODE_DIRECT_LOAL + case ACE_JAV_FIREMODE_DIR: { + LOG("Initiating Javelin FIREMODE_LOBL_DIR"); + _this call FUNC(guidance_Javelin_LOBL_DIR); + }; + default { + LOG("Initiating Javelin FIREMODE_LOBL_TOP"); + _this call FUNC(guidance_Javelin_LOBL_TOP); + }; + }; }; \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_lockKeyDown.sqf b/addons/wep_javelin/functions/fnc_lockKeyDown.sqf new file mode 100644 index 0000000000..bc3198915b --- /dev/null +++ b/addons/wep_javelin/functions/fnc_lockKeyDown.sqf @@ -0,0 +1,3 @@ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_lockKeyUp.sqf b/addons/wep_javelin/functions/fnc_lockKeyUp.sqf new file mode 100644 index 0000000000..bc3198915b --- /dev/null +++ b/addons/wep_javelin/functions/fnc_lockKeyUp.sqf @@ -0,0 +1,3 @@ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_onGetLockedTarget.sqf b/addons/wep_javelin/functions/fnc_onGetLockedTarget.sqf deleted file mode 100644 index e96520e7f7..0000000000 --- a/addons/wep_javelin/functions/fnc_onGetLockedTarget.sqf +++ /dev/null @@ -1,24 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" - -// Store the current cursor target for guidance -GVAR(currentTarget) = cursorTarget; -GVAR(currentTargetPos) = screenToWorld [0.5,0.5]; - -TRACE_2("Tracking optics target draw", GVAR(currentTarget), GVAR(currentTargetPos)); - -if(isNil QGVAR(nextSoundPlay)) then { - GVAR(nextSoundPlay) = diag_tickTime + 0.25; -}; - -hint format["T: %1", GVAR(currentTarget)]; - -if(diag_tickTime > GVAR(nextSoundPlay) ) then { - GVAR(nextSoundPlay) = diag_tickTime + 0.25; - - if(!isNull GVAR(currentTarget)) then { - playSound "ACE_Javelin_Locked"; - } else { - playSound "ACE_Javelin_Locking"; - }; -}; diff --git a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf new file mode 100644 index 0000000000..5f9b2d3fa7 --- /dev/null +++ b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf @@ -0,0 +1,104 @@ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + +#define __TRACKINTERVAL 0.1 // how frequent the check should be. +#define __LOCKONTIME 1.85 // Lock on won't occur sooner +#define __LOCKONTIMERANDOM 0.3 // Deviation in lock on time +#define __SENSORSQUARE 1 // Locking on sensor square side in angles + +#define __ConstraintTop (((ctrlPosition __JavelinIGUITargetingConstrainTop) select 1) + ((ctrlPosition (__JavelinIGUITargetingConstrainTop)) select 3)) +#define __ConstraintBottom ((ctrlPosition __JavelinIGUITargetingConstrainBottom) select 1) +#define __ConstraintLeft (((ctrlPosition __JavelinIGUITargetingConstrainLeft) select 0) + ((ctrlPosition (__JavelinIGUITargetingConstrainLeft)) select 2)) +#define __ConstraintRight ((ctrlPosition __JavelinIGUITargetingConstrainRight) select 0) + +#define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5 +#define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5 + + +private["_args", "_lastTick"]; + +// Reset arguments if we havnt rendered in over a second +_args = uiNamespace getVariable[QGVAR(arguments), [] ]; +if( (count _args) > 0) then { + _lastTick = _args select 0; + if(diag_tickTime - _lastTick > 1) then { + [] call FUNC(onOpticLoad); + }; +}; + +// Pull the arguments +_currentTarget = _args select 1; + + +// Find a target within the optic range +_newTarget = objNull; + +_range = parseNumber (ctrlText __JavelinIGUIRangefinder); +if (_range > 50 && {_range < 2500}) then { + _pos = positionCameraToWorld [0,0,_range]; + _targetArray = _pos nearEntities ["AllVehicles", _range/25]; + if (count (_targetArray) > 0) then { + _newTarget = _targetArray select 0; + }; +}; + +if (isNull _newTarget) then { + _newTarget = cursorTarget; +}; + +if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) then { // keep it steady. + ACE_player switchCamera "INTERNAL"; +}; + +if (isNull _newTarget) then { + // No targets found + _currentTarget = objNull; + + __JavelinIGUISeek ctrlSetTextColor __ColorGray; + __JavelinIGUINFOV ctrlSetTextColor __ColorGreen; + __JavelinIGUITargetingConstrains ctrlShow false; + __JavelinIGUITargetingGate ctrlShow false; + __JavelinIGUITargetingLines ctrlShow false; + + ACE_player setVariable [QGVAR(currentTarget),nil, false]; + + // Disallow fire + //if (ACE_player ammo "Javelin" > 0 || {ACE_player ammo "ACE_Javelin_Direct" > 0}) then {ACE_player setWeaponReloadingTime //[player, "Javelin", 0.2];}; +} else { + if (_newTarget distance ACE_player < 2500 && + {(call CBA_fnc_getFoV) select 1 > 7} && + { (currentVisionMode ACE_player == 2)} + ) then { + + // THIS IS A PROPER LOCK + _currentTarget = _newTarget; + __JavelinIGUISeek ctrlSetTextColor __ColorGreen; + __JavelinIGUINFOV ctrlSetTextColor __ColorNull; + __JavelinIGUITargetingConstrains ctrlShow true; + + ACE_player setVariable[QGVAR(currentTarget), _currentTarget, false]; + ACE_player setVariable[QGVAR(currentTargetPos), getPosASL _currentTarget, false]; + + } else { + // Something is wrong with our seek + _currentTarget = objNull; + + __JavelinIGUISeek ctrlSetTextColor __ColorGray; + __JavelinIGUINFOV ctrlSetTextColor __ColorGray; + __JavelinIGUITargetingConstrains ctrlShow false; + __JavelinIGUITargetingGate ctrlShow false; + __JavelinIGUITargetingLines ctrlShow false; + + ACE_player setVariable [QGVAR(currentTarget),nil, false]; + }; + +}; + + +TRACE_2("", _newTarget, _currentTarget); + +_args set[0, diag_tickTime]; +_args set[1, _currentTarget]; + +uiNamespace setVariable[QGVAR(arguments), _args ]; \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_onOpticLoad.sqf b/addons/wep_javelin/functions/fnc_onOpticLoad.sqf new file mode 100644 index 0000000000..10433b12e9 --- /dev/null +++ b/addons/wep_javelin/functions/fnc_onOpticLoad.sqf @@ -0,0 +1,14 @@ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + +if((count _this) > 0) then { + uiNameSpace setVariable ['ACE_RscOptics_javelin',_this select 0]; +}; + +uiNameSpace setVariable [QGVAR(arguments), + [ + 0, // Last runtime + objNull // currentTargetObject + ] +]; \ No newline at end of file diff --git a/addons/wep_javelin/initKeybinds.sqf b/addons/wep_javelin/initKeybinds.sqf new file mode 100644 index 0000000000..126b1395a3 --- /dev/null +++ b/addons/wep_javelin/initKeybinds.sqf @@ -0,0 +1,30 @@ +// by commy2 + +["ACE3", QGVAR(lockTarget), localize "STR_ACE_WEP_JAVELIN_LockTarget", +{ + if (GETGVAR(isLockKeyDown,false)) exitWith {false}; + + GVAR(isLockKeyDown) = true; + + // Statement + [ACE_player] call FUNC(lockKeyDown); + // Return false so it doesn't block the rest weapon action + false +}, +{ + // prevent holding down + GVAR(isLockKeyDown) = false; + + // Statement + [ACE_player] call FUNC(lockKeyUp); + false +}, +[15, [false, false, false]], false] call cba_fnc_addKeybind; //Tab Key + +["ACE3", QGVAR(cycleFireMode), localize "STR_ACE_WEP_JAVELIN_CycleFireMode", +{ false }, +{ + [ACE_player] call FUNC(cycleFireMode); + false +}, +[15, [false, true, false]], false] call cba_fnc_addKeybind; //Shift+Tab Key \ No newline at end of file diff --git a/addons/wep_javelin/script_component.hpp b/addons/wep_javelin/script_component.hpp index 757b3b012c..3014b184ad 100644 --- a/addons/wep_javelin/script_component.hpp +++ b/addons/wep_javelin/script_component.hpp @@ -10,3 +10,44 @@ #endif #include "\z\ace\Addons\main\script_macros.hpp" + +#define ACE_JAV_FIREMODE_DIR 1 +#define ACE_JAV_FIREMODE_TOP 2 + + +// Javelin IGUI defines +#define __JavelinIGUI (uinamespace getVariable "ACE_RscOptics_javelin") + +// Custom controls +#define __JavelinIGUISeek (__JavelinIGUI displayCtrl 699000) +#define __JavelinIGUITop (__JavelinIGUI displayCtrl 699001) +#define __JavelinIGUIDir (__JavelinIGUI displayCtrl 699002) +#define __JavelinIGUINFOV (__JavelinIGUI displayCtrl 699003) + +// Constrains +#define __JavelinIGUITargetingConstrains (__JavelinIGUI displayCtrl 699100) +#define __JavelinIGUITargetingConstrainTop (__JavelinIGUI displayCtrl 699101) +#define __JavelinIGUITargetingConstrainBottom (__JavelinIGUI displayCtrl 699102) +#define __JavelinIGUITargetingConstrainLeft (__JavelinIGUI displayCtrl 699103) +#define __JavelinIGUITargetingConstrainRight (__JavelinIGUI displayCtrl 699104) + +// Targeting gate (not present yet) +#define __JavelinIGUITargetingGate (__JavelinIGUI displayCtrl 699200) +#define __JavelinIGUITargetingGateTL (__JavelinIGUI displayCtrl 699201) +#define __JavelinIGUITargetingGateTR (__JavelinIGUI displayCtrl 699202) +#define __JavelinIGUITargetingGateBL (__JavelinIGUI displayCtrl 699203) +#define __JavelinIGUITargetingGateBR (__JavelinIGUI displayCtrl 699204) + +// Rangefinder +#define __JavelinIGUIRangefinder (__JavelinIGUI displayCtrl 151) + +// Targeting lines +#define __JavelinIGUITargetingLines (__JavelinIGUI displayCtrl 699300) +#define __JavelinIGUITargetingLineH (__JavelinIGUI displayCtrl 699301) +#define __JavelinIGUITargetingLineV (__JavelinIGUI displayCtrl 699302) + +// Colors for controls +#define __ColorOrange [0.9255,0.5216,0.1216,1] +#define __ColorGreen [0.2941,0.8745,0.2157,1] +#define __ColorGray [0.2941,0.2941,0.2941,1] +#define __ColorNull [0,0,0,0] \ No newline at end of file diff --git a/addons/wep_javelin/stringtable.xml b/addons/wep_javelin/stringtable.xml new file mode 100644 index 0000000000..4068d6f0a6 --- /dev/null +++ b/addons/wep_javelin/stringtable.xml @@ -0,0 +1,24 @@ + + + + + + Lock Target (Hold) + Lock Target (Hold) + Lock Target (Hold) + Lock Target (Hold) + Lock Target (Hold) + Lock Target (Hold) + Lock Target (Hold) + + + Cycle Fire Mode + Cycle Fire Mode + Cycle Fire Mode + Cycle Fire Mode + Cycle Fire Mode + Cycle Fire Mode + Cycle Fire Mode + + + From 583acf65588dcced55dcf115f0e125b7dca59179 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 4 Apr 2015 17:15:59 -0700 Subject: [PATCH 25/43] ctrlShow is not operational on ControlGroups in RscOptics. --- addons/wep_javelin/RscInGameUI.hpp | 5 +++++ addons/wep_javelin/functions/fnc_onOpticDraw.sqf | 2 +- addons/wep_javelin/script_component.hpp | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/wep_javelin/RscInGameUI.hpp b/addons/wep_javelin/RscInGameUI.hpp index aab84b2472..e94e4c58fd 100644 --- a/addons/wep_javelin/RscInGameUI.hpp +++ b/addons/wep_javelin/RscInGameUI.hpp @@ -211,6 +211,7 @@ class RscInGameUI { }; }; }; + /* class TargetingConstrains: RscControlsGroup { idc = 699100; x = "SafezoneX"; @@ -264,6 +265,7 @@ class RscInGameUI { }; }; }; + class TargetingGate: TargetingConstrains { idc = 699200; class Controls { @@ -349,6 +351,7 @@ class RscInGameUI { }; }; }; + class TargetingLines: TargetingConstrains { idc = 699300; class Controls { @@ -370,6 +373,8 @@ class RscInGameUI { }; }; }; + */ + class ACE_javelin_SEEK_off: ACE_javelin_Day_mode_off { idc = 699000; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.863/4)*3*SafezoneH - SafezoneX"; diff --git a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf index 5f9b2d3fa7..83d9927a91 100644 --- a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf @@ -95,9 +95,9 @@ if (isNull _newTarget) then { }; - TRACE_2("", _newTarget, _currentTarget); +// Save arguments for next run _args set[0, diag_tickTime]; _args set[1, _currentTarget]; diff --git a/addons/wep_javelin/script_component.hpp b/addons/wep_javelin/script_component.hpp index 3014b184ad..3df1273422 100644 --- a/addons/wep_javelin/script_component.hpp +++ b/addons/wep_javelin/script_component.hpp @@ -31,7 +31,7 @@ #define __JavelinIGUITargetingConstrainLeft (__JavelinIGUI displayCtrl 699103) #define __JavelinIGUITargetingConstrainRight (__JavelinIGUI displayCtrl 699104) -// Targeting gate (not present yet) +// Targeting gate #define __JavelinIGUITargetingGate (__JavelinIGUI displayCtrl 699200) #define __JavelinIGUITargetingGateTL (__JavelinIGUI displayCtrl 699201) #define __JavelinIGUITargetingGateTR (__JavelinIGUI displayCtrl 699202) From 6288a809f72b851d3976dd915e3f04138125c665 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 4 Apr 2015 22:36:09 -0700 Subject: [PATCH 26/43] actually final terminal decent. woops. --- addons/wep_javelin/functions/fnc_fired.sqf | 39 ++++++++++++---------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/addons/wep_javelin/functions/fnc_fired.sqf b/addons/wep_javelin/functions/fnc_fired.sqf index 795c244375..52933b0cc9 100644 --- a/addons/wep_javelin/functions/fnc_fired.sqf +++ b/addons/wep_javelin/functions/fnc_fired.sqf @@ -72,25 +72,30 @@ FUNC(guidance_Javelin_LOBL_TOP_PFH) = { _targetPos = _targetPos vectorAdd _addHeight; _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - _yaw = 0.0; TRACE_5("", _missile, _xVec, _yVec, _zVec, _targetPos); - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_defYaw; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _defYaw; - }; + + _yaw = 0.0; + _pitch = 0.0; + + // Stop jinking on terminal final decent + if((_missilePos distance _targetPos) > 50) then { + if((_targetVectorSeeker select 0) < 0) then { + _yaw = -_defYaw; + } else { + if((_targetVectorSeeker select 0) > 0) then { + _yaw = _defYaw; + }; + }; + + + if((_targetVectorSeeker select 2) < 0) then { + _pitch = -_defPitch; + } else { + if((_targetVectorSeeker select 2) > 0) then { + _pitch = _defPitch; + }; + }; }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_defPitch; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _defPitch; - }; - }; - TRACE_3("", _targetVectorSeeker, _pitch, _yaw); #ifdef DEBUG_MODE_FULL From dca75c555724f5a2dfb01eabf96fb7fd43eaf631 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:26:33 +0200 Subject: [PATCH 27/43] Implemented bandaged wounds setting (adv) --- .../fnc_displayPatientInformation.sqf | 32 ++++- .../functions/fnc_handleBandageOpening.sqf | 118 ++++++++++++++++++ addons/medical/functions/fnc_init.sqf | 1 + .../fnc_treatmentAdvanced_bandageLocal.sqf | 11 +- .../fnc_treatmentAdvanced_fullHealLocal.sqf | 1 + 5 files changed, 152 insertions(+), 11 deletions(-) create mode 100644 addons/medical/functions/fnc_handleBandageOpening.sqf diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index b155a7b1ef..97c42042d7 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -74,24 +74,45 @@ if (_show) then { if (_amountOf > 0) then { if (_amountOf >= 1) then { // TODO localization - _allInjuryTexts pushback format["%2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, _amountOf]; + _allInjuryTexts pushback [format["%2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, _amountOf], [1,1,1,1]]; } else { // TODO localization - _allInjuryTexts pushback format["Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6]; + _allInjuryTexts pushback [format["Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6], [1,1,1,1]]; }; }; }; }foreach _openWounds; + + _bandagedwounds = _target getvariable [QGVAR(bandagedWounds), []]; + { + _amountOf = _x select 3; + // Find how much this bodypart is bleeding + if (_selectionBloodLoss select (_x select 2) == 0) then { + _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (15 * ((_x select 4) * _amountOf))]; + }; + if (GVAR(currentSelectedSelectionN) == (_x select 2)) then { + // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] + if (_amountOf > 0) then { + if (_amountOf >= 1) then { + // TODO localization + _allInjuryTexts pushback [format["[B] %2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, _amountOf], [1,0.5,0.5,1]]; + } else { + // TODO localization + _allInjuryTexts pushback [format["[B] Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6], [1,0.5,0.5,1]]; + }; + }; + }; + }foreach _bandagedwounds; } else { { _selectionBloodLoss set [_forEachIndex, _target getHitPointDamage _x]; if (_target getHitPointDamage _x > 0.1) then { // @todo localize - _allInjuryTexts pushBack format ["%1 %2", + _allInjuryTexts pushBack [format ["%1 %2", ["Lightly wounded", "Heavily wounded"] select (_target getHitPointDamage _x > 0.5), ["head", "torso", "left arm", "right arm", "left leg", "right leg"] select _forEachIndex - ]; + ], [1,1,1,1]]; }; } forEach ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; }; @@ -125,7 +146,8 @@ if (_show) then { _lbCtrl lbSetColor [_foreachIndex, _x select 1]; }foreach _genericMessages; { - _lbCtrl lbAdd _x; + _lbCtrl lbAdd (_x select 0); + _lbCtrl lbSetColor [_foreachIndex, _x select 1]; }foreach _allInjuryTexts; if (count _allInjuryTexts == 0) then { _lbCtrl lbAdd "No injuries on this bodypart.."; diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf new file mode 100644 index 0000000000..eb35b3e8c5 --- /dev/null +++ b/addons/medical/functions/fnc_handleBandageOpening.sqf @@ -0,0 +1,118 @@ +/* + * Author: Glowbal + * Handles the bandage of a patient. + * + * Arguments: + * 0: The target + * 1: The impact + * 2: Selection part number + * 3: Injury index + * 4: Injury + * 5: Used Bandage type + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage", "_classID", "_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury"]; +_target = _this select 0; +_impact = _this select 1; +_part = _this select 2; +_injuryIndex = _this select 3; +_injury = _this select 4; +_bandage = _this select 5; + +_classID = _injury select 1; +_className = GVAR(woundClassNames) select _classID; + +// default, just in case.. +_reopeningChance = 0.1; +_reopeningMinDelay = 120; +_reopeningMaxDelay = 200; + +// Get the default values for the used bandage +_config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging"); +if (isClass (_config >> _bandage)) then { + _config = (_config >> _bandage); + _reopeningChance = getNumber (_config >> "reopeningChance"); + _reopeningMinDelay = getNumber (_config >> "reopeningMinDelay"); + _reopeningMaxDelay = getNumber (_config >> "reopeningMaxDelay") max _reopeningMinDelay; +}; + +if (isClass (_config >> _className)) then { + _woundTreatmentConfig = (_config >> _className); + if (isNumber (_woundTreatmentConfig >> "reopeningChance")) then { + _reopeningChance = getNumber (_woundTreatmentConfig >> "reopeningChance"); + }; + if (isNumber (_woundTreatmentConfig >> "reopeningMinDelay")) then { + _reopeningMinDelay = getNumber (_woundTreatmentConfig >> "reopeningMinDelay"); + }; + if (isNumber (_woundTreatmentConfig >> "reopeningMaxDelay")) then { + _reopeningMaxDelay = getNumber (_woundTreatmentConfig >> "reopeningMaxDelay") max _reopeningMinDelay; + }; +}; + +_bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; +_exist = false; +_injuryId = _injury select 0; +{ + if ((_x select 0) == _injuryId) exitwith { + _exist = true; + _existingInjury = _x; + _existingInjury set [3, (_existingInjury select 3) + _impact]; + _bandagedWounds set [_foreachIndex, _existingInjury]; + }; +}foreach _bandagedWounds; + +if !(_exist) then { + // [ID, classID, bodypart, percentage treated, bloodloss rate] + _bandagedWounds pushback [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4]; +}; +_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; + +// Check if we are ever going to reopen this +if (random(1) <= _reopeningChance) then { + _delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay); + [{ + private ["_target", "_impact", "_part", "_injuryIndex", "_bandage", "_injury", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"]; + _target = _this select 0; + _impact = _this select 1; + _part = _this select 2; + _injuryIndex = _this select 3; + _injury = _this select 4; + + if (alive _target) then { + _openWounds = _target getvariable [QGVAR(openWounds), []]; + if ((count _openWounds)-1 < _injuryIndex) exitwith {}; + _selectedInjury = _openWounds select _injuryIndex; + if (_selectedInjury select 0 == _injury select 0) then { // matching the IDs + _selectedInjury set [3, (_selectedInjury select 3) + _impact]; + _openWounds set [_injuryIndex, _selectedInjury]; + _target setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; + if (USE_WOUND_EVENT_SYNC) then { + ["medical_propagateWound", [_target, _selectedInjury]] call EFUNC(common,globalEvent); + }; + _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; + _exist = false; + _injuryId = _injury select 0; + { + if ((_x select 0) == _injuryId) exitwith { + _exist = true; + _existingInjury = _x; + _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; + _bandagedWounds set [_foreachIndex, _existingInjury]; + }; + }foreach _bandagedWounds; + + if (_exist) then { + _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; + }; + }; + // Otherwise something went wrong, we we don't reopen them.. + }; + }, [_target, _impact, _part, _injuryIndex, _injury], _delay, 0] call EFUNC(common,waitAndExecute); +}; diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index fc74711a30..ed8301b6b2 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -26,6 +26,7 @@ _unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; // wounds and injuries _unit setvariable [QGVAR(openWounds), [], true]; +_unit setvariable [QGVAR(bandagedWounds), [], true]; _unit setVariable [QGVAR(internalWounds), [], true]; // vitals diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index c003f48ead..0eaa8b4fa8 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -10,7 +10,7 @@ * Return Value: * Succesful treatment started * - * Public: Yes + * Public: No */ #include "script_component.hpp" @@ -82,18 +82,17 @@ if (_effectivenessFound == -1) exitwith {}; // Seems everything is patched up on // TODO refactor this part // Find the impact this bandage has and reduce the amount this injury is present _impact = if ((_mostEffectiveInjury select 3) >= _effectivenessFound) then {_effectivenessFound} else { (_mostEffectiveInjury select 3) }; -_mostEffectiveInjury set [ 3, ((_mostEffectiveInjury select 3) - _effectivenessFound) max 0]; +_mostEffectiveInjury set [ 3, ((_mostEffectiveInjury select 3) - _impact) max 0]; _openWounds set [_mostEffectiveSpot, _mostEffectiveInjury]; _target setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; if (USE_WOUND_EVENT_SYNC) then { - ["medical_propagateWound", [_unit, _mostEffectiveInjury]] call EFUNC(common,globalEvent); + ["medical_propagateWound", [_target, _mostEffectiveInjury]] call EFUNC(common,globalEvent); }; // Handle the reopening of bandaged wounds -if (_impact > 0) then { - // TODO handle reopening of bandaged wounds - // [_target, _impact, _part,_highestSpot, _removeItem] call FUNC(handleBandageOpening); +if (_impact > 0 && {GVAR(enableAdvancedWounds)}) then { + [_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening); }; // If all wounds have been bandaged, we will reset all damage to 0, so the unit is not showing any blood on the model anymore. diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf index e8669ecbec..77f6d7f44c 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf @@ -25,6 +25,7 @@ if (alive _target) exitwith { // wounds and injuries _target setvariable [QGVAR(openWounds), [], true]; + _target setvariable [QGVAR(bandagedWounds), [], true]; _target setVariable [QGVAR(internalWounds), [], true]; // vitals From 0f520592491619472f7ccc1ea58b8a04beba96d6 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:27:09 +0200 Subject: [PATCH 28/43] Fixed CPR script error --- addons/medical/ACE_Medical_Treatments.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 855653718a..bb52693e91 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -265,7 +265,7 @@ class ACE_Medical_Actions { condition = "((_this select 1) getvariable ['ACE_medical_inCardiacArrest', false])"; callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR)); callbackFailure = ""; - callbackProgress = "((_this select 1) getvariable ['ACE_medical_inCardiacArrest', false])"; + callbackProgress = "(((_this select 0) select 1) getvariable ['ACE_medical_inCardiacArrest', false])"; animationPatient = ""; animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; animationCaller = "AinvPknlMstpSlayWnonDnon_medic"; From ecf84ae039199c298a74e8e5b7713ae7663c99fe Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:27:28 +0200 Subject: [PATCH 29/43] Updated module classname to be inline with others --- addons/medical/CfgVehicles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 0c05532073..9f2f4a597b 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -135,7 +135,7 @@ class CfgVehicles { }; }; - class ACE_moduleTreatmentConfiguration: ACE_Module { + class ACE_moduleTreatmentSettings: ACE_Module { scope = 2; displayName = "Treatment Settings [ACE]"; icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); From f52891436a05cfefc41e34bfffe19f797500e81d Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:27:40 +0200 Subject: [PATCH 30/43] oops --- addons/medical/XEH_preInit.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index c51fecc608..fc9d68fc68 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -45,6 +45,7 @@ PREP(handleDamage_wounds); PREP(handleUnitVitals); PREP(handleKilled); PREP(handleLocal); +PREP(handleBandageOpening); PREP(hasItem); PREP(hasItems); PREP(hasMedicalEnabled); From a0bbbdb0b7493d3c09b52bd802c1c35ce4258a66 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:27:53 +0200 Subject: [PATCH 31/43] fixed place in bodybag --- .../medical/functions/fnc_actionPlaceInBodyBag.sqf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf index 9cd3bf1bed..d657dbe152 100644 --- a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf +++ b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf @@ -22,18 +22,18 @@ if !([_caller, "ACE_itemBodyBag"] call EFUNC(common,hasItem)) exitwith {}; [_caller, "ACE_itemBodyBag"] call EFUNC(common,useItem); -_nameOfUnit = [_unit] call EFUNC(common,getName); -if (alive _unit) then { +_nameOfUnit = [_target] call EFUNC(common,getName); +if (alive _target) then { // force kill the unit. - [_unit, true] call FUNC(setDead); + [_target, true] call FUNC(setDead); }; -_onPosition = getPos _unit; -deleteVehicle _unit; +_onPosition = getPos _target; +deleteVehicle _target; _bodyBagCreated = createVehicle ["ACE_bodyBag", _onPosition, [], 0, "NONE"]; // reset the position to ensure it is on the correct one. _bodyBagCreated setPos _onPosition; // TODO Does this need to be something with QUOTE(DEFUNC)? -[[_bodyBagCreated], QEFUNC(common,revealObject), true] call call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +[[_bodyBagCreated], QUOTE(DEFUNC(common,revealObject)), true] call call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ _bodyBagCreated; From 171ebf827a47f78f1e8c871e024df3f88fcd91b2 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:28:57 +0200 Subject: [PATCH 32/43] No litter created when in vehicle --- addons/medical/functions/fnc_createLitter.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf index 8df56ad1fb..570c6d63d3 100644 --- a/addons/medical/functions/fnc_createLitter.sqf +++ b/addons/medical/functions/fnc_createLitter.sqf @@ -24,6 +24,7 @@ _className = _this select 3; _usersOfItems = _this select 5; if !(GVAR(allowLitterCreation)) exitwith {}; +if (vehicle _caller != _caller || vehicle _target != _target) exitwith {}; _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); if (GVAR(level) >= 2) then { From 2c0bec2b071c395f931267c87138e74298b5d668 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:36:40 +0200 Subject: [PATCH 33/43] disabled injury visualization for bandaged wounds --- addons/medical/functions/fnc_displayPatientInformation.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index 97c42042d7..a501b28927 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -87,9 +87,9 @@ if (_show) then { { _amountOf = _x select 3; // Find how much this bodypart is bleeding - if (_selectionBloodLoss select (_x select 2) == 0) then { - _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (15 * ((_x select 4) * _amountOf))]; - }; + //if (_selectionBloodLoss select (_x select 2) == 0) then { + // _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (15 * ((_x select 4) * _amountOf))]; + //}; if (GVAR(currentSelectedSelectionN) == (_x select 2)) then { // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] if (_amountOf > 0) then { From ae2adc17b93ebb3f20ea0dc773c490f9aca37771 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:37:07 +0200 Subject: [PATCH 34/43] changed all medical items to inherit from ACE_ItemCore --- addons/medical/CfgWeapons.hpp | 64 ++++++++++++----------------------- 1 file changed, 21 insertions(+), 43 deletions(-) diff --git a/addons/medical/CfgWeapons.hpp b/addons/medical/CfgWeapons.hpp index 670cfcb34c..6545464ea9 100644 --- a/addons/medical/CfgWeapons.hpp +++ b/addons/medical/CfgWeapons.hpp @@ -10,14 +10,12 @@ class CfgWeapons { type = 0; class ItemInfo: InventoryFirstAidKitItem_Base_F { mass = 4; - type = 201; }; }; class Medikit: ItemCore { type = 0; class ItemInfo: MedikitItem { mass = 60; - type = 201; }; }; @@ -31,11 +29,10 @@ class CfgWeapons { descriptionShort = $STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_USE; class ItemInfo: InventoryItem_Base_F { - mass=1; - type=201; + mass = 1; }; }; - class ACE_packingBandage: ItemCore { + class ACE_packingBandage: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -46,11 +43,10 @@ class CfgWeapons { descriptionShort = $STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_USE; class ItemInfo: InventoryItem_Base_F { - mass=1; - type=201; + mass = 1; }; }; - class ACE_elasticBandage: ItemCore { + class ACE_elasticBandage: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -61,11 +57,10 @@ class CfgWeapons { descriptionShort = $STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_USE; class ItemInfo: InventoryItem_Base_F { - mass=1; - type=201; + mass = 1; }; }; - class ACE_tourniquet: ItemCore { + class ACE_tourniquet: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -76,11 +71,10 @@ class CfgWeapons { descriptionShort = $STR_ACE_MEDICAL_TOURNIQUET_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_TOURNIQUET_DESC_USE; class ItemInfo: InventoryItem_Base_F { - mass=1; - type=201; + mass = 1; }; }; - class ACE_morphine: ItemCore { + class ACE_morphine: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -91,11 +85,10 @@ class CfgWeapons { descriptionShort = $STR_ACE_MEDICAL_MORPHINE_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_MORPHINE_DESC_USE; class ItemInfo: InventoryItem_Base_F { - mass=1; - type=201; + mass = 1; }; }; - class ACE_atropine: ItemCore { + class ACE_atropine: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -106,11 +99,11 @@ class CfgWeapons { descriptionShort = $STR_ACE_MEDICAL_ATROPINE_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_ATROPINE_DESC_USE; class ItemInfo: InventoryItem_Base_F { - mass=1; - type=201; + mass = 1; + }; }; - class ACE_epinephrine: ItemCore { + class ACE_epinephrine: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -121,11 +114,10 @@ class CfgWeapons { descriptionShort = $STR_ACE_MEDICAL_EPINEPHRINE_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_EPINEPHRINE_DESC_USE; class ItemInfo: InventoryItem_Base_F { - mass=1; - type=201; + mass = 1; }; }; - class ACE_plasmaIV: ItemCore { + class ACE_plasmaIV: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -135,24 +127,21 @@ class CfgWeapons { descriptionUse = $STR_ACE_MEDICAL_PLASMA_IV_DESC_USE; class ItemInfo: InventoryItem_Base_F { mass = 10; - type = 201; }; }; class ACE_plasmaIV_500: ACE_plasmaIV { displayName = $STR_ACE_MEDICAL_PLASMA_IV_500; class ItemInfo: InventoryItem_Base_F { mass = 5; - type = 201; }; }; class ACE_plasmaIV_250: ACE_plasmaIV { displayName = $STR_ACE_MEDICAL_PLASMA_IV_250; class ItemInfo: InventoryItem_Base_F { mass = 2.5; - type = 201; }; }; - class ACE_bloodIV: ItemCore { + class ACE_bloodIV: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -163,24 +152,21 @@ class CfgWeapons { descriptionUse = $STR_ACE_MEDICAL_BLOOD_IV_DESC_USE; class ItemInfo: InventoryItem_Base_F { mass = 10; - type = 201; }; }; class ACE_bloodIV_500: ACE_bloodIV { displayName = $STR_ACE_MEDICAL_BLOOD_IV_500; class ItemInfo: InventoryItem_Base_F { mass = 5; - type = 201; }; }; class ACE_bloodIV_250: ACE_bloodIV { displayName = $STR_ACE_MEDICAL_BLOOD_IV_250; class ItemInfo: InventoryItem_Base_F { mass = 2.5; - type = 201; }; }; - class ACE_salineIV: ItemCore { + class ACE_salineIV: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -190,24 +176,21 @@ class CfgWeapons { descriptionUse = $STR_ACE_MEDICAL_SALINE_IV_DESC_USE; class ItemInfo: InventoryItem_Base_F { mass = 10; - type = 201; }; }; class ACE_salineIV_500: ACE_salineIV { displayName = $STR_ACE_MEDICAL_SALINE_IV_500; class ItemInfo: InventoryItem_Base_F { mass = 2.5; - type = 201; }; }; class ACE_salineIV_250: ACE_salineIV { displayName = $STR_ACE_MEDICAL_SALINE_IV_250; class ItemInfo: InventoryItem_Base_F { mass = 2.5; - type = 201; }; }; - class ACE_quikclot: ItemCore { + class ACE_quikclot: ACE_ItemCore { scope = 2; value = 1; count = 1; @@ -218,25 +201,22 @@ class CfgWeapons { descriptionUse = $STR_ACE_MEDICAL_QUIKCLOT_DESC_USE; class ItemInfo: InventoryItem_Base_F { mass = 1; - type = 201; }; }; - class ACE_personalAidKit: ItemCore { + class ACE_personalAidKit: ACE_ItemCore { scope = 2; value = 1; count = 1; type = 16; displayName = $STR_ACE_MEDICAL_AID_KIT_DISPLAY; picture = QUOTE(PATHTOF(ui\items\personal_aid_kit.paa)); - //model = QUOTE(PATHTOF(equipment\Personal-aidkits\MTP.p3d)); descriptionShort = $STR_ACE_MEDICAL_AID_KIT_DESC_SHORT; descriptionUse = $STR_ACE_MEDICAL_AID_KIT_DESC_USE; class ItemInfo: InventoryItem_Base_F { mass = 2; - type = 201; }; }; - class ACE_surgicalKit: ItemCore { + class ACE_surgicalKit: ACE_ItemCore { scope=2; displayName= $STR_ACE_MEDICAL_SURGICALKIT_DISPLAY; model = QUOTE(PATHTOF(data\surgical_kit.p3d)); @@ -245,10 +225,9 @@ class CfgWeapons { descriptionUse = $STR_ACE_MEDICAL_SURGICALKIT_DESC_USE; class ItemInfo: InventoryItem_Base_F { mass = 5; - type = 201; }; }; - class ACE_bodyBag: ItemCore { + class ACE_bodyBag: ACE_ItemCore { scope=2; displayName= $STR_ACE_MEDICAL_BODYBAG_DISPLAY; model = QUOTE(PATHTOF(data\bodybagItem.p3d)); @@ -257,7 +236,6 @@ class CfgWeapons { descriptionUse = $STR_ACE_MEDICAL_BODYBAG_DESC_USE; class ItemInfo: InventoryItem_Base_F { mass = 15; - type = 201; }; }; }; From 89015c94d4ea37fa0a0c54c89ef9b63bc8800deb Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 19:42:55 +0200 Subject: [PATCH 35/43] Removed rouge system chat and diag_log messages --- addons/captives/functions/fnc_handleOnUnconscious.sqf | 3 --- addons/medical/functions/fnc_setCardiacArrest.sqf | 2 -- 2 files changed, 5 deletions(-) diff --git a/addons/captives/functions/fnc_handleOnUnconscious.sqf b/addons/captives/functions/fnc_handleOnUnconscious.sqf index 1924b6bb47..9aa4856204 100644 --- a/addons/captives/functions/fnc_handleOnUnconscious.sqf +++ b/addons/captives/functions/fnc_handleOnUnconscious.sqf @@ -18,9 +18,6 @@ EXPLODE_2_PVT(_this,_unit,_isUnconc); -diag_log "handleOnUnconscious"; -diag_log _this; -diag_log _unit; if (!local _unit) exitWith {}; if (_isUnconc) then { diff --git a/addons/medical/functions/fnc_setCardiacArrest.sqf b/addons/medical/functions/fnc_setCardiacArrest.sqf index 6ae9fe1079..cebf968898 100644 --- a/addons/medical/functions/fnc_setCardiacArrest.sqf +++ b/addons/medical/functions/fnc_setCardiacArrest.sqf @@ -26,7 +26,6 @@ _unit setvariable [QGVAR(heartRate), 0]; [_unit, true] call FUNC(setUnconscious); _timeInCardiacArrest = 120 + round(random(600)); -systemChat format["Unit went cardiac arrest; hr: %1", _unit getvariable [QGVAR(heartRate), -1]]; [{ private ["_args","_unit","_startTime","_timeInCardiacArrest","_heartRate"]; _args = _this select 0; @@ -36,7 +35,6 @@ systemChat format["Unit went cardiac arrest; hr: %1", _unit getvariable [QGVAR(h _heartRate = _unit getvariable [QGVAR(heartRate), 0]; if (_heartRate > 0 || !alive _unit) exitwith { - systemChat format["Unit no longer cardiac arrest; hr: %1", _unit getvariable [QGVAR(heartRate), -1]]; [(_this select 1)] call cba_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inCardiacArrest), nil,true]; }; From 278ffe7d6550a4b4a0a4507cfe2af96d192b5f92 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sun, 5 Apr 2015 10:45:09 -0700 Subject: [PATCH 36/43] save --- addons/wep_javelin/functions/fnc_fired.sqf | 33 ++++++++++++---------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/addons/wep_javelin/functions/fnc_fired.sqf b/addons/wep_javelin/functions/fnc_fired.sqf index 52933b0cc9..014bc972bb 100644 --- a/addons/wep_javelin/functions/fnc_fired.sqf +++ b/addons/wep_javelin/functions/fnc_fired.sqf @@ -79,23 +79,26 @@ FUNC(guidance_Javelin_LOBL_TOP_PFH) = { // Stop jinking on terminal final decent if((_missilePos distance _targetPos) > 50) then { - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_defYaw; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _defYaw; - }; + _defPitch = 0.0015; + _defYaw = 0.0015; + }; + + if((_targetVectorSeeker select 0) < 0) then { + _yaw = -_defYaw; + } else { + if((_targetVectorSeeker select 0) > 0) then { + _yaw = _defYaw; }; - - - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_defPitch; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _defPitch; - }; + }; + + if((_targetVectorSeeker select 2) < 0) then { + _pitch = -_defPitch; + } else { + if((_targetVectorSeeker select 2) > 0) then { + _pitch = _defPitch; }; - }; + }; + TRACE_3("", _targetVectorSeeker, _pitch, _yaw); #ifdef DEBUG_MODE_FULL From 7ffd690a71b1e34e68e2edb8deb566fee16039b8 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 20:11:54 +0200 Subject: [PATCH 37/43] Changed: IVs are now synced and medics can see a unit is receiving an IV --- .../functions/fnc_displayPatientInformation.sqf | 12 ++++++++++++ .../medical/functions/fnc_getBloodVolumeChange.sqf | 6 ++++++ addons/medical/functions/fnc_handleUnitVitals.sqf | 11 +++++++++++ addons/medical/functions/fnc_treatmentIVLocal.sqf | 5 ++++- addons/medical/stringtable.xml | 3 +++ 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index a501b28927..b5eecbeb8d 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -61,6 +61,18 @@ if (_show) then { _genericMessages pushback [localize "STR_ACE_MEDICAL_STATUS_PAIN", [1, 1, 1, 1]]; }; + _totalIvVolume = 0; + { + private "_value"; + _value = _target getvariable _x; + if !(isnil "_value") then { + _totalIvVolume = _totalIvVolume + (_target getvariable [_x, 0]); + }; + }foreach GVAR(IVBags); + if (_totalIvVolume >= 1) then { + _genericMessages pushback [format[localize "STR_ACE_MEDICAL_receivingIvVolume", floor _totalIvVolume], [1, 1, 1, 1]]; + }; + _selectionBloodLoss = [0,0,0,0,0,0]; if (GVAR(level) >= 2) then { _openWounds = _target getvariable [QGVAR(openWounds), []]; diff --git a/addons/medical/functions/fnc_getBloodVolumeChange.sqf b/addons/medical/functions/fnc_getBloodVolumeChange.sqf index b031ae4585..f94c5d5b7b 100644 --- a/addons/medical/functions/fnc_getBloodVolumeChange.sqf +++ b/addons/medical/functions/fnc_getBloodVolumeChange.sqf @@ -44,6 +44,12 @@ if (_bloodVolume < 100.0) then { _unit setvariable [_x,_ivVolume]; }; }foreach GVAR(IVBags); +} else { + { + if ((_unit getvariable [_x, 0]) > 0) then { + _unit setvariable [_x, 0]; // lets get rid of exessive IV volume + }; + }foreach GVAR(IVBags); }; _bloodVolumeChange; diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 992ccdc3f2..107480108b 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -167,4 +167,15 @@ if (GVAR(level) >= 2) then { [_unit] call FUNC(setCardiacArrest); }; }; + + // syncing any remaining values + if (_syncValues) then { + { + private "_value"; + _value = _unit getvariable _x; + if !(isnil "_value") then { + _unit setvariable [_x,(_unit getvariable [_x, 0]), true]; + }; + }foreach GVAR(IVBags); + }; }; diff --git a/addons/medical/functions/fnc_treatmentIVLocal.sqf b/addons/medical/functions/fnc_treatmentIVLocal.sqf index aa7b5dbf17..b0b5ce6a7f 100644 --- a/addons/medical/functions/fnc_treatmentIVLocal.sqf +++ b/addons/medical/functions/fnc_treatmentIVLocal.sqf @@ -19,6 +19,9 @@ private ["_target", "_ivItem", "_config", "_volumeAdded", "_typeOf", "_varName"] _target = _this select 0; _ivItem = _this select 1; +_bloodVolume = _target getvariable [QGVAR(bloodVolume), 100]; +if (_bloodVolume >= 100) exitwith {}; + // Find the proper attributes for the used IV _config = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "IV"); _volumeAdded = getNumber (_config >> "volume"); @@ -31,7 +34,7 @@ if (isClass (_config >> _className)) then { }; _varName = format["ACE_Medical_IVVolume_%1",_typeOf]; -_target setvariable [_varName, (_target getvariable [_varName, 0]) + _volumeAdded]; +_target setvariable [_varName, (_target getvariable [_varName, 0]) + _volumeAdded, true]; if !(_varName in GVAR(IVBags)) then { GVAR(IVBags) pushback _varName; diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index a23c37c658..0243ab5222 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -336,6 +336,9 @@ Garot [CAT] Opaska uciskowa [CAT] + + Receiving IV [%1ml] + From 147bb925413281d55859a2262cd96405f151e5c2 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 20:23:07 +0200 Subject: [PATCH 38/43] Added setting to disable variable sync (recommended on) --- addons/medical/ACE_Settings.hpp | 19 +++++++++++++------ addons/medical/CfgVehicles.hpp | 6 ++++++ .../functions/fnc_handleUnitVitals.sqf | 2 +- .../functions/fnc_moduleMedicalSettings.sqf | 1 + 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 51ad3533f6..915beafd6c 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -16,13 +16,12 @@ class ACE_Settings { }; class GVAR(enableOverdosing) { typeName = "BOOL"; - value = true; + value = 1; }; class GVAR(bleedingCoefficient) { typeName = "SCALAR"; value = 1; }; - class GVAR(enableAirway) { typeName = "BOOL"; value = false; @@ -37,11 +36,11 @@ class ACE_Settings { }; class GVAR(enableVehicleCrashes) { typeName = "BOOL"; - value = true; + value = 1; }; class GVAR(enableScreams) { typeName = "BOOL"; - value = true; + value = 1; }; class GVAR(playerDamageThreshold) { typeName = "SCALAR"; @@ -58,7 +57,7 @@ class ACE_Settings { }; class GVAR(preventInstaDeath) { typeName = "BOOL"; - value = false; + value = 0; }; class GVAR(maxReviveTime) { typeName = "SCALAR"; @@ -70,7 +69,7 @@ class ACE_Settings { }; class GVAR(allowDeadBodyMovement) { typeName = "BOOL"; - value = false; + value = 0; }; class GVAR(allowLitterCreation) { typeName = "BOOL"; @@ -83,17 +82,25 @@ class ACE_Settings { class GVAR(medicSetting_PAK) { typeName = "SCALAR"; value = 1; + values[] = {"Anyone", "Medics only", "Doctors only"}; }; class GVAR(medicSetting_SurgicalKit) { typeName = "SCALAR"; value = 1; + values[] = {"Anyone", "Medics only", "Doctors only"}; }; class GVAR(consumeItem_PAK) { typeName = "SCALAR"; value = 0; + values[] = {"No", "Yes"}; }; class GVAR(consumeItem_SurgicalKit) { typeName = "SCALAR"; value = 0; + values[] = {"No", "Yes"}; + }; + class GVAR(keepLocalSettingsSynced) { + typeName = "BOOL"; + value = 1; }; }; diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 9f2f4a597b..a1110019ae 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -128,6 +128,12 @@ class CfgVehicles { typeName = "NUMBER"; defaultValue = 1; }; + class keepLocalSettingsSynced { + displayName = "Sync status"; + description = "Keep unit status synced. Recommended on."; + typeName = "BOOL"; + defaultValue = 1; + }; }; class ModuleDescription { description = "Provides a medical system for both players and AI."; diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 107480108b..fc13e19d29 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -22,7 +22,7 @@ _unit setVariable [QGVAR(lastMomentVitalsHandled), time]; if (_interval == 0) exitWith {}; _lastTimeValuesSynced = _unit getvariable [QGVAR(lastMomentValuesSynced), 0]; -_syncValues = time - _lastTimeValuesSynced >= (10 + floor(random(10))); +_syncValues = (time - _lastTimeValuesSynced >= (10 + floor(random(10))) && GVAR(keepLocalSettingsSynced)); if (_syncValues) then { _unit setvariable [QGVAR(lastMomentValuesSynced), time]; }; diff --git a/addons/medical/functions/fnc_moduleMedicalSettings.sqf b/addons/medical/functions/fnc_moduleMedicalSettings.sqf index 4fa90ae267..34dd063a4d 100644 --- a/addons/medical/functions/fnc_moduleMedicalSettings.sqf +++ b/addons/medical/functions/fnc_moduleMedicalSettings.sqf @@ -34,3 +34,4 @@ if !(_activated) exitWith {}; [_logic, QGVAR(enableUnsconsiousnessAI), "enableUnsconsiousnessAI"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(preventInstaDeath), "preventInstaDeath"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(bleedingCoefficient), "bleedingCoefficient"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(keepLocalSettingsSynced), "keepLocalSettingsSynced"] call EFUNC(common,readSettingFromModule); From 34b834e7009fccf73e5b3a7b2505ad1c526def19 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sun, 5 Apr 2015 11:51:39 -0700 Subject: [PATCH 39/43] Rudimentary hold-tab lock on titan, sounds added, jink removed, state tracking. --- addons/aircraft/README.md | 1 + addons/wep_javelin/functions/fnc_fired.sqf | 2 +- .../wep_javelin/functions/fnc_onOpticDraw.sqf | 72 +++++++++++++------ .../wep_javelin/functions/fnc_onOpticLoad.sqf | 7 +- .../functions/fnc_translateToModelSpace.sqf | 4 ++ .../functions/fnc_translateToWeaponSpace.sqf | 3 + 6 files changed, 64 insertions(+), 25 deletions(-) diff --git a/addons/aircraft/README.md b/addons/aircraft/README.md index 5c3de5c6d4..76c721bd0c 100644 --- a/addons/aircraft/README.md +++ b/addons/aircraft/README.md @@ -3,6 +3,7 @@ ace_aircraft Changes to air weaponry, flightmodels and HUDs. +* Contributations by Kimi for HUD updates ## Maintainers diff --git a/addons/wep_javelin/functions/fnc_fired.sqf b/addons/wep_javelin/functions/fnc_fired.sqf index 014bc972bb..6a4b1930e3 100644 --- a/addons/wep_javelin/functions/fnc_fired.sqf +++ b/addons/wep_javelin/functions/fnc_fired.sqf @@ -78,7 +78,7 @@ FUNC(guidance_Javelin_LOBL_TOP_PFH) = { _pitch = 0.0; // Stop jinking on terminal final decent - if((_missilePos distance _targetPos) > 50) then { + if((_missilePos distance _targetPos) < 50) then { _defPitch = 0.0015; _defYaw = 0.0015; }; diff --git a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf index 83d9927a91..3dfafb3410 100644 --- a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf @@ -1,6 +1,6 @@ #define DEBUG_MODE_FULL #include "script_component.hpp" -TRACE_1("enter", _this); +//TRACE_1("enter", _this); #define __TRACKINTERVAL 0.1 // how frequent the check should be. #define __LOCKONTIME 1.85 // Lock on won't occur sooner @@ -16,7 +16,7 @@ TRACE_1("enter", _this); #define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5 -private["_args", "_lastTick"]; +private["_args", "_lastTick", "_runTime", "_soundTime", "_lockTime", "_newTarget", "_currentTarget", "_range", "_pos", "_targetArray"]; // Reset arguments if we havnt rendered in over a second _args = uiNamespace getVariable[QGVAR(arguments), [] ]; @@ -29,11 +29,21 @@ if( (count _args) > 0) then { // Pull the arguments _currentTarget = _args select 1; - +_runTime = _args select 2; +_lockTime = _args select 3; +_soundTime = _args select 4; // Find a target within the optic range _newTarget = objNull; +// Bail on fast movement +if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) exitWith { // keep it steady. + ACE_player switchCamera "INTERNAL"; +}; + +// Only start locking on holding tab +if(!GVAR(isLockKeyDown)) exitWith { false }; + _range = parseNumber (ctrlText __JavelinIGUIRangefinder); if (_range > 50 && {_range < 2500}) then { _pos = positionCameraToWorld [0,0,_range]; @@ -47,14 +57,11 @@ if (isNull _newTarget) then { _newTarget = cursorTarget; }; -if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) then { // keep it steady. - ACE_player switchCamera "INTERNAL"; -}; - if (isNull _newTarget) then { // No targets found _currentTarget = objNull; - + _lockTime = 0; + __JavelinIGUISeek ctrlSetTextColor __ColorGray; __JavelinIGUINFOV ctrlSetTextColor __ColorGreen; __JavelinIGUITargetingConstrains ctrlShow false; @@ -66,20 +73,38 @@ if (isNull _newTarget) then { // Disallow fire //if (ACE_player ammo "Javelin" > 0 || {ACE_player ammo "ACE_Javelin_Direct" > 0}) then {ACE_player setWeaponReloadingTime //[player, "Javelin", 0.2];}; } else { - if (_newTarget distance ACE_player < 2500 && - {(call CBA_fnc_getFoV) select 1 > 7} && - { (currentVisionMode ACE_player == 2)} + if (_newTarget distance ACE_player < 2500 + // && {(call CBA_fnc_getFoV) select 1 > 7} + // && { (currentVisionMode ACE_player == 2)} ) then { - - // THIS IS A PROPER LOCK - _currentTarget = _newTarget; - __JavelinIGUISeek ctrlSetTextColor __ColorGreen; - __JavelinIGUINFOV ctrlSetTextColor __ColorNull; - __JavelinIGUITargetingConstrains ctrlShow true; - - ACE_player setVariable[QGVAR(currentTarget), _currentTarget, false]; - ACE_player setVariable[QGVAR(currentTargetPos), getPosASL _currentTarget, false]; - + // Lock on after 3 seconds + if(_currentTarget != _newTarget) then { + TRACE_1("New Target, reseting locking", _newTarget); + _lockTime = diag_tickTime; + _currentTarget = _newTarget; + + playSound "ACE_Javelin_Locking"; + } else { + if(diag_tickTime - _lockTime > 3) then { + TRACE_2("LOCKED!", _currentTarget, _lockTime); + __JavelinIGUISeek ctrlSetTextColor __ColorGreen; + __JavelinIGUINFOV ctrlSetTextColor __ColorNull; + __JavelinIGUITargetingConstrains ctrlShow true; + + ACE_player setVariable[QGVAR(currentTarget), _currentTarget, false]; + ACE_player setVariable[QGVAR(currentTargetPos), getPosASL _currentTarget, false]; + + if(diag_tickTime > _soundTime) then { + playSound "ACE_Javelin_Locked"; + _soundTime = diag_tickTime + 0.25; + }; + } else { + if(diag_tickTime > _soundTime) then { + playSound "ACE_Javelin_Locking"; + _soundTime = diag_tickTime + 0.25; + }; + }; + }; } else { // Something is wrong with our seek _currentTarget = objNull; @@ -95,10 +120,13 @@ if (isNull _newTarget) then { }; -TRACE_2("", _newTarget, _currentTarget); +//TRACE_2("", _newTarget, _currentTarget); // Save arguments for next run _args set[0, diag_tickTime]; _args set[1, _currentTarget]; +_args set[2, _runTime]; +_args set[3, _lockTime]; +_args set[4, _soundTime]; uiNamespace setVariable[QGVAR(arguments), _args ]; \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_onOpticLoad.sqf b/addons/wep_javelin/functions/fnc_onOpticLoad.sqf index 10433b12e9..c4a7069630 100644 --- a/addons/wep_javelin/functions/fnc_onOpticLoad.sqf +++ b/addons/wep_javelin/functions/fnc_onOpticLoad.sqf @@ -1,4 +1,4 @@ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" TRACE_1("enter", _this); @@ -9,6 +9,9 @@ if((count _this) > 0) then { uiNameSpace setVariable [QGVAR(arguments), [ 0, // Last runtime - objNull // currentTargetObject + objNull, // currentTargetObject + 0, // Run Time + 0, // Lock Time + 0 // Sound timer ] ]; \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_translateToModelSpace.sqf b/addons/wep_javelin/functions/fnc_translateToModelSpace.sqf index 1e2e930ac7..12f828769a 100644 --- a/addons/wep_javelin/functions/fnc_translateToModelSpace.sqf +++ b/addons/wep_javelin/functions/fnc_translateToModelSpace.sqf @@ -1,3 +1,7 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + _object = _this select 0; _origin = getPosASL _object; _matrix = _this select 1; diff --git a/addons/wep_javelin/functions/fnc_translateToWeaponSpace.sqf b/addons/wep_javelin/functions/fnc_translateToWeaponSpace.sqf index d74fa17fa1..afe2436e5d 100644 --- a/addons/wep_javelin/functions/fnc_translateToWeaponSpace.sqf +++ b/addons/wep_javelin/functions/fnc_translateToWeaponSpace.sqf @@ -1,3 +1,6 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); _object = _this select 0; _origin = getPosASL _object; From 788487baa5fc52d8eded30052e7f1dc86c39f72f Mon Sep 17 00:00:00 2001 From: jaynus Date: Sun, 5 Apr 2015 11:54:00 -0700 Subject: [PATCH 40/43] Debug disable --- addons/wep_javelin/functions/fnc_fired.sqf | 2 +- addons/wep_javelin/functions/fnc_onOpticDraw.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wep_javelin/functions/fnc_fired.sqf b/addons/wep_javelin/functions/fnc_fired.sqf index 6a4b1930e3..149f829292 100644 --- a/addons/wep_javelin/functions/fnc_fired.sqf +++ b/addons/wep_javelin/functions/fnc_fired.sqf @@ -1,4 +1,4 @@ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" //_this=[TEST_AI_HELICOPTER,"missiles_DAGR","missiles_DAGR","Far_AI","M_PG_AT","24Rnd_PG_missiles",163988: rocket_01_fly_f.p3d] TRACE_1("Launch", _this); diff --git a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf index 3dfafb3410..1bc848cb04 100644 --- a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf @@ -1,4 +1,4 @@ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" //TRACE_1("enter", _this); From 12d10b8bf77c21fc3f83bdd6f859b87a967eadd6 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 21:38:15 +0200 Subject: [PATCH 41/43] Blood loss for basic (from AGM medical) --- addons/medical/functions/fnc_getBloodLoss.sqf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_getBloodLoss.sqf b/addons/medical/functions/fnc_getBloodLoss.sqf index 4f070e2546..6418d425e8 100644 --- a/addons/medical/functions/fnc_getBloodLoss.sqf +++ b/addons/medical/functions/fnc_getBloodLoss.sqf @@ -13,6 +13,8 @@ #include "script_component.hpp" +#define BLOODLOSSRATE_BASIC 0.4 + private ["_totalBloodLoss","_tourniquets","_openWounds", "_value", "_cardiacOutput", "_internalWounds"]; // TODO Only use this calculation if medium or higher, otherwise use vanilla calculations (for basic medical). _totalBloodLoss = 0; @@ -40,6 +42,6 @@ if (GVAR(level) >= 2) then { // cap the blood loss to be no greater as the current cardiac output //(_totalBloodLoss min _cardiacOutput); } else { - // TODO basic medical + _totalBloodLoss = BLOODLOSSRATE_BASIC * (damage _this); }; _totalBloodLoss * (GVAR(bleedingCoefficient) max 0); From 7d5fca3c5a0ddce6fb94066b35a3077152fe8a77 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sun, 5 Apr 2015 12:55:17 -0700 Subject: [PATCH 42/43] DIR guidance on Javelin missiles/Titan. TODO: The guidance codes need re-works. --- addons/wep_javelin/functions/fnc_fired.sqf | 119 ++++++++++++++++++++- 1 file changed, 118 insertions(+), 1 deletion(-) diff --git a/addons/wep_javelin/functions/fnc_fired.sqf b/addons/wep_javelin/functions/fnc_fired.sqf index 149f829292..4e94989677 100644 --- a/addons/wep_javelin/functions/fnc_fired.sqf +++ b/addons/wep_javelin/functions/fnc_fired.sqf @@ -5,7 +5,124 @@ TRACE_1("Launch", _this); PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); FUNC(guidance_Javelin_LOBL_DIR_PFH) = { + TRACE_1("enter", _this); + private["_pitch", "_yaw", "_wentTerminal", "_target", "_targetPos", "_curVelocity", "_missile", + "_launchPos", "_targetStartPos", "_defPitch", "_defYaw"]; + _args = _this select 0; + //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + _shooter = _args select 0; + _missile = _args select 6; + + if((count _args) > 7) then { + _saveArgs = _args select 7; + _target = _saveArgs select 0; + _targetStartPos = _saveArgs select 1; + _launchPos = _saveArgs select 2; + _wentTerminal = _saveArgs select 3; + } else { + _wentTerminal = false; + _launchPos = getPosASL _shooter; + _target = ACE_player getVariable[QGVAR(currentTarget), objNull]; + _targetStartPos = ACE_player getVariable[QGVAR(currentTargetPos), [0,0,0]]; + }; + + if(!alive _missile || isNull _missile || isNull _target) exitWith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + _targetPos = getPosASL _target; + _curVelocity = velocity _missile; + + TRACE_4("", _target, _targetPos, _launchPos, _targetStartPos); + + _addHeight = [0,0,0]; + if(!isNil "_target") then { + + _yVec = vectorDir _missile; + _zVec = vectorUp _missile; + _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); + + _missilePos = getPosASL _missile; + // player sideChat "G!"; + + TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); + if((count _targetPos) > 0) then { + _distanceToTarget = [(_missilePos select 0), (_missilePos select 1), (_targetPos select 2)] vectorDistance _targetPos; + + if( (_missilePos select 2) < (_targetPos select 2) + 60 && !_wentTerminal) then { + _addHeight = [0,0,(_targetPos select 2) + 120]; + + _defPitch = 0.15; + _defYaw = 0.035; + + TRACE_1("Climb phase", _addHeight); + } else { + _wentTerminal = true; + _this set[2, _wentTerminal]; + + _defPitch = 0.15; + _defYaw = 0.035; + + TRACE_1("TERMINAL", ""); + }; + _targetPos = _targetPos vectorAdd _addHeight; + + _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); + TRACE_5("", _missile, _xVec, _yVec, _zVec, _targetPos); + + _yaw = 0.0; + _pitch = 0.0; + + if((_targetVectorSeeker select 0) < 0) then { + _yaw = -_defYaw; + } else { + if((_targetVectorSeeker select 0) > 0) then { + _yaw = _defYaw; + }; + }; + + if((_targetVectorSeeker select 2) < 0) then { + _pitch = -_defPitch; + } else { + if((_targetVectorSeeker select 2) > 0) then { + _pitch = _defPitch; + }; + }; + + TRACE_3("", _targetVectorSeeker, _pitch, _yaw); + + #ifdef DEBUG_MODE_FULL + drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; + + _light = "#lightpoint" createVehicleLocal (getPos _missile); + _light setLightBrightness 1.0; + _light setLightAmbient [1.0, 0.0, 0.0]; + _light setLightColor [1.0, 0.0, 0.0]; + + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; + drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; + + MARKERCOUNT = MARKERCOUNT + 1; + #endif + + if(accTime > 0) then { + TRACE_5("", _xVec, _yVec, _zVec, _yaw, _pitch); + _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); + + _vectorTo = _missilePos vectorFromTo _outVector; + TRACE_3("", _missile, _outVector, _vectorTo); + _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; + }; + + #ifdef DEBUG_MODE_FULL + hintSilent format["d: %1", _distanceToTarget]; + #endif + }; + }; + + _saveArgs = [_target,_targetStartPos, _launchPos, _wentTerminal]; + _args set[7, _saveArgs ]; + _this set[0, _args]; }; FUNC(guidance_Javelin_LOBL_TOP_PFH) = { @@ -78,7 +195,7 @@ FUNC(guidance_Javelin_LOBL_TOP_PFH) = { _pitch = 0.0; // Stop jinking on terminal final decent - if((_missilePos distance _targetPos) < 50) then { + if((_missilePos distance _targetPos) < 150) then { _defPitch = 0.0015; _defYaw = 0.0015; }; From 9e3bb8ac95d765d317142de3b07523711efa6119 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 5 Apr 2015 22:07:38 +0200 Subject: [PATCH 43/43] fixed triage card --- .../functions/fnc_displayTriageCard.sqf | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/addons/medical/functions/fnc_displayTriageCard.sqf b/addons/medical/functions/fnc_displayTriageCard.sqf index 95e6713d9a..c6e59fead2 100644 --- a/addons/medical/functions/fnc_displayTriageCard.sqf +++ b/addons/medical/functions/fnc_displayTriageCard.sqf @@ -43,28 +43,27 @@ if (_show) then { _lbCtrl = (_display displayCtrl 200); lbClear _lbCtrl; - _log = _target getvariable ["myVariableTESTKOEAKJR", []]; + _log = _target getvariable [QGVAR(triageCard), []]; { - // [_message,_moment,_type, _arguments] - _message = _x select 0; - _moment = _x select 1; - _arguments = _x select 3; - if (isLocalized _message) then { - _message = localize _message; - }; - - { - if (typeName _x == "STRING" && {isLocalized _x}) then { - _arguments set [_foreachIndex, localize _x]; + _item = _x select 0; + _amount = _x select 1; + _message = _item; + if (isClass(configFile >> "CfgWeapons" >> _item)) then { + _message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName"); + } else { + if (isLocalized _message) then { + _message = localize _message; }; - }foreach _arguments; - _message = format([_message] + _arguments); - _lbCtrl lbAdd format["%1 %2", _moment, _message]; + }; + _triageCardTexts pushback format["%1x - %2", _amount, _message]; }foreach _log; if (count _triageCardTexts == 0) then { _lbCtrl lbAdd "No entries on this triage card.."; }; + { + _lbCtrl lbAdd _x; + }foreach _triageCardTexts; _triageStatus = [_target] call FUNC(getTriageStatus); (_display displayCtrl 2000) ctrlSetText (_triageStatus select 0);