Braf_Air2 atualizado

This commit is contained in:
2026-06-14 21:25:45 -03:00
parent e4ac56b038
commit 63626ca260
62 changed files with 1734 additions and 306 deletions

18
braf_air2/.vscode/c_cpp_properties.json vendored Normal file
View File

@@ -0,0 +1,18 @@
{
"configurations": [
{
"name": "windows-gcc-x64",
"includePath": [
"${workspaceFolder}/**"
],
"compilerPath": "gcc",
"cStandard": "${default}",
"cppStandard": "${default}",
"intelliSenseMode": "windows-gcc-x64",
"compilerArgs": [
""
]
}
],
"version": 4
}

24
braf_air2/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,24 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ Runner: Debug Session",
"type": "cppdbg",
"request": "launch",
"args": [],
"stopAtEntry": false,
"externalConsole": true,
"cwd": "p:/braf/braf_air2",
"program": "p:/braf/braf_air2/build/Debug/outDebug",
"MIMode": "gdb",
"miDebuggerPath": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}

59
braf_air2/.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,59 @@
{
"C_Cpp_Runner.cCompilerPath": "gcc",
"C_Cpp_Runner.cppCompilerPath": "g++",
"C_Cpp_Runner.debuggerPath": "gdb",
"C_Cpp_Runner.cStandard": "",
"C_Cpp_Runner.cppStandard": "",
"C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvarsall.bat",
"C_Cpp_Runner.useMsvc": false,
"C_Cpp_Runner.warnings": [
"-Wall",
"-Wextra",
"-Wpedantic",
"-Wshadow",
"-Wformat=2",
"-Wcast-align",
"-Wconversion",
"-Wsign-conversion",
"-Wnull-dereference"
],
"C_Cpp_Runner.msvcWarnings": [
"/W4",
"/permissive-",
"/w14242",
"/w14287",
"/w14296",
"/w14311",
"/w14826",
"/w44062",
"/w44242",
"/w14905",
"/w14906",
"/w14263",
"/w44265",
"/w14928"
],
"C_Cpp_Runner.enableWarnings": true,
"C_Cpp_Runner.warningsAsError": false,
"C_Cpp_Runner.compilerArgs": [],
"C_Cpp_Runner.linkerArgs": [],
"C_Cpp_Runner.includePaths": [],
"C_Cpp_Runner.includeSearch": [
"*",
"**/*"
],
"C_Cpp_Runner.excludeSearch": [
"**/build",
"**/build/**",
"**/.*",
"**/.*/**",
"**/.vscode",
"**/.vscode/**"
],
"C_Cpp_Runner.useAddressSanitizer": false,
"C_Cpp_Runner.useUndefinedSanitizer": false,
"C_Cpp_Runner.useLeakSanitizer": false,
"C_Cpp_Runner.showCompilationTime": false,
"C_Cpp_Runner.useLinkTimeOptimization": false,
"C_Cpp_Runner.msvcSecureNoWarnings": false
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -23,21 +23,6 @@ class CfgModels
class Animations
{
};
};
class braf_a29_gunner_n
{
htMin=0;
htMax=0;
afMax=0;
mfMax=0;
mFact=0;
tBody=0;
skeletonName="braf_A29_Flir";
sectionsInherit="";
sections[]={};
class Animations
{
};
};
class braf_a29_gunner_m
{

View File

@@ -1,48 +1,76 @@
/*
Author: Brazilian Armed Forces
File: BRAF_AirOptics.hpp
Purpose:
Define a UI (InGame Optics) do A-29 com elementos vanilla + elementos custom (IDCs 9901..9905)
e instala um EventHandler para atualizar os controles em tempo real enquanto a optics estiver ativa.
Correções lógicas aplicadas (padrão Arma 3):
1) onLoad usa _this (minúsculo), não _This
2) EH 'Draw' entrega CONTROL; chamamos a função passando DISPLAY via ctrlParent
3) onUnload remove o EH, evitando acumular handlers após abrir/fechar optics
4) Caminhos usam barra simples '\' (padrão Arma 3), sem inventar '\\'
=======================================================================
BRAF A-29 STARSAPHIRE - DICIONÁRIO DE IDCs (REFERÊNCIA)
=======================================================================
IDDs
300 - Display do optics A-29 (BRAF_RscOptics_A29)
Grupos (ControlsGroup)
170 - CA_IGUI_elements_group (grupo principal do optics)
CUSTOM (BRAF)
9901 - Seta: indicador de elevação (trilho vertical)
9902 - Texto: valor numérico da elevação (ex: -12.3°)
9903 - Seta: indicador de direção (trilho horizontal)
9904 - Texto: valor numérico da direção (ex: -45°)
9905 - Seta: bússola (norte geográfico relativo ao apontamento)
*/
class ScrollBar;
class RscUnitInfo;
class RscControlsGroup
{
class VScrollbar;
class HScrollbar;
class Controls;
};
class RscControlsGroup;
class RscControlsGroupNoScrollbars;
class CA_HUDRscControlsGroup;
class RscText;
class RangeText: RscText{};
class RscPicture;
class RscOpticsText;
class RscOpticsValue;
class RscIGProgress;
class RscInGameUI
{
class RscOptics_MBT_01_gunner;
class BRAF_RscOptics_A29: RscUnitInfo
{
idd=300;
controls[]=
{
"CA_IGUI_elements_group"
};
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="70";
h="40 * (0.025 * SafezoneH)";
class controls
{
class ValueDistance: RscText
class BRAF_RscOptics_A29: RscUnitInfo
{
idd = 300;
controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"};
class VScrollbar;
class HScrollbar;
onLoad = "[""onLoad"",_this,""RscUnitInfo"",'IGUI'] call (uiNamespace getVariable 'BIS_fnc_initDisplay'); _this call BRAF_fnc_initRSC;";
onUnload = "[""onUnload"",_this,""RscUnitInfo"",'IGUI'] call (uiNamespace getVariable 'BIS_fnc_initDisplay')";
class CA_IGUI_elements_group: RscControlsGroup
{
idc = 170;
class VScrollbar: VScrollbar { width = 0; };
class HScrollbar: HScrollbar { height = 0; };
x = "-4 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH)/2))";
y = "000 * (0.02500 * SafezoneH) + (SafezoneY)";
w = "100 * (0.01875 * SafezoneH)";
h = "080 * (0.02500 * SafezoneH)";
class controls
{
class ValueDistance: RscText
{
style=1;
sizeEx="0.038*SafezoneH";
shadow=0;
font="EtelkaMonospacePro";
idc=198; //idc=183;
idc=198;
text="245678";
colorText[] = {0,0,0,1};
colorBackground[] = {0,0,0,0};
@@ -66,7 +94,7 @@ class RscInGameUI
x="10 * (0.01875 * SafezoneH)";
y="34 * (0.025 * SafezoneH)";
};
class Textweapon: ValueGrid
class TextGrid: ValueGrid
{
style=0;
idc=1801;
@@ -144,6 +172,22 @@ class RscInGameUI
y="35.75 * (0.025 * SafezoneH)";
w="6.5 * (0.01875 * SafezoneH)";
};
class braf_fov_mode: RscText
{
idc = 154;
text = "WFOV";
sizeEx="0.03*SafezoneH";
style=0;
shadow=0;
font="EtelkaMonospacePro";
x = "0 * (0.01875 * SafezoneH)";
y="3 * (0.025 * SafezoneH)";
w="5 * (0.01875 * SafezoneH)";
h="1.2 * (0.025 * SafezoneH)";
colorText[] = {0,0,0,1};
};
class CA_VisionMode: RscText
{
idc=152;
@@ -151,18 +195,19 @@ class RscInGameUI
style=0;
shadow=0;
font="EtelkaMonospacePro";
text="DAY";
x="1 * (0.01875 * SafezoneH)";
text="DTV";
x="4.5 * (0.01875 * SafezoneH)";
y="3 * (0.025 * SafezoneH)";
w="5 * (0.01875 * SafezoneH)";
h="1.2 * (0.025 * SafezoneH)";
colorText[] = {0,0,0,1};
};
class CA_FlirMode: CA_VisionMode
{
idc=153;
text="BHOT";
x="5 * (0.01875 * SafezoneH)";
x="7 * (0.01875 * SafezoneH)";
};
class CA_Laser: RscText
{
@@ -173,73 +218,251 @@ class RscInGameUI
shadow=0;
font="EtelkaMonospacePro";
text="\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa";
x="31.1 * (0.01875 * SafezoneH)";
y="12.85 * (0.025 * SafezoneH)";
x="33 * (0.01875 * SafezoneH)";
y="8 * (0.025 * SafezoneH)";
w="3.5 * (0.01875 * SafezoneH)";
h="1.5 * (0.025 * SafezoneH)";
};
//class braf_tri_vert: RscPicture
//{
// idc = 1806;
// text = "rhsusf\addons\rhsusf_optics\data\tex\tri_vert.paa";
// x = "12.9 * (0.01875 * SafezoneH)";
// y = "14.65 * (0.025 * SafezoneH)";
// w = "0.7 * (0.01875 * SafezoneH)";
// h = "1.1 * (0.025 * SafezoneH)";
//};
//class braf_tri_horiz: braf_tri_vert
//{
// idc = 1807;
// text = "rhsusf\addons\rhsusf_optics\data\tex\tri_hor.paa";
// x = "26.1 * (0.01875 * SafezoneH)";
// y = "26.8 * (0.025 * SafezoneH)";
// w = "1.1 * (0.01875 * SafezoneH)";
// h = "0.7 * (0.025 * SafezoneH)";
//};
};
};
class braf_arrow_vert: RscPicture
{
idc = 1901;
text = "\braf\braf_air2\braf_optics_air2\A29\data\braf_arrow_vert_ca.paa";
shadow = 0;
sizeEx = "0.03*SafezoneH";
x = "-0.5 * (0.01875 * SafezoneH)";
y = "16.6 * (0.025 * SafezoneH)";
w = "2.1 * (0.01875 * SafezoneH)";
h = "2.1 * (0.025 * SafezoneH)";
color[] = {1,1,1,1};
colorBackground[] = {0,0,0,0};
};
class braf_elev_value: RscText
{
idc = 1902;
style = 0;
shadow = 0;
sizeEx = "0.03*SafezoneH";
colorText[] = {1,1,1,1};
colorBackground[] = {0,0,0,0};
x = "1 * (0.01875 * SafezoneH)";
y = "16.6 * (0.025 * SafezoneH)";
w = "4 * (0.01875 * SafezoneH)";
h = "2.1 * (0.025 * SafezoneH)";
text = "-120";
};
class braf_arrow_horiz: braf_arrow_vert
{
idc = 1903;
text = "\braf\braf_air2\braf_optics_air2\A29\data\braf_arrow_hor_ca.paa";
x = "-12 * (0.01875 * SafezoneH)";
y = "30 * (0.025 * SafezoneH)";
};
class braf_dir_value: braf_elev_value
{
idc = 1904;
style = 2;
x = "-12.95 * (0.01875 * SafezoneH)";
y = "20 * (0.025 * SafezoneH)";
w = "4.0 * (0.01875 * SafezoneH)";
h = "2.1 * (0.025 * SafezoneH)";
text = "-180";
};
class braf_compass_arrow: RscPicture
{
idc = 1905;
style = 144;
shadow = 0;
text = "\braf\braf_air2\braf_optics_air2\A29\data\braf_arrow_north_ca.paa";
x = "57.5 * (0.01875 * SafezoneH)";
y = "25.5 * (0.02500 * SafezoneH)";
w = "10 * (0.01875 * SafezoneH)";
h = "10 * (0.02500 * SafezoneH)";
};
class braf_compass_n: braf_elev_value
{
idc = -1;
style = 2;
sizeEx = "0.03*SafezoneH";
x = "60 * (0.01875 * SafezoneH)";
y = "28 * (0.02500 * SafezoneH)";
w = "05 * (0.01875 * SafezoneH)";
h = "05 * (0.02500 * SafezoneH)";
text = "N";
};
class BRAF_AirData_Label_HDG: RscText
{
idc = 1906;
style = 2;
shadow = 0;
font = "EtelkaMonospacePro";
sizeEx = "0.02*SafezoneH";
colorText[] = {1,1,1,1};
colorBackground[] = {0,0,0,0};
text = "HDG:";
x="60 * (0.01875 * SafezoneH)";
y = "4.4 * (0.025 * SafezoneH)";
w = "4 * (0.01875 * SafezoneH)";
h = "1.2 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Value_HDG: BRAF_AirData_Label_HDG
{
idc = 1907;
style = 1;
text = "000";
x = "60 * (0.01875 * SafezoneH)";
w = "5 * (0.01875 * SafezoneH)";
};
class BRAF_AirData_Label_IAS: BRAF_AirData_Label_HDG
{
idc = 1908;
text = "IAS:";
y = "5 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Value_IAS: BRAF_AirData_Value_HDG
{
idc = 1909;
text = "000";
y = "5 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Label_GS: BRAF_AirData_Label_HDG
{
idc = 1910;
text = "GS:";
y = "5.6 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Value_GS: BRAF_AirData_Value_HDG
{
idc = 1911;
text = "000";
y = "5.6 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Label_RALT: BRAF_AirData_Label_HDG
{
idc = 1912;
text = "RALT:";
y = "6.2 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Value_RALT: BRAF_AirData_Value_HDG
{
idc = 1913;
text = "0000";
y = "6.2 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Label_BARO: BRAF_AirData_Label_HDG
{
idc = 1914;
text = "BARO:";
y = "6.8 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Value_BARO: BRAF_AirData_Value_HDG
{
idc = 1915;
text = "0000";
y = "6.8 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Label_ROLL: BRAF_AirData_Label_HDG
{
idc = 1916;
text = "ROLL:";
y = "7.4 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Value_ROLL: BRAF_AirData_Value_HDG
{
idc = 1917;
text = "0";
y = "7.4 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Label_PTCH: BRAF_AirData_Label_HDG
{
idc = 1918;
text = "PTCH:";
y = "8 * (0.025 * SafezoneH)";
};
class BRAF_AirData_Value_PTCH: BRAF_AirData_Value_HDG
{
idc = 1919;
text = "0";
y = "8 * (0.025 * SafezoneH)";
};
};
};
};
class BRAF_RscOptics_Fennec: BRAF_RscOptics_A29
{
};
};
};
class BRAF_A29_Gunner_Optics: Optics_Armored
{
class Wide: RCWSOptics
class Wide: RCWSOptics
{
initFov = 0.5236;
minFov = 0.5236;
maxFov = 0.5236;
opticsDisplayName = "WFOV";
visionMode[] = { "Normal", "TI" };
thermalMode[] = { 0, 1 };
thermalNoise[] = { 0.5, 1.25, 2.5, 0.75, 1, 0, 0, 0.95 };
gunnerOpticsModel = "\braf\braf_air2\braf_optics_air2\A29\braf_a29_gunner_w.p3d";
gunnerOpticsEffect[] = {};
directionStabilized = 1;
};
class Medium: Wide
{
opticsDisplayName = "MFOV";
gunnerOpticsModel = "\braf\braf_air2\braf_optics_air2\A29\braf_a29_gunner_m.p3d";
initFov = 0.0593;
minFov = 0.0593;
maxFov = 0.0593;
};
class Narrow: Wide
{
opticsDisplayName = "NFOV";
gunnerOpticsModel = "\braf\braf_air2\braf_optics_air2\A29\braf_a29_gunner_n.p3d";
initFov = 0.0140;
minFov = 0.0140;
maxFov = 0.0140;
};
class Narrower: Narrow
{
initFov=0.4;
minFov=0.4;
maxFov=0.4;
visionMode[]=
{
"Normal",
"TI"
};
thermalMode[]={0,1};
thermalNoise[]=
{
0.5, //intensity,
1.25, //sharpness,
2.5, //grainSize,
0.75, //intensityX0,
1, //intensityX1,
0, //monochromatic,
0, //static,
0.95 //blurCoef
};
gunnerOpticsModel="\braf\braf_air2\BRAF_Optics_Air2\A29\braf_a29_gunner_w.p3d";
gunnerOpticsEffect[]={};
directionStabilized=1;
opticsDisplayName = "NFOV 2X";
initFov = 0.0070;
minFov = 0.0070;
maxFov = 0.0070;
};
class Medium: Wide
class UltraNarrow: Narrow
{
gunnerOpticsModel="\braf\braf_air2\BRAF_Optics_Air2\A29\braf_a29_gunner_m.p3d";
initFov=0.07;
minFov=0.07;
maxFov=0.07;
opticsDisplayName = "NFOV 4X";
initFov = 0.0035;
minFov = 0.0035;
maxFov = 0.0035;
};
class Narrow: Wide
{
gunnerOpticsModel="\braf\braf_air2\BRAF_Optics_Air2\A29\braf_a29_gunner_n.p3d";
initFov=0.014;
minFov=0.014;
maxFov=0.014;
};
};
};
class BRAF_Fennec_Gunner_Optics: BRAF_A29_Gunner_Optics
{
class Wide;
class Medium;
class Narrow;
class Narrower;
class UltraNarrow;
};

View File

@@ -0,0 +1,315 @@
/*
Author: Brazilian Armed Forces
File: BRAF_AirOptics.hpp
Purpose:
Define a UI (InGame Optics) do A-29 com elementos vanilla + elementos custom (IDCs 9901..9905)
e instala um EventHandler para atualizar os controles em tempo real enquanto a optics estiver ativa.
Correções lógicas aplicadas (padrão Arma 3):
1) onLoad usa _this (minúsculo), não _This
2) EH 'Draw' entrega CONTROL; chamamos a função passando DISPLAY via ctrlParent
3) onUnload remove o EH, evitando acumular handlers após abrir/fechar optics
4) Caminhos usam barra simples '\' (padrão Arma 3), sem inventar '\\'
=======================================================================
BRAF A-29 STARSAPHIRE - DICIONÁRIO DE IDCs (REFERÊNCIA)
=======================================================================
IDDs
300 - Display do optics A-29 (BRAF_RscOptics_A29)
Grupos (ControlsGroup)
170 - CA_IGUI_elements_group (grupo principal do optics)
CUSTOM (BRAF)
9901 - Seta: indicador de elevação (trilho vertical)
9902 - Texto: valor numérico da elevação (ex: -12.3°)
9903 - Seta: indicador de direção (trilho horizontal)
9904 - Texto: valor numérico da direção (ex: -45°)
9905 - Seta: bússola (norte geográfico relativo ao apontamento)
*/
class ScrollBar;
class RscUnitInfo;
class RscControlsGroup;
class RscControlsGroupNoScrollbars;
class CA_HUDRscControlsGroup;
class RscText;
class RangeText: RscText{};
class RscPicture;
class RscOpticsText;
class RscOpticsValue;
class RscIGProgress;
class RscInGameUI
{
class BRAF_RscOptics_A29: RscUnitInfo
{
idd = 300;
controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"};
class VScrollbar;
class HScrollbar;
onLoad = "[""onLoad"",_this,""RscUnitInfo"",'IGUI'] call (uiNamespace getVariable 'BIS_fnc_initDisplay'); _this call BRAF_fnc_initRSC;";
onUnload = "[""onUnload"",_this,""RscUnitInfo"",'IGUI'] call (uiNamespace getVariable 'BIS_fnc_initDisplay')";
class CA_IGUI_elements_group: RscControlsGroup
{
idc = 170;
class VScrollbar: VScrollbar { width = 0; };
class HScrollbar: HScrollbar { height = 0; };
x = "000 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH)/2))";
y = "000 * (0.02500 * SafezoneH) + (SafezoneY)";
w = "100 * (0.01875 * SafezoneH)";
h = "080 * (0.02500 * SafezoneH)";
class controls
{
class ValueDistance: RscText
{
style=1;
sizeEx="0.038*SafezoneH";
shadow=0;
font="EtelkaMonospacePro";
idc=198; //idc=183;
text="245678";
colorText[] = {0,0,0,1};
colorBackground[] = {0,0,0,0};
x="45.5 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
w="8 * (0.01875 * SafezoneH)";
h="1.2 * (0.025 * SafezoneH)";
};
class TextDistance: ValueDistance
{
style=0;
idc=1800;
text="Laser dist:";
x="42 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
};
class ValueGrid: ValueDistance
{
idc=171;
text="245678";
x="10 * (0.01875 * SafezoneH)";
y="34 * (0.025 * SafezoneH)";
};
class Textweapon: ValueGrid
{
style=0;
idc=1801;
text="GPS grid:";
x="4.45 * (0.01875 * SafezoneH)";
y="34 * (0.025 * SafezoneH)";
};
class ValueWeapon: ValueDistance
{
idc=172;
text="245678";
x="10 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
};
class TextTarget: ValueGrid
{
style=0;
idc=1802;
text="Target grid:";
x="4.45 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
};
class TextElev: ValueGrid
{
style=0;
idc=1803;
text="Elev:";
x="32 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
};
class ValueElev: ValueDistance
{
idc=175;
text="245";
x="32 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
};
class TextAz: ValueGrid
{
style=0;
idc=1804;
text="Az:";
x="24.5 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
};
class ValueAz: ValueDistance
{
idc=156;
text="245";
x="23 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
};
class TextAlt: ValueGrid
{
style=0;
idc=1805;
text="Alt:";
x="24.5 * (0.01875 * SafezoneH)";
y="34 * (0.025 * SafezoneH)";
};
class ValueAlt: ValueDistance
{
idc=189;
text="245678";
x="24 * (0.01875 * SafezoneH)";
y="34 * (0.025 * SafezoneH)";
};
class CA_Time: ValueGrid
{
idc=190;
style=0;
shadow=0;
text="XX:XX:xx";
x="54 * (0.01875 * SafezoneH)";
y="35.75 * (0.025 * SafezoneH)";
w="6.5 * (0.01875 * SafezoneH)";
};
class CA_VisionMode: RscText
{
idc=152;
sizeEx="0.03*SafezoneH";
style=0;
shadow=0;
font="EtelkaMonospacePro";
text="DTV";
x="1 * (0.01875 * SafezoneH)";
y="3 * (0.025 * SafezoneH)";
w="5 * (0.01875 * SafezoneH)";
h="1.2 * (0.025 * SafezoneH)";
colorText[] = {0,0,0,1};
};
class CA_FlirMode: CA_VisionMode
{
idc=153;
text="BHOT";
x="5 * (0.01875 * SafezoneH)";
};
class CA_Laser: RscText
{
idc=158;
style="0x30 + 0x800";
sizeEx="0.038*SafezoneH";
colorText[]={0.70599997,0.074500002,0.0196,1};
shadow=0;
font="EtelkaMonospacePro";
text="\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa";
x="33 * (0.01875 * SafezoneH)";
y="8 * (0.025 * SafezoneH)";
w="3.5 * (0.01875 * SafezoneH)";
h="1.5 * (0.025 * SafezoneH)";
};
class braf_arrow_vert: RscPicture
{
idc = 1901;
text = "\braf\braf_air2\braf_optics_air2\A29\data\braf_arrow_vert_ca.paa";
shadow = 2;
sizeEx = "0.06*SafezoneH";
x = "0 * (0.01875 * SafezoneH)";
y = "16.6 * (0.025 * SafezoneH)";
w = "4.2 * (0.01875 * SafezoneH)";
h = "4.2 * (0.025 * SafezoneH)";
color[] = {1,1,1,1};
colorBackground[] = {0,0,0,0};
};
class braf_arrow_horiz: braf_arrow_vert
{
idc = 1903;
text = "\braf\braf_air2\braf_optics_air2\A29\data\braf_arrow_hor_ca.paa";
x = "24.45 * (0.01875 * SafezoneH)";
y = "29 * (0.025 * SafezoneH)";
w = "4.2 * (0.01875 * SafezoneH)";
};
class braf_compass_arrow: RscPicture
{
idc = 1905;
style = 144;
text = "\braf\braf_air2\braf_optics_air2\A29\data\braf_arrow_north_ca.paa";
x = "56 * (0.01875 * SafezoneH)";
y = "28 * (0.02500 * SafezoneH)";
w = "05 * (0.01875 * SafezoneH)";
h = "05 * (0.02500 * SafezoneH)";
};
class braf_elev_value: RscText
{
idc = 1902;
style = 2;
shadow = 2;
sizeEx = "0.06*SafezoneH";
colorText[] = {1,1,1,1};
colorBackground[] = {0,0,0,0};
x = "0 * (0.01875 * SafezoneH)";
y = "16.6 * (0.025 * SafezoneH)";
w = "4.2 * (0.01875 * SafezoneH)";
h = "1.5 * (0.025 * SafezoneH)";
text = "-120";
};
class braf_dir_value: braf_elev_value
{
idc = 1904;
x = "24.15 * (0.01875 * SafezoneH)";
y = "28.45 * (0.025 * SafezoneH)";
w = "4.2 * (0.01875 * SafezoneH)";
h = "1.5 * (0.025 * SafezoneH)";
text = "-180";
};
class braf_compass_n: braf_elev_value
{
idc = -1;
style = 1;
x = "56 * (0.01875 * SafezoneH)";
y = "29.5 * (0.02500 * SafezoneH)";
w = "05 * (0.01875 * SafezoneH)";
h = "2 * (0.02500 * SafezoneH)";
text = "N";
};
};
};
};
};
class BRAF_A29_Gunner_Optics: Optics_Armored
{
class Wide: RCWSOptics
{
initFov = 0.4;
minFov = 0.4;
maxFov = 0.4;
visionMode[] = { "Normal", "TI" };
thermalMode[] = { 0, 1 };
thermalNoise[] = { 0.5, 1.25, 2.5, 0.75, 1, 0, 0, 0.95 };
gunnerOpticsModel = "\braf\braf_air2\braf_optics_air2\A29\braf_a29_gunner_w.p3d";
gunnerOpticsEffect[] = {};
directionStabilized = 1;
};
class Medium: Wide
{
gunnerOpticsModel = "\braf\braf_air2\braf_optics_air2\A29\braf_a29_gunner_m.p3d";
initFov = 0.07;
minFov = 0.07;
maxFov = 0.07;
};
class Narrow: Wide
{
gunnerOpticsModel = "\braf\braf_air2\braf_optics_air2\A29\braf_a29_gunner_n.p3d";
initFov = 0.014;
minFov = 0.014;
maxFov = 0.014;
};
};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -5,8 +5,10 @@ class CfgMovesBasic
{
A29_Pilot="A29_Pilot";
A29_Pilot_Dead="A29_Pilot_Dead";
//A29_Copilot="A29_Copilot";
//A29_Copilot_Dead="A29_Copilot_Dead";
/*
braf_ejection_chute_Pilot = "braf_ejection_chute_Pilot";
braf_ejection_chute_KIA = "braf_ejection_chute_KIA";
*/
};
};
@@ -19,8 +21,8 @@ class CfgMovesMaleSdr : CfgMovesBasic
{
actions="DeadActions";
speed=0.5;
looped="false";
terminal=true;
looped= 0;
terminal= 1;
file="braf\braf_air2\Braf_air_anim\a29_pilot_kia.rtm";
connectTo[]={"DeadState", 0.1};
};
@@ -30,19 +32,29 @@ class CfgMovesMaleSdr : CfgMovesBasic
interpolateTo[]={"A29_Pilot_Dead", 1};
};
/*
class A29_Copilot_Dead: DefaultDie
class braf_ejection_chute_KIA: DefaultDie
{
actions="DeadActions";
speed=0.5;
looped="false";
terminal=true;
file="braf\braf_air2\Braf_air_anim\a29_copilot_kia.rtm";
actions = "DeadActions";
file = "\braf\braf_air2\braf_air_anim\braf_ejection_chute_KIA.rtm";
speed = 0.5;
terminal = 1;
soundEnabled = 0;
looped = 0;
connectTo[]={"DeadState", 0.1};
};
class A29_Copilot: Crew
class braf_ejection_chute_Pilot: Crew
{
file="braf\braf_air2\Braf_air_anim\a29_copilot_alive.rtm";
interpolateTo[]={"A29_Copilot_Dead", 1};
file = "\braf\braf_air2\braf_air_anim\braf_ejection_chute_init.rtm";
interpolateTo[]={"braf_ejection_chute_KIA", 1};
interpolationSpeed = 1;
speed = -4;
hideWeaponsDriver = 1;
hideWeaponsGunner = 1;
hideWeaponsCargo = 1;
looped = 0;
useIdles = 0;
leftHandIKCurve[] = {1};
rightHandIKCurve[] = {1};
};
*/
};

View File

@@ -84,7 +84,7 @@ class Stage6
};
class Stage7
{
texture = "a3\data\env_land_co.paa";
texture = "a3\data_f\env_land_co.paa";
useWorldEnvMap="true";
uvSource="tex";
class uvTransform

View File

@@ -0,0 +1,84 @@
#define _ARMA_
ambient[] = {1,1,1,1};
diffuse[] = {1,1,1,1};
forcedDiffuse[] = {0,0,0,0};
emmisive[] = {0,0,0,1};
specular[] = {0.2,0.4,0.3,1};
specularPower = 8;
PixelShaderID = "Super";
VertexShaderID = "Super";
class Stage1
{
texture = "braf\braf_air2\braf_airplanes\braf_super_tucano\data\ejection_chute_nohq.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1,0,0};
up[] = {0,1,0};
dir[] = {0,0,0};
pos[] = {0,0,0};
};
};
class Stage2
{
texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)";
uvSource = "tex";
class uvTransform
{
aside[] = {80,0,0};
up[] = {0,40,0};
dir[] = {0,0,0};
pos[] = {0,0,0};
};
};
class Stage3
{
texture = "#(argb,8,8,3)color(0,0,0,0,MC)";
uvSource = "tex";
class uvTransform
{
aside[] = {1,0,0};
up[] = {0,1,0};
dir[] = {0,0,0};
pos[] = {0,0,0};
};
};
class Stage4
{
texture = "braf\braf_air2\braf_airplanes\braf_super_tucano\data\ejection_chute_as.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1,0,0};
up[] = {0,1,0};
dir[] = {0,0,0};
pos[] = {0,0,0};
};
};
class Stage5
{
texture = "braf\braf_air2\braf_airplanes\braf_super_tucano\data\ejection_chute_smdi.paa";
uvSource = "tex";
class uvTransform
{
aside[] = {1,0,0};
up[] = {0,1,0};
dir[] = {0,0,0};
pos[] = {0,0,0};
};
};
class Stage6
{
texture = "#(ai,128,128,1)fresnel(1.72,0.01)";
uvSource = "none";
};
class Stage7
{
texture = "a3\data_f\env_land_co.paa";
uvSource = "none";
};
class StageTI
{
texture = "a3\data_f\default_ti_ca.paa";
};

View File

@@ -285,7 +285,7 @@ class braf_A29_base: Plane_Fighter_03_base_F
armor=2;
explosionShielding=3;
passThrough=0.3;
radius=0.2L;
radius=0.2;
minimalHit=0.05;
};
class HitLCElevator: HitHull
@@ -1014,7 +1014,7 @@ class braf_A29_base: Plane_Fighter_03_base_F
};
class Eventhandlers : Eventhandlers
{
init="if (local (_this select 0)) then { [(_this select 0), """", [], false] call BIS_fnc_initVehicle; };";
init="if (local (_this select 0)) then { [(_this select 0), """", [], false] call BIS_fnc_initVehicle; (_this select 0) setVariable ['BRAF_InterceptionLight', 0]; };";
hit="_this call bis_fnc_planeAiEject";
};
hiddenSelections[]=
@@ -1534,18 +1534,24 @@ class braf_A29B: BRAF_A29_base
condition="this animationPhase 'BackFLIrMotion' > 0.5 and (player in this) and (driver this != player)";
statement="this animate ['BackEICASMotion',1] && this animate ['BackFLIrMotion',0]";
};
class BRAF_A29B_Eject
class BRAF_A29B_Pilot_Eject
{
priority=0.05;
shortcut="Eject";
displayName="<t color='#FF0000'>Eject</t>";
condition="(player in this) && {speed this > 1}";
statement="[this] spawn BRAF_fnc_EjectPilot; [this] call BRAF_fnc_EjectCopilot";
position="pilotcontrol";
radius=10;
onlyforplayer=1;
showWindow=0;
hideOnUse=1;
priority=0.05;
shortcut="Eject";
displayName="<t color='#FF0000'>Eject - Pilot</t>";
condition="(driver this == player) && {speed this > 1}";
statement="[this] spawn BRAF_fnc_EjectPilot";
position="pilotcontrol";
radius=10;
onlyforplayer=1;
showWindow=0;
hideOnUse=1;
};
class BRAF_A29B_Gunner_Eject: BRAF_A29B_Pilot_Eject
{
displayName="<t color='#FF0000'>Eject - Gunner</t>";
condition="(gunner this == player) && {speed this > 1}";
statement="[this] spawn BRAF_fnc_EjectCopilot";
};
};
class NewTurret;
@@ -1627,6 +1633,12 @@ class braf_A29B: BRAF_A29_base
class Narrow: Narrow
{
};
class Narrower: Narrower
{
};
class UltraNarrow: UltraNarrow
{
};
};
class OpticsOut
{
@@ -2105,9 +2117,33 @@ class braf_A29B_90k: BRAF_A29B
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\Extras_Joker_co.paa"
};
class TextureSources
{
class FAB_90k
{
displayName="A-29B Super Tucano Brazilian Air Force Comemorative 90k hours Joker Fighter Squadron";
author="BRAF Team";
factions[]=
{
"BRAF_FAB"
};
textures[]=
{
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\camo1_90k_co.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\camo2_co.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\Extras_Joker_co.paa"
};
};
};
textureList[]=
{
"FAB_100k",1
"FAB_90k",1
};
};
class braf_A29B_100k: BRAF_A29B
@@ -2122,7 +2158,7 @@ class braf_A29B_100k: BRAF_A29B
editorPreview="\braf\braf_insignia\editorpreview\air2\BRAF_A29B.jpg";
class Armory
{
description="A-29B Super Tucano Brazilian Air Force Comemorative 1o0k hours Joker Fighter Squadron";
description="A-29B Super Tucano Brazilian Air Force Comemorative 100k hours Joker Fighter Squadron";
};
crew="braf_characters_aviation_air_force_fighter_pilot";
typicalcargo[]={""};
@@ -2138,9 +2174,33 @@ class braf_A29B_100k: BRAF_A29B
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\Extras_Joker_co.paa"
};
class TextureSources
{
class FAB_100k
{
displayName="A-29B Super Tucano Brazilian Air Force Comemorative 100k hours Joker Fighter Squadron";
author="BRAF Team";
factions[]=
{
"BRAF_FAB"
};
textures[]=
{
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\camo1_100k_co.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\camo2_co.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\Extras_Joker_co.paa"
};
};
};
textureList[]=
{
"FAB_90k",1
"FAB_100k",1
};
};
class braf_A29B_Jambock: BRAF_A29B
@@ -2175,6 +2235,30 @@ class braf_A29B_Jambock: BRAF_A29B
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\Extras_Jambock_co.paa"
};
class TextureSources
{
class FAB_Jambock
{
displayName="A-29B Super Tucano Brazilian Air Force Comemorative WW2 Jambock Squadron";
author="BRAF Team";
factions[]=
{
"BRAF_FAB"
};
textures[]=
{
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\camo1_Jambock_co.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\camo2_co.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\glass_ca.paa",
"braf\braf_air2\braf_airplanes\braf_super_tucano\Data\Extras_Jambock_co.paa"
};
};
};
textureList[]=
{
"FAB_Jambock",1
@@ -2316,4 +2400,64 @@ class braf_ejection_seat_A29: braf_ejection_seat_base
count=3;
};
};
};
};
/*
class braf_ejection_chute_base: Steerable_Parachute_F
{
driverAction = "braf_ejection_chute_Pilot";
Author = "BRAF TEAM";
scope = 0;
mapSize = 20;
animationdrop = "\braf\braf_air2\braf_air_anim\braf_ejection_chute_close.rtm";
animationopen = "\braf\braf_air2\braf_air_anim\braf_ejection_chute_open.rtm";
airinfluence = "1,0";
liftgravity = -14;
maxrotationx = 0.1;
minrotationx = -0.1;
maxrotationz = 0.1;
minrotationz = -0.1;
maxsensitivityhorizontal = 0.005;
maxsensitivityvertical = 0;
minliftduration = 4;
minliftthrust = -14;
maxliftthrust = -12;
mingravity = -2;
maxgravity = -4;
normalgravity = -4;
thrustaccel = 0.1;
thrustdeccel = 0.1;
thrustnormal = 0.1;
turnforcescale = 0.022;
textSingular = "$STR_A3_nameSound_veh_air_parachute_s";
textPlural = "$STR_A3_nameSound_veh_air_parachute_p";
radarType = 0;
openingTime = 5;
hideWeaponsDriver = 0;
class ViewPilot
{
minFov = 0.25;
initFov = 0.7;
maxFov = 1.1;
initAngleX = 0;
minAngleX = -65;
maxAngleX = 85;
initAngleY = 0;
minAngleY = -150;
maxAngleY = 150;
};
};
class braf_ejection_chute: braf_ejection_chute_base
{
scope = 1;
displayName = "Ejection Seat Canopy";
model = "braf\braf_air2\braf_airplanes\braf_super_tucano\braf_ejection_chute.p3d";
hiddenSelections[] =
{
"camo"
};
hiddenSelectionsTextures[] =
{
"\braf\braf_air2\braf_airplanes\braf_super_tucano\Dataa\ejection_chute_co.paa"
};
};
*/

View File

@@ -1,4 +1,3 @@
// GENERAL
maxSpeed=800;
enginePower=1.193;
landingAOA=__EVAL(3*3.1415/180);

View File

@@ -178,6 +178,12 @@ class CfgSkeletons
"canopy",""
};
};
class Skeleton
{
isDiscrete=0;
skeletonInherit="";
skeletonBones[]={"body", "", "striska", "", "fl", "", "bl", "", "fm", "", "mb", "", "fr", "", "rb", ""};
};
};
class CfgModels
{
@@ -1222,6 +1228,21 @@ class CfgModels
unHideValue=-1;
};
};
};
class braf_ejection_chute
{
htMin=0;
htMax=0;
afMax=0;
mfMax=0;
mFact=0;
tBody=0;
skeletonName="Skeleton";
sectionsInherit="";
sections[]={};
class Animations
{
};
};
class braf_ejection_seat_01: braf_a29_ejection_seat{};
class braf_A29_wreck: braf_A29{};

View File

@@ -0,0 +1,28 @@
#define IGUI_GROUP 170
// IDCs (seus)
#define BRAF_ELEV_ARROW 1901
#define BRAF_ELEV_TXT 1902
#define BRAF_AZ_ARROW 1903
#define BRAF_AZ_TXT 1904
#define BRAF_NORTH_ARROW 1905
// RANGES da régua (fixos do seu pod)
#define BRAF_MIN_TURN -180
#define BRAF_MAX_TURN 180
#define BRAF_MIN_ELEV -120
#define BRAF_MAX_ELEV 30
// ====== CONSTANTES DO TAPE (mesmo conceito do USAF) ======
// Azimute (horizontal): X do ponto onde está -180 (início da régua)
// e distância total até +180 (largura da régua)
#define BRAF_AZ_BEG (0.035 * safeZoneW)
#define BRAF_AZ_DIS (0.5375 * safeZoneW)
#define BRAF_AZ_NUM_OFFSET (-0.009 * safeZoneW)
#define BRAF_AZ_TXT_Y_OFFSET (-0.5 * 0.025 * safeZoneH)
// Elevação (vertical): Y do ponto onde está +30 (topo) e distância total até -120 (base)
// (no USAF eles mapeiam para Y)
#define BRAF_EZ_BEG (0.196289 * safeZoneH)
#define BRAF_EZ_DIS (0.684570 * safeZoneH)
#define BRAF_EZ_NUM_OFFSET (0 * safeZoneH)

View File

@@ -0,0 +1,290 @@
/*
Author: Brazilian Armed Forces
File: fn_flirControls.sqf
Objetivo:
- Atualizar indicadores de AZ (direção) e EZ (elevação) do POD FLIR em relação ao corpo da aeronave
- Atualizar indicação de Norte geográfico relativa ao centro do apontamento (compasso)
Padrão adotado:
- Mesmo padrão (carrot/tape):
* ler ctrlPosition
* calcular posição com BEG/DIS/OFFSET
* ctrlSetPosition + ctrlCommit 0
Observação:
- Este script assume que:
* os controles estão acessíveis via _display displayCtrl <IDC>
* existem constantes BEG/DIS/OFFSET para a régua horizontal (AZ) e vertical (EZ)
*/
#define IGUI_GROUP 170
#define BRAF_ELEV_ARROW 1901
#define BRAF_ELEV_TXT 1902
#define BRAF_AZ_ARROW 1903
#define BRAF_AZ_TXT 1904
#define BRAF_NORTH_ARROW 1905
#define BRAF_HDG_VALUE 1907
#define BRAF_IAS_VALUE 1909
#define BRAF_GS_VALUE 1911
#define BRAF_RALT_VALUE 1913
#define BRAF_BARO_VALUE 1915
#define BRAF_ROLL_VALUE 1917
#define BRAF_PTCH_VALUE 1919
#define BRAF_MIN_TURN -180
#define BRAF_MAX_TURN 180
#define BRAF_MIN_ELEV -120
#define BRAF_MAX_ELEV 30
#define BRAF_AZ_BEG (0.04 * safeZoneW)
#define BRAF_AZ_DIS (0.5375 * safeZoneW)
#define BRAF_AZ_NUM_OFFSET (0.5 * safeZoneW)
#define BRAF_AZ_TXT_Y_OFFSET (-1 * 0.025 * safeZoneH)
#define BRAF_EZ_BEG (0.215 * safeZoneH)
#define BRAF_EZ_DIS (0.52 * safeZoneH)
#define BRAF_EZ_NUM_OFFSET (0 * safeZoneH)
disableSerialization;
params ["_display"];
// Segurança: display inválido
if (isNull _display) exitWith {};
// Segurança: só atualiza quando estiver em optics
if (cameraView != "GUNNER") exitWith {};
// Veículo base (corpo)
private _veh = vehicle player;
if (isNull _veh) exitWith {};
// CORREÇÃO: Validar que os controles customizados existem antes de acessá-los
// Previne crashes se os IDCs não foram criados corretamente na config
if (isNull (_display displayCtrl BRAF_ELEV_ARROW)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle de seta de elevação (IDC 1901) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_AZ_ARROW)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle de seta de azimute (IDC 1903) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_ELEV_TXT)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle de texto de elevação (IDC 1902) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_AZ_TXT)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle de texto de azimute (IDC 1904) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_NORTH_ARROW)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle da bússola norte (IDC 1905) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_HDG_VALUE)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle HDG (IDC 1907) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_IAS_VALUE)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle IAS (IDC 1909) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_GS_VALUE)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle GS (IDC 1911) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_RALT_VALUE)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle RALT (IDC 1913) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_BARO_VALUE)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle BARO (IDC 1915) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_ROLL_VALUE)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle ROLL (IDC 1917) não encontrado!";
};
if (isNull (_display displayCtrl BRAF_PTCH_VALUE)) exitWith {
systemChat "[BRAF A-29] ERRO: Controle PTCH (IDC 1919) não encontrado!";
};
// ======================================================================
// 1) Captura da direção REAL da câmera (mundo) e conversão para o corpo
// ======================================================================
// Vetor forward real da câmera ativa (mundo)
private _p0 = positionCameraToWorld [0, 0, 0];
private _p1 = positionCameraToWorld [0, 0, 1];
private _vW = _p1 vectorDiff _p0;
private _lenW = vectorMagnitude _vW;
if (_lenW < 0.0001) exitWith {};
_vW = _vW vectorMultiply (1/_lenW);
// Direção absoluta (mundo) em RADIANOS para o compasso
// atan2 retorna radianos: 0 = norte, π/2 = leste, π ou -π = sul, -π/2 = oeste
private _absDir_rad = (_vW select 0) atan2 (_vW select 1);
// Normalizar para [0, 2π) para ficar positivo
if (_absDir_rad < 0) then {
_absDir_rad = _absDir_rad + (2 * pi);
};
// Converte vetor para o referencial do veículo (corpo)
private _vM = _veh vectorWorldToModel _vW;
private _lenM = vectorMagnitude _vM;
if (_lenM < 0.0001) exitWith {};
_vM = _vM vectorMultiply (1/_lenM);
private _x = _vM select 0;
private _y = _vM select 1;
private _z = _vM select 2;
// AZIMUTH (yaw) relativo ao corpo: [-180..+180] em GRAUS
private _azimuth = (_x atan2 _y);
if (_azimuth > 180) then {
_azimuth = _azimuth - 360;
};
if (_azimuth < -180) then {
_azimuth = _azimuth + 360;
};
// ELEVATION (pitch) relativo ao corpo, permitindo < -90 em GRAUS
private _h = sqrt (_x*_x + _y*_y);
private _signY = if (_y < 0) then {
-1
} else {
1
};
private _yPrime = _h * _signY;
private _elevation = (_z atan2 _yPrime);
// Clamp nos limites do POD
_azimuth = _azimuth max BRAF_MIN_TURN min BRAF_MAX_TURN; // -180..+180
_elevation = _elevation max BRAF_MIN_ELEV min BRAF_MAX_ELEV; // -120..+30
// ======================================================================
// 2) TURRET AZ (Azimute/Direção Horizontal)
// ======================================================================
private _turretAZcarrotCtrlPos = ctrlPosition (_display displayCtrl BRAF_AZ_ARROW);
private _turretAZtextCtrlPos = ctrlPosition (_display displayCtrl BRAF_AZ_TXT);
// X do carrot na régua de -180..+180
// CORREÇÃO: Referências de constantes alteradas para BRAF_AZ_BEG e BRAF_AZ_DIS
private _azPosX = BRAF_AZ_BEG + (((_azimuth + 180) / 360) * BRAF_AZ_DIS);
// Atualizar posição da seta horizontal (carrot) - IDC 1903
(_display displayCtrl BRAF_AZ_ARROW) ctrlSetPosition [
_azPosX,
_turretAZcarrotCtrlPos select 1,
_turretAZcarrotCtrlPos select 2,
_turretAZcarrotCtrlPos select 3
];
(_display displayCtrl BRAF_AZ_ARROW) ctrlCommit 0;
// Atualizar valor numérico do azimute - IDC 1904
// O texto usa o mesmo centro X da seta e fica acima dela.
(_display displayCtrl BRAF_AZ_TXT) ctrlSetText str (round _azimuth);
private _azArrowW = _turretAZcarrotCtrlPos select 2;
private _azTextW = _turretAZtextCtrlPos select 2;
(_display displayCtrl BRAF_AZ_TXT) ctrlSetPosition [
_azPosX + ((_azArrowW - _azTextW) / 2),
(_turretAZcarrotCtrlPos select 1) + BRAF_AZ_TXT_Y_OFFSET,
_azTextW,
_turretAZtextCtrlPos select 3
];
(_display displayCtrl BRAF_AZ_TXT) ctrlCommit 0;
// ======================================================================
// 3) TURRET EZ (Elevação/pitch Vertical)
// Régua: +30 (topo) -> -120 (base)
// ======================================================================
private _turretEZcarrotCtrlPos = ctrlPosition (_display displayCtrl BRAF_ELEV_ARROW);
private _turretEZtextCtrlPos = ctrlPosition (_display displayCtrl BRAF_ELEV_TXT);
// tEl: 0 no topo (+30), 1 na base (-120)
private _tEl = (BRAF_MAX_ELEV - _elevation) / (BRAF_MAX_ELEV - BRAF_MIN_ELEV);
if (_tEl < 0) then {
_tEl = 0;
};
if (_tEl > 1) then {
_tEl = 1;
};
// Y da régua
// CORREÇÃO: Referências de constantes alteradas para BRAF_EZ_BEG e BRAF_EZ_DIS
private _elevPos = BRAF_EZ_BEG + (_tEl * BRAF_EZ_DIS);
// Atualizar posição da seta vertical (carrot) - IDC 1901
(_display displayCtrl BRAF_ELEV_ARROW) ctrlSetPosition [
_turretEZcarrotCtrlPos select 0,
_elevPos,
_turretEZcarrotCtrlPos select 2,
_turretEZcarrotCtrlPos select 3
];
(_display displayCtrl BRAF_ELEV_ARROW) ctrlCommit 0;
// Atualizar valor numérico da elevação - IDC 1902
(_display displayCtrl BRAF_ELEV_TXT) ctrlSetText str (round _elevation);
(_display displayCtrl BRAF_ELEV_TXT) ctrlSetPosition [
_turretEZtextCtrlPos select 0,
_elevPos + BRAF_EZ_NUM_OFFSET,
_turretEZtextCtrlPos select 2,
_turretEZtextCtrlPos select 3
];
// CORREÇÃO: Referência de constante alterada para BRAF_EZ_NUM_OFFSET
(_display displayCtrl BRAF_ELEV_TXT) ctrlCommit 0;
// ======================================================================
// 4) AIRCRAFT DATA - HDG / IAS / GS / RALT / BARO / ROLL / PTCH
// ======================================================================
private _hdg = round (getDir _veh);
private _ias = round (speed _veh);
private _gs = round ((vectorMagnitude (velocity _veh)) * 3.6);
private _ralt = round ((getPosATL _veh) select 2);
private _baro = round ((getPosASL _veh) select 2);
private _pitchBank = _veh call BIS_fnc_getPitchBank;
private _ptch = round (_pitchBank select 0);
private _roll = round (_pitchBank select 1);
private _ctrlHDG = _display displayCtrl BRAF_HDG_VALUE;
private _ctrlIAS = _display displayCtrl BRAF_IAS_VALUE;
private _ctrlGS = _display displayCtrl BRAF_GS_VALUE;
private _ctrlRALT = _display displayCtrl BRAF_RALT_VALUE;
private _ctrlBARO = _display displayCtrl BRAF_BARO_VALUE;
private _ctrlROLL = _display displayCtrl BRAF_ROLL_VALUE;
private _ctrlPTCH = _display displayCtrl BRAF_PTCH_VALUE;
if (!isNull _ctrlHDG) then {
_ctrlHDG ctrlSetText format ["%1", _hdg];
};
if (!isNull _ctrlIAS) then {
_ctrlIAS ctrlSetText format ["%1", _ias];
};
if (!isNull _ctrlGS) then {
_ctrlGS ctrlSetText format ["%1", _gs];
};
if (!isNull _ctrlRALT) then {
_ctrlRALT ctrlSetText format ["%1", _ralt];
};
if (!isNull _ctrlBARO) then {
_ctrlBARO ctrlSetText format ["%1", _baro];
};
if (!isNull _ctrlROLL) then {
_ctrlROLL ctrlSetText format ["%1", _roll];
};
if (!isNull _ctrlPTCH) then {
_ctrlPTCH ctrlSetText format ["%1", _ptch];
};
// ======================================================================
// 5) COMPASS N (Bússola Norte Geográfico)
// ======================================================================
// CORREÇÃO: Referência de IDC alterada:
// COMPASS_N_ARROW → BRAF_NORTH_ARROW (IDC 1905)
// Motivo: Alinhar com nomenclatura definida em braf_constants.h
//
// A fórmula: rotação_seta = -_absDir_rad
// Isso faz a seta apontar para o NORTE true em relação ao que a câmera vê:
// - Se câmera aponta NORTE: -0° → seta aponta PARA CIMA (norte)
// - Se câmera aponta LESTE: -π/2 → seta aponta PARA A ESQUERDA (norte relativo)
// - Se câmera aponta SUL: -π → seta aponta PARA BAIXO (norte relativo)
// - Se câmera aponta OESTE: -(-π/2) = +π/2 → seta aponta PARA A DIREITA (norte relativo)
(_display displayCtrl BRAF_NORTH_ARROW) ctrlSetAngle [ -_absDir_rad, 0.5, 0.5 ];

View File

@@ -0,0 +1,48 @@
/*
Author: Brazilian Armed Forces
File: fn_initRSC.sqf
Objetivo:
- Cria e gerencia o loop EachFrame que chama uma função de atualização BRAF_fnc_flirControls
*/
disableSerialization;
params ["_display"];
// Diagnóstico: Verificar se a função está definida
if (isNil "BRAF_fnc_flirControls") then {
systemChat "[BRAF A-29] AVISO: BRAF_fnc_flirControls não foi carregada!";
};
uiNamespace setVariable ["BRAF_A29_UI_Display", _display];
if ((uiNamespace getVariable ["BRAF_A29_PFH_eachFrame", -1]) > -1) then {
removeMissionEventHandler ["EachFrame", (uiNamespace getVariable "BRAF_A29_PFH_eachFrame")];
uiNamespace setVariable ["BRAF_A29_PFH_eachFrame", nil];
};
private _pfh = addMissionEventHandler ["EachFrame", {
if (cameraView != "GUNNER") exitWith {};
private _display = uiNamespace getVariable ["BRAF_A29_UI_Display", displayNull];
if (isNull _display) exitWith {
removeMissionEventHandler ["EachFrame", (uiNamespace getVariable "BRAF_A29_PFH_eachFrame")];
uiNamespace setVariable ["BRAF_A29_PFH_eachFrame", nil];
uiNamespace setVariable ["BRAF_A29_UI_Display", nil];
};
private _veh = vehicle player;
if (isNull _veh) exitWith {
removeMissionEventHandler ["EachFrame", (uiNamespace getVariable "BRAF_A29_PFH_eachFrame")];
uiNamespace setVariable ["BRAF_A29_PFH_eachFrame", nil];
uiNamespace setVariable ["BRAF_A29_UI_Display", nil];
};
[_display] call BRAF_fnc_flirControls;
}];
uiNamespace setVariable ["BRAF_A29_PFH_eachFrame", _pfh];
//systemChat "[BRAF A-29] Sistema FLIR iniciado com sucesso";

View File

@@ -27,7 +27,7 @@
Requirments:
- Compatible aircrafat must have a config definition for all sub-sytems that will be invoked by this function.
- Compatible aircraft must have a config definition for all sub-sytems that will be invoked by this function.
1- Aircrfat model must have memory a point called "smoker_spawn" definig the position where to attach smoke generator.

View File

@@ -1,11 +1,8 @@
class CfgPatches
{
class BRAF_Air2
{
class CfgPatches {
class BRAF_Air2 {
author = "BRAF Team";
addonRootClass = "braf";
requiredAddons[] =
{
requiredAddons[] = {
"A3_Air_F",
"A3_Air_F_Jets",
"A3_Air_F_Jets_Plane_Fighter_04",
@@ -18,77 +15,74 @@ class CfgPatches
"BRAF_Air",
};
requiredVersion = 0.1;
units[] =
{
// Aircrafts
"BRAF_Gripen",
"BRAF_A29A",
"BRAF_A29_EDA",
"BRAF_A29B",
"BRAF_A29B_90k",
"BRAF_A29B_100k",
"BRAF_A29B_Jambock",
// Wreck_Model
"BRAF_A29A_wreck_F",
// Canopy
"BRAF_A29_canopy",
"BRAF_A29_canopy_EDA",
"BRAF_A29_canopy_Jambock",
//Ejection_Seats
"BRAF_ejection_seat_base",
"BRAF_ejection_seat_A29"
};
weapons[] =
{
// MG
"BRAF_M3W_A29",
units[] = {
// Aircrafts
"BRAF_Gripen",
"BRAF_A29A",
"BRAF_A29_EDA",
"BRAF_A29B",
"BRAF_A29B_90k",
"BRAF_A29B_100k",
"BRAF_A29B_Jambock",
// Master Safe
"BRAF_master_arm_safe",
// AA Missile
"BRAF_MAA1A_Launcher_weapon",
// Wreck_Model
"BRAF_A29A_wreck_F",
// Rockets
"BRAF_EQ_LMF_70_19_he_weapon",
"BRAF_EQ_LMF_70_19_ap_weapon",
"BRAF_EQ_LMF_70_7_he_weapon",
"BRAF_EQ_LMF_70_7_ap_weapon",
// Bombs
"BRAF_EFT_weapon",
"BRAF_Mk82_weapon",
"BRAF_M117_weapon",
"BRAF_GBU12_weapon",
"BRAF_GBU58_weapon"
};
// Canopy
"BRAF_A29_canopy",
"BRAF_A29_canopy_EDA",
"BRAF_A29_canopy_Jambock",
// Ejection_Seats
"BRAF_ejection_seat_base",
"BRAF_ejection_seat_A29"};
weapons[] = {
// MG
"BRAF_M3W_A29",
// Master Safe
"BRAF_master_arm_safe",
// AA Missile
"BRAF_MAA1A_Launcher_weapon",
// Rockets
"BRAF_EQ_LMF_70_19_he_weapon",
"BRAF_EQ_LMF_70_19_ap_weapon",
"BRAF_EQ_LMF_70_7_he_weapon",
"BRAF_EQ_LMF_70_7_ap_weapon",
// Bombs
"BRAF_EFT_weapon",
"BRAF_Mk82_weapon",
"BRAF_M117_weapon",
"BRAF_GBU12_weapon",
"BRAF_GBU58_weapon"};
};
};
class CfgFunctions {
class BRAF {
tag = "BRAF";
class functions
{
class EjectCopilot
{
file = "braf\braf_air2\braf_airplanes\braf_super_tucano\data\fnc\fn_copilot_eject.sqf";
class functions {
class EjectCopilot {
file = "braf\braf_air2\braf_fnc\fn_copilot_eject.sqf";
};
class EjectPilot
{
file = "braf\braf_air2\braf_airplanes\braf_super_tucano\data\fnc\fn_pilot_eject.sqf";
class EjectPilot {
file = "braf\braf_air2\braf_fnc\fn_pilot_eject.sqf";
};
class Smoker
{
file = "braf\braf_air2\braf_airplanes\braf_super_tucano\data\fnc\fn_smoker.sqf";
class Smoker {
file = "braf\braf_air2\braf_fnc\fn_smoker.sqf";
};
class RemoveBeforeFlight
{
file = "braf\braf_air2\braf_airplanes\braf_super_tucano\data\fnc\fn_remove_before_flight.sqf";
};
/*class RemoveBeforeFlight
{
file = "braf\braf_air2\braf_fnc\fn_remove_before_flight.sqf";
};*/
};
class UI {
file = "braf\braf_air2\braf_fnc";
class initRSC {};
class flirControls {};
};
};
};
@@ -114,99 +108,94 @@ class SensorTemplateIR;
class SensorTemplateVisual;
class SensorTemplateMan;
class SensorTemplateNV;
class DefaultVehicleSystemsDisplayManagerLeft
{
class components;
class DefaultVehicleSystemsDisplayManagerLeft {
class components;
};
class DefaultVehicleSystemsDisplayManagerRight
{
class components;
class DefaultVehicleSystemsDisplayManagerRight {
class components;
};
class VehicleSystemsTemplateLeftPilot: DefaultVehicleSystemsDisplayManagerLeft
{
class components;
class VehicleSystemsTemplateLeftPilot
: DefaultVehicleSystemsDisplayManagerLeft {
class components;
};
class VehicleSystemsTemplateRightPilot: DefaultVehicleSystemsDisplayManagerRight
{
class components;
class VehicleSystemsTemplateRightPilot
: DefaultVehicleSystemsDisplayManagerRight {
class components;
};
class VehicleSystemsTemplateLeftDriver: DefaultVehicleSystemsDisplayManagerLeft
{
class components;
class VehicleSystemsTemplateLeftDriver
: DefaultVehicleSystemsDisplayManagerLeft {
class components;
};
class VehicleSystemsTemplateRightDriver: DefaultVehicleSystemsDisplayManagerRight
{
class components;
class VehicleSystemsTemplateRightDriver
: DefaultVehicleSystemsDisplayManagerRight {
class components;
};
class VehicleSystemsTemplateLeftCommander: DefaultVehicleSystemsDisplayManagerLeft
{
class components;
class VehicleSystemsTemplateLeftCommander
: DefaultVehicleSystemsDisplayManagerLeft {
class components;
};
class VehicleSystemsTemplateRightCommander: DefaultVehicleSystemsDisplayManagerRight
{
class components;
class VehicleSystemsTemplateRightCommander
: DefaultVehicleSystemsDisplayManagerRight {
class components;
};
class VehicleSystemsTemplateLeftGunner: DefaultVehicleSystemsDisplayManagerLeft
{
class components;
class VehicleSystemsTemplateLeftGunner
: DefaultVehicleSystemsDisplayManagerLeft {
class components;
};
class VehicleSystemsTemplateRightGunner: DefaultVehicleSystemsDisplayManagerRight
{
class components;
class VehicleSystemsTemplateRightGunner
: DefaultVehicleSystemsDisplayManagerRight {
class components;
};
class RCWSOptics;
class Optics_Armored;
#include "BRAF_Optics_Air2\BRAF_AirOptics.hpp"
#include "braf_air_anim\CfgMovesBasic.hpp"
class CfgVehicles
{
class Air;
class Plane: Air
{
class NewTurret;
class ViewPilot;
class HitPoints
{
class HitHull;
};
};
class Plane_Base_F: Plane
{
class AnimationSources;
class HitPoints: HitPoints
{
class HitHull;
};
class Turrets
{
class CopilotTurret;
};
};
class Plane_Fighter_03_base_F : Plane_Base_F
{
class AnimationSources;
};
class Plane_Fighter_04_Base_F : Plane_Base_F {};
class I_Plane_Fighter_04_F : Plane_Fighter_04_Base_F {};
class Ejection_Seat_Base_F;
class Plane_Canopy_Base_F;
#include "braf_optics_air2\BRAF_AirOptics.hpp"
class CfgVehicles {
class Air;
class ParachuteBase;
class B_Parachute;
class Steerable_Parachute_F;
class NonSteerable_Parachute_F;
class Plane : Air {
class NewTurret;
class ViewPilot;
class HitPoints {
class HitHull;
};
};
class Plane_Base_F : Plane {
class AnimationSources;
class HitPoints : HitPoints {
class HitHull;
};
class Turrets {
class CopilotTurret;
};
};
class Plane_Fighter_03_base_F : Plane_Base_F {
class AnimationSources;
};
class Plane_Fighter_04_Base_F : Plane_Base_F {};
class I_Plane_Fighter_04_F : Plane_Fighter_04_Base_F {};
class Ejection_Seat_Base_F;
class Plane_Canopy_Base_F;
// Attack and Fighter
#include "BRAF_airplanes\braf_super_tucano\a29_base.hpp"
//#include "BRAF_airplanes\braf_gripen\a4_base.hpp"
//#include "BRAF_airplanes\braf_gripen\amx_base.hpp"
#include "BRAF_airplanes\braf_gripen\f39_base.hpp"
//#include "BRAF_airplanes\braf_gripen\f5_base.hpp"
//#include "BRAF_airplanes\braf_gripen\t27_base.hpp"
// Attack and Fighter
#include "BRAF_airplanes\braf_super_tucano\a29_base.hpp"
// #include "BRAF_airplanes\braf_gripen\a4_base.hpp"
// #include "BRAF_airplanes\braf_gripen\amx_base.hpp"
#include "BRAF_airplanes\braf_gripen\f39_base.hpp"
// #include "BRAF_airplanes\braf_gripen\f5_base.hpp"
// #include "BRAF_airplanes\braf_gripen\t27_base.hpp"
// Patrol and Transport
//#include "BRAF_airplanes\braf_gripen\c95_base.hpp"
//#include "BRAF_airplanes\braf_gripen\c105_base.hpp"
//#include "BRAF_airplanes\braf_gripen\c130_base.hpp"
//#include "BRAF_airplanes\braf_gripen\c390_base.hpp"
//#include "BRAF_airplanes\braf_gripen\c98_base.hpp"
//#include "BRAF_airplanes\braf_gripen\p95_base.hpp"
//#include "BRAF_airplanes\braf_gripen\p3m_base.hpp"
// Patrol and Transport
// #include "BRAF_airplanes\braf_gripen\c95_base.hpp"
// #include "BRAF_airplanes\braf_gripen\c105_base.hpp"
// #include "BRAF_airplanes\braf_gripen\c130_base.hpp"
// #include "BRAF_airplanes\braf_gripen\c390_base.hpp"
// #include "BRAF_airplanes\braf_gripen\c98_base.hpp"
// #include "BRAF_airplanes\braf_gripen\p95_base.hpp"
// #include "BRAF_airplanes\braf_gripen\p3m_base.hpp"
};
#include "BRAF_Air_Weap2\Ammo.hpp"
#include "BRAF_Air_Weap2\Magazines.hpp"

4
braf_air2/textures.lst Normal file
View File

@@ -0,0 +1,4 @@
braf_air2\braf_airplanes\braf_super_tucano\data\a29_sms_co.png
braf_air2\braf_optics_air2\a29\data\braf_a29_reticulo_m_white_ca.png
braf_air2\braf_optics_air2\a29\data\braf_a29_reticulo_n_white_ca.png
braf_air2\braf_optics_air2\a29\data\braf_a29_reticulo_w_white_ca.png