feat(sar): add EFS to FAB Caracal variants

Enable EFS and native flotation configuration for Caracal Fast Rope, SAR, and Transport variants. Record the autocenter Geometry LOD root cause and retain the shared EFS and hoist function migration.
This commit is contained in:
2026-07-19 22:13:15 -03:00
parent e702b91416
commit 3c59733c8a
15 changed files with 570 additions and 220 deletions
@@ -317,13 +317,13 @@ class BRAF_Caracal_Base: Helicopter_Base_H
{
source="user";
animPeriod=0;
initPhase=1;
initPhase=0;
};
class EFS_Hide
{
source="user";
animPeriod=0;
initPhase=1;
initPhase=0;
};
class Hoist_Hide
{
@@ -1027,8 +1027,8 @@ class BRAF_Caracal_FFV: BRAF_Caracal_Base
{
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",1,
"EFS_Hide",0,
"EFS_Cover_Hide",0,
"Door_L_1",1,
"Door_L_2",1,
"Door_R_1",1,
@@ -1215,8 +1215,8 @@ class BRAF_Caracal_2: BRAF_Caracal_Base
editorPreview="\braf\braf_insignia\editorpreview\Air\BRAF_Caracal_2.jpg";
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",1,
"EFS_Hide",0,
"EFS_Cover_Hide",0,
"SAR_Hide",0,
"Pole_Hide",1,
"Hoist_Hide",1,
@@ -1235,43 +1235,43 @@ class BRAF_Caracal_2: BRAF_Caracal_Base
priority=1;
onlyForPlayer=0;
condition="this animationphase 'Hoist_Hide' > 0.9 AND (player in crew this) AND this animationphase 'Door_R_1' > 0.9 AND !(""BRAF_Rescue_Seat"" in (this getVariable ['braf_hoist_spent_payloads', []]))";
statement="[this, ""deploy"", ""BRAF_Rescue_Seat""] execVM ""braf\braf_sar\Braf_Scripts\hoist_controller.sqf""; this animate ['Hoist_Hide',-0.5]";
statement="[this, ""deploy"", ""BRAF_Rescue_Seat""] call BRAF_fnc_hoist; this animate ['Hoist_Hide',-0.5]";
};
class Deploy_Rescue_Basket: Deploy_Rescue_Seat
{
displayname="<t color='#ffaa00'> Deploy Rescue Basket </t>";
condition="this animationphase 'Hoist_Hide' > 0.9 AND (player in crew this) AND this animationphase 'Door_R_1' > 0.9 AND !(""BRAF_Rescue_Basket"" in (this getVariable ['braf_hoist_spent_payloads', []]))";
statement="[this, ""deploy"", ""BRAF_Rescue_Basket""] execVM ""braf\braf_sar\Braf_Scripts\hoist_controller.sqf""; this animate ['Hoist_Hide',-0.5]";
statement="[this, ""deploy"", ""BRAF_Rescue_Basket""] call BRAF_fnc_hoist; this animate ['Hoist_Hide',-0.5]";
};
class Deploy_Rescue_Stretcher: Deploy_Rescue_Seat
{
displayname="<t color='#ffaa00'> Deploy Rescue Stretcher </t>";
condition="this animationphase 'Hoist_Hide' > 0.9 AND (player in crew this) AND this animationphase 'Door_R_1' > 0.9 AND !(""BRAF_Rescue_Stretcher"" in (this getVariable ['braf_hoist_spent_payloads', []]))";
statement="[this, ""deploy"", ""BRAF_Rescue_Stretcher""] execVM ""braf\braf_sar\Braf_Scripts\hoist_controller.sqf""; this animate ['Hoist_Hide',-0.5]";
statement="[this, ""deploy"", ""BRAF_Rescue_Stretcher""] call BRAF_fnc_hoist; this animate ['Hoist_Hide',-0.5]";
};
class Hoist_Down: Deploy_Rescue_Seat
{
displayname="<t color='#ffaa00'> Extend Cable Hook </t>";
condition="this animationphase 'Hoist_Hide' < -0.4 AND this animationphase 'Hoist_Hide' > -0.6 AND (player in crew this) AND this animationphase 'Door_R_1' > 0.9";
statement="[this, ""down""] execVM ""braf\braf_sar\Braf_Scripts\hoist_controller.sqf""; this animate ['Hoist_Hide',-1]; this say3d ""Winch""";
statement="[this, ""down""] call BRAF_fnc_hoist; this animate ['Hoist_Hide',-1]; this say3d ""Winch""";
};
class Hoist_Up: Deploy_Rescue_Seat
{
displayname="<t color='#ffaa00'> Recover Cable Hook </t>";
condition="this animationphase 'Hoist_Hide' < -0.9 AND (player in crew this) AND this animationphase 'Door_R_1' > 0.9";
statement="[this, ""up""] execVM ""braf\braf_sar\Braf_Scripts\hoist_controller.sqf""; this animate ['Hoist_Hide',-0.5]; this say3d ""Winch""";
statement="[this, ""up""] call BRAF_fnc_hoist; this animate ['Hoist_Hide',-0.5]; this say3d ""Winch""";
};
class Recover_Rescue_Seat: Deploy_Rescue_Seat
{
displayname="<t color='#ffaa00'> Retrieve Rescue Payload </t>";
condition="(player in crew this) AND this animationphase 'Door_R_1' > 0.9 AND this animationphase 'Hoist_Hide' < -0.4 AND this animationphase 'Hoist_Hide' > -0.6";
statement="[this, ""recover""] execVM ""braf\braf_sar\Braf_Scripts\hoist_controller.sqf""; this animate ['Hoist_Hide',1]";
statement="[this, ""recover""] call BRAF_fnc_hoist; this animate ['Hoist_Hide',1]";
};
class Hoist_Cut: Deploy_Rescue_Seat
{
displayname="<t color='#b31d00'> Cut Hoist Hook Cable </t>";
condition="(player in crew this) AND this animationphase 'Door_R_1' > 0.9 AND this animationphase 'Hoist_Hide' < 0";
statement="[this, ""cut""] execVM ""braf\braf_sar\Braf_Scripts\hoist_controller.sqf""; this animate ['Hoist_Hide',1]";
statement="[this, ""cut""] call BRAF_fnc_hoist; this animate ['Hoist_Hide',1]";
};
class Open_Door_Left
{
@@ -1613,8 +1613,8 @@ class BRAF_Caracal_3: BRAF_Caracal_Base
};
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",1,
"EFS_Hide",0,
"EFS_Cover_Hide",0,
"SAR_Hide",1,
"Pole_Hide",1,
"Hoist_Hide",0,
@@ -1628,6 +1628,43 @@ class BRAF_Caracal_4: BRAF_Caracal_1
author="BRAF TEAM";
_generalMacro="BRAF_Caracal_4";
displayName="UH-15 Super Cougar (Fast Rope)";
canFloat=1;
waterDamageEngine=0.2;
waterEffect="HeliWater";
waterLeakiness=50;
waterPPInVehicle=1;
waterResistance=1;
waterResistanceCoef=0.5;
class EventHandlers: EventHandlers
{
init="if (local (_this select 0)) then {[(_this select 0), """", [], false] call bis_fnc_initVehicle; [(_this select 0), ""Init""] call BRAF_fnc_efs;};";
};
class UserActions: UserActions
{
class Arm_EFS
{
displayname="<t color='#ffaa00'> Arm EFS </t>";
position="window_pos";
showWindow=1;
radius=10;
priority=1;
onlyForPlayer=0;
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','SAFE']) == 'SAFE')";
statement="[this, ""arm""] call BRAF_fnc_efs";
};
class Disarm_EFS: Arm_EFS
{
displayname="<t color='#ffaa00'> Disarm EFS </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""disarm""] call BRAF_fnc_efs";
};
class Deploy_Floats: Arm_EFS
{
displayname="<t color='#b31d00'> Deploy Floats </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""deployfloats""] call BRAF_fnc_efs";
};
};
editorPreview="\braf\braf_insignia\editorpreview\air\BRAF_Caracal_4.jpg";
faction="BRAF_NAVY";
crew="braf_characters_aviation_navy_pilot";
@@ -1648,8 +1685,8 @@ class BRAF_Caracal_4: BRAF_Caracal_1
};
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",0,
"EFS_Hide",0,
"EFS_Cover_Hide",1,
"Door_L_1",1,
"Door_L_2",1,
"Door_R_1",1,
@@ -1670,10 +1707,47 @@ class BRAF_Caracal_5: BRAF_Caracal_2
editorPreview="\braf\braf_insignia\editorpreview\air\BRAF_Caracal_5.jpg";
faction="BRAF_NAVY";
crew="braf_characters_aviation_navy_pilot";
canFloat=1;
waterDamageEngine=0.2;
waterEffect="HeliWater";
waterLeakiness=50;
waterPPInVehicle=1;
waterResistance=1;
waterResistanceCoef=0.5;
class EventHandlers: EventHandlers
{
init="if (local (_this select 0)) then {[(_this select 0), """", [], false] call bis_fnc_initVehicle; [(_this select 0), ""Init""] call BRAF_fnc_efs;};";
};
class UserActions: UserActions
{
class Arm_EFS
{
displayname="<t color='#ffaa00'> Arm EFS </t>";
position="window_pos";
showWindow=1;
radius=10;
priority=1;
onlyForPlayer=0;
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','SAFE']) == 'SAFE')";
statement="[this, ""arm""] call BRAF_fnc_efs";
};
class Disarm_EFS: Arm_EFS
{
displayname="<t color='#ffaa00'> Disarm EFS </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""disarm""] call BRAF_fnc_efs";
};
class Deploy_Floats: Arm_EFS
{
displayname="<t color='#b31d00'> Deploy Floats </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""deployfloats""] call BRAF_fnc_efs";
};
};
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",0,
"EFS_Hide",0,
"EFS_Cover_Hide",1,
"SAR_Hide",0,
"Pole_Hide",1,
"Hoist_Hide",1,
@@ -1705,10 +1779,47 @@ class BRAF_Caracal_6: BRAF_Caracal_3
editorPreview="\braf\braf_insignia\editorpreview\air\BRAF_Caracal_6.jpg";
faction="BRAF_NAVY";
crew="braf_characters_aviation_navy_pilot";
canFloat=1;
waterDamageEngine=0.2;
waterEffect="HeliWater";
waterLeakiness=50;
waterPPInVehicle=1;
waterResistance=1;
waterResistanceCoef=0.5;
class EventHandlers: EventHandlers
{
init="if (local (_this select 0)) then {[(_this select 0), """", [], false] call bis_fnc_initVehicle; [(_this select 0), ""Init""] call BRAF_fnc_efs;};";
};
class UserActions: UserActions
{
class Arm_EFS
{
displayname="<t color='#ffaa00'> Arm EFS </t>";
position="window_pos";
showWindow=1;
radius=10;
priority=1;
onlyForPlayer=0;
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','SAFE']) == 'SAFE')";
statement="[this, ""arm""] call BRAF_fnc_efs";
};
class Disarm_EFS: Arm_EFS
{
displayname="<t color='#ffaa00'> Disarm EFS </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""disarm""] call BRAF_fnc_efs";
};
class Deploy_Floats: Arm_EFS
{
displayname="<t color='#b31d00'> Deploy Floats </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""deployfloats""] call BRAF_fnc_efs";
};
};
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",0,
"EFS_Hide",0,
"EFS_Cover_Hide",1,
"SAR_Hide",1,
"Pole_Hide",1,
"Hoist_Hide",0,
@@ -1762,10 +1873,47 @@ class BRAF_Caracal_7: BRAF_Caracal_1
editorPreview="\braf\braf_insignia\editorpreview\air\BRAF_Caracal_7.jpg";
faction="BRAF_FAB";
crew="braf_characters_aviation_air_force_pilot";
canFloat=1;
waterDamageEngine=0.2;
waterEffect="HeliWater";
waterLeakiness=50;
waterPPInVehicle=1;
waterResistance=1;
waterResistanceCoef=0.5;
class EventHandlers: EventHandlers
{
init="if (local (_this select 0)) then {[(_this select 0), """", [], false] call bis_fnc_initVehicle; [(_this select 0), ""Init""] call BRAF_fnc_efs;};";
};
class UserActions: UserActions
{
class Arm_EFS
{
displayname="<t color='#ffaa00'> Arm EFS </t>";
position="window_pos";
showWindow=1;
radius=10;
priority=1;
onlyForPlayer=0;
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','SAFE']) == 'SAFE')";
statement="[this, ""arm""] call BRAF_fnc_efs";
};
class Disarm_EFS: Arm_EFS
{
displayname="<t color='#ffaa00'> Disarm EFS </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""disarm""] call BRAF_fnc_efs";
};
class Deploy_Floats: Arm_EFS
{
displayname="<t color='#b31d00'> Deploy Floats </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""deployfloats""] call BRAF_fnc_efs";
};
};
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",0,
"EFS_Hide",0,
"EFS_Cover_Hide",1,
"Door_L_1",1,
"Door_L_2",1,
"Door_R_1",1,
@@ -1802,6 +1950,43 @@ class BRAF_Caracal_8: BRAF_Caracal_2
editorPreview="\braf\braf_insignia\editorpreview\air\BRAF_Caracal_8.jpg";
faction="BRAF_FAB";
crew="braf_characters_aviation_air_force_pilot";
canFloat=1;
waterDamageEngine=0.2;
waterEffect="HeliWater";
waterLeakiness=50;
waterPPInVehicle=1;
waterResistance=1;
waterResistanceCoef=0.5;
class EventHandlers: EventHandlers
{
init="if (local (_this select 0)) then {[(_this select 0), """", [], false] call bis_fnc_initVehicle; [(_this select 0), ""Init""] call BRAF_fnc_efs;};";
};
class UserActions: UserActions
{
class Arm_EFS
{
displayname="<t color='#ffaa00'> Arm EFS </t>";
position="window_pos";
showWindow=1;
radius=10;
priority=1;
onlyForPlayer=0;
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','SAFE']) == 'SAFE')";
statement="[this, ""arm""] call BRAF_fnc_efs";
};
class Disarm_EFS: Arm_EFS
{
displayname="<t color='#ffaa00'> Disarm EFS </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""disarm""] call BRAF_fnc_efs";
};
class Deploy_Floats: Arm_EFS
{
displayname="<t color='#b31d00'> Deploy Floats </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""deployfloats""] call BRAF_fnc_efs";
};
};
hiddenSelectionsTextures[]=
{
"braf\braf_air\BRAF_helicopters\BRAF_Caracal\data\FAB\Camo1_co.paa",
@@ -1820,8 +2005,8 @@ class BRAF_Caracal_8: BRAF_Caracal_2
};
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",0,
"EFS_Hide",0,
"EFS_Cover_Hide",1,
"SAR_Hide",0,
"Pole_Hide",1,
"Hoist_Hide",1,
@@ -1838,6 +2023,43 @@ class BRAF_Caracal_9: BRAF_Caracal_3
editorPreview="\braf\braf_insignia\editorpreview\air\BRAF_Caracal_9.jpg";
faction="BRAF_FAB";
crew="braf_characters_aviation_air_force_pilot";
canFloat=1;
waterDamageEngine=0.2;
waterEffect="HeliWater";
waterLeakiness=50;
waterPPInVehicle=1;
waterResistance=1;
waterResistanceCoef=0.5;
class EventHandlers: EventHandlers
{
init="if (local (_this select 0)) then {[(_this select 0), """", [], false] call bis_fnc_initVehicle; [(_this select 0), ""Init""] call BRAF_fnc_efs;};";
};
class UserActions: UserActions
{
class Arm_EFS
{
displayname="<t color='#ffaa00'> Arm EFS </t>";
position="window_pos";
showWindow=1;
radius=10;
priority=1;
onlyForPlayer=0;
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','SAFE']) == 'SAFE')";
statement="[this, ""arm""] call BRAF_fnc_efs";
};
class Disarm_EFS: Arm_EFS
{
displayname="<t color='#ffaa00'> Disarm EFS </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""disarm""] call BRAF_fnc_efs";
};
class Deploy_Floats: Arm_EFS
{
displayname="<t color='#b31d00'> Deploy Floats </t>";
condition="getNumber (configOf this >> 'canFloat') == 1 AND this animationphase 'EFS_Cover_Hide' > 0.9 AND (player in crew this) AND ((this getVariable ['braf_efs_state','ARMED']) == 'ARMED')";
statement="[this, ""deployfloats""] call BRAF_fnc_efs";
};
};
hiddenSelectionsTextures[]=
{
"braf\braf_air\BRAF_helicopters\BRAF_Caracal\data\FAB\Camo1_co.paa",
@@ -1856,8 +2078,8 @@ class BRAF_Caracal_9: BRAF_Caracal_3
};
animationList[]=
{
"EFS_Hide",1,
"EFS_Cover_Hide",0,
"EFS_Hide",0,
"EFS_Cover_Hide",1,
"SAR_Hide",1,
"Pole_Hide",1,
"Hoist_Hide",0,