diff --git a/mpmissions/Exile.Altis/Igiload/IgiLoad.sqf b/mpmissions/Exile.Altis/Igiload/IgiLoad.sqf
new file mode 100644
index 0000000..7121d88
--- /dev/null
+++ b/mpmissions/Exile.Altis/Igiload/IgiLoad.sqf
@@ -0,0 +1,2550 @@
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// IgiLoad v0.9.10_RC_e_(Arma3_1.32) //
+// Version info: This is not official version of IgiLoad it is only WIP (RC) //
+// Author: Igi_PL //
+// Web: http://www.igipl.net/ //
+// Version date: 2014.10.16 //
+// //
+// USE: //
+// 1. In mission "init.sqf" add line: "0 = execVM "IgiLoad\IgiLoadInit.sqf";". //
+// 2. In vehicles "INITIALIZATION" field type: "0 = [this] execVM "IgiLoad\IgiLoad.sqf";" //
+// 3. Unload from script or trigger: //
+// a) Unloading cargo from script. Force unload: "0 = [Car, true, "L"] spawn IL_Do_Unload;" //
+// b) Unloading cargo from script. Force unload: "0 = [Car, true] spawn IL_Do_Unload;" //
+// c) Unloading cargo from script. Force unload: "0 = [Car] spawn IL_Do_Unload;" //
+// 4. Loading cargo from script. Force load: "0 = [Car, [typeOf Box], "B", true, Box] spawn IL_Do_Load;" //
+// //
+// Ways from points 1 and 2 can not be used simultaneously!!! //
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+waitUntil { time > 0 };
+IL_Script_Inst = time;
+// VARIABLES
+_obj_main = _this select 0;
+_obj_main_type = (typeOf _obj_main);
+
+if (isnil "IL_Variables") then
+{
+ IL_Variables = true;
+ //Check new vehicles time
+ IL_Check_Veh_Min = 15;
+ IL_Check_Veh_Max = 30;
+ //Dealing with cargo damage
+ //-1 - do nothing
+ //0 - set to 0
+ //1 - keep such as before loading/unloading
+ IL_CDamage = -1; /// fix for repair car by load/unload
+ //AddAction menu position
+ IL_Action_LU_Priority = 30; //Load and (para)unload
+ IL_Action_O_Priority = 0; //Open and close
+ IL_Action_S_Priority = 0; //Setup
+ //Maximum capacity for vehicles
+ IL_Num_Slots_OFFROAD = -2;
+ IL_Num_Slots_VAN = -3;
+ IL_Num_Slots_MOHAWK = -7;
+ IL_num_Slots_CHINOOK = -8;
+ IL_Num_Slots_KAMAZ = -4;
+ IL_Num_Slots_TEMPEST = -5;
+ IL_Num_Slots_HEMTT = -6;
+ IL_Num_Slots_MH9 = -1;
+ //Player addScore after loading and unloading
+ IL_Load_Score = 20;
+ //Para unload score = 2 * IL_Unload_Score
+ IL_Unload_Score = 10;
+ //The minimum altitude for the drop with parachute
+ IL_Para_Drop_ATL = 50;
+ IL_Para_Jump_ATL = 30;
+ //The minimum altitude for parachute opening
+ IL_Para_Drop_Open_ATL = 150;
+ IL_Para_Jump_Open_ATL = 150;
+ //Parachute get velocity from player or cargo
+ IL_Para_Drop_Velocity = true;
+ IL_Para_Jump_Velocity = true;
+ //Set smoke and light for parachute drop.
+ IL_Para_Smoke = true;
+ IL_Para_Light = true;
+ //Additional smoke after landing
+ IL_Para_Smoke_Add = true;
+ //Additional light after landing
+ IL_Para_Light_Add = true;
+ //Smoke and light color
+ IL_Para_Smoke_Default = "SmokeshellGreen";
+ IL_Para_Light_Default = "Chemlight_green";
+ IL_Para_Smoke_Veh = "SmokeshellBlue";
+ IL_Para_Light_Veh = "Chemlight_blue";
+ //This allows for loading or unloading, if a player is in the area of loading or copilot
+ IL_Can_Inside = true;
+ IL_Can_CoPilot = true;
+ IL_Can_Outside = true;
+ //IL_SDistU = 20;//No longer needed
+ IL_SDistL = 2.5;
+ IL_SDistL_Heli_offset = 1;
+ //Load and unload (not para) max speed in km/h
+ IL_LU_Speed = 10;
+ //Load and unload (not para) max height in m
+ IL_LU_Alt = 3;
+ //Enable or disable usable cargo ramp in CH-49
+ IL_Ramp = true;
+ //Enable change of vehicle mass
+ IL_Mass = true;
+
+
+ IL_Supported_Vehicles_OFFROAD =
+ [
+ "Exile_Car_Offroad_Repair_Civillian",
+ "Exile_Car_Offroad_Repair_Red",
+ "Exile_Car_Offroad_Repair_Beige",
+ "Exile_Car_Offroad_Repair_White",
+ "Exile_Car_Offroad_Repair_Blue",
+ "Exile_Car_Offroad_Repair_DarkRed",
+ "Exile_Car_Offroad_Repair_BlueCustom",
+ "Exile_Car_Offroad_Repair_Guerilla01",
+ "Exile_Car_Offroad_Repair_Guerilla02",
+ "Exile_Car_Offroad_Repair_Guerilla03",
+ "Exile_Car_Offroad_Repair_Guerilla04",
+ "Exile_Car_Offroad_Repair_Guerilla05",
+ "Exile_Car_Offroad_Repair_Guerilla06",
+ "Exile_Car_Offroad_Repair_Guerilla07",
+ "Exile_Car_Offroad_Repair_Guerilla08",
+ "Exile_Car_Offroad_Repair_Guerilla09",
+ "Exile_Car_Offroad_Repair_Guerilla10",
+ "Exile_Car_Offroad_Repair_Guerilla11",
+ "Exile_Car_Offroad_Repair_Guerilla12",
+ "Exile_Car_Offroad_Red",
+ "Exile_Car_Offroad_Beige",
+ "Exile_Car_Offroad_White",
+ "Exile_Car_Offroad_Blue",
+ "Exile_Car_Offroad_DarkRed",
+ "Exile_Car_Offroad_BlueCustom",
+ "Exile_Car_Offroad_Guerilla01",
+ "Exile_Car_Offroad_Guerilla02",
+ "Exile_Car_Offroad_Guerilla03",
+ "Exile_Car_Offroad_Guerilla04",
+ "Exile_Car_Offroad_Guerilla05",
+ "Exile_Car_Offroad_Guerilla06",
+ "Exile_Car_Offroad_Guerilla07",
+ "Exile_Car_Offroad_Guerilla08",
+ "Exile_Car_Offroad_Guerilla09",
+ "Exile_Car_Offroad_Guerilla10",
+ "Exile_Car_Offroad_Guerilla11",
+ "Exile_Car_Offroad_Guerilla12",
+ "Exile_Car_Offroad_Rusty1",
+ "Exile_Car_Offroad_Rusty2",
+ "Exile_Car_Offroad_Rusty3"
+ ];
+ IL_Supported_Vehicles_VAN =
+ [
+ "Exile_Car_Van_Black",
+ "Exile_Car_Van_White",
+ "Exile_Car_Van_Red",
+ "Exile_Car_Van_Guerilla01",
+ "Exile_Car_Van_Guerilla02",
+ "Exile_Car_Van_Guerilla03",
+ "Exile_Car_Van_Guerilla04",
+ "Exile_Car_Van_Guerilla05",
+ "Exile_Car_Van_Guerilla06",
+ "Exile_Car_Van_Guerilla07",
+ "Exile_Car_Van_Guerilla08",
+ "Exile_Car_Van_Box_Black",
+ "Exile_Car_Van_Box_White",
+ "Exile_Car_Van_Box_Red",
+ "Exile_Car_Van_Box_Guerilla01",
+ "Exile_Car_Van_Box_Guerilla02",
+ "Exile_Car_Van_Box_Guerilla03",
+ "Exile_Car_Van_Box_Guerilla04",
+ "Exile_Car_Van_Box_Guerilla05",
+ "Exile_Car_Van_Box_Guerilla06",
+ "Exile_Car_Van_Box_Guerilla07",
+ "Exile_Car_Van_Box_Guerilla08"
+ ];
+ IL_Supported_Vehicles_HEMTT = ["Exile_Car_HEMMT"];
+ IL_Supported_Vehicles_KAMAZ =
+ [
+ "I_Truck_02_covered_F",
+ "I_Truck_02_transport_F",
+ "Exile_Car_Zamak"
+ ];
+ IL_Supported_Vehicles_TEMPEST = ["Exile_Car_Tempest"];
+ IL_Supported_Vehicles_MOHAWK = ["Exile_Chopper_Mohawk_FIA"];
+ IL_Supported_Vehicles_CHINOOK =
+ [
+ "Exile_Chopper_Huron_Black",
+ "Exile_Chopper_Huron_Green"
+ ];
+ IL_Supported_Vehicles_MH9 =
+ [
+ "Exile_Chopper_Hummingbird_Green",
+ "Exile_Chopper_Hummingbird_Civillian_Blue",
+ "Exile_Chopper_Hummingbird_Civillian_Red",
+ "Exile_Chopper_Hummingbird_Civillian_ION",
+ "Exile_Chopper_Hummingbird_Civillian_BlueLine",
+ "Exile_Chopper_Hummingbird_Civillian_Digital",
+ "Exile_Chopper_Hummingbird_Civillian_Elliptical",
+ "Exile_Chopper_Hummingbird_Civillian_Furious",
+ "Exile_Chopper_Hummingbird_Civillian_GrayWatcher",
+ "Exile_Chopper_Hummingbird_Civillian_Jeans",
+ "Exile_Chopper_Hummingbird_Civillian_Light",
+ "Exile_Chopper_Hummingbird_Civillian_Shadow",
+ "Exile_Chopper_Hummingbird_Civillian_Sheriff",
+ "Exile_Chopper_Hummingbird_Civillian_Speedy",
+ "Exile_Chopper_Hummingbird_Civillian_Sunset",
+ "Exile_Chopper_Hummingbird_Civillian_Vrana",
+ "Exile_Chopper_Hummingbird_Civillian_Wasp",
+ "Exile_Chopper_Hummingbird_Civillian_Wave"
+ ];
+
+ IL_Supported_Vehicles_All = IL_Supported_Vehicles_MH9 + IL_Supported_Vehicles_MOHAWK + IL_Supported_Vehicles_KAMAZ + IL_Supported_Vehicles_TEMPEST + IL_Supported_Vehicles_HEMTT + IL_Supported_Vehicles_VAN + IL_Supported_Vehicles_OFFROAD + IL_Supported_Vehicles_CHINOOK;
+ IL_Para_Drop_Vehicles = IL_Supported_Vehicles_MH9 + IL_Supported_Vehicles_MOHAWK + IL_Supported_Vehicles_CHINOOK;
+
+ IL_Supported_Bicycles =
+ [
+ "Exile_Bike_OldBike",
+ "Exile_Bike_MountainBike",
+ "Exile_Bike_Crosser"
+ ];
+ IL_Supported_Karts =
+ [
+ "Exile_Car_Kart_BluKing",
+ "Exile_Car_Kart_RedStone",
+ "Exile_Car_Kart_Vrana",
+ "Exile_Car_Kart_Green",
+ "Exile_Car_Kart_Blue",
+ "Exile_Car_Kart_Orange",
+ "Exile_Car_Kart_White",
+ "Exile_Car_Kart_Yellow",
+ "Exile_Car_Kart_Black"
+ ];
+ IL_Supported_HEMTT = ["Exile_Car_HEMMT"];
+ IL_Supported_KAMAZ =
+ [
+ "I_Truck_02_covered_F",
+ "I_Truck_02_transport_F",
+ "Exile_Car_Zamak"
+ ];
+ IL_Supported_TEMPEST = ["Exile_Car_Tempest"];
+ IL_Supported_Strider =
+ [
+ "I_MRAP_03_hmg_F",
+ "Exile_Car_Strider"
+ ];
+ IL_Supported_Hunter =
+ [
+ "B_MRAP_01_hmg_F",
+ "Exile_Car_Hunter"
+ ];
+ IL_Supported_Ifrit =
+ [
+ "O_MRAP_02_hmg_F",
+ "Exile_Car_Ifrit"
+ ];
+ IL_Supported_UGV =
+ [
+ "B_UGV_01_rcws_F",
+ "B_UGV_01_F",
+ "O_UGV_01_rcws_F",
+ "O_UGV_01_F",
+ "I_UGV_01_rcws_F",
+ "I_UGV_01_F"
+ ];
+ IL_Supported_VAN =
+ [
+ "Exile_Car_Van_Black",
+ "Exile_Car_Van_White",
+ "Exile_Car_Van_Red",
+ "Exile_Car_Van_Guerilla01",
+ "Exile_Car_Van_Guerilla02",
+ "Exile_Car_Van_Guerilla03",
+ "Exile_Car_Van_Guerilla04",
+ "Exile_Car_Van_Guerilla05",
+ "Exile_Car_Van_Guerilla06",
+ "Exile_Car_Van_Guerilla07",
+ "Exile_Car_Van_Guerilla08",
+ "Exile_Car_Van_Box_Black",
+ "Exile_Car_Van_Box_White",
+ "Exile_Car_Van_Box_Red",
+ "Exile_Car_Van_Box_Guerilla01",
+ "Exile_Car_Van_Box_Guerilla02",
+ "Exile_Car_Van_Box_Guerilla03",
+ "Exile_Car_Van_Box_Guerilla04",
+ "Exile_Car_Van_Box_Guerilla05",
+ "Exile_Car_Van_Box_Guerilla06",
+ "Exile_Car_Van_Box_Guerilla07",
+ "Exile_Car_Van_Box_Guerilla08",
+ "Exile_Car_Van_Fuel_Black",
+ "Exile_Car_Van_Fuel_White",
+ "Exile_Car_Van_Fuel_Red",
+ "Exile_Car_Van_Fuel_Guerilla01",
+ "Exile_Car_Van_Fuel_Guerilla02",
+ "Exile_Car_Van_Fuel_Guerilla03"
+ ];
+ IL_Supported_OFFROAD =
+ [
+ "Exile_Car_Offroad_Red",
+ "Exile_Car_Offroad_Beige",
+ "Exile_Car_Offroad_White",
+ "Exile_Car_Offroad_Blue",
+ "Exile_Car_Offroad_DarkRed",
+ "Exile_Car_Offroad_BlueCustom",
+ "Exile_Car_Offroad_Guerilla01",
+ "Exile_Car_Offroad_Guerilla02",
+ "Exile_Car_Offroad_Guerilla03",
+ "Exile_Car_Offroad_Guerilla04",
+ "Exile_Car_Offroad_Guerilla05",
+ "Exile_Car_Offroad_Guerilla06",
+ "Exile_Car_Offroad_Guerilla07",
+ "Exile_Car_Offroad_Guerilla08",
+ "Exile_Car_Offroad_Guerilla09",
+ "Exile_Car_Offroad_Guerilla10",
+ "Exile_Car_Offroad_Guerilla11",
+ "Exile_Car_Offroad_Guerilla12",
+ "Exile_Car_Offroad_Rusty1",
+ "Exile_Car_Offroad_Rusty2",
+ "Exile_Car_Offroad_Rusty3",
+ "Exile_Car_Offroad_Armed_Guerilla01",
+ "Exile_Car_Offroad_Armed_Guerilla02",
+ "Exile_Car_Offroad_Armed_Guerilla03",
+ "Exile_Car_Offroad_Armed_Guerilla04",
+ "Exile_Car_Offroad_Armed_Guerilla05",
+ "Exile_Car_Offroad_Armed_Guerilla06",
+ "Exile_Car_Offroad_Armed_Guerilla07",
+ "Exile_Car_Offroad_Armed_Guerilla08",
+ "Exile_Car_Offroad_Armed_Guerilla09",
+ "Exile_Car_Offroad_Armed_Guerilla10",
+ "Exile_Car_Offroad_Armed_Guerilla11",
+ "Exile_Car_Offroad_Armed_Guerilla12",
+ "Exile_Car_Offroad_Repair_Civillian",
+ "Exile_Car_Offroad_Repair_Red",
+ "Exile_Car_Offroad_Repair_Beige",
+ "Exile_Car_Offroad_Repair_White",
+ "Exile_Car_Offroad_Repair_Blue",
+ "Exile_Car_Offroad_Repair_DarkRed",
+ "Exile_Car_Offroad_Repair_BlueCustom",
+ "Exile_Car_Offroad_Repair_Guerilla01",
+ "Exile_Car_Offroad_Repair_Guerilla02",
+ "Exile_Car_Offroad_Repair_Guerilla03",
+ "Exile_Car_Offroad_Repair_Guerilla04",
+ "Exile_Car_Offroad_Repair_Guerilla05",
+ "Exile_Car_Offroad_Repair_Guerilla06",
+ "Exile_Car_Offroad_Repair_Guerilla07",
+ "Exile_Car_Offroad_Repair_Guerilla08",
+ "Exile_Car_Offroad_Repair_Guerilla09",
+ "Exile_Car_Offroad_Repair_Guerilla10",
+ "Exile_Car_Offroad_Repair_Guerilla11",
+ "Exile_Car_Offroad_Repair_Guerilla12"
+ ];
+ IL_Supported_SUV =
+ [
+ "Exile_Car_SUV_Red",
+ "Exile_Car_SUV_Black",
+ "Exile_Car_SUV_Grey",
+ "Exile_Car_SUV_Orange"
+ ];
+ IL_Supported_Hatchback =
+ [
+ "Exile_Car_Hatchback_Beige",
+ "Exile_Car_Hatchback_Green",
+ "Exile_Car_Hatchback_Blue",
+ "Exile_Car_Hatchback_BlueCustom",
+ "Exile_Car_Hatchback_BeigeCustom",
+ "Exile_Car_Hatchback_Yellow",
+ "Exile_Car_Hatchback_Grey",
+ "Exile_Car_Hatchback_Black",
+ "Exile_Car_Hatchback_Dark",
+ "Exile_Car_Hatchback_Rusty1",
+ "Exile_Car_Hatchback_Rusty2",
+ "Exile_Car_Hatchback_Rusty3",
+ "Exile_Car_Hatchback_Sport_Red",
+ "Exile_Car_Hatchback_Sport_Blue",
+ "Exile_Car_Hatchback_Sport_Orange",
+ "Exile_Car_Hatchback_Sport_White",
+ "Exile_Car_Hatchback_Sport_Beige",
+ "Exile_Car_Hatchback_Sport_Green"
+ ];
+ IL_Supported_Quadbike =
+ [
+ "Exile_Bike_QuadBike_Black",
+ "Exile_Bike_QuadBike_Blue",
+ "Exile_Bike_QuadBike_Red",
+ "Exile_Bike_QuadBike_White",
+ "Exile_Bike_QuadBike_Nato",
+ "Exile_Bike_QuadBike_Csat",
+ "Exile_Bike_QuadBike_Fia",
+ "Exile_Bike_QuadBike_Guerilla01",
+ "Exile_Bike_QuadBike_Guerilla02"
+ ];
+ IL_Supported_Supply_Crate =
+ [
+ "B_supplyCrate_F",
+ "IG_supplyCrate_F",
+ "O_supplyCrate_F",
+ "I_supplyCrate_F",
+ "C_supplyCrate_F"
+ ];
+ IL_Supported_Veh_Ammo =
+ [
+ "Box_NATO_AmmoVeh_F",
+ "Box_East_AmmoVeh_F",
+ "Box_IND_AmmoVeh_F",
+ "Land_CargoBox_V1_F",
+ "ASC_B_box",
+ "I_CargoNet_01_ammo_F",
+ "O_CargoNet_01_ammo_F",
+ "Box_NATO_Uniforms_F",
+ "Exile_Container_SupplyBox",
+
+ "B_CargoNet_01_ammo_F"
+ ];
+ IL_Supported_Barrel =
+ [
+ /*
+ "Land_BarrelEmpty_F",
+ "Land_BarrelEmpty_grey_F",
+ "Land_BarrelSand_F",
+ "Land_BarrelSand_grey_F",
+ "Land_BarrelTrash_F",
+ "Land_BarrelTrash_grey_F",
+ "Land_BarrelWater_F",
+ "Land_BarrelWater_grey_F",
+ "Land_MetalBarrel_F"
+ */
+ ]; // "Land_MetalBarrel_empty_F","MetalBarrel_burning_F"];
+ IL_Supported_Tank =
+ [
+ /*
+ "Land_WaterBarrel_F",
+ "Land_WaterTank_F"
+ */
+ ];
+ IL_Supported_Rubberboat =
+ [
+ "Exile_Boat_RubberDuck_CSAT",
+ "Exile_Boat_RubberDuck_Digital",
+ "Exile_Boat_RubberDuck_Orange",
+ "Exile_Boat_RubberDuck_Blue",
+ "Exile_Boat_RubberDuck_Black"
+ ];
+ IL_Supported_SDV =
+ [
+ "Exile_Boat_SDV_CSAT",
+ "Exile_Boat_SDV_Digital",
+ "Exile_Boat_SDV_Grey"
+ ];
+ IL_Supported_Box_H1 =
+ [
+ "Box_NATO_Wps_F",
+ "Box_East_Wps_F",
+ "Box_IND_Wps_F",
+ "Box_East_WpsLaunch_F",
+ "Box_NATO_WpsLaunch_F",
+ "Box_IND_WpsLaunch_F",
+ "Box_IND_WpsSpecial_F",
+ "Box_East_WpsSpecial_F",
+ "Box_NATO_WpsSpecial_F",
+ "Box_mas_all_rifle_Wps_F",
+ "Box_mas_us_rifle_Wps_F",
+ "Box_mas_ru_rifle_Wps_F",
+ "Box_mas_mar_NATO_equip_F",
+ "Box_mas_mar_NATO_Wps_F"
+ ];
+ IL_Supported_Box_H2 =
+ [
+ "Box_NATO_AmmoOrd_F",
+ "Box_East_AmmoOrd_F",
+ "Box_IND_AmmoOrd_F",
+ "Box_NATO_Grenades_F",
+ "Box_East_Grenades_F",
+ "Box_IND_Grenades_F",
+ "Box_NATO_Ammo_F",
+ "Box_East_Ammo_F",
+ "Box_IND_Ammo_F",
+ "Box_IND_Support_F",
+ "Box_East_Support_F",
+ "Box_NATO_Support_F"
+ ];
+ IL_Supported_Cargo20 =
+ [
+ "Land_Cargo20_blue_F",
+ "Land_Cargo20_brick_red_F",
+ "Land_Cargo20_cyan_F",
+ "Land_Cargo20_grey_F",
+ "Land_Cargo20_light_blue_F",
+ "Land_Cargo20_light_green_F",
+ "Land_Cargo20_military_green_F",
+ "Land_Cargo20_orange_F",
+ "Land_Cargo20_red_F",
+ "Land_Cargo20_sand_F",
+ "Land_Cargo20_white_F",
+ "Land_Cargo20_yellow_F"
+ ];
+ IL_Supported_TaruPods =
+ [
+ "Land_Pod_Heli_Transport_04_ammo_F",
+ "Land_Pod_Heli_Transport_04_bench_F",
+ "Land_Pod_Heli_Transport_04_box_F",
+ "Land_Pod_Heli_Transport_04_covered_F",
+ "Land_Pod_Heli_Transport_04_fuel_F",
+ "Land_Pod_Heli_Transport_04_medevac_F",
+ "Land_Pod_Heli_Transport_04_repair_F",
+ "B_Slingload_01_Ammo_F",
+ "B_Slingload_01_Medical_F",
+ "B_Slingload_01_Fuel_F",
+ "B_Slingload_01_Repair_F",
+ "B_Slingload_01_Cargo_F"
+ ];
+ //needed for the new Initialization, put all supported Vehicles & all supported Cargo in!!!
+ IL_Supported_Init_All = IL_Supported_Vehicles_OFFROAD + IL_Supported_Vehicles_VAN + IL_Supported_Vehicles_HEMTT + IL_Supported_Vehicles_KAMAZ + IL_Supported_Vehicles_TEMPEST + IL_Supported_Vehicles_MOHAWK + IL_Supported_Vehicles_CHINOOK + IL_Supported_Vehicles_MH9 + IL_Supported_Bicycles + IL_Supported_Karts + IL_Supported_HEMTT + IL_Supported_KAMAZ + IL_Supported_TEMPEST + IL_Supported_Strider + IL_Supported_Hunter + IL_Supported_Ifrit + IL_Supported_UGV + IL_Supported_VAN + IL_Supported_OFFROAD + IL_Supported_SUV + IL_Supported_Hatchback + IL_Supported_Quadbike + IL_Supported_Supply_Crate + IL_Supported_Veh_Ammo + IL_Supported_Barrel + IL_Supported_Tank + IL_Supported_Rubberboat + IL_Supported_SDV + IL_Supported_Box_H1 + IL_Supported_Box_H2 + IL_Supported_Cargo20 + IL_Supported_TaruPods;
+
+ IL_Supported_Cargo_MH9 = IL_Supported_Supply_Crate + IL_Supported_Barrel;
+
+ IL_Supported_Cargo_Veh_Offroad = IL_Supported_Quadbike + IL_Supported_Karts + IL_Supported_Bicycles;
+ IL_Supported_Cargo_NonVeh_Offroad = IL_Supported_Supply_Crate + IL_Supported_Veh_Ammo + IL_Supported_Barrel + IL_Supported_Tank + IL_Supported_Box_H1 + IL_Supported_Box_H2;
+ IL_Supported_Cargo_Offroad = IL_Supported_Cargo_Veh_Offroad + IL_Supported_Cargo_NonVeh_Offroad;
+
+ IL_Supported_Cargo_Veh_VAN = IL_Supported_Cargo_Veh_Offroad;
+ IL_Supported_Cargo_NonVeh_VAN = IL_Supported_Cargo_NonVeh_Offroad;
+ IL_Supported_Cargo_VAN = IL_Supported_Cargo_Veh_VAN + IL_Supported_Cargo_NonVeh_VAN;
+
+ IL_Supported_Cargo_Veh_Kamaz = IL_Supported_Quadbike + IL_Supported_Karts + IL_Supported_Rubberboat + IL_Supported_SDV + IL_Supported_Hatchback + IL_Supported_UGV + IL_Supported_VAN + IL_Supported_OFFROAD + IL_Supported_SUV;
+ IL_Supported_Cargo_NonVeh_Kamaz = IL_Supported_Supply_Crate + IL_Supported_Veh_Ammo + IL_Supported_Barrel + IL_Supported_Tank + IL_Supported_Box_H1 + IL_Supported_Box_H2 + IL_Supported_Cargo20;
+ IL_Supported_Cargo_Kamaz = IL_Supported_Cargo_Veh_Kamaz + IL_Supported_Cargo_NonVeh_Kamaz;
+
+ IL_Supported_Cargo_Veh_HEMTT = IL_Supported_Cargo_Veh_Kamaz;
+ IL_Supported_Cargo_NonVeh_HEMTT = IL_Supported_Cargo_NonVeh_Kamaz + IL_Supported_TaruPods;
+ IL_Supported_Cargo_HEMTT = IL_Supported_Cargo_Veh_HEMTT + IL_Supported_Cargo_NonVeh_HEMTT;
+
+ IL_Supported_Cargo_Veh_TEMPEST = IL_Supported_Cargo_Veh_HEMTT;
+ IL_Supported_Cargo_NonVeh_TEMPEST = IL_Supported_Cargo_NonVeh_HEMTT;
+ IL_Supported_Cargo_TEMPEST = IL_Supported_Cargo_Veh_TEMPEST + IL_Supported_Cargo_NonVeh_TEMPEST;
+
+ IL_Supported_Cargo_Veh_Mohawk = IL_Supported_Quadbike + IL_Supported_Karts + IL_Supported_Rubberboat + IL_Supported_SDV + IL_Supported_Hatchback + IL_Supported_UGV;
+ IL_Supported_Cargo_NonVeh_Mohawk = IL_Supported_Supply_Crate + IL_Supported_Veh_Ammo + IL_Supported_Barrel + IL_Supported_Tank;
+ IL_Supported_Cargo_Mohawk = IL_Supported_Cargo_Veh_Mohawk + IL_Supported_Cargo_NonVeh_Mohawk;
+
+ IL_Supported_Cargo_Veh_CHINOOK = IL_Supported_Cargo_Veh_Mohawk;
+ IL_Supported_Cargo_NonVeh_CHINOOK = IL_Supported_Cargo_NonVeh_Mohawk;
+ IL_Supported_Cargo_CHINOOK = IL_Supported_Cargo_Veh_CHINOOK + IL_Supported_Cargo_NonVeh_CHINOOK;
+};
+
+if (isnil "IL_Procedures") then
+{
+ IL_Procedures = true;
+
+ IL_Init_Veh =
+ {
+ private["_obj", "_obj_type", "_force"];
+ _obj = _this select 0;
+ _force = if (count _this > 1) then {_this select 1} else {false};
+ _obj_type = (typeOf _obj);
+
+ if ((isNil {_obj getVariable "default_mass"}) || (_force)) then
+ {
+ if (isNil {_obj getVariable "default_mass"}) then
+ {
+ _obj setVariable["default_mass", getMass _obj, true];
+ }
+ else
+ {
+ _obj setMass (_obj getVariable "default_mass");
+ };
+ };
+
+ if (_obj_type in IL_Supported_Vehicles_MOHAWK) then
+ {
+ if ((isNil {_obj getVariable "box_num"}) || (_force)) then {_obj setVariable["box_num", 0, true];};
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_MOHAWK, true];};
+ if ((isNil {_obj getVariable "can_load"}) || (_force)) then {_obj setVariable["can_load", true, true];};
+ if ((isNil {_obj getVariable "can_copilot"}) || (_force)) then {_obj setVariable["can_copilot", IL_Can_CoPilot, true];};
+ if ((isNil {_obj getVariable "can_outside"}) || (_force)) then {_obj setVariable["can_outside", IL_Can_Outside, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -2.25, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 4.5, true];};
+ if ((isNil {_obj getVariable "usable_ramp"}) || (_force)) then {_obj setVariable["usable_ramp", IL_Ramp, true];};
+ };
+ if (_obj_type in IL_Supported_Vehicles_CHINOOK) then
+ {
+ if ((isNil {_obj getVariable "box_num"}) || (_force)) then {_obj setVariable["box_num", 0, true];};
+ if ((isNil {_obj getVariable "can_load"}) || (_force)) then {_obj setVariable["can_load", true, true];};
+ if ((isNil {_obj getVariable "can_copilot"}) || (_force)) then {_obj setVariable["can_copilot", IL_Can_CoPilot, true];};
+ if ((isNil {_obj getVariable "can_outside"}) || (_force)) then {_obj setVariable["can_outside", IL_Can_Outside, true];};
+ if (_obj_type == "CH_47F") then
+ {
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_CHINOOK - 2, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -3.1, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 4.5, true];};
+ };
+ if (_obj_type == "CH_147F") then
+ {
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_CHINOOK, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -2.55, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 5.25, true];};
+ };
+ if (_obj_type in ["kyo_MH47E_HC", "kyo_MH47E_Ramp", "kyo_MH47E_base"]) then
+ {
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_CHINOOK, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -1.5, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 6, true];};
+ };
+ if ((isNil {_obj getVariable "usable_ramp"}) || (_force)) then {_obj setVariable["usable_ramp", IL_Ramp, true];};
+ };
+ if (_obj_type in IL_Supported_Vehicles_MH9) then
+ {
+ if ((isNil {_obj getVariable "box_l"}) || (_force)) then {_obj setVariable["box_l", _obj, true];};
+ if ((isNil {_obj getVariable "box_r"}) || (_force)) then {_obj setVariable["box_r", _obj, true];};
+
+ if ((isNil {_obj getVariable "box_num_l"}) || (_force)) then {_obj setVariable["box_num_l", 0, true];};
+ if ((isNil {_obj getVariable "box_num_r"}) || (_force)) then {_obj setVariable["box_num_r", 0, true];};
+ if ((isNil {_obj getVariable "slots_num_l"}) || (_force)) then {_obj setVariable["slots_num_l", IL_Num_Slots_MH9, true];};
+ if ((isNil {_obj getVariable "slots_num_r"}) || (_force)) then {_obj setVariable["slots_num_r", IL_Num_Slots_MH9, true];};
+ if ((isNil {_obj getVariable "can_load"}) || (_force)) then {_obj setVariable["can_load", true, true];};
+ if ((isNil {_obj getVariable "can_copilot"}) || (_force)) then {_obj setVariable["can_copilot", IL_Can_CoPilot, true];};
+ if ((isNil {_obj getVariable "can_outside"}) || (_force)) then {_obj setVariable["can_outside", IL_Can_Outside, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -0.48, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 1, true];};
+ if ((isNil {_obj getVariable "usable_ramp"}) || (_force)) then {_obj setVariable["usable_ramp", IL_Ramp, true];};
+ };
+ if (_obj_type in IL_Supported_Vehicles_OFFROAD) then
+ {
+ if ((isNil {_obj getVariable "box_num"}) || (_force)) then {_obj setVariable["box_num", 0, true];};
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_OFFROAD, true];};
+ if ((isNil {_obj getVariable "can_load"}) || (_force)) then {_obj setVariable["can_load", true, true];};
+ if ((isNil {_obj getVariable "can_outside"}) || (_force)) then {_obj setVariable["can_outside", IL_Can_Outside, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -0.65, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 1.5, true];};
+ };
+ if (_obj_type in IL_Supported_Vehicles_VAN) then
+ {
+ if ((isNil {_obj getVariable "box_num"}) || (_force)) then {_obj setVariable["box_num", 0, true];};
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_VAN, true];};
+ if ((isNil {_obj getVariable "can_load"}) || (_force)) then {_obj setVariable["can_load", true, true];};
+ if ((isNil {_obj getVariable "can_outside"}) || (_force)) then {_obj setVariable["can_outside", IL_Can_Outside, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -0.6, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 1, true];};
+ };
+ if (_obj_type in IL_Supported_Vehicles_KAMAZ) then
+ {
+ if ((isNil {_obj getVariable "box_num"}) || (_force)) then {_obj setVariable["box_num", 0, true];};
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_KAMAZ, true];};
+ if ((isNil {_obj getVariable "can_load"}) || (_force)) then {_obj setVariable["can_load", true, true];};
+ if ((isNil {_obj getVariable "can_outside"}) || (_force)) then {_obj setVariable["can_outside", IL_Can_Outside, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -0.8, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", -0.5, true];};
+ };
+ if (_obj_type in IL_Supported_Vehicles_TEMPEST) then
+ {
+ if ((isNil {_obj getVariable "box_num"}) || (_force)) then {_obj setVariable["box_num", 0, true];};
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_TEMPEST, true];};
+ if ((isNil {_obj getVariable "can_load"}) || (_force)) then {_obj setVariable["can_load", true, true];};
+ if ((isNil {_obj getVariable "can_outside"}) || (_force)) then {_obj setVariable["can_outside", IL_Can_Outside, true];};
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -0.4, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 0.5, true];};
+ };
+ if (_obj_type in IL_Supported_Vehicles_HEMTT) then
+ {
+ if ((isNil {_obj getVariable "box_num"}) || (_force)) then {_obj setVariable["box_num", 0, true];};
+ if ((isNil {_obj getVariable "slots_num"}) || (_force)) then {_obj setVariable["slots_num", IL_Num_Slots_HEMTT, true];};
+ if ((isNil {_obj getVariable "can_load"}) || (_force)) then {_obj setVariable["can_load", true, true];};
+ if ((isNil {_obj getVariable "can_outside"}) || (_force)) then {_obj setVariable["can_outside", IL_Can_Outside, true];};
+ if (_obj_type in ["B_Truck_01_box_F", "Marinir_Truck_01_box_FG"]) then
+ {
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -0.4, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 0.8, true];};
+ }
+ else
+ {
+ if ((isNil {_obj getVariable "zload"}) || (_force)) then {_obj setVariable["zload", -0.5, true];};
+ if ((isNil {_obj getVariable "load_offset"}) || (_force)) then {_obj setVariable["load_offset", 0, true];};
+ };
+ };
+ };
+
+ IL_Init_Box =
+ {
+ private["_obj", "_obj_type", "_bbr", "_p0", "_p1"];
+ _obj = _this select 0;
+
+ _obj setVariable["attachedPos", 0, true];
+ _obj setVariable["attachedTruck", _obj, true];
+ _obj setVariable["doors", "N", true];
+
+ _obj setVariable["slots", 1, true];
+ _obj setVariable["cargo_offset", 0, true];
+
+ _bbr = boundingBoxReal _obj;
+ _p0 = _bbr select 0;
+ _p1 = _bbr select 1;
+ _obj setVariable["zload_cargo", abs (_p0 select 2), true];
+
+ _obj_type = (typeOf _obj);
+
+ if (_obj_type in IL_Supported_Cargo20) then
+ {
+ _obj setVariable["slots", 6, true];
+ _obj setVariable["cargo_offset", 2.6, true];
+ [_obj, 2400] call IL_SetNewMass;
+ };
+
+ if (_obj_type in IL_Supported_HEMTT) then
+ {
+ _obj setVariable["slots", 10, true];
+ _obj setVariable["cargo_offset", 4.2, true];
+ };
+
+ if (_obj_type in IL_Supported_Strider) then
+ {
+ _obj setVariable["slots", 6, true];
+ _obj setVariable["cargo_offset", 2.2, true];
+ };
+ if (_obj_type in IL_Supported_TaruPods) then
+ {
+ _obj setVariable["slots", 7, true];
+ _obj setVariable["cargo_offset", 2.9, true];
+ };
+ if (_obj_type in IL_Supported_Hunter) then
+ {
+ _obj setVariable["slots", 7, true];
+ _obj setVariable["cargo_offset", 1.5, true];
+ };
+ if (_obj_type in IL_Supported_Ifrit) then
+ {
+ _obj setVariable["slots", 7, true];
+ _obj setVariable["cargo_offset", 1.3, true];
+ };
+ if (_obj_type in IL_Supported_VAN) then
+ {
+ _obj setVariable["slots", 6, true];
+ _obj setVariable["cargo_offset", 1.8, true];
+ };
+ if (_obj_type in IL_Supported_UGV) then
+ {
+ _obj setVariable["slots", 5, true];
+ _obj setVariable["cargo_offset", 2.1, true];
+ };
+ if (_obj_type in IL_Supported_Hatchback) then
+ {
+ _obj setVariable["slots", 5, true];
+ _obj setVariable["cargo_offset", 1.9, true];
+ };
+ if (_obj_type in IL_Supported_SUV) then
+ {
+ _obj setVariable["slots", 6, true];
+ _obj setVariable["cargo_offset", 2, true];
+ };
+ if (_obj_type in IL_Supported_OFFROAD) then
+ {
+ _obj setVariable["slots", 6, true];
+ _obj setVariable["cargo_offset", 2.4, true];
+ };
+ if (_obj_type in IL_Supported_Rubberboat) then
+ {
+ _obj setVariable["slots", 5, true];
+ _obj setVariable["cargo_offset", 2, true];
+ };
+ if (_obj_type in IL_Supported_SDV) then
+ {
+ _obj setVariable["slots", 6, true];
+ _obj setVariable["cargo_offset", 1.6, true];
+ };
+ if (_obj_type in IL_Supported_Quadbike) then
+ {
+ _obj setVariable["slots", 2, true];
+ _obj setVariable["cargo_offset", 0.5, true];
+ };
+ if (_obj_type in IL_Supported_Karts) then
+ {
+ _obj setVariable["slots", 2, true];
+ _obj setVariable["cargo_offset", 0.5, true];
+ };
+ if (_obj_type in IL_Supported_Veh_Ammo) then
+ {
+ _obj setVariable["slots", 2, true];
+ _obj setVariable["cargo_offset", 0.4, true];
+ };
+ if (_obj_type in IL_Supported_Tank) then
+ {
+ if (_obj_type == "Land_WaterTank_F") then
+ {
+ _obj setVariable["slots", 3, true];
+ _obj setVariable["cargo_offset", 1, true];
+ }
+ else
+ {
+ _obj setVariable["slots", 2, true];
+ _obj setVariable["cargo_offset", 0.4, true];
+ };
+ _turn = true;
+ };
+ };
+
+ IL_Server_AddScore =
+ {
+ if (isServer) then
+ {
+ ((_this select 1) select 0) addScore ((_this select 1) select 1);
+ };
+ };
+
+ "IL_SetScore" addPublicVariableEventHandler IL_Server_AddScore;
+
+
+ IL_Score =
+ {
+ private ["_obj", "_score"];
+
+ _obj = _this select 0;
+ _score = _this select 1;
+
+ if (_score != 0) then
+ {
+ IL_SetScore = [_obj, _score];
+ if (isServer) then
+ {
+ ["Cos", IL_SetScore] spawn IL_Server_AddScore;
+ }
+ else
+ {
+ publicVariableServer "IL_SetScore";
+ };
+ };
+ };
+
+ IL_Server_SetDir =
+ {
+ private ["_obj", "_dir"];
+ _obj = _this select 1 select 0;
+ _dir = _this select 1 select 1;
+
+ if (_dir < 0) then
+ {
+ _dir = _dir + 360;
+ };
+ if (_dir > 360) then
+ {
+ _dir = _dir - 360;
+ };
+
+ _obj setDir _dir;
+ _obj setPos (getPos _obj);
+ };
+
+ "IL_SetDir" addPublicVariableEventHandler IL_Server_SetDir;
+
+ IL_Rotate =
+ {
+ private ["_obj", "_to", "_change"];
+
+ _obj = _this select 0;
+ _to = _this select 1;
+ _change = _this select 2;
+
+ _change = (getDir _obj + _change) - getDir _to;
+
+ IL_SetDir = [_obj, _change];
+ if (local _obj) then
+ {
+ ["Cos", IL_SetDir] spawn IL_Server_SetDir;
+ }
+ else
+ {
+ if (isDedicated) then
+ {
+ (owner _obj) publicVariableClient "IL_SetDir";
+ }
+ else
+ {
+ publicVariableServer "IL_SetDir";
+ };
+ };
+ };
+
+ IL_Server_SetMass =
+ {
+ private ["_obj", "_mass"];
+ _obj = _this select 1 select 0;
+ _mass = _this select 1 select 1;
+ if ((getMass _obj) != _mass) then
+ {
+ _obj setMass _mass;
+ };
+ };
+
+ "IL_SetMass" addPublicVariableEventHandler IL_Server_SetMass;
+
+ IL_GetCargoMass =
+ {
+ private ["_v", "_cargo_mass"];
+ _v = _this select 0;
+ _cargo_mass = 0;
+ if (count(attachedObjects _v) > 0) then
+ {
+ {
+ _cargo_mass = _cargo_mass + getMass _x;
+ } forEach attachedObjects _v;
+ };
+ _cargo_mass;
+ };
+
+ IL_GetDefaultMass =
+ {
+ private ["_v"];
+ _v = _this select 0;
+ _v getVariable "default_mass";
+ };
+
+ IL_SetNewMass =
+ {
+ if !(IL_Mass) ExitWith {};
+ private ["_v", "_v_def_mass", "_cargo_mass"];
+ _v = _this select 0;
+ _v_def_mass = if (count _this > 1) then {_this select 1} else {0};
+ _cargo_mass = if (count _this > 2) then {_this select 2} else {0};
+
+ if (_v_def_mass == 0) then
+ {
+ _v_def_mass = [_v] call IL_GetDefaultMass;
+ };
+ if (_cargo_mass == 0) then
+ {
+ _cargo_mass = [_v] call IL_GetCargoMass;
+ };
+
+ if ((getMass _v) != (_v_def_mass + _cargo_mass)) then
+ {
+ IL_SetMass = [_v, (_v_def_mass + _cargo_mass)];
+ if (local _v) then
+ {
+ ["Cos", IL_SetMass] spawn IL_Server_SetMass;
+ }
+ else
+ {
+ if (isDedicated) then
+ {
+ (owner _v) publicVariableClient "IL_SetMass";
+ }
+ else
+ {
+ publicVariableServer "IL_SetMass";
+ };
+ };
+ };
+ };
+
+
+ IL_Move_Attach=
+ {
+ private ["_veh", "_obj", "_from", "_to", "_pos", "_step", "_steps", "_from_x", "_from_y", "_from_z", "_to_x", "_to_y", "_to_z", "_x", "_y", "_z", "_i", "_x_step", "_y_step", "_z_step", "_turn"];
+ _veh = _this select 0;
+ _obj = _this select 1;
+ _from = _this select 2;
+ _to = _this select 3;
+ _step = _this select 4;
+ _turn = if (count _this > 5) then {_this select 5} else {false};
+
+ _from_x = _from select 0;
+ _from_y = _from select 1;
+ _from_z = _from select 2;
+
+ _to_x = _to select 0;
+ _to_y = _to select 1;
+ _to_z = _to select 2;
+
+ _x = _to_x - _from_x;
+ _y = _to_y - _from_y;
+ _z = _to_z - _from_z;
+
+ if (((abs _x) > (abs _y)) && ((abs _x) > (abs _z))) then
+ {
+ _steps = round ((abs _x) / _step);
+ }
+ else
+ {
+ if ((abs _y) > (abs _z)) then
+ {
+ _steps = round ((abs _y) / _step);
+ }
+ else
+ {
+ _steps = round ((abs _z) / _step);
+
+ };
+ };
+
+ _i = 0;
+ _obj AttachTo [_veh, _from];
+ while {_i < _steps} do
+ {
+ _i = _i + 1;
+ _pos = [(((_x / _steps) * _i) + _from_x), (((_y / _steps) * _i) + _from_y), (((_z / _steps) * _i) + _from_z)];
+ _obj AttachTo [_veh, _pos];
+ if (_turn) then
+ {
+ [_obj, _veh, -90] call IL_Rotate;
+ _turn = false;
+ };
+ sleep 0.25;
+ };
+
+ _obj AttachTo [_veh, _to];
+ };
+
+ IL_Create_And_Attach =
+ {
+ _type = _this select 0;
+ _to = _this select 1;
+ _x = if (count _this > 2) then {_this select 2} else {0};
+ _y = if (count _this > 3) then {_this select 3} else {0};
+ _z = if (count _this > 4) then {_this select 4} else {0};
+ _m = createVehicle [_type, position _to, [], 0, "CAN_COLLIDE"];
+ _m AttachTo [_to,[_x,_y,_z]];
+ _m
+ };
+
+ IL_Server_Cargo_Para =
+ {
+ private ["_smoke", "_player_velocity", "_light", "_damage", "_smoke_type", "_chemlight_type", "_cargo_pos", "_last_attach_pos", "_dist", "_velocity", "_tmp"];
+ _vars = _this select 1;
+ _cargo = _vars select 0;
+ _v = _vars select 1;
+ _last_attach_pos = _vars select 2;
+ _player_velocity = _vars select 3;
+ if (((IL_Para_Smoke) || (IL_Para_Smoke_Add)) && (_cargo isKindOf "AllVehicles")) then
+ {
+ _smoke_type = IL_Para_Smoke_Veh;
+ }
+ else
+ {
+ _smoke_type = IL_Para_Smoke_Default;
+ };
+ if (((IL_Para_Light) || (IL_Para_Light_Add)) && (_cargo isKindOf "AllVehicles")) then
+ {
+ _chemlight_type = IL_Para_Light_Veh;
+ }
+ else
+ {
+ _chemlight_type = IL_Para_Light_Default;
+ };
+
+ _cargo_pos = [0,0,-2.3];
+
+ _damage = getDammage _cargo;
+ detach _cargo;
+ _cargo setVelocity _player_velocity;
+ _dist = _v distance _cargo;
+ _tmp = [_cargo] spawn
+ {
+ while {(getPosATL (_this select 0)) select 2 > IL_Para_Drop_Open_ATL} do
+ {
+ sleep 0.2;
+ };
+ };
+ while {(_v distance _cargo) - _dist < 20} do
+ {
+ sleep 0.2;
+ };
+ if (IL_Para_Drop_Open_ATL > 0) then
+ {
+ while {(getPosATL _cargo) select 2 > (IL_Para_Drop_Open_ATL + ((velocity _cargo) select 2) * -0.5)} do
+ {
+ sleep 0.2;
+ };
+ };
+
+ _chute = createVehicle ["B_Parachute_02_F", position _cargo, [], 0, "CAN_COLLIDE"];
+ _chute attachTo [_cargo, _cargo_pos];
+ detach _chute;
+
+ if (IL_Para_Drop_Velocity) then
+ {
+ _chute setVelocity _player_velocity;
+ };
+ _cargo attachTo [_chute, _cargo_pos];
+
+ if (IL_Para_Smoke) then
+ {
+ _smoke = [_smoke_type, _cargo] call IL_Create_And_Attach;
+ };
+ if (IL_Para_Light) then
+ {
+ _light = [_chemlight_type, _cargo] call IL_Create_And_Attach;
+ };
+ while {(getPos _cargo) select 2 > 2} do
+ {
+ sleep 0.2;
+ };
+ detach _cargo;
+ if (IL_Para_Smoke) then
+ {
+ _smoke attachTo [_cargo,[0,0,2]];
+ detach _smoke;
+ };
+ if (IL_Para_Light) then
+ {
+ _light attachTo [_cargo,[0,0,2]];
+ detach _light;
+ };
+ if (IL_Para_Smoke_Add) then
+ {
+ _smoke = [_smoke_type, _cargo] call IL_Create_And_Attach;
+ _smoke attachTo [_cargo,[0,0,2]];
+ detach _smoke;
+ };
+ if (IL_Para_Light_Add) then
+ {
+ _light = [_chemlight_type, _cargo] call IL_Create_And_Attach;
+ _light attachTo [_cargo,[0,0,2]];
+ detach _light;
+ };
+
+ _cargo setPosASL getPosASL _cargo;
+
+ if (IL_CDamage == 0) then
+ {
+ _cargo setDamage 0;
+ };
+
+ if (IL_CDamage == 1) then
+ {
+ _cargo setDamage _damage;
+ if (_damage != (getDammage _cargo)) then
+ {
+ sleep 1;
+ _cargo setDamage _damage;
+ };
+ };
+ };
+
+ IL_Cargo_Para = {
+ IL_CLient_Cargo_Para = _this;
+ if (isServer) then
+ {
+ IL_CLient_Cargo_Para spawn IL_Server_Cargo_Para;
+ }
+ else
+ {
+ [Player, IL_Unload_Score] call IL_Score;
+ publicVariableServer "IL_Client_Cargo_Para";
+ };
+ };
+ "IL_Client_Cargo_Para" addPublicVariableEventHandler IL_Cargo_Para;
+
+ IL_Do_Load =
+ {
+ private["_NoBoxHint", "_v", "_supported_cargo", "_zload", "_x_cargo_offset", "_cargo_offset", "_sdist", "_spoint", "_slot_num", "_counter", "_done", "_obj_lst", "_damage", "_obj_type", "_doors", "_box_num", "_dummy", "_nic", "_turn", "_force", "_cargo"];
+ _NoBoxHint = "The box is in the vicinity. Perhaps it is outside of the loading area.";
+ _v = _this select 0;
+ _supported_cargo = _this select 1;
+ _doors = if (count _this > 2) then {_this select 2} else {"B"};
+ _force = if (count _this > 3) then {_this select 3} else {false};
+ _cargo = if (count _this > 4) then {_this select 4} else {ObjNull};
+
+ _v setVariable["can_load", false, true];
+ _zload = _v getVariable "zload";
+ _obj_type = (typeOf _v);
+ _sdist = 0;
+
+ _counter = 0;
+ _done = false;
+ _turn = false;
+
+ if ((_obj_type in IL_Supported_Vehicles_VAN) && (_doors == "B")) then
+ {
+ _sdist = IL_SDistL;
+ _spoint = _v modelToWorld [0,-4.5,-1.6];
+ _box_num = _v getVariable "box_num";
+ _slot_num = _v getVariable "slots_num";
+ };
+ if ((_obj_type in IL_Supported_Vehicles_OFFROAD) && (_doors == "B")) then
+ {
+ _sdist = IL_SDistL;
+ _spoint = _v modelToWorld [0,-4.5,-1.6];
+ _box_num = _v getVariable "box_num";
+ _slot_num = _v getVariable "slots_num";
+ };
+ if ((_obj_type in IL_Supported_Vehicles_KAMAZ) && (_doors == "B")) then
+ {
+ _sdist = IL_SDistL;
+ _spoint = _v modelToWorld [0,-6 - (_v getVariable "load_offset"),0];
+ _box_num = _v getVariable "box_num";
+ _slot_num = _v getVariable "slots_num";
+ };
+ if ((_obj_type in IL_Supported_Vehicles_HEMTT) && (_doors == "B")) then
+ {
+ _sdist = IL_SDistL;
+ _spoint = _v modelToWorld [0,-7 - (_v getVariable "load_offset"),0];
+ _box_num = _v getVariable "box_num";
+ _slot_num = _v getVariable "slots_num";
+ };
+ if ((_obj_type in IL_Supported_Vehicles_TEMPEST) && (_doors == "B")) then
+ {
+ _sdist = IL_SDistL;
+ _spoint = _v modelToWorld [0,-6.5 - (_v getVariable "load_offset"),0];
+ _box_num = _v getVariable "box_num";
+ _slot_num = _v getVariable "slots_num";
+ };
+ if ((_obj_type in IL_Supported_Vehicles_CHINOOK) && (_doors == "B")) then
+ {
+ _sdist = IL_SDistL + IL_SDistL_Heli_offset;
+ _spoint = _v modelToWorld [0,-9,-3];
+ _box_num = _v getVariable "box_num";
+ _slot_num = _v getVariable "slots_num";
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MOHAWK) && (_doors == "B")) then
+ {
+ _sdist = IL_SDistL + IL_SDistL_Heli_offset;
+ _spoint = _v modelToWorld [0,-6,-3];
+ _box_num = _v getVariable "box_num";
+ _slot_num = _v getVariable "slots_num";
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MH9) && (_doors == "L")) then
+ {
+ _sdist = IL_SDistL + IL_SDistL_Heli_offset;
+ _spoint = _v modelToWorld [0-3,1.3,-1.3];
+ _box_num = _v getVariable "box_num_l";
+ _slot_num = _v getVariable "slots_num_l";
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MH9) && (_doors == "R")) then
+ {
+ _sdist = IL_SDistL + IL_SDistL_Heli_offset;
+ _spoint = _v modelToWorld [0+3,1.3,-1.3];
+ _box_num = _v getVariable "box_num_r";
+ _slot_num = _v getVariable "slots_num_r";
+ };
+
+ if !(_force) then
+ {
+ _obj_lst = nearestObjects[ _spoint, _supported_cargo, _sdist];
+ }
+ else
+ {
+ _obj_lst = [_cargo];
+ };
+
+ if (count (_obj_lst) > 0) then
+ {
+ {
+ if (isNil {_x getVariable "attachedPos"}) then
+ {
+ [_x] call IL_Init_Box;
+ };
+ if ((typeOf _x) in (IL_Supported_Cargo20 + ["Land_WaterTank_F"])) then
+ {
+ _turn = true;
+ };
+
+
+ _lock1 = locked _v;
+ _lock2 = locked _x;
+ if (_lock1 <= 1) then
+ {
+ if (_lock2 <= 1) then
+ {
+ if (_obj_type in IL_Supported_Vehicles_MH9) then
+ {
+ _turn = !_turn;
+ };
+ if ((_box_num > _slot_num) && !_done) then
+ {
+ _done = true;
+ _counter = (_box_num);
+ _zload = (_v getVariable "zload") + (_x getVariable "zload_cargo");
+ _cargo_offset = (_v getVariable "load_offset") + (_x getVariable "cargo_offset");
+ if ((typeOf _x) in IL_Supported_UGV) then
+ {
+ _x_cargo_offset = -0.4;
+ }
+ else
+ {
+ _x_cargo_offset = 0;
+ };
+ _damage = getDammage _x;
+
+ if ((typeOf _x) in IL_Supported_SDV) then
+ {
+ _x animate ["periscope", 3];
+ _x animate ["Antenna", 3];
+ _x animate ["HideScope", 3];
+ _x animate["display_on_R", 1];
+ while {_x animationPhase "periscope" < 3} do
+ {
+ sleep 1;
+ };
+ };
+
+ if ((_obj_type in IL_Supported_Vehicles_VAN) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,-4.5,_zload], [_x_cargo_offset,_counter + 0.25 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_OFFROAD) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,-4.5,_zload], [_x_cargo_offset,_counter + 0.25 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_KAMAZ) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,-6 - _cargo_offset,_zload], [_x_cargo_offset,_counter + 0.25 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_HEMTT) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,-7 - _cargo_offset,_zload], [_x_cargo_offset,_counter + 0.25 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_TEMPEST) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,-6.5 - _cargo_offset,_zload], [_x_cargo_offset,_counter - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_CHINOOK) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,-9,-0.75 + _zload], [_x_cargo_offset,-7,-0.75 + _zload], 1, _turn] call IL_Move_Attach;
+ [_v, _x, [_x_cargo_offset,-7,-0.75 + _zload], [_x_cargo_offset,-4,_zload], 1, _turn] call IL_Move_Attach;
+ [_v, _x, [_x_cargo_offset,-4,_zload], [_x_cargo_offset,_counter + 9 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MOHAWK) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,-6,-0.75 + _zload], [_x_cargo_offset,-4.5,-0.75 + _zload], 1, _turn] call IL_Move_Attach;
+ [_v, _x, [_x_cargo_offset,-4.5,-0.75 + _zload], [_x_cargo_offset,-1.5,_zload], 1, _turn] call IL_Move_Attach;
+ [_v, _x, [_x_cargo_offset,-1.5,_zload], [_x_cargo_offset,_counter + 9 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MH9) && (_doors == "L")) then
+ {
+ [_v, _x, [_x_cargo_offset-3,1.3,-1.3 + _zload], [_x_cargo_offset-1,-0.2,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MH9) && (_doors == "R")) then
+ {
+ [_v, _x, [_x_cargo_offset+3,1.3,-1.3 + _zload], [_x_cargo_offset+1,-0.2,_zload], 1, _turn] call IL_Move_Attach;
+ };
+
+ _counter = _counter - (_x getVariable "slots");
+
+ if (_doors == "B") then
+ {
+ _v setVariable["box_num", _counter, true];
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MH9) && (_doors == "L")) then
+ {
+ _v setVariable["box_num_l", _counter, true];
+ _v setVariable["box_l", _x, true];
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MH9) && (_doors == "R")) then
+ {
+ _v setVariable["box_num_r", _counter, true];
+ _v setVariable["box_r", _x, true];
+ };
+
+ [_v] call IL_SetNewMass;
+
+ if (_x isKindOf "AllVehicles") then
+ {
+ _x forceSpeed 0;
+ };
+
+ _x setVariable["attachedPos", _counter, true];
+ _x setVariable["attachedTruck", _v, true];
+ _x setVariable["doors", _doors, true];
+
+ if (IL_CDamage == 0) then
+ {
+ _x setDamage 0;
+ };
+
+ if (IL_CDamage == 1) then
+ {
+ _x setDamage _damage;
+ if (_damage != (getDammage _x)) then
+ {
+ sleep 1;
+ _x setDamage _damage;
+ };
+ };
+
+ _IL_noti = getText(configFile >> "cfgVehicles" >> typeOf _x >> "displayName");
+ _x call ExileServer_object_vehicle_database_update;
+ ["Success", format ["%1 successfully loaded!",_IL_noti]] call ExileClient_gui_notification_event_addNotification;
+ [Player, IL_Load_Score] call IL_Score;
+ };
+ }
+ else
+ {
+ ["Whoops", ["Locked vehicles can't be loaded!"]] call ExileClient_gui_notification_event_addNotification;
+ };
+ }
+ else
+ {
+ ["Whoops", ["Locked vehicles can't load Cargo!"]] call ExileClient_gui_notification_event_addNotification;
+ };
+
+ if (_done) exitWith {};
+ } forEach (_obj_lst);
+
+ };
+ _v setVariable["can_load", true, true];
+ };
+
+ IL_Do_Unload =
+ {
+ private ["_v", "_para", "_supported_cargo", "_doors", "_counter", "_done", "_obj_lst", "_zload", "_x_cargo_offset", "_cargo_offset", "_obj_type", "_damage", "_nic", "_free_slots", "_turn", "_skip", "_last_attach_pos"];
+ _v = _this select 0;
+ _para = if (count _this > 1) then {_this select 1} else {false};
+ _doors = if (count _this > 2) then {_this select 2} else {"B"};
+
+ _v setVariable["can_load", false, true];
+ _counter = 0;
+ _done = false;
+ _turn = false;
+ _skip = true;
+ _obj_lst = [];
+
+ _obj_type = (typeOf _v);
+ if (_obj_type in IL_Supported_Vehicles_MH9) then
+ {
+ if (_doors == "L") then
+ {
+ _obj_lst = [_v getVariable "box_l"];
+ }
+ else
+ {
+ _obj_lst = [_v getVariable "box_r"];
+ };
+ }
+ else
+ {
+ _obj_lst = attachedObjects _v;
+ };
+
+ if (count (_obj_lst) > 0) then
+ {
+ {
+ _obj_type = (typeOf _v);
+
+ if (_x getVariable "doors" == _doors) then
+ {
+ if (_doors == "B") then
+ {
+ _counter = (_v getVariable "box_num");
+ };
+ if (_doors == "L") then
+ {
+ _counter = (_v getVariable "box_num_l");
+ };
+ if (_doors == "R") then
+ {
+ _counter = (_v getVariable "box_num_r");
+ };
+ if (((_x getVariable "attachedTruck") == _v) && ((_x getVariable "attachedPos") == (_counter)) && (_counter < 0) && !_done) then
+ {
+ _done = true;
+ _skip = false;
+ _zload = (_v getVariable "zload") + (_x getVariable "zload_cargo");
+ _cargo_offset = (_v getVariable "load_offset") + (_x getVariable "cargo_offset");
+ _damage = getDammage _x;
+ if ((typeOf _x) in IL_Supported_UGV) then
+ {
+ _x_cargo_offset = -0.4;
+ }
+ else
+ {
+ _x_cargo_offset = 0;
+ };
+
+ _obj_type = (typeOf _v);
+ if ((_obj_type in IL_Supported_Vehicles_VAN) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,_counter + 0.25 - _cargo_offset,_zload], [_x_cargo_offset,-4.5,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_OFFROAD) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,_counter + 0.25 - _cargo_offset,_zload], [_x_cargo_offset,-4.5,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_KAMAZ) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,_counter + 0.25 - _cargo_offset,_zload], [_x_cargo_offset,-6 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_HEMTT) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,_counter + 0.25 - _cargo_offset,_zload], [_x_cargo_offset,-7 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_TEMPEST) && (_doors == "B")) then
+ {
+ [_v, _x, [_x_cargo_offset,_counter - _cargo_offset,_zload], [_x_cargo_offset,-6.5 - _cargo_offset,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ if ((_obj_type in IL_Supported_Vehicles_CHINOOK) && (_doors == "B")) then
+ {
+ if !(_para) then
+ {
+ [_v, _x, [_x_cargo_offset,_counter + 9 - _cargo_offset,_zload], [_x_cargo_offset,-4,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ [_v, _x, [_x_cargo_offset,-4,_zload], [_x_cargo_offset,-7,-0.75 + _zload], 1, _turn] call IL_Move_Attach;
+ [_v, _x, [_x_cargo_offset,-7,-0.75 + _zload], [_x_cargo_offset,-9,-0.75 + _zload], 1, _turn] call IL_Move_Attach;
+ if ((_para) && (_obj_type in IL_Para_Drop_Vehicles)) then
+ {
+ _last_attach_pos = [_x_cargo_offset,-10,-0.75 + _zload];
+ };
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MOHAWK) && (_doors == "B")) then
+ {
+ if !(_para) then
+ {
+ [_v, _x, [_x_cargo_offset,_counter + 9 - _cargo_offset,_zload], [_x_cargo_offset,-1.5,_zload], 1, _turn] call IL_Move_Attach;
+ };
+ [_v, _x, [_x_cargo_offset,-1.5,_zload], [_x_cargo_offset,-4.5,-0.75 + _zload], 1, _turn] call IL_Move_Attach;
+ [_v, _x, [_x_cargo_offset,-4.5,-0.75 + _zload], [_x_cargo_offset,-6,-0.75 + _zload], 1, _turn] call IL_Move_Attach;
+ if ((_para) && (_obj_type in IL_Para_Drop_Vehicles)) then
+ {
+ _last_attach_pos = [_x_cargo_offset,-6,-0.75 + _zload];
+ };
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MH9) && (_doors == "L")) then
+ {
+ [_v, _x, [_x_cargo_offset-1,-0.2,_zload], [_x_cargo_offset-3,1.3,-0.75 + _zload], 1] call IL_Move_Attach;
+ if ((_para) && (_obj_type in IL_Para_Drop_Vehicles)) then
+ {
+ _last_attach_pos = [_x_cargo_offset-3,1.3,-0.75 + _zload];
+ };
+ };
+ if ((_obj_type in IL_Supported_Vehicles_MH9) && (_doors == "R")) then
+ {
+ [_v, _x, [_x_cargo_offset+1,-0.2,_zload], [_x_cargo_offset+3,1.3,-0.75 + _zload], 1] call IL_Move_Attach;
+ if ((_para) && (_obj_type in IL_Para_Drop_Vehicles)) then
+ {
+ _last_attach_pos = [_x_cargo_offset+3,1.3,-0.75 + _zload];
+ };
+ };
+
+ if ((_para) && (_obj_type in IL_Para_Drop_Vehicles)) then
+ {
+ _player_velocity = velocity (vehicle player);
+ [_x, _v, _last_attach_pos, _player_velocity] spawn IL_Cargo_Para;
+ }
+ else
+ {
+ sleep 0.2;
+ detach _x;
+ _x setVelocity [0, 0, -0.2];
+ };
+
+ if (_x isKindOf "AllVehicles") then
+ {
+ _x forceSpeed -1;
+ };
+
+ _counter = _counter + (_x getVariable "slots");
+ if (_doors == "B") then
+ {
+ _v setVariable["box_num", _counter, true];
+ _free_slots = abs((_v getVariable "slots_num") - (_v getVariable "box_num"));
+ };
+ if (_doors == "L") then
+ {
+ _v setVariable["box_num_l", _counter, true];
+ _v setVariable["box_l", _v, true];
+ _free_slots = abs((_v getVariable "slots_num_l") - (_v getVariable "box_num_l"));
+ };
+ if (_doors == "R") then
+ {
+ _v setVariable["box_num_r", _counter, true];
+ _v setVariable["box_r", _v, true];
+ _free_slots = abs((_v getVariable "slots_num_r") - (_v getVariable "box_num_r"));
+ };
+
+ [_v] call IL_SetNewMass;
+
+ _x setVariable["attachedPos", 0, true];
+ _x setVariable["attachedTruck", _x, true];
+ _x setVariable["doors", "N", true];
+
+ if (IL_CDamage == 0) then
+ {
+ _x setDamage 0;
+ };
+
+ if (IL_CDamage == 1) then
+ {
+ _x setDamage _damage;
+ if (_damage != (getDammage _x)) then
+ {
+ sleep 1;
+ _x setDamage _damage;
+ };
+ };
+ [Player, IL_Unload_Score] call IL_Score;
+ sleep 1;
+ };
+ };
+ _IL_noti = getText(configFile >> "cfgVehicles" >> typeOf _x >> "displayName");
+ ["Success", format ["%1 successfully unloaded!",_IL_noti]] call ExileClient_gui_notification_event_addNotification;
+
+ if (_done) exitWith {};
+ } forEach (_obj_lst);
+ if (_skip) then
+ {
+
+ if (_counter < 0) then
+ {
+ _counter = _counter + 1;
+ };
+
+ if (_doors == "B") then
+ {
+ _v setVariable["box_num", _counter, true];
+ _free_slots = abs((_v getVariable "slots_num") - (_v getVariable "box_num"));
+ };
+ if (_doors == "L") then
+ {
+ _v setVariable["box_num_l", _counter, true];
+ _v setVariable["box_l", _v, true];
+ _free_slots = abs((_v getVariable "slots_num_l") - (_v getVariable "box_num_l"));
+ };
+ if (_doors == "R") then
+ {
+ _v setVariable["box_num_r", _counter, true];
+ _v setVariable["box_r", _v, true];
+ _free_slots = abs((_v getVariable "slots_num_r") - (_v getVariable "box_num_r"));
+ };
+ };
+ }
+ else
+ {
+ [_v, true] call IL_Init_Veh;
+ };
+ [_v] call IL_SetNewMass;
+ _v setVariable["can_load", true, true];
+ };
+
+
+ IL_Server_GetOut =
+ {
+ private ["_v", "_player", "_para", "_chute", "_backpack", "_pos", "_x_offset", "_dist", "_dist_out", "_dist_out_para", "_velocity"];
+ _vars = _this select 1;
+ _v = _vars select 0;
+ _player = _vars select 1;
+ _para = if (count _this > 2) then {_this select 2} else {false};
+
+ if ((typeOf _v) in IL_Supported_Vehicles_MH9) then
+ {
+ _dist_out = 5;
+ _dist_out_para = 5;
+ };
+ if ((typeOf _v) in IL_Supported_Vehicles_MOHAWK) then
+ {
+ _dist_out = 5;
+ _dist_out_para = 11;
+ };
+ if ((typeOf _v) in IL_Supported_Vehicles_CHINOOK) then
+ {
+ _dist_out = 7;
+ _dist_out_para = 11;
+ };
+
+ _pos = (_v worldToModel (getPosATL _player));
+ _x_offset = _pos select 0;
+ if (_x_offset < 0) then
+ {
+ if ((typeOf _v) in IL_Supported_Vehicles_MH9) then
+ {
+ _x_offset = 90;
+ }
+ else
+ {
+ _x_offset = 8;
+ };
+ }
+ else
+ {
+ if ((typeOf _v) in IL_Supported_Vehicles_MH9) then
+ {
+ _x_offset = -90;
+ }
+ else
+ {
+ _x_offset = -8;
+ };
+ };
+
+ _player allowDamage false;
+ sleep 0.2;
+ unassignVehicle _player;
+ _player action ["EJECT",vehicle _player];
+ sleep 0.5;
+
+ if !(_para) then
+ {
+ _player setDir ((getDir _v) + 180);
+ _pos = ([_v, _dist_out, ((getDir _v) + 180 + _x_offset)] call BIS_fnc_relPos);
+ _pos = [_pos select 0, _pos select 1, ((getPosATL _v) select 2)];
+ _player setPosATL _pos;
+ }
+ else
+ {
+ _pos = ([_v, _dist_out_para, ((getDir _v) + 180 + _x_offset)] call BIS_fnc_relPos);
+ _pos = [_pos select 0, _pos select 1, ((getPosATL _v) select 2)];
+ _player setPosATL _pos;
+ _dist = _v distance _player;
+ while {(_v distance _player) - _dist < 20} do
+ {
+ sleep 0.2;
+ };
+ if (IL_Para_Jump_Open_ATL > 0) then
+ {
+ while {(getPosATL _player) select 2 > IL_Para_Jump_Open_ATL} do
+ {
+ sleep 0.2;
+ };
+ };
+ if !(unitBackpack _player isKindOf "B_Parachute") then
+ {
+ _chute = createVehicle ["Steerable_Parachute_F", position _player, [], 0, "CAN_COLLIDE"];
+ _chute AttachTo [_player, [0,0,0]];
+ detach _chute;
+ _velocity = velocity _player;
+ _player moveInDriver _chute;
+ if (IL_Para_Jump_Velocity) then
+ {
+ _chute setVelocity _velocity;
+ };
+ };
+ };
+ _player allowDamage true;
+
+ };
+
+ IL_GetOut = {
+ private ["_cargo", "_v", "_last_attach_pos"];
+ IL_Client_GetOut = _this;
+ if (isServer) then
+ {
+ IL_Client_GetOut spawn IL_Server_GetOut;
+ }
+ else
+ {
+ publicVariableServer "IL_Client_GetOut";
+ };
+ };
+ "IL_Client_GetOut" addPublicVariableEventHandler IL_GetOut;
+
+};
+
+_vsupported = false;
+if (_obj_main_type in IL_Supported_Vehicles_MOHAWK) then
+{
+
+ _vsupported = true;
+ [_obj_main] call IL_Init_Veh;
+
+ _obj_main addAction [
+ "
Load cargo on CH-49",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_Mohawk] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-6,-3], IL_Supported_Cargo_NonVeh_Mohawk, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-6,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'CargoRamp_Open' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on CH-49",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_Mohawk] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-6,-3], IL_Supported_Cargo_Veh_Mohawk, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-6,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'CargoRamp_Open' == 1)"
+ ];
+
+ _obj_main addAction [
+ "Get in CH-49",
+ {
+ (_this select 1) moveInCargo (_this select 0);
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_this in (nearestObjects[ _target modelToWorld [0,-6,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && ((_target emptyPositions 'cargo') > 0) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'CargoRamp_Open' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "Get out CH-49",
+ {
+ [_this select 0, _this select 1, false] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'CargoRamp_Open' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "
Eject",
+ {
+ [_this select 0, _this select 1, true] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (((getPosATL _target) select 2) >= IL_Para_Jump_ATL) && (_target animationPhase 'CargoRamp_Open' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from CH-49",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-6,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'CargoRamp_Open' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo with parachute",
+ {
+ [_this select 0, true] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL) && (_target animationPhase 'CargoRamp_Open' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Unload ALL cargo with parachute",
+ {
+ while {((_this select 0) getVariable "box_num") != 0} do
+ {
+ [_this select 0, true] call IL_Do_Unload;
+ };
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL) && (_target animationPhase 'CargoRamp_Open' == 1)"
+ ];
+
+ _obj_main addAction [
+ "Open cargo ramp in CH-49",
+ {
+ _this select 0 animatedoor ['CargoRamp_Open', 1];
+ },[],IL_Action_O_Priority,false,true,"",
+ "((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-6,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target animationPhase 'CargoRamp_Open' == 0) && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "Close cargo ramp in CH-49",
+ {
+ _this select 0 animatedoor ['CargoRamp_Open', 0];
+ },[],IL_Action_O_Priority,false,true,"",
+ "((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-6,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target animationPhase 'CargoRamp_Open' == 1) && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "Enable loading for Co-Pilot",
+ {
+ (_this select 0) setVariable["can_copilot", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && !(_target getVariable 'can_copilot') && IL_Can_CoPilot)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading for Co-Pilot",
+ {
+ (_this select 0) setVariable["can_copilot", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && (_target getVariable 'can_copilot') && IL_Can_CoPilot)"
+ ];
+
+ _obj_main addAction [
+ "Enable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && !(_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Enable usable ramp",
+ {
+ (_this select 0) setVariable["usable_ramp", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && !(_target getVariable 'usable_ramp') && IL_Ramp)"
+ ];
+
+ _obj_main addAction [
+ "Disable usable ramp",
+ {
+ (_this select 0) setVariable["usable_ramp", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'usable_ramp') && IL_Ramp)"
+ ];
+};
+if (_obj_main_type in IL_Supported_Vehicles_CHINOOK) then
+{
+
+ _vsupported = true;
+ [_obj_main] call IL_Init_Veh;
+
+ if (typeOf _obj_main == "CH_147F") then
+ {
+ _obj_main addAction [
+ "
Load cargo on Chinook",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_CHINOOK] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-9,-3], IL_Supported_Cargo_NonVeh_CHINOOK, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'ani_ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on Chinook",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_CHINOOK] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-9,-3], IL_Supported_Cargo_Veh_CHINOOK, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'ani_ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "Get in Chinook Ride in back",
+ {
+ (_this select 1) moveInCargo (_this select 0);
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && ((_target emptyPositions 'cargo') > 0) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'ani_ramp' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "Get in Chinook",
+ {
+ (_this select 1) setDir (getDir (_this select 0));
+ _pos = ([(_this select 0), 4.5, (getDir (_this select 0))] call BIS_fnc_relPos);
+ _pos = [_pos select 0, _pos select 1, ((getPosATL (_this select 0)) select 2) + 1];
+ (_this select 1) setPosATL _pos;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && ((_target emptyPositions 'cargo') > 0) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'ani_ramp' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "Get out Chinook",
+ {
+ [_this select 0, _this select 1, false] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'ani_ramp' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "
Eject",
+ {
+ [_this select 0, _this select 1, true] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (((getPosATL _target) select 2) >= IL_Para_Jump_ATL) && (_target animationPhase 'ani_ramp' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from Chinook",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'ani_ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo with parachute",
+ {
+ [_this select 0, true] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL) && (_target animationPhase 'ani_ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Unload ALL cargo with parachute",
+ {
+ while {((_this select 0) getVariable "box_num") != 0} do
+ {
+ [_this select 0, true] call IL_Do_Unload;
+ };
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL) && (_target animationPhase 'ani_ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "Open cargo ramp in Chinook",
+ {
+ _this select 0 animatedoor ['ani_ramp', 1];
+ _this select 0 animatedoor ['ani_ramp2', 1];
+ },[],IL_Action_O_Priority,false,true,"",
+ "((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target animationPhase 'ani_ramp' == 0) && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "Close cargo ramp in Chinook",
+ {
+ _this select 0 animatedoor ['ani_ramp', 0];
+ _this select 0 animatedoor ['ani_ramp2', 0];
+ },[],IL_Action_O_Priority,false,true,"",
+ "((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target animationPhase 'ani_ramp' == 1) && (_target getVariable 'can_load')"
+ ];
+ };
+ if (typeOf _obj_main == "CH_47F") then
+ {
+ _obj_main addAction [
+ "
Load cargo on Chinook",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_CHINOOK] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-9,-3], IL_Supported_Cargo_NonVeh_CHINOOK, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on Chinook",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_CHINOOK] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-9,-3], IL_Supported_Cargo_Veh_CHINOOK, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "Get in Chinook Ride in back",
+ {
+ (_this select 1) moveInCargo (_this select 0);
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && ((_target emptyPositions 'cargo') > 0) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ramp' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "Get in Chinook",
+ {
+ (_this select 1) setDir (getDir (_this select 0));
+ _pos = ([(_this select 0), 4.5, (getDir (_this select 0))] call BIS_fnc_relPos);
+ _pos = [_pos select 0, _pos select 1, ((getPosATL (_this select 0)) select 2) + 1];
+ (_this select 1) setPosATL _pos;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && ((_target emptyPositions 'cargo') > 0) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ramp' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "Get out Chinook",
+ {
+ [_this select 0, _this select 1, false] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ramp' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "
Eject",
+ {
+ [_this select 0, _this select 1, true] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (((getPosATL _target) select 2) >= IL_Para_Jump_ATL) && (_target animationPhase 'Ramp' > 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from Chinook",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo with parachute",
+ {
+ [_this select 0, true] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL) && (_target animationPhase 'Ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "
Unload ALL cargo with parachute",
+ {
+ while {((_this select 0) getVariable "box_num") != 0} do
+ {
+ [_this select 0, true] call IL_Do_Unload;
+ };
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL) && (_target animationPhase 'Ramp' == 1)"
+ ];
+
+ _obj_main addAction [
+ "Open cargo ramp in Chinook",
+ {
+ _this select 0 animate ['Ramp', 1];
+ },[],IL_Action_O_Priority,false,true,"",
+ "((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target animationPhase 'Ramp' == 0) && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "Close cargo ramp in Chinook",
+ {
+ _this select 0 animate ['Ramp', 0];
+ },[],IL_Action_O_Priority,false,true,"",
+ "((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target animationPhase 'Ramp' == 1) && (_target getVariable 'can_load')"
+ ];
+ };
+ if (typeOf _obj_main in ["kyo_MH47E_HC", "kyo_MH47E_Ramp", "kyo_MH47E_base"]) then
+ {
+ _obj_main addAction [
+ "
Load cargo on Chinook",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_CHINOOK] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-9,-3], IL_Supported_Cargo_NonVeh_CHINOOK, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ani_Ramp' < 0.43)"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on Chinook",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_CHINOOK] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-9,-3], IL_Supported_Cargo_Veh_CHINOOK, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ani_Ramp' < 0.43)"
+ ];
+
+ _obj_main addAction [
+ "Get in Chinook Ride in back",
+ {
+ (_this select 1) moveInCargo (_this select 0);
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && ((_target emptyPositions 'cargo') > 0) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ani_Ramp' < 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "Get in Chinook",
+ {
+ (_this select 1) setDir (getDir (_this select 0));
+ _pos = ([(_this select 0), 4.5, (getDir (_this select 0))] call BIS_fnc_relPos);
+ _pos = [_pos select 0, _pos select 1, ((getPosATL (_this select 0)) select 2) + 1];
+ (_this select 1) setPosATL _pos;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && ((_target emptyPositions 'cargo') > 0) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ani_Ramp' < 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "Get out Chinook",
+ {
+ [_this select 0, _this select 1, false] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ani_Ramp' < 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "
Eject",
+ {
+ [_this select 0, _this select 1, true] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (((getPosATL _target) select 2) >= IL_Para_Jump_ATL) && (_target animationPhase 'Ani_Ramp' < 0.43) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from Chinook",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt) && (_target animationPhase 'Ani_Ramp' < 0.43)"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo with parachute",
+ {
+ [_this select 0, true] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL) && (_target animationPhase 'Ani_Ramp' < 0.43)"
+ ];
+
+ _obj_main addAction [
+ "
Unload ALL cargo with parachute",
+ {
+ while {((_this select 0) getVariable "box_num") != 0} do
+ {
+ [_this select 0, true] call IL_Do_Unload;
+ };
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL) && (_target animationPhase 'Ani_Ramp' < 0.43)"
+ ];
+
+ _obj_main addAction [
+ "Open cargo ramp in Chinook",
+ {
+ _this select 0 animate ['Ani_Ramp', 0];
+ },[],IL_Action_O_Priority,false,true,"",
+ "((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target animationPhase 'Ani_Ramp' == 1) && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "Close cargo ramp in Chinook",
+ {
+ _this select 0 animate ['Ani_Ramp', 1];
+ },[],IL_Action_O_Priority,false,true,"",
+ "((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || ((_this in (nearestObjects[ _target modelToWorld [0,-9,-3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside'))) && (_target animationPhase 'Ani_Ramp' == 0) && (_target getVariable 'can_load')"
+ ];
+ };
+
+ _obj_main addAction [
+ "Enable loading for Co-Pilot",
+ {
+ (_this select 0) setVariable["can_copilot", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && !(_target getVariable 'can_copilot') && IL_Can_CoPilot)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading for Co-Pilot",
+ {
+ (_this select 0) setVariable["can_copilot", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && (_target getVariable 'can_copilot') && IL_Can_CoPilot)"
+ ];
+
+ _obj_main addAction [
+ "Enable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && !(_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Enable usable ramp",
+ {
+ (_this select 0) setVariable["usable_ramp", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && !(_target getVariable 'usable_ramp') && IL_Ramp)"
+ ];
+
+ _obj_main addAction [
+ "Disable usable ramp",
+ {
+ (_this select 0) setVariable["usable_ramp", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'usable_ramp') && IL_Ramp)"
+ ];
+};
+if (_obj_main_type in IL_Supported_Vehicles_MH9) then
+{
+
+ _vsupported = true;
+ [_obj_main] call IL_Init_Veh;
+
+ _obj_main addAction [
+ "
Load cargo on left MH-9",
+ {
+ [_this select 0, IL_Supported_Cargo_MH9, "L"] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count (nearestObjects[ _target modelToWorld [0-3,1,-1.3], IL_Supported_Cargo_MH9, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || (((_this in (nearestObjects[ _target modelToWorld [0-3,1,-1.3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num_l' > _target getVariable 'slots_num_l') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt)"
+ ];
+
+ _obj_main addAction [
+ "
Load cargo on right MH-9",
+ {
+ [_this select 0, IL_Supported_Cargo_MH9, "R"] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count (nearestObjects[ _target modelToWorld [0+3,1,-1.3], IL_Supported_Cargo_MH9, IL_SDistL + IL_SDistL_Heli_offset]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || (((_this in (nearestObjects[ _target modelToWorld [0+3,1,-1.3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num_r' > _target getVariable 'slots_num_r') && (_target getVariable 'can_load') && (((getPos _target) select 2) <= IL_LU_Alt)"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from left MH-9",
+ {
+ [_this select 0, false, "L"] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num_l' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || (((_this in (nearestObjects[ _target modelToWorld [0-3,1,-1.3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt)"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from right MH-9",
+ {
+ [_this select 0, false, "R"] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num_r' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (IL_Can_Inside && ('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot')) || (((_this in (nearestObjects[ _target modelToWorld [0+3,1,-1.3], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed) && (((getPos _target) select 2) <= IL_LU_Alt)"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo with parachute left MH-9",
+ {
+ [_this select 0, true, "L"] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num_l' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL)"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo with parachute right MH-9",
+ {
+ [_this select 0, true, "R"] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num_r' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL)"
+ ];
+
+ _obj_main addAction [
+ "
Unload ALL cargo with parachute",
+ {
+ [_this select 0, true, "L"] call IL_Do_Unload;
+ [_this select 0, true, "R"] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num_r' < 0) && (_target getVariable 'box_num_l' < 0) && ((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_load') && (((getPosATL _target) select 2) >= IL_Para_Drop_ATL)"
+ ];
+
+ _obj_main addAction [
+ "
Eject",
+ {
+ [_this select 0, _this select 1, true] call IL_GetOut;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "('cargo' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (((getPosATL _target) select 2) >= IL_Para_Jump_ATL) && (_target getVariable 'usable_ramp')"
+ ];
+
+ _obj_main addAction [
+ "Enable loading for Co-Pilot",
+ {
+ (_this select 0) setVariable["can_copilot", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && !(_target getVariable 'can_copilot') && IL_Can_CoPilot)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading for Co-Pilot",
+ {
+ (_this select 0) setVariable["can_copilot", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && (_target getVariable 'can_copilot') && IL_Can_CoPilot)"
+ ];
+
+ _obj_main addAction [
+ "Enable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && !(_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Enable usable ramp",
+ {
+ (_this select 0) setVariable["usable_ramp", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && !(_target getVariable 'usable_ramp') && IL_Ramp)"
+ ];
+
+ _obj_main addAction [
+ "Disable usable ramp",
+ {
+ (_this select 0) setVariable["usable_ramp", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "(((driver _target == _this) || (('Turret' in (assignedVehicleRole _this)) && (vehicle _this == _target) && (_target getVariable 'can_copilot'))) && (_target getVariable 'usable_ramp') && IL_Ramp)"
+ ];
+
+};
+if (_obj_main_type in IL_Supported_Vehicles_OFFROAD) then
+{
+
+ _vsupported = true;
+ [_obj_main] call IL_Init_Veh;
+
+ _obj_main addAction [
+ "
Load cargo on Offroad",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_OFFROAD] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-4.5,0], IL_Supported_Cargo_NonVeh_OFFROAD, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || ((((_this in (nearestObjects[ _target modelToWorld [0,-4.5,0], [], IL_SDistL + IL_SDistL_Heli_offset]))) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on Offroad",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_OFFROAD] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-4.5,0], IL_Supported_Cargo_Veh_OFFROAD, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || ((((_this in (nearestObjects[ _target modelToWorld [0,-4.5,0], [], IL_SDistL + IL_SDistL_Heli_offset]))) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from Offroad",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (((_this in (nearestObjects[ _target modelToWorld [0,-4.5,0], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed)"
+ ];
+ _obj_main addAction [
+ "Enable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && !(_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && (_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+};
+if (_obj_main_type in IL_Supported_Vehicles_VAN) then
+{
+
+ _vsupported = true;
+ [_obj_main] call IL_Init_Veh;
+
+ _obj_main addAction [
+ "
Load cargo on VAN",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_VAN] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-4.5,0], IL_Supported_Cargo_NonVeh_VAN, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || ((((_this in (nearestObjects[ _target modelToWorld [0,-4.5,0], [], IL_SDistL + IL_SDistL_Heli_offset]))) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on VAN",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_VAN] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-4.5,0], IL_Supported_Cargo_Veh_VAN, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || ((((_this in (nearestObjects[ _target modelToWorld [0,-4.5,0], [], IL_SDistL + IL_SDistL_Heli_offset]))) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from VAN",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (((_this in (nearestObjects[ _target modelToWorld [0,-4.5,0], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed)"
+ ];
+
+ _obj_main addAction [
+ "Enable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && !(_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && (_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+};
+if (_obj_main_type in IL_Supported_Vehicles_KAMAZ) then
+{
+
+ _vsupported = true;
+ [_obj_main] call IL_Init_Veh;
+
+ _obj_main addAction [
+ "
Load cargo on ZAMAK",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_Kamaz] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-6 - (_target getVariable 'load_offset'),0], IL_Supported_Cargo_NonVeh_Kamaz, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || ((((_this in (nearestObjects[ _target modelToWorld [0,-6 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset]))) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on ZAMAK",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_Kamaz] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-6 - (_target getVariable 'load_offset'),0], IL_Supported_Cargo_Veh_Kamaz, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || ((((_this in (nearestObjects[ _target modelToWorld [0,-6 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset]))) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from ZAMAK",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (((_this in (nearestObjects[ _target modelToWorld [0,-6 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed)"
+ ];
+ _obj_main addAction [
+ "Enable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && !(_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && (_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+};
+if (_obj_main_type in IL_Supported_Vehicles_TEMPEST) then
+{
+
+ _vsupported = true;
+ [_obj_main] call IL_Init_Veh;
+
+ _obj_main addAction [
+ "
Load cargo on TEMPEST",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_TEMPEST] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-6.5 - (_target getVariable 'load_offset'),0], IL_Supported_Cargo_NonVeh_TEMPEST, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || ((((_this in (nearestObjects[ _target modelToWorld [0,-6.5 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset]))) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on TEMPEST",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_TEMPEST] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-6.5 - (_target getVariable 'load_offset'),0], IL_Supported_Cargo_Veh_TEMPEST, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || ((((_this in (nearestObjects[ _target modelToWorld [0,-6.5 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset]))) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from TEMPEST",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (((_this in (nearestObjects[ _target modelToWorld [0,-6.5 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed)"
+ ];
+ _obj_main addAction [
+ "Enable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && !(_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && (_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+};
+if (_obj_main_type in IL_Supported_Vehicles_HEMTT) then
+{
+
+ _vsupported = true;
+ [_obj_main] call IL_Init_Veh;
+
+ _obj_main addAction [
+ "
Load cargo on HEMTT",
+ {
+ [_this select 0, IL_Supported_Cargo_NonVeh_HEMTT] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-7 - (_target getVariable 'load_offset'),0], IL_Supported_Cargo_NonVeh_HEMTT, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (((_this in (nearestObjects[ _target modelToWorld [0,-7 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Load vehicle on HEMTT",
+ {
+ [_this select 0, IL_Supported_Cargo_Veh_HEMTT] call IL_Do_Load;
+ },[],IL_Action_LU_Priority,true,true,"",
+ "(count(nearestObjects[ _target modelToWorld [0,-7 - (_target getVariable 'load_offset'),0], IL_Supported_Cargo_Veh_HEMTT, IL_SDistL]) > 0) && (abs(speed _target) <= IL_LU_Speed) && ((IL_Can_Inside && (driver _target == _this)) || (((_this in (nearestObjects[ _target modelToWorld [0,-7 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'box_num' > _target getVariable 'slots_num') && (_target getVariable 'can_load')"
+ ];
+
+ _obj_main addAction [
+ "
Unload cargo from HEMTT",
+ {
+ [_this select 0] call IL_Do_Unload;
+ },[],IL_Action_LU_Priority,false,true,"",
+ "(_target getVariable 'box_num' < 0) && ((IL_Can_Inside && (driver _target == _this)) || (((_this in (nearestObjects[ _target modelToWorld [0,-7 - (_target getVariable 'load_offset'),0], [], IL_SDistL + IL_SDistL_Heli_offset])) && (_target getVariable 'can_outside')))) && (_target getVariable 'can_load') && (abs(speed _target) <= IL_LU_Speed)"
+ ];
+
+ _obj_main addAction [
+ "Enable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", true, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && !(_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+
+ _obj_main addAction [
+ "Disable loading from outside",
+ {
+ (_this select 0) setVariable["can_outside", false, true];;
+ },[],IL_Action_S_Priority,false,true,"",
+ "((driver _target == _this) && (_target getVariable 'can_outside') && IL_Can_Outside)"
+ ];
+};
diff --git a/mpmissions/Exile.Altis/Igiload/IgiLoadInit.sqf b/mpmissions/Exile.Altis/Igiload/IgiLoadInit.sqf
new file mode 100644
index 0000000..a614b82
--- /dev/null
+++ b/mpmissions/Exile.Altis/Igiload/IgiLoadInit.sqf
@@ -0,0 +1,52 @@
+waituntil {!isnil "bis_fnc_init"};
+//if (isDedicated) exitwith {};
+//if (isServer) exitwith {};
+//waitUntil { !(isNull player) };
+waitUntil { time > 0 };
+
+IL_EV_Count = 0;
+IL_Veh_Array = [];
+
+
+//cutText ["IgiLoad is loading. Please wait...","PLAIN",2];
+sleep (random 30);
+
+//cutText [Format ["IgiLoad init Player: %1", Player],"PLAIN",2];
+
+_null = [Player] execVM "IgiLoad\IgiLoad.sqf";
+waitUntil {scriptDone _null};
+
+sleep (random (IL_Check_Veh_Max - IL_Check_Veh_Min));
+
+{
+ if ((typeOf _x) in (IL_Supported_Vehicles_All)) then
+ {
+ IL_Veh_Array = IL_Veh_Array + [_x];
+ _null = [_x] execVM "IgiLoad\IgiLoad.sqf";
+ waitUntil {scriptDone _null};
+ };
+} forEach (vehicles);
+
+call compileFinal preprocessFileLineNumbers "IgiLoad\IgiLoadTaru.sqf";
+//cutText ["IgiLoad loaded. Have fun :)","PLAIN",2];
+
+while {true} do
+{
+ sleep (IL_Check_Veh_Min + (random (IL_Check_Veh_Max - IL_Check_Veh_Min)));
+ IL_LST_Count = nearestObjects[getPos player,IL_Supported_Init_All,75];
+ //Delete vehicles from "IL_Veh_Array" if not in "vehicles"
+ {
+ if !(_x in vehicles) then
+ {
+ IL_Veh_Array = IL_Veh_Array - [_x];
+ };
+ } forEach (IL_Veh_Array);
+ {
+ if (((typeOf _x) in (IL_Supported_Vehicles_All)) && !(_x in IL_Veh_Array)) then
+ {
+ IL_Veh_Array = IL_Veh_Array + [_x];
+ _null = [_x] execVM "IgiLoad\IgiLoad.sqf";
+ waitUntil {scriptDone _null};
+ };
+ } forEach IL_LST_Count;
+};
diff --git a/mpmissions/Exile.Altis/Igiload/IgiLoadTaru.sqf b/mpmissions/Exile.Altis/Igiload/IgiLoadTaru.sqf
new file mode 100644
index 0000000..0e6a324
--- /dev/null
+++ b/mpmissions/Exile.Altis/Igiload/IgiLoadTaru.sqf
@@ -0,0 +1,478 @@
+/*
+This script is based on Xeno Taru mod from NorX Aengell.
+http://www.armaholic.com/page.php?id=27532
+
+Original author: NorX Aengell
+Rewrite and Epoch adaptation: Slayer
+
+*/
+
+IL_Taru_DevMod = false;
+
+//above this altitude dropping with parachute
+IL_Taru_Parachute_Altitude = 70;
+
+//open parachute when altitude is less or equal this parameter
+IL_Taru_Parachute_Open_Altitude = 60;
+//IL_Taru_Parachute_Altitude must be greater then IL_Taru_Parachute_Open_Altitude
+
+IL_Taru_Disable_Deattaching_Altitude = 3;
+//Not posible to deattach when altitude is extrely low, because new position of pod will be under terrain level.
+//Recomended values are between 3 and 10.
+
+if (hasInterface && !isDedicated) then {
+ if (IL_Taru_DevMod) then {
+ diag_log "Igi Load Taru started";
+ };
+
+ IL_Taru_Init =
+ {
+ waituntil
+ {
+ sleep 2;
+
+ {
+ if (isnil {_x getVariable "IL_Taru_Action_Attach"}) then
+ {
+ _x setVariable ["IL_Taru_Action_Attach",true,false];
+
+ IL_Taru_Action_Attach = _x addAction ["
Attach the Pod", "[""attach"",_this] call IL_Taru_Do_Action;", nil, 2, false, true, "",
+ "[_this] call IL_Verify_Heli and {[vehicle _this] call IL_Verify_Pod} and {!([vehicle _this] call IL_Verify_Attached_Object)}"];
+ };
+
+ if (isnil {_x getVariable "IL_Taru_Action_Deattach"}) then
+ {
+ _x setVariable ["IL_Taru_Action_Deattach",true,false];
+
+ IL_Taru_Action_Deattach = _x addAction ["
Detach the Pod", "[""deattach"",_this] call IL_Taru_Do_Action;", nil, 2, false, true, "",
+ "[_this] call IL_Verify_Heli and [_this] call IL_Verify_Altitude and {[vehicle _this] call IL_Verify_Attached_Object}"];
+ };
+
+ if (isnil {_x getVariable "IL_Taru_Action_Drop"}) then
+ {
+ _x setVariable ["IL_Taru_Action_Drop",true,false];
+
+ IL_Taru_Action_Drop = _x addAction ["
Drop the Pod", "[""drop"",_this] call IL_Taru_Do_Action;", nil, 2, false, true, "",
+ "[_this] call IL_Verify_Heli and {[vehicle _this] call IL_Verify_Attached_Object}"];
+ };
+ } foreach units group player;
+ };
+ };
+
+ IL_Verify_Attached_Object =
+ {
+ if (IL_Taru_DevMod) then {
+ diag_log "IL_Verify_Attached_Object called";
+ };
+ _helico = (_this select 0);
+ _object_Verifier = false;
+ if (count (attachedObjects _helico) isEqualTo 0) exitwith {_object_Verifier};
+ {
+ if (_x isKindOf "Pod_Heli_Transport_04_base_F") exitwith {_object_Verifier = true;};
+ } foreach attachedObjects _helico;
+ if (IL_Taru_DevMod) then {
+ diag_log format["IL_Verify_Attached_Object returns %1",_object_Verifier];
+ };
+ _object_Verifier
+ };
+
+ IL_Verify_Pod =
+ {
+ if (IL_Taru_DevMod) then {
+ diag_log "IL_Verify_Pod called";
+ };
+ _pod = getSlingLoad (_this select 0);
+ _pod_Verifier = false;
+ if (isnull (getSlingLoad vehicle player)) exitwith {_pod_Verifier};
+ if (_pod isKindOf "Pod_Heli_Transport_04_base_F") then {_pod_Verifier = true;};
+ if (IL_Taru_DevMod) then {
+ diag_log format["IL_Verify_Pod returns %1",_pod_Verifier];
+ };
+ _pod_Verifier
+ };
+
+ IL_Verify_Heli =
+ {
+ if (IL_Taru_DevMod) then {
+ diag_log "IL_Verify_Heli called";
+ };
+ _helico = vehicle (_this select 0);
+ _helico_Verifier = false;
+ if (_helico isKindOf "Heli_Transport_04_base_F") then {_helico_Verifier = true;};
+ if (IL_Taru_DevMod) then {
+ diag_log format["IL_Verify_Heli returns %1",_helico_Verifier];
+ };
+ _helico_Verifier
+ };
+
+ IL_Verify_Altitude = {
+ if (IL_Taru_DevMod) then {
+ diag_log "IL_Verify_Altitude called";
+ };
+ _helico = vehicle (_this select 0);
+ _allow_deattach = false;
+ if ((getPosATL _helico) select 2 > IL_Taru_Disable_Deattaching_Altitude) then {_allow_deattach = true;};
+ if (IL_Taru_DevMod) then {
+ diag_log format["IL_Verify_Altitude returns %1",_allow_deattach];
+ };
+ _allow_deattach
+ };
+
+ IL_Taru_Do_Action =
+ {
+ _action = _this select 0;
+ _helico = "";
+
+ if (typename (_this select 1) isEqualTo "OBJECT") then {_helico = vehicle (_this select 1);};
+ if (typename (_this select 1) isEqualTo "ARRAY") then {_helico = vehicle ((_this select 1) select 0);};
+
+ _cables = ropes _helico;
+
+ if (ropeUnwound (_cables select 0)) then
+ {
+ [_action, _helico] call IL_Pod_Manager;
+ };
+ };
+
+ IL_Taru_Transmission =
+ {
+ private ["_soundToPlay", "_helico", "_soundToPlay","_args","_pod"];
+ _args = _this select 1;
+ _helico = vehicle (_args select 1);
+ _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString;
+
+ switch (_args select 0) do {
+ case 'rope_unwind': {
+ _pod = _args select 2;
+ _helico disableCollisionWith _pod;
+ {ropeUnwind [_x, _args select 3, _args select 4];} foreach ropes _helico;
+ sleep 4;
+ _helico enableCollisionWith _pod;
+ };
+ case 'rope_unwind_and_wait': {
+ _pod = _args select 2;
+ _helico disableCollisionWith _pod;
+ {ropeUnwind [_x, _args select 3, _args select 4];} foreach ropes _helico;
+ waituntil {ropeLength ((ropes _helico) select 0) isEqualTo 1};
+ sleep 4;
+ _helico enableCollisionWith _pod;
+ };
+ case 'chat_attach': {
+ if (!(player in crew _helico)) exitWith{};
+ ["Success",["Pod successfully attached!"]] call ExileClient_gui_notification_event_addNotification;
+ };
+ case 'chat_deattach': {
+ if (!(player in crew _helico)) exitWith{};
+ ["Success",["Pod successfully dettached!"]] call ExileClient_gui_notification_event_addNotification;
+ };
+ case 'chat_drop_with_parachute': {
+ if (!(player in crew _helico)) exitWith{};
+ ["Success",["Pod Paradropt!"]] call ExileClient_gui_notification_event_addNotification;
+ };
+ case 'chat_drop_without_parachute': {
+ if (!(player in crew _helico)) exitWith{};
+ ["Success",["Pod drop without Parachut!"]] call ExileClient_gui_notification_event_addNotification;
+ };
+ case 'sound_attach': {
+ if (!(player in crew _helico)) exitWith{};
+ _soundToPlay = _soundPath + "IgiLoad\sounds\attach.wss";
+ playSound3D [_soundToPlay, _helico, false, getPosATL _helico, 10, 1, 0];
+ };
+ case 'sound_deattach': {
+ if (!(player in crew _helico)) exitWith{};
+ _soundToPlay = _soundPath + "IgiLoad\sounds\deattach.wss";
+ playSound3D [_soundToPlay, _helico, false, getPosATL _helico, 10, 1, 0];
+ };
+ case 'sound_drop': {
+ if (!(player in crew _helico)) exitWith{};
+ _soundToPlay = _soundPath + "IgiLoad\sounds\drop.wss";
+ playSound3D [_soundToPlay, _helico, false, getPosATL _helico, 10, 1, 0];
+ };
+ };
+ };
+
+ waitUntil {!isNull player};
+ [] spawn IL_Taru_Init;
+ IL_Taru_EH_Respawn = player addEventHandler ["Respawn", "[] spawn IL_Taru_Init;"];
+};
+
+IL_Pod_Manager = {
+ IL_CLient_Pod_Manager = _this;
+ if (isDedicated || isServer) then
+ {
+ IL_CLient_Pod_Manager spawn IL_Server_Pod_Manager;
+ }
+ else
+ {
+ publicVariableServer "IL_CLient_Pod_Manager";
+ };
+};
+"IL_Client_Pod_Manager" addPublicVariableEventHandler IL_Pod_Manager;
+
+IL_Client_Control = {
+ private ["_nearBy","_heli","_heli_pos"];
+ IL_Server_Client_Control = _this;
+ if (hasInterface && !isDedicated) then
+ {
+ IL_Server_Client_Control spawn IL_Taru_Transmission; Exile_
+ }
+ else
+ {
+ _heli = IL_Server_Client_Control select 1;
+ _nearBy = (getPosATL _heli) nearEntities [["Exile_Unit_Player","LandVehicle","Ship","Air"], 300];
+ {
+ if (isPlayer _x) then {
+ (owner _x) publicVariableClient "IL_Server_Client_Control";
+ };
+ } forEach _nearBy;
+ };
+};
+"IL_Server_Client_Control" addPublicVariableEventHandler IL_Client_Control;
+
+
+if (isDedicated || isServer) then {
+ if (IL_Taru_DevMod) then {
+ diag_log "Igi Load Taru started";
+ };
+
+ IL_Server_Pod_Manager = {
+ private ["_args"];
+ _args = _this select 1;
+ switch (_args select 0) do {
+ case "attach": {
+ [_args select 1] spawn IL_Taru_Attach_Pod;
+ };
+ case "deattach": {
+ [_args select 1] spawn IL_Taru_Deattach_Pod;
+ };
+ case "drop": {
+ [_args select 1] spawn IL_Taru_Drop_Pod;
+ };
+ };
+ };
+
+ IL_Taru_Attach_Pod =
+ {
+ _helico = _this select 0;
+ _pod = getSlingLoad _helico;
+ _mass_of_pod = getmass getSlingLoad _helico;
+ _mass_of_heli = getmass _helico;
+
+ if (!isTouchingGround _helico) then
+ {
+
+ ["sound_attach", _helico] call IL_Client_Control;
+ ["rope_unwind_and_wait", _helico, _pod, 1.9, 1, 1] call IL_Client_Control;
+ sleep 1;
+ {ropeUnwind [_x, 1.9, 1];} foreach ropes _helico;
+
+ waituntil {ropeLength (ropes _helico select 0) isEqualTo 1};
+
+ };
+
+ _helico disableCollisionWith _pod;
+ [] call {
+ _pod_type = typeOf _pod;
+ if (_pod_type isEqualTo "Land_Pod_Heli_Transport_04_bench_F") exitwith
+ {
+ _pod attachTo [_helico,[0,0.1,-1.13]];
+ _helico setCustomWeightRTD 680;
+ _helico setmass _mass_of_pod + _mass_of_heli;
+ };
+
+ if (_pod_type isEqualTo "Land_Pod_Heli_Transport_04_covered_F") exitwith
+ {
+ _pod attachTo [_helico,[-0.1,-1.05,-0.82]];
+ _helico setCustomWeightRTD 1413;
+ _helico setmass _mass_of_pod + _mass_of_heli;
+ };
+
+ if (_pod_type isEqualTo "Land_Pod_Heli_Transport_04_fuel_F") exitwith
+ {
+ _pod attachTo [_helico,[0,-0.282,-1.25]];
+ _helico setCustomWeightRTD 13311;
+ _helico setmass _mass_of_pod + _mass_of_heli;
+ };
+
+ if (_pod_type isEqualTo "Land_Pod_Heli_Transport_04_medevac_F") exitwith
+ {
+ _pod attachTo [_helico,[-0.14,-1.05,-0.92]];
+ _helico setCustomWeightRTD 1321;
+ _helico setmass _mass_of_pod + _mass_of_heli;
+ };
+
+ if (_pod_type in ["Land_Pod_Heli_Transport_04_repair_F","Land_Pod_Heli_Transport_04_box_F","Land_Pod_Heli_Transport_04_ammo_F"]) exitwith
+ {
+ _pod attachTo [_helico,[-0.09,-1.05,-1.1]];
+ _helico setCustomWeightRTD 1270;
+ _helico setmass _mass_of_pod + _mass_of_heli;
+ };
+ };
+
+ ["rope_unwind", _helico, _pod, 250, 1] call IL_Client_Control;
+ sleep 1;
+ {ropeUnwind [_x, 250, 1];} foreach ropes _helico;
+ _helico enableCollisionWith _pod;
+ ["sound_attach", _helico] call IL_Client_Control;
+ ["chat_attach", _helico] call IL_Client_Control;
+
+ if (isnil {_helico getVariable "EH_GetOut_Taru"}) then
+ {
+ _helico addEventHandler ["Getin", "[_this] spawn IL_Taru_GetIn;"];
+ _helico setVariable ["EH_GetIn_Taru", true, false];
+ };
+ };
+
+ IL_Taru_Deattach_Pod =
+ {
+ _helico = _this select 0;
+ _attached_object = [];
+ _mass_of_heli = getmass _helico;
+ {
+ if (_x isKindOf "Pod_Heli_Transport_04_base_F") exitwith {_attached_object = _x;};
+ } foreach attachedObjects _helico;
+
+ _mass_of_pod = getmass _attached_object;
+ _helico disableCollisionWith _attached_object;
+
+ [] call {
+ _pod_type = typeOf _attached_object;
+ if (_pod_type isEqualTo "Land_Pod_Heli_Transport_04_bench_F") exitwith
+ {
+ _attached_object attachTo [_helico,[0,0.1,-2.83]];
+ };
+
+ if (_pod_type isEqualTo "Land_Pod_Heli_Transport_04_covered_F") exitwith
+ {
+ _attached_object attachTo [_helico,[-0.1,-1.05,-2.52]];
+ };
+
+ if (_pod_type isEqualTo "Land_Pod_Heli_Transport_04_fuel_F") exitwith
+ {
+ _attached_object attachTo [_helico,[0,-0.282,-3.05]];
+ };
+
+ if (_pod_type isEqualTo "Land_Pod_Heli_Transport_04_medevac_F") exitwith
+ {
+ _attached_object attachTo [_helico,[-0.14,-1.05,-2.62]];
+ };
+
+ if (_pod_type in ["Land_Pod_Heli_Transport_04_repair_F","Land_Pod_Heli_Transport_04_box_F","Land_Pod_Heli_Transport_04_ammo_F"]) exitwith
+ {
+ _attached_object attachTo [_helico,[-0.09,-1.05,-2.8]];
+ };
+ };
+
+ ["rope_unwind", _helico, _attached_object, 1,9, 10] call IL_Client_Control;
+ sleep 1;
+ {
+ ropeUnwind [_x, 1.9, 10];
+ } foreach ropes _helico;
+ ["sound_deattach", _helico] call IL_Client_Control;
+
+ _helico setCustomWeightRTD 0;
+ _helico setmass _mass_of_heli - _mass_of_pod;
+ ["sound_deattach", _helico] call IL_Client_Control;
+ ["chat_deattach", _helico] call IL_Client_Control;
+ detach _attached_object;
+ sleep 4;
+ _helico enableCollisionWith _attached_object;
+ //if (!isTouchingGround _helico) then {waituntil {ropeLength (ropes _helico select 0) isEqualTo 10};};
+ };
+
+ IL_Taru_Drop_Pod =
+ {
+ _helico = _this select 0;
+ _attached_object = [];
+
+ {
+ if (_x isKindOf "Pod_Heli_Transport_04_base_F") exitwith {_attached_object = _x;};
+ } foreach attachedObjects _helico;
+
+ _helico disableCollisionWith _attached_object;
+ {ropeCut [_x, 0];} foreach ropes _helico;
+ _helico setCustomWeightRTD 0;
+ ["sound_drop", _helico] call IL_Client_Control;
+ detach _attached_object;
+ sleep 4;
+ _helico enableCollisionWith _attached_object;
+
+ sleep 0.5;
+
+ if ((getPosATL _attached_object) select 2 >= IL_Taru_Parachute_Altitude) exitwith
+ {
+ ["chat_drop_with_parachute", _helico] call IL_Client_Control;
+
+ waituntil {(getPosATL _attached_object) select 2 <= IL_Taru_Parachute_Open_Altitude};
+
+ _parachute = createVehicle ["B_Parachute_02_F",getposatl _attached_object, [], 0, "CAN COLLIDE"];
+ _parachute attachTo [_attached_object,[0,0,-1]];
+
+ [_attached_object,_parachute,_helico] spawn
+ {
+ _attached_object = _this select 0;
+ _parachute = _this select 1;
+ _helico = _this select 2;
+
+ waituntil
+ {
+ if ((getPosATL _attached_object) select 2 <= 5) exitwith
+ {
+ detach _attached_object;
+ _vitesse_nacelle = velocity _attached_object;
+ _parachute setVelocity [_vitesse_nacelle select 0 + 1, _vitesse_nacelle select 1 + 1, 0];
+ true
+ };
+ false
+ };
+ };
+
+ waituntil
+ {
+ if (getposasl _helico distance getposasl _attached_object >= 50) exitwith
+ {
+ detach _parachute;
+ _attached_object attachTo [_parachute,[0,0,-1]];
+ true
+ };
+ false
+ };
+ };
+
+ ["chat_drop_without_parachute", _helico] call IL_Client_Control;
+ };
+
+ IL_Taru_GetIn =
+ {
+ _vehicle = _this select 0 select 0;
+ if ([_vehicle] call IL_Verify_Heli) then
+ {
+ if (count attachedObjects _vehicle > 0) then
+ {
+ _time = time + 2;
+ waituntil
+ {
+ _vehicle setvelocity [0, 0, 0];
+ if (time > _time or {time > _time + 15}) exitwith {true};
+ };
+ };
+ };
+ };
+
+ IL_Save_Pod_Position =
+ {
+ while{true}do {
+ sleep 20;
+ {
+ sleep 2;
+ //when you dropping with parachute or deattaching pod without player, new position of the pod is not saved to db.
+ //with following ugly hack we are saving pod position every 20 seconds
+ if (_x isKindOf "Pod_Heli_Transport_04_base_F") then {
+ _x call ExileServer_object_vehicle_database_update;
+ };
+ } forEach vehicles;
+ };
+ };
+
+ [] spawn IL_Save_Pod_Position;
+};
diff --git a/mpmissions/Exile.Altis/Igiload/images/load.paa b/mpmissions/Exile.Altis/Igiload/images/load.paa
new file mode 100644
index 0000000..c20f447
Binary files /dev/null and b/mpmissions/Exile.Altis/Igiload/images/load.paa differ
diff --git a/mpmissions/Exile.Altis/Igiload/images/unload.paa b/mpmissions/Exile.Altis/Igiload/images/unload.paa
new file mode 100644
index 0000000..eaff43f
Binary files /dev/null and b/mpmissions/Exile.Altis/Igiload/images/unload.paa differ
diff --git a/mpmissions/Exile.Altis/Igiload/images/unload_all_para.paa b/mpmissions/Exile.Altis/Igiload/images/unload_all_para.paa
new file mode 100644
index 0000000..52e2c34
Binary files /dev/null and b/mpmissions/Exile.Altis/Igiload/images/unload_all_para.paa differ
diff --git a/mpmissions/Exile.Altis/Igiload/images/unload_para.paa b/mpmissions/Exile.Altis/Igiload/images/unload_para.paa
new file mode 100644
index 0000000..ef8f3be
Binary files /dev/null and b/mpmissions/Exile.Altis/Igiload/images/unload_para.paa differ
diff --git a/mpmissions/Exile.Altis/Igiload/sounds/attach.wss b/mpmissions/Exile.Altis/Igiload/sounds/attach.wss
new file mode 100644
index 0000000..2f66405
Binary files /dev/null and b/mpmissions/Exile.Altis/Igiload/sounds/attach.wss differ
diff --git a/mpmissions/Exile.Altis/Igiload/sounds/deattach.wss b/mpmissions/Exile.Altis/Igiload/sounds/deattach.wss
new file mode 100644
index 0000000..994115d
Binary files /dev/null and b/mpmissions/Exile.Altis/Igiload/sounds/deattach.wss differ
diff --git a/mpmissions/Exile.Altis/Igiload/sounds/drop.wss b/mpmissions/Exile.Altis/Igiload/sounds/drop.wss
new file mode 100644
index 0000000..492b6a9
Binary files /dev/null and b/mpmissions/Exile.Altis/Igiload/sounds/drop.wss differ
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla.sqf
new file mode 100644
index 0000000..be7cdc5
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla.sqf
@@ -0,0 +1,14 @@
+/**
+ * Logistics configuration for A3 vanilla.
+ * The configuration is splitted in categories dispatched in the included files.
+ */
+
+#include "A3_vanilla\Air.sqf"
+#include "A3_vanilla\LandVehicle.sqf"
+#include "A3_vanilla\StaticWeapon.sqf"
+#include "A3_vanilla\Ship.sqf"
+#include "A3_vanilla\Building.sqf"
+#include "A3_vanilla\ReammoBox_F.sqf"
+#include "A3_vanilla\Others.sqf"
+
+#include "A3_vanilla\delta_A3_1.32_to_1.35.sqf"
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/air.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/air.sqf
new file mode 100644
index 0000000..026d62a
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/air.sqf
@@ -0,0 +1,44 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ "plane"
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+ "heli_light_02_base_f",
+ "heli_transport_01_base_f",
+ "heli_transport_02_base_f"
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["helicopter_base_f", 8],
+ ["heli_attack_01_base_f", 2],
+ ["heli_attack_02_base_f", 20],
+ ["heli_light_02_base_f", 15],
+ ["heli_transport_01_base_f", 15],
+ ["heli_transport_02_base_f", 120],
+ ["i_heli_light_03_base_f", 25],
+ ["uav_01_base_f", 0],
+ ["plane", 3],
+ ["uav", 0]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["uav_01_base_f", 3],
+ ["uav_02_base_f", 100]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "uav_01_base_f"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/building.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/building.sqf
new file mode 100644
index 0000000..8d19a6b
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/building.sqf
@@ -0,0 +1,97 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["camping_base_f", 1],
+ ["flagsmall_f", 1],
+ ["hbarrier_base_f", 3],
+ ["land_hbarriertower_f", 8],
+ ["land_hbarrierwall6_f", 4],
+ ["land_hbarrierwall_corridor_f", 4],
+ ["land_hbarrier_1_f", 1],
+ ["land_hbarrier_3_f", 2],
+ ["helper_base_f", 1],
+ ["helih", 1],
+ ["land_portablelight_single_f", 1],
+ ["land_metalbarrel_empty_f", 2],
+ ["land_campfire_f", 1],
+ ["land_fireplace_f", 1],
+ ["land_obstacle_bridge_f", 2],
+ ["land_razorwire_f", 2],
+ ["land_sign_mines_f", 1],
+ ["land_pallet_milboxes_f", 5],
+ ["land_paperbox_closed_f", 5],
+ ["land_paperbox_open_empty_f", 5],
+ ["land_paperbox_open_full_f", 5],
+ ["land_bargate_f", 2],
+ ["land_cncbarriermedium4_f", 6],
+ ["land_cncbarriermedium_f", 2],
+ ["land_cncbarrier_f", 2],
+ ["land_cncbarrier_stripes_f", 2],
+ ["land_cncwall1_f", 2],
+ ["land_cncwall4_f", 6],
+ ["land_mil_concretewall_f", 2],
+ ["land_shoot_house_wall_f", 2],
+ ["sign_f", 2],
+ ["signad_sponsors_f", 1],
+ ["shelter_base_f", 2],
+ ["land_plasticbarrier_01_f", 2],
+ ["land_plasticbarrier_02_f", 2],
+ ["bagbunker_base_f", 15],
+ ["land_bagbunker_small_f", 6],
+ ["bagfence_base_f", 2],
+ ["flagcarriercore", 2]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "camping_base_f",
+ "flagsmall_f",
+ "hbarrier_base_f",
+ "helper_base_f",
+ "helih",
+ "land_portablelight_single_f",
+ "land_metalbarrel_empty_f",
+ "land_campfire_f",
+ "land_fireplace_f",
+ "land_obstacle_bridge_f",
+ "land_razorwire_f",
+ "land_sign_mines_f",
+ "land_pallet_milboxes_f",
+ "land_paperbox_closed_f",
+ "land_paperbox_open_empty_f",
+ "land_paperbox_open_full_f",
+ "land_bargate_f",
+ "land_cncbarriermedium4_f",
+ "land_cncbarriermedium_f",
+ "land_cncbarrier_f",
+ "land_cncbarrier_stripes_f",
+ "land_cncwall1_f",
+ "land_cncwall4_f",
+ "land_mil_concretewall_f",
+ "land_shoot_house_wall_f",
+ "sign_f",
+ "land_plasticbarrier_01_f",
+ "land_plasticbarrier_02_f",
+ "bagbunker_base_f",
+ "bagfence_base_f",
+ "flagcarriercore"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/delta_a3_1.32_to_1.35.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/delta_a3_1.32_to_1.35.sqf
new file mode 100644
index 0000000..a3fb9bf
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/delta_a3_1.32_to_1.35.sqf
@@ -0,0 +1,68 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ "machine_base_f"
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+ "b_heli_transport_03_base_f",
+ "heli_transport_04_base_f"
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "cargo10_base_f",
+ "machine_base_f",
+ "cargonet_01_base_f",
+ "slingload_01_base_f"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["cargo10_base_f", 40],
+ ["metalcase_01_base_f", 4],
+ ["plasticcase_01_base_f", 4],
+ ["cargonet_01_base_f", 14],
+ ["b_slingload_01_cargo_f", 110],
+ ["b_slingload_01_ammo_f", 90],
+ ["b_heli_transport_03_base_f", 70],
+ ["o_heli_transport_04_ammo_f", 40],
+ ["o_heli_transport_04_box_f", 40],
+ ["heli_transport_04_base_f", 40],
+ ["o_heli_transport_04_bench_f", 5],
+ ["o_heli_transport_04_f", 5],
+ ["o_heli_transport_04_fuel_f", 5]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["gastank_base_f", 2],
+ ["tooltrolley_base_f", 3],
+ ["land_weldingtrolley_01_f", 4],
+ ["pallettrolley_01_base_f", 3],
+ ["land_mobilelandingplatform_01_f", 10],
+ ["windsock_01_f", 2],
+ ["cargo10_base_f", 45],
+ ["land_portablehelipadlight_01_f", 1],
+ ["metalcase_01_base_f", 5],
+ ["plasticcase_01_base_f", 5],
+ ["cargonet_01_base_f", 16],
+ ["flexibletank_base_f", 2],
+ ["pod_heli_transport_04_base_f", 200]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "gastank_base_f",
+ "tooltrolley_base_f",
+ "land_weldingtrolley_01_f",
+ "pallettrolley_01_base_f",
+ "windsock_01_f",
+ "land_mobilelandingplatform_01_f",
+ "land_portablehelipadlight_01_f",
+ "flexibletank_base_f"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/landvehicle.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/landvehicle.sqf
new file mode 100644
index 0000000..3359891
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/landvehicle.sqf
@@ -0,0 +1,69 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+ "truck_01_base_f",
+ "truck_02_base_f",
+ "truck_03_base_f",
+ "b_apc_tracked_01_crv_f"
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ "car_f"
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "bus",
+ "car_f"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["tank", 5],
+ ["car", 6],
+ ["motorcycle", 2],
+ ["truck_f", 100],
+ ["bus", 30],
+ ["kart_01_base_f", 2],
+ ["mrap_01_base_f", 12],
+ ["mrap_02_base_f", 12],
+ ["mrap_03_base_f", 12],
+ ["offroad_01_base_f", 10],
+ ["offroad_01_armed_base_f", 4],
+ ["quadbike_01_base_f", 3],
+ ["quadbike_base_f", 3],
+ ["b_truck_01_mover_f", 5],
+ ["b_truck_01_repair_f", 170],
+ ["b_truck_01_covered_f", 120],
+ ["b_truck_01_ammo_f", 120],
+ ["b_truck_01_box_f", 170],
+ ["truck_02_base_f", 120],
+ ["i_truck_02_medical_f", 100],
+ ["i_truck_02_fuel_f", 5],
+ ["i_truck_02_transport_f", 100],
+ ["o_truck_02_fuel_f", 5],
+ ["o_truck_02_transport_f", 100],
+ ["o_truck_03_ammo_f", 140],
+ ["o_truck_03_device_f", 5],
+ ["o_truck_03_fuel_f", 5],
+ ["van_01_base_f", 5],
+ ["c_van_01_box_f", 40],
+ ["c_van_01_transport_f", 25],
+ ["i_g_van_01_transport_f", 25],
+ ["wheeled_apc_f", 10]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["kart_01_base_f", 40],
+ ["quadbike_01_base_f", 40],
+ ["ugv_01_base_f", 100]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/others.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/others.sqf
new file mode 100644
index 0000000..8caefd7
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/others.sqf
@@ -0,0 +1,89 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "cargo_base_f",
+ "land_cargobox_v1_f"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["cargo_base_f", 170],
+ ["land_cargobox_v1_f", 14]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["targetbase", 3],
+ ["land_pierladder_f", 3],
+ ["metal_pole_f", 1],
+ ["arrowmarker_r_f", 1],
+ ["land_pallet_f", 2],
+ ["land_pallets_stack_f", 4],
+ ["land_chairplastic_f", 1],
+ ["land_chairwood_f", 1],
+ ["items_base_f", 1],
+ ["land_canisterfuel_f", 2],
+ ["land_metalbarrel_f", 5],
+ ["land_portable_generator_f", 6],
+ ["land_waterbarrel_f", 15],
+ ["land_watertank_f", 20],
+ ["land_campingchair_v1_f", 1],
+ ["land_campingchair_v2_f", 1],
+ ["land_campingtable_f", 2],
+ ["land_campingtable_small_f", 1],
+ ["land_camping_light_off_f", 1],
+ ["land_cargobox_v1_f", 15],
+ ["land_fieldtoilet_f", 4],
+ ["land_ground_sheet_folded_f", 1],
+ ["land_mapboard_f", 3],
+ ["land_plasticbarrier_03_f", 2],
+ ["land_redwhitepole_f", 1],
+ ["land_sink_f", 5],
+ ["land_sleeping_bag_folded_f", 1],
+ ["land_toiletbox_f", 4],
+ ["land_woodentable_large_f", 3],
+ ["land_woodentable_small_f", 2],
+ ["pole_f", 1],
+ ["roadcone_f", 1]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "targetbase",
+ "land_pierladder_f",
+ "metal_pole_f",
+ "arrowmarker_r_f",
+ "land_pallet_f",
+ "land_pallets_stack_f",
+ "furniture_base_f",
+ "items_base_f",
+ "land_campingchair_v1_f",
+ "land_campingchair_v2_f",
+ "land_campingtable_f",
+ "land_campingtable_small_f",
+ "land_camping_light_off_f",
+ "land_cargobox_v1_f",
+ "land_fieldtoilet_f",
+ "land_ground_sheet_folded_f",
+ "land_mapboard_f",
+ "land_plasticbarrier_03_f",
+ "land_redwhitepole_f",
+ "land_sink_f",
+ "land_sleeping_bag_folded_f",
+ "land_toiletbox_f",
+ "land_woodentable_large_f",
+ "land_woodentable_small_f",
+ "pole_f",
+ "roadcone_f"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/reammobox_f.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/reammobox_f.sqf
new file mode 100644
index 0000000..3672f58
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/reammobox_f.sqf
@@ -0,0 +1,66 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "b_supplycrate_f",
+ "c_supplycrate_f",
+ "box_east_ammoveh_f",
+ "ig_supplycrate_f",
+ "box_ind_ammoveh_f",
+ "box_nato_ammoveh_f"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["b_supplycrate_f", 9],
+ ["c_supplycrate_f", 9],
+ ["box_east_ammoveh_f", 14],
+ ["ig_supplycrate_f", 9],
+ ["box_ind_ammoveh_f", 14],
+ ["box_nato_ammoveh_f", 14]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["reammobox_f", 4],
+ ["b_supplycrate_f", 10],
+ ["c_supplycrate_f", 10],
+ ["box_east_ammoord_f", 2],
+ ["box_east_ammoveh_f", 15],
+ ["box_east_ammo_f", 2],
+ ["box_east_grenades_f", 2],
+ ["box_east_support_f", 2],
+ ["box_east_wpslaunch_f", 2],
+ ["box_east_wps_f", 3],
+ ["ig_supplycrate_f", 10],
+ ["box_ind_ammoord_f", 2],
+ ["box_ind_ammoveh_f", 15],
+ ["box_ind_ammo_f", 2],
+ ["box_ind_grenades_f", 2],
+ ["box_ind_support_f", 2],
+ ["box_ind_wpslaunch_f", 2],
+ ["box_ind_wps_f", 3],
+ ["land_box_ammoold_f", 2],
+ ["box_nato_ammoord_f", 2],
+ ["box_nato_ammoveh_f", 15],
+ ["box_nato_ammo_f", 2],
+ ["box_nato_grenades_f", 2],
+ ["box_nato_support_f", 2],
+ ["box_nato_wpslaunch_f", 2],
+ ["box_nato_wps_f", 3]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "reammobox_f"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/ship.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/ship.sqf
new file mode 100644
index 0000000..00b0e54
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/ship.sqf
@@ -0,0 +1,40 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ "ship_f"
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "ship_f"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["ship_f", 5],
+ ["boat_civil_01_base_f", 10],
+ ["boat_armed_01_base_f", 15]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["land_camping_light_f", 1],
+ ["roadcone_l_f", 1],
+ ["roadbarrier_small_f", 1],
+ ["rubber_duck_base_f", 40]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "land_camping_light_f",
+ "roadcone_l_f",
+ "roadbarrier_small_f",
+ "rubber_duck_base_f"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/staticweapon.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/staticweapon.sqf
new file mode 100644
index 0000000..58952f7
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/a3_vanilla/staticweapon.sqf
@@ -0,0 +1,31 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["staticweapon", 5],
+ ["staticmortar", 6]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "reammobox_f",
+ "staticweapon"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma.sqf
new file mode 100644
index 0000000..a065d49
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma.sqf
@@ -0,0 +1,15 @@
+/**
+ * Logistics configuration for All in Arma.
+ * The configuration is splitted in categories dispatched in the included files.
+ */
+
+// Load the logistics config only if the addon is used
+if (isClass (configfile >> "CfgPatches" >> "AiA_Core")) then
+{
+ #include "All_in_Arma\Air.sqf"
+ #include "All_in_Arma\LandVehicle.sqf"
+ #include "All_in_Arma\Ship.sqf"
+ #include "All_in_Arma\Building.sqf"
+ #include "All_in_Arma\ReammoBox.sqf"
+ #include "All_in_Arma\Others.sqf"
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/air.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/air.sqf
new file mode 100644
index 0000000..2189d63
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/air.sqf
@@ -0,0 +1,59 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+ "ah64_base_ep1",
+ "aw159_lynx_baf",
+ "baf_merlin_hc3_d",
+ "ch47_base_ep1",
+ "ka60_base_pmc",
+ "kamov_base",
+ "mi17_base",
+ "mi24_base",
+ "uh1_base",
+ "uh60_base"
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["ah1_base", 5],
+ ["ah64_base_ep1", 10],
+ ["ah6_base_ep1", 20],
+ ["aw159_lynx_baf", 40],
+ ["baf_merlin_hc3_d", 100],
+ ["ch47_base_ep1", 130],
+ ["ka60_base_pmc", 60],
+ ["kamov_base", 10],
+ ["mi17_base", 80],
+ ["mi24_base", 50],
+ ["uh1h_base", 40],
+ ["uh1_base", 40],
+ ["uh60_base", 60],
+ ["an2_base_ep1", 50],
+ ["c130j", 250],
+ ["dc3", 90],
+ ["mv22", 60]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["ka137_mg_pmc", 45],
+ ["ka137_pmc", 45],
+ ["pchela1t", 45]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "ka137_mg_pmc",
+ "ka137_pmc"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/building.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/building.sqf
new file mode 100644
index 0000000..329b551
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/building.sqf
@@ -0,0 +1,171 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "land_misc_cargo1a_ep1",
+ "land_misc_cargo1ao",
+ "land_misc_cargo1ao_ep1",
+ "land_misc_cargo1b",
+ "land_misc_cargo1b_ep1",
+ "land_misc_cargo1bo",
+ "land_misc_cargo1c",
+ "land_misc_cargo1c_ep1",
+ "land_misc_cargo1d",
+ "land_misc_cargo1d_ep1",
+ "land_misc_cargo1e",
+ "land_misc_cargo1e_ep1",
+ "land_misc_cargo1f",
+ "land_misc_cargo1g",
+ "land_misc_cargomarket1a_ep1",
+ "base_warfarebcontructionsite",
+ "misc_cargo_cont_net1",
+ "misc_cargo_cont_small",
+ "misc_cargo_cont_small2"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["land_misc_cargo1ao", 110],
+ ["land_misc_cargo1a_ep1", 110],
+ ["land_misc_cargo1ao_ep1", 110],
+ ["land_misc_cargo1b", 110],
+ ["land_misc_cargo1b_ep1", 110],
+ ["land_misc_cargo1bo", 110],
+ ["land_misc_cargo1c", 110],
+ ["land_misc_cargo1c_ep1", 110],
+ ["land_misc_cargo1d", 110],
+ ["land_misc_cargo1d_ep1", 110],
+ ["land_misc_cargo1e", 110],
+ ["land_misc_cargo1e_ep1", 110],
+ ["land_misc_cargo1f", 110],
+ ["land_misc_cargo1g", 110],
+ ["land_misc_cargomarket1a_ep1", 110],
+ ["base_warfarebcontructionsite", 110],
+ ["fortress2", 20],
+ ["warfarebcamp", 30],
+ ["misc_cargo_cont_small", 65],
+ ["misc_cargo_cont_small2", 50]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["concrete_wall_ep1", 3],
+ ["fencewood", 1],
+ ["fencewoodpalet", 1],
+ ["wire", 2],
+ ["fire", 1],
+ ["flagcarriersmall", 1],
+ ["fort_razorwire", 2],
+ ["gunrack1", 2],
+ ["base_warfarebbarrier5x", 3],
+ ["base_warfarebbarrier10x", 6],
+ ["base_warfarebbarrier10xtall", 12],
+ ["base_warfarebbarrier5xpreview", 2],
+ ["land_camonet_east", 2],
+ ["land_camonet_nato", 2],
+ ["land_fire", 1],
+ ["land_fire_barrel", 3],
+ ["land_fort_watchtower", 20],
+ ["land_guardshed", 3],
+ ["land_misc_cargo1ao", 120],
+ ["land_misc_cargo1a_ep1", 120],
+ ["land_misc_cargo1ao_ep1", 120],
+ ["land_misc_cargo1b", 120],
+ ["land_misc_cargo1b_ep1", 120],
+ ["land_misc_cargo1bo", 120],
+ ["land_misc_cargo1c", 120],
+ ["land_misc_cargo1c_ep1", 120],
+ ["land_misc_cargo1d", 120],
+ ["land_misc_cargo1d_ep1", 120],
+ ["land_misc_cargo1e", 120],
+ ["land_misc_cargo1e_ep1", 120],
+ ["land_misc_cargo1f", 120],
+ ["land_misc_cargo1g", 120],
+ ["land_misc_cargomarket1a_ep1", 120],
+ ["land_woodenramp", 2],
+ ["land_fort_bagfence_corner", 3],
+ ["land_fort_bagfence_long", 2],
+ ["land_fort_bagfence_round", 4],
+ ["land_fort_rampart", 4],
+ ["land_fortified_nest_big", 20],
+ ["land_fortified_nest_small", 10],
+ ["land_cncblock", 2],
+ ["land_cncblock_d", 2],
+ ["land_cncblock_stripes", 2],
+ ["land_hbarrier_large", 4],
+ ["land_bagfencecorner", 2],
+ ["land_hbarrier1", 1],
+ ["land_hbarrier3", 2],
+ ["land_hbarrier5", 3],
+ ["land_toilet", 3],
+ ["paletabase", 2],
+ ["roadbarrier_light", 2],
+ ["targettraining", 2],
+ ["warfarebunkersign", 3],
+ ["zavoraanim", 2],
+ ["base_warfarebcontructionsite", 120],
+ ["fortress1", 10],
+ ["hedgehog", 3],
+ ["land_prebehlavka", 3],
+ ["land_prolejzacka", 2],
+ ["ammocrate_nointeractive_", 7],
+ ["misc_cargo_cont_net1", 25],
+ ["misc_cargo_cont_small", 75],
+ ["misc_cargo_cont_small2", 60],
+ ["shed", 2],
+ ["target", 2]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "concrete_wall_ep1",
+ "fencewood",
+ "fencewoodpalet",
+ "wire",
+ "fire",
+ "flagcarriersmall",
+ "fort_razorwire",
+ "gunrack1",
+ "base_warfarebbarrier5x",
+ "land_camonet_east",
+ "land_camonet_nato",
+ "land_fire",
+ "land_fort_watchtower",
+ "land_guardshed",
+ "land_woodenramp",
+ "land_fort_bagfence_corner",
+ "land_fort_bagfence_long",
+ "land_fort_bagfence_round",
+ "land_fort_rampart",
+ "land_fortified_nest_big",
+ "land_fortified_nest_small",
+ "land_cncblock",
+ "land_cncblock_d",
+ "land_cncblock_stripes",
+ "land_hbarrier_large",
+ "land_bagfencecorner",
+ "land_toilet",
+ "paletabase",
+ "roadbarrier_light",
+ "targettraining",
+ "warfarebunkersign",
+ "zavoraanim",
+ "fortress1",
+ "hedgehog",
+ "land_prebehlavka",
+ "land_prolejzacka",
+ "ammocrate_nointeractive_",
+ "misc_cargo_cont_net1",
+ "shed",
+ "target"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/landvehicle.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/landvehicle.sqf
new file mode 100644
index 0000000..38821ec
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/landvehicle.sqf
@@ -0,0 +1,122 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+ "towingtractor",
+ "tractorold",
+ "mtvr",
+ "t810_turrets_base_acr"
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ "d30_base",
+ "m119",
+ "zu23_base"
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+ "heli_light_02_base_f",
+ "heli_transport_01_base_f",
+ "heli_transport_02_base_f"
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "atv_base_ep1",
+ "armoredsuv_base_pmc",
+ "baf_jackal2_base_d",
+ "datsun_pk1",
+ "dingo_base_acr",
+ "hilux_pk1",
+ "hmmwv_base",
+ "ikarus",
+ "lada_base",
+ "landrover_base",
+ "octavia_acr",
+ "offroad_dshkm_base",
+ "pickup_pk_base",
+ "s1203_tk_civ_ep1",
+ "suv_base_ep1",
+ "skodabase",
+ "towingtractor",
+ "tractorold",
+ "kamaz_base",
+ "mtvr",
+ "t810_turrets_base_acr",
+ "truck_base_h",
+ "ural_base_withturret",
+ "v3s_base",
+ "uaz_base",
+ "volha_tk_civ_base_ep1",
+ "vwgolf",
+ "btr40_mg_base_ep1",
+ "btr90_base",
+ "gaz_vodnik_hmg",
+ "lav25_base",
+ "strykerbase_ep1",
+ "hilux1_civil_1_open",
+ "d30_base",
+ "m119",
+ "zu23_base",
+ "m113_base"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["atv_base_ep1", 3],
+ ["armoredsuv_base_pmc", 15],
+ ["baf_jackal2_base_d", 18],
+ ["datsun_pk1", 10],
+ ["dingo_base_acr", 25],
+ ["hilux_pk1", 10],
+ ["hmmwv_base", 18],
+ ["hmmwv_avenger", 5],
+ ["ikarus", 60],
+ ["landrover_base", 15],
+ ["offroad_dshkm_base", 10],
+ ["pickup_pk_base", 10],
+ ["s1203_tk_civ_ep1", 20],
+ ["suv_base_ep1", 12],
+ ["kamaz_base", 100],
+ ["mtvr", 80],
+ ["t810_turrets_base_acr", 80],
+ ["truck_base_h", 50],
+ ["ural_base_withturret", 10],
+ ["ural_base", 100],
+ ["v3s_base", 90],
+ ["uaz_base", 15],
+ ["brdm2_base", 15],
+ ["btr40_mg_base_ep1", 12],
+ ["btr90_base", 18],
+ ["gaz_vodnik_hmg", 18],
+ ["lav25_base", 18],
+ ["strykerbase_ep1", 18],
+ ["hilux1_civil_1_open", 12],
+ ["baf_fv510_d", 8],
+ ["m113_base", 10],
+ ["m2a2_ep1", 8],
+ ["aav", 8]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["atv_base_ep1", 40],
+ ["mmt_base", 8],
+ ["m1030", 30],
+ ["tt650_base", 30],
+ ["stinger_pod", 15],
+ ["stinger_pod_us_ep1", 15],
+ ["tow_tripod", 10],
+ ["tow_tripod_base", 10],
+ ["m119", 50],
+ ["d30_base", 50],
+ ["zu23_base", 50],
+ ["warfarebmgnest_m240_base", 10],
+ ["uh1wreck", 200],
+ ["uh60_wreck_ep1", 200]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "mmt_base"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/others.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/others.sqf
new file mode 100644
index 0000000..ed71a56
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/others.sqf
@@ -0,0 +1,72 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["targetgrenadbase", 5],
+ ["wallmap", 2],
+ ["foldchair", 1],
+ ["woodchair", 1],
+ ["foldtable", 2],
+ ["land_barrel_empty", 2],
+ ["land_barrel_sand", 2],
+ ["land_barrel_water", 2],
+ ["land_conelight", 1],
+ ["barrel1", 2],
+ ["barrel2", 2],
+ ["barrel3", 2],
+ ["barrel4", 2],
+ ["barrel5", 2],
+ ["barrel6", 2],
+ ["wooden_barrel", 2],
+ ["fuel_can", 1],
+ ["notice_board", 2],
+ ["roadcone", 1],
+ ["sign_danger", 2],
+ ["smalltable", 2],
+ ["small_items", 1],
+ ["land_shelf_ep1", 2]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "wallmap",
+ "foldchair",
+ "woodchair",
+ "foldtable",
+ "land_barrel_empty",
+ "land_barrel_sand",
+ "land_barrel_water",
+ "land_conelight",
+ "barrel1",
+ "barrel2",
+ "barrel3",
+ "barrel4",
+ "barrel5",
+ "barrel6",
+ "wooden_barrel",
+ "fuel_can",
+ "notice_board",
+ "roadcone",
+ "sign_danger",
+ "smalltable",
+ "small_items",
+ "land_shelf_ep1"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/reammobox.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/reammobox.sqf
new file mode 100644
index 0000000..c0bd75e
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/reammobox.sqf
@@ -0,0 +1,69 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["guerillacachebox", 5],
+ ["specialweaponsbox", 10],
+ ["rubasicammunitionbox", 5],
+ ["rubasicweaponsbox", 15],
+ ["ruspecialweaponsbox", 12],
+ ["ruvehiclebox", 50],
+ ["ammobox_pmc", 5],
+ ["baf_vehiclebox", 30],
+ ["czbasicweapons_ep1", 5],
+ ["gerbasicweapons_ep1", 5],
+ ["guerillacachebox_ep1", 5],
+ ["tkbasicammunitionbox_ep1", 5],
+ ["tkvehiclebox_ep1", 40],
+ ["tkbasicweapons_ep1", 5],
+ ["tklaunchers_ep1", 5],
+ ["tkspecialweapons_ep1", 5],
+ ["unbasicammunitionbox_ep1", 5],
+ ["unbasicweapons_ep1", 5],
+ ["usbasicammunitionbox_ep1", 5],
+ ["usvehiclebox_ep1", 30],
+ ["usbasicweapons_ep1", 5],
+ ["uslaunchers_ep1", 5],
+ ["usspecialweapons_ep1", 8],
+ ["usbasicammunitionbox", 5],
+ ["usvehiclebox", 20]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "guerillacachebox",
+ "rubasicammunitionbox",
+ "ammobox_pmc",
+ "czbasicweapons_ep1",
+ "gerbasicweapons_ep1",
+ "guerillacachebox_ep1",
+ "tkbasicammunitionbox_ep1",
+ "tkbasicweapons_ep1",
+ "tklaunchers_ep1",
+ "tkspecialweapons_ep1",
+ "unbasicammunitionbox_ep1",
+ "unbasicweapons_ep1",
+ "usbasicammunitionbox_ep1",
+ "usbasicweapons_ep1",
+ "uslaunchers_ep1",
+ "usspecialweapons_ep1",
+ "usbasicammunitionbox"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/ship.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/ship.sqf
new file mode 100644
index 0000000..18cd372
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/all_in_arma/ship.sqf
@@ -0,0 +1,41 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ "boat",
+ "pbx_acr",
+ "seafox",
+ "smallboat_1"
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+ "heli_light_02_base_f",
+ "heli_transport_01_base_f",
+ "heli_transport_02_base_f"
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "boat",
+ "seafox",
+ "smallboat_1"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["rubberboat", 40],
+ ["pbx_acr", 40]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "rubberboat",
+ "pbx_acr"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup.sqf
new file mode 100644
index 0000000..16a9965
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup.sqf
@@ -0,0 +1,15 @@
+/**
+ * Logistics configuration for All in Arma.
+ * The configuration is splitted in categories dispatched in the included files.
+ */
+
+// Load the logistics config only if the addon is used
+if (isClass (configfile >> "CfgPatches" >> "CUP_Vehicles_Core")) then
+{
+ #include "CUP\Air.sqf"
+ #include "CUP\LandVehicle.sqf"
+ #include "CUP\Ship.sqf"
+ #include "CUP\Building.sqf"
+ #include "CUP\ReammoBox.sqf"
+ #include "CUP\Others.sqf"
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/air.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/air.sqf
new file mode 100644
index 0000000..fb9dc83
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/air.sqf
@@ -0,0 +1,64 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["CUP_B_CH53E_USMC", 50],
+ ["CUP_B_UH1Y_UNA_F", 50],
+ ["CUP_B_UH1Y_MEV_F", 50],
+ ["CUP_C_Mi17_Civilian_RU", 50],
+ ["CUP_B_Mi17_CDF", 50],
+ ["CUP_O_Mi17_TK", 50],
+ ["CUP_B_Mi17_medevac_CDF", 50],
+ ["CUP_B_Mi171Sh_Unarmed_ACR", 50],
+ ["CUP_O_Mi8_medevac_CHDKZ", 50],
+ ["CUP_O_Mi8_medevac_RU", 50],
+ ["CUP_Merlin_HC3_FFV", 50],
+ ["CUP_Merlin_HC3", 50],
+ ["CUP_Merlin_HC3_MED", 50],
+ ["CUP_B_MH60S_USMC", 50],
+ ["CUP_B_MH60S_FFV_USMC", 50],
+ ["CUP_B_AW159_Unarmed_BAF", 50],
+ ["CUP_B_CH47F_USA", 50],
+ ["CUP_B_CH47F_GB", 50],
+ ["CUP_B_UH60M_US", 50],
+ ["CUP_B_UH60L_US", 50],
+ ["CUP_B_UH60M_FFV_US", 50],
+ ["CUP_B_UH60L_FFV_US", 50],
+ ["CUP_B_UH60M_Unarmed_US", 50],
+ ["CUP_B_UH60L_Unarmed_US", 50],
+ ["CUP_B_UH60M_Unarmed_FFV_US", 50],
+ ["CUP_B_UH60L_Unarmed_FFV_US", 50],
+ ["CUP_B_UH60M_Unarmed_FFV_MEV_US", 50],
+ ["CUP_B_UH60L_Unarmed_FFV_MEV_US", 50],
+ ["CUP_I_UH60L_RACS", 50],
+ ["CUP_I_UH60L_FFV_RACS", 50],
+ ["CUP_I_UH60L_Unarmed_RACS", 50],
+ ["CUP_I_UH60L_Unarmed_FFV_Racs", 50],
+ ["CUP_I_UH60L_Unarmed_FFV_MEV_Racs", 50],
+ ["CUP_B_AH1Z_NoWeapons", 50]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/building.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/building.sqf
new file mode 100644
index 0000000..c5dd49d
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/building.sqf
@@ -0,0 +1,31 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/landvehicle.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/landvehicle.sqf
new file mode 100644
index 0000000..1a7908b
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/landvehicle.sqf
@@ -0,0 +1,559 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+ //Unarmed
+ "CUP_C_Datsun",
+ "CUP_C_Datsun_4seat",
+ "CUP_C_Datsun_Plain",
+ "CUP_C_Datsun_Covered",
+ "CUP_C_Datsun_Tubeframe",
+ "CUP_C_Ural_Civ_01",
+ "CUP_C_Ural_Civ_02",
+ "CUP_C_Ural_Civ_03",
+ "CUP_C_Ural_Open_Civ_01",
+ "CUP_C_Ural_Open_Civ_02",
+ "CUP_C_Ural_Open_Civ_03",
+ "CUP_O_Ural_TKA",
+ "CUP_O_Ural_RU",
+ "CUP_I_Ural_UN",
+ "CUP_B_Ural_CDF",
+ "CUP_O_Ural_CHDKZ",
+ "CUP_O_Ural_SLA",
+ "CUP_O_Ural_Open_TKA",
+ "CUP_B_Ural_Open_CDF",
+ "CUP_O_Ural_Open_RU",
+ "CUP_O_Ural_Open_CHDKZ",
+ "CUP_O_Ural_Open_SLA",
+ "CUP_O_Ural_Empty_SLA",
+ "CUP_B_Ural_Empty_CDF",
+ "CUP_I_Ural_Empty_UN",
+ "CUP_O_Ural_Empty_RU",
+ "CUP_O_Ural_Empty_CHDKZ",
+ "CUP_O_Ural_Empty_TKA",
+ "CUP_O_Ural_Repair_SLA",
+ "CUP_O_Ural_Repair_TKA",
+ "CUP_O_Ural_Repair_CHDKZ",
+ "CUP_O_Ural_Repair_RU",
+ "CUP_I_Ural_Repair_UN",
+ "CUP_B_Ural_Repair_CDF",
+ "CUP_B_Ural_Refuel_CDF",
+ "CUP_O_Ural_Refuel_RU",
+ "CUP_O_Ural_Refuel_CHDKZ",
+ "CUP_O_Ural_Refuel_TKA",
+ "CUP_O_Ural_Refuel_SLA",
+ "CUP_C_LR_Transport_CTK",
+ "CUP_O_LR_Transport_TKA",
+ "CUP_O_LR_Transport_TKM",
+ "CUP_B_LR_Transport_CZ_W",
+ "CUP_B_LR_Transport_CZ_D",
+ "CUP_B_LR_Transport_GB_W",
+ "CUP_B_LR_Transport_GB_D",
+ "CUP_B_LR_Ambulance_CZ_W",
+ "CUP_B_LR_Ambulance_CZ_D",
+ "CUP_B_LR_Ambulance_GB_W",
+ "CUP_B_LR_Ambulance_GB_D",
+ "CUP_O_LR_Ambulance_TKA",
+ "CUP_C_UAZ_Unarmed_TK_CIV",
+ "CUP_O_UAZ_Unarmed_RU",
+ "CUP_I_UAZ_Unarmed_UN",
+ "CUP_O_UAZ_Unarmed_TKA",
+ "CUP_O_UAZ_Unarmed_CHDKZ",
+ "CUP_B_UAZ_Unarmed_ACR",
+ "CUP_B_UAZ_Unarmed_CDF",
+ "CUP_C_UAZ_Open_TK_CIV",
+ "CUP_O_UAZ_Open_CHDKZ",
+ "CUP_O_UAZ_Open_RU",
+ "CUP_O_UAZ_Open_TKA",
+ "CUP_I_UAZ_Open_UN",
+ "CUP_B_UAZ_Open_ACR",
+ "CUP_B_UAZ_Open_CDF",
+ "CUP_B_HMMWV_Unarmed_USA",
+ "CUP_B_HMMWV_Unarmed_USMC",
+ "CUP_B_HMMWV_Ambulance_USMC",
+ "CUP_B_HMMWV_Ambulance_USA",
+ "CUP_B_HMMWV_Ambulance_ACR",
+ "CUP_B_HMMWV_Transport_USA",
+ "CUP_I_M113_Med_RACS",
+ "CUP_I_M113_Med_UN",
+
+ //Armed
+ "Wheeled_APC_F",
+ "CUP_StrykerBase",
+ "CUP_O_LR_MG_TKM",
+ "CUP_O_LR_MG_TKA",
+ "CUP_I_Datsun_PK",
+ "CUP_I_Datsun_PK_Random",
+ "CUP_I_Datsun_PK_TK",
+ "CUP_I_Datsun_PK_TK_Random",
+ "CUP_O_Datsun_PK",
+ "CUP_O_Datsun_PK_Random",
+ "CUP_O_UAZ_MG_CHDKZ",
+ "CUP_O_UAZ_MG_RU",
+ "CUP_O_UAZ_MG_TKA",
+ "CUP_I_UAZ_MG_UN",
+ "CUP_B_UAZ_MG_ACR",
+ "CUP_B_UAZ_MG_CDF",
+ "CUP_B_UAZ_AGS30_CDF",
+ "CUP_O_UAZ_AGS30_CHDKZ",
+ "CUP_O_UAZ_AGS30_RU",
+ "CUP_O_UAZ_AGS30_TKA",
+ "CUP_I_UAZ_AGS30_UN",
+ "CUP_I_M113_RACS",
+ "CUP_I_M113_UN",
+ "CUP_BAF_Jackal2_L2A1_W",
+ "CUP_BAF_Jackal2_L2A1_D",
+ "CUP_BAF_Jackal2_GMG_D",
+ "CUP_BAF_Jackal2_GMG_W",
+ "CUP_B_LR_Special_CZ_W",
+ "CUP_B_LR_Special_Des_CZ_D",
+ "CUP_B_LR_MG_CZ_W",
+ "CUP_B_LR_MG_GB_W",
+ "CUP_B_HMMWV_M1114_USMC",
+ "CUP_B_HMMWV_M2_USMC",
+ "CUP_B_HMMWV_Crows_M2_USA",
+ "CUP_B_HMMWV_M2_GPK_USA",
+ "CUP_B_HMMWV_M2_USA",
+ "CUP_B_HMMWV_DSHKM_GPK_ACR",
+ "CUP_B_HMMWV_AGS_GPK_ACR",
+ "CUP_B_HMMWV_MK19_USMC",
+ "CUP_B_HMMWV_MK19_USA",
+ "CUP_B_HMMWV_Crows_MK19_USA",
+ "CUP_B_HMMWV_SOV_USA",
+ "CUP_B_BRDM2_HQ_CDF",
+ "CUP_O_BRDM2_HQ_SLA",
+ "CUP_I_BRDM2_HQ_UN",
+ "CUP_I_BRDM2_HQ_NAPA",
+ "CUP_I_BRDM2_HQ_TK_Gue",
+ "CUP_O_BRDM2_HQ_TKA",
+ "CUP_O_BRDM2_HQ_CHDKZ",
+ "CUP_O_BRDM2_CHDKZ",
+ "CUP_O_BRDM2_SLA",
+ "CUP_O_BRDM2_TKA",
+ "CUP_I_BRDM2_NAPA",
+ "CUP_I_BRDM2_TK_Gue",
+ "CUP_I_BRDM2_UN",
+ "CUP_B_BRDM2_CDF"
+
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ //Unarmed
+ "CUP_C_Datsun",
+ "CUP_C_Datsun_4seat",
+ "CUP_C_Datsun_Plain",
+ "CUP_C_Datsun_Covered",
+ "CUP_C_Datsun_Tubeframe",
+ "CUP_C_Ural_Civ_01",
+ "CUP_C_Ural_Civ_02",
+ "CUP_C_Ural_Civ_03",
+ "CUP_C_Ural_Open_Civ_01",
+ "CUP_C_Ural_Open_Civ_02",
+ "CUP_C_Ural_Open_Civ_03",
+ "CUP_O_Ural_TKA",
+ "CUP_O_Ural_RU",
+ "CUP_I_Ural_UN",
+ "CUP_B_Ural_CDF",
+ "CUP_O_Ural_CHDKZ",
+ "CUP_O_Ural_SLA",
+ "CUP_O_Ural_Open_TKA",
+ "CUP_B_Ural_Open_CDF",
+ "CUP_O_Ural_Open_RU",
+ "CUP_O_Ural_Open_CHDKZ",
+ "CUP_O_Ural_Open_SLA",
+ "CUP_O_Ural_Empty_SLA",
+ "CUP_B_Ural_Empty_CDF",
+ "CUP_I_Ural_Empty_UN",
+ "CUP_O_Ural_Empty_RU",
+ "CUP_O_Ural_Empty_CHDKZ",
+ "CUP_O_Ural_Empty_TKA",
+ "CUP_O_Ural_Repair_SLA",
+ "CUP_O_Ural_Repair_TKA",
+ "CUP_O_Ural_Repair_CHDKZ",
+ "CUP_O_Ural_Repair_RU",
+ "CUP_I_Ural_Repair_UN",
+ "CUP_B_Ural_Repair_CDF",
+ "CUP_B_Ural_Refuel_CDF",
+ "CUP_O_Ural_Refuel_RU",
+ "CUP_O_Ural_Refuel_CHDKZ",
+ "CUP_O_Ural_Refuel_TKA",
+ "CUP_O_Ural_Refuel_SLA",
+ "CUP_C_LR_Transport_CTK",
+ "CUP_O_LR_Transport_TKA",
+ "CUP_O_LR_Transport_TKM",
+ "CUP_B_LR_Transport_CZ_W",
+ "CUP_B_LR_Transport_CZ_D",
+ "CUP_B_LR_Transport_GB_W",
+ "CUP_B_LR_Transport_GB_D",
+ "CUP_B_LR_Ambulance_CZ_W",
+ "CUP_B_LR_Ambulance_CZ_D",
+ "CUP_B_LR_Ambulance_GB_W",
+ "CUP_B_LR_Ambulance_GB_D",
+ "CUP_O_LR_Ambulance_TKA",
+ "CUP_C_UAZ_Unarmed_TK_CIV",
+ "CUP_O_UAZ_Unarmed_RU",
+ "CUP_I_UAZ_Unarmed_UN",
+ "CUP_O_UAZ_Unarmed_TKA",
+ "CUP_O_UAZ_Unarmed_CHDKZ",
+ "CUP_B_UAZ_Unarmed_ACR",
+ "CUP_B_UAZ_Unarmed_CDF",
+ "CUP_C_UAZ_Open_TK_CIV",
+ "CUP_O_UAZ_Open_CHDKZ",
+ "CUP_O_UAZ_Open_RU",
+ "CUP_O_UAZ_Open_TKA",
+ "CUP_I_UAZ_Open_UN",
+ "CUP_B_UAZ_Open_ACR",
+ "CUP_B_UAZ_Open_CDF",
+ "CUP_B_HMMWV_Unarmed_USA",
+ "CUP_B_HMMWV_Unarmed_USMC",
+ "CUP_B_HMMWV_Ambulance_USMC",
+ "CUP_B_HMMWV_Ambulance_USA",
+ "CUP_B_HMMWV_Ambulance_ACR",
+ "CUP_B_HMMWV_Transport_USA",
+ "CUP_I_M113_Med_RACS",
+ "CUP_I_M113_Med_UN",
+
+ //Armed
+ "Wheeled_APC_F",
+ "CUP_StrykerBase",
+ "CUP_O_LR_MG_TKM",
+ "CUP_O_LR_MG_TKA",
+ "CUP_I_Datsun_PK",
+ "CUP_I_Datsun_PK_Random",
+ "CUP_I_Datsun_PK_TK",
+ "CUP_I_Datsun_PK_TK_Random",
+ "CUP_O_Datsun_PK",
+ "CUP_O_Datsun_PK_Random",
+ "CUP_O_UAZ_MG_CHDKZ",
+ "CUP_O_UAZ_MG_RU",
+ "CUP_O_UAZ_MG_TKA",
+ "CUP_I_UAZ_MG_UN",
+ "CUP_B_UAZ_MG_ACR",
+ "CUP_B_UAZ_MG_CDF",
+ "CUP_B_UAZ_AGS30_CDF",
+ "CUP_O_UAZ_AGS30_CHDKZ",
+ "CUP_O_UAZ_AGS30_RU",
+ "CUP_O_UAZ_AGS30_TKA",
+ "CUP_I_UAZ_AGS30_UN",
+ "CUP_I_M113_RACS",
+ "CUP_I_M113_UN",
+ "CUP_BAF_Jackal2_L2A1_W",
+ "CUP_BAF_Jackal2_L2A1_D",
+ "CUP_BAF_Jackal2_GMG_D",
+ "CUP_BAF_Jackal2_GMG_W",
+ "CUP_B_LR_Special_CZ_W",
+ "CUP_B_LR_Special_Des_CZ_D",
+ "CUP_B_LR_MG_CZ_W",
+ "CUP_B_LR_MG_GB_W",
+ "CUP_B_HMMWV_M1114_USMC",
+ "CUP_B_HMMWV_M2_USMC",
+ "CUP_B_HMMWV_Crows_M2_USA",
+ "CUP_B_HMMWV_M2_GPK_USA",
+ "CUP_B_HMMWV_M2_USA",
+ "CUP_B_HMMWV_DSHKM_GPK_ACR",
+ "CUP_B_HMMWV_AGS_GPK_ACR",
+ "CUP_B_HMMWV_MK19_USMC",
+ "CUP_B_HMMWV_MK19_USA",
+ "CUP_B_HMMWV_Crows_MK19_USA",
+ "CUP_B_HMMWV_SOV_USA",
+ "CUP_B_BRDM2_HQ_CDF",
+ "CUP_O_BRDM2_HQ_SLA",
+ "CUP_I_BRDM2_HQ_UN",
+ "CUP_I_BRDM2_HQ_NAPA",
+ "CUP_I_BRDM2_HQ_TK_Gue",
+ "CUP_O_BRDM2_HQ_TKA",
+ "CUP_O_BRDM2_HQ_CHDKZ",
+ "CUP_O_BRDM2_CHDKZ",
+ "CUP_O_BRDM2_SLA",
+ "CUP_O_BRDM2_TKA",
+ "CUP_I_BRDM2_NAPA",
+ "CUP_I_BRDM2_TK_Gue",
+ "CUP_I_BRDM2_UN",
+ "CUP_B_BRDM2_CDF"
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ //Unarmed
+ "CUP_C_Datsun",
+ "CUP_C_Datsun_4seat",
+ "CUP_C_Datsun_Plain",
+ "CUP_C_Datsun_Covered",
+ "CUP_C_Datsun_Tubeframe",
+ "CUP_C_Ural_Civ_01",
+ "CUP_C_Ural_Civ_02",
+ "CUP_C_Ural_Civ_03",
+ "CUP_C_Ural_Open_Civ_01",
+ "CUP_C_Ural_Open_Civ_02",
+ "CUP_C_Ural_Open_Civ_03",
+ "CUP_O_Ural_TKA",
+ "CUP_O_Ural_RU",
+ "CUP_I_Ural_UN",
+ "CUP_B_Ural_CDF",
+ "CUP_O_Ural_CHDKZ",
+ "CUP_O_Ural_SLA",
+ "CUP_O_Ural_Open_TKA",
+ "CUP_B_Ural_Open_CDF",
+ "CUP_O_Ural_Open_RU",
+ "CUP_O_Ural_Open_CHDKZ",
+ "CUP_O_Ural_Open_SLA",
+ "CUP_O_Ural_Empty_SLA",
+ "CUP_B_Ural_Empty_CDF",
+ "CUP_I_Ural_Empty_UN",
+ "CUP_O_Ural_Empty_RU",
+ "CUP_O_Ural_Empty_CHDKZ",
+ "CUP_O_Ural_Empty_TKA",
+ "CUP_O_Ural_Repair_SLA",
+ "CUP_O_Ural_Repair_TKA",
+ "CUP_O_Ural_Repair_CHDKZ",
+ "CUP_O_Ural_Repair_RU",
+ "CUP_I_Ural_Repair_UN",
+ "CUP_B_Ural_Repair_CDF",
+ "CUP_B_Ural_Refuel_CDF",
+ "CUP_O_Ural_Refuel_RU",
+ "CUP_O_Ural_Refuel_CHDKZ",
+ "CUP_O_Ural_Refuel_TKA",
+ "CUP_O_Ural_Refuel_SLA",
+ "CUP_C_LR_Transport_CTK",
+ "CUP_O_LR_Transport_TKA",
+ "CUP_O_LR_Transport_TKM",
+ "CUP_B_LR_Transport_CZ_W",
+ "CUP_B_LR_Transport_CZ_D",
+ "CUP_B_LR_Transport_GB_W",
+ "CUP_B_LR_Transport_GB_D",
+ "CUP_B_LR_Ambulance_CZ_W",
+ "CUP_B_LR_Ambulance_CZ_D",
+ "CUP_B_LR_Ambulance_GB_W",
+ "CUP_B_LR_Ambulance_GB_D",
+ "CUP_O_LR_Ambulance_TKA",
+ "CUP_C_UAZ_Unarmed_TK_CIV",
+ "CUP_O_UAZ_Unarmed_RU",
+ "CUP_I_UAZ_Unarmed_UN",
+ "CUP_O_UAZ_Unarmed_TKA",
+ "CUP_O_UAZ_Unarmed_CHDKZ",
+ "CUP_B_UAZ_Unarmed_ACR",
+ "CUP_B_UAZ_Unarmed_CDF",
+ "CUP_C_UAZ_Open_TK_CIV",
+ "CUP_O_UAZ_Open_CHDKZ",
+ "CUP_O_UAZ_Open_RU",
+ "CUP_O_UAZ_Open_TKA",
+ "CUP_I_UAZ_Open_UN",
+ "CUP_B_UAZ_Open_ACR",
+ "CUP_B_UAZ_Open_CDF",
+ "CUP_B_HMMWV_Unarmed_USA",
+ "CUP_B_HMMWV_Unarmed_USMC",
+ "CUP_B_HMMWV_Ambulance_USMC",
+ "CUP_B_HMMWV_Ambulance_USA",
+ "CUP_B_HMMWV_Ambulance_ACR",
+ "CUP_B_HMMWV_Transport_USA",
+ "CUP_I_M113_Med_RACS",
+ "CUP_I_M113_Med_UN",
+
+ //Armed
+ "Wheeled_APC_F",
+ "CUP_StrykerBase",
+ "CUP_O_LR_MG_TKM",
+ "CUP_O_LR_MG_TKA",
+ "CUP_I_Datsun_PK",
+ "CUP_I_Datsun_PK_Random",
+ "CUP_I_Datsun_PK_TK",
+ "CUP_I_Datsun_PK_TK_Random",
+ "CUP_O_Datsun_PK",
+ "CUP_O_Datsun_PK_Random",
+ "CUP_O_UAZ_MG_CHDKZ",
+ "CUP_O_UAZ_MG_RU",
+ "CUP_O_UAZ_MG_TKA",
+ "CUP_I_UAZ_MG_UN",
+ "CUP_B_UAZ_MG_ACR",
+ "CUP_B_UAZ_MG_CDF",
+ "CUP_B_UAZ_AGS30_CDF",
+ "CUP_O_UAZ_AGS30_CHDKZ",
+ "CUP_O_UAZ_AGS30_RU",
+ "CUP_O_UAZ_AGS30_TKA",
+ "CUP_I_UAZ_AGS30_UN",
+ "CUP_I_M113_RACS",
+ "CUP_I_M113_UN",
+ "CUP_BAF_Jackal2_L2A1_W",
+ "CUP_BAF_Jackal2_L2A1_D",
+ "CUP_BAF_Jackal2_GMG_D",
+ "CUP_BAF_Jackal2_GMG_W",
+ "CUP_B_LR_Special_CZ_W",
+ "CUP_B_LR_Special_Des_CZ_D",
+ "CUP_B_LR_MG_CZ_W",
+ "CUP_B_LR_MG_GB_W",
+ "CUP_B_HMMWV_M1114_USMC",
+ "CUP_B_HMMWV_M2_USMC",
+ "CUP_B_HMMWV_Crows_M2_USA",
+ "CUP_B_HMMWV_M2_GPK_USA",
+ "CUP_B_HMMWV_M2_USA",
+ "CUP_B_HMMWV_DSHKM_GPK_ACR",
+ "CUP_B_HMMWV_AGS_GPK_ACR",
+ "CUP_B_HMMWV_MK19_USMC",
+ "CUP_B_HMMWV_MK19_USA",
+ "CUP_B_HMMWV_Crows_MK19_USA",
+ "CUP_B_HMMWV_SOV_USA",
+ "CUP_B_BRDM2_HQ_CDF",
+ "CUP_O_BRDM2_HQ_SLA",
+ "CUP_I_BRDM2_HQ_UN",
+ "CUP_I_BRDM2_HQ_NAPA",
+ "CUP_I_BRDM2_HQ_TK_Gue",
+ "CUP_O_BRDM2_HQ_TKA",
+ "CUP_O_BRDM2_HQ_CHDKZ",
+ "CUP_O_BRDM2_CHDKZ",
+ "CUP_O_BRDM2_SLA",
+ "CUP_O_BRDM2_TKA",
+ "CUP_I_BRDM2_NAPA",
+ "CUP_I_BRDM2_TK_Gue",
+ "CUP_I_BRDM2_UN",
+ "CUP_B_BRDM2_CDF"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ //Unarmed
+ ["CUP_C_Datsun", 25],
+ ["CUP_C_Datsun_4seat", 25],
+ ["CUP_C_Datsun_Plain", 25],
+ ["CUP_C_Datsun_Covered", 25],
+ ["CUP_C_Datsun_Tubeframe", 25],
+ ["CUP_C_Ural_Civ_01", 25],
+ ["CUP_C_Ural_Civ_02", 25],
+ ["CUP_C_Ural_Civ_03", 25],
+ ["CUP_C_Ural_Open_Civ_01", 25],
+ ["CUP_C_Ural_Open_Civ_02", 25],
+ ["CUP_C_Ural_Open_Civ_03", 25],
+ ["CUP_O_Ural_TKA", 25],
+ ["CUP_O_Ural_RU", 25],
+ ["CUP_I_Ural_UN", 25],
+ ["CUP_B_Ural_CDF", 25],
+ ["CUP_O_Ural_CHDKZ", 25],
+ ["CUP_O_Ural_SLA", 25],
+ ["CUP_O_Ural_Open_TKA", 25],
+ ["CUP_B_Ural_Open_CDF", 25],
+ ["CUP_O_Ural_Open_RU", 25],
+ ["CUP_O_Ural_Open_CHDKZ", 25],
+ ["CUP_O_Ural_Open_SLA", 25],
+ ["CUP_O_Ural_Empty_SLA", 25],
+ ["CUP_B_Ural_Empty_CDF", 25],
+ ["CUP_I_Ural_Empty_UN", 25],
+ ["CUP_O_Ural_Empty_RU", 25],
+ ["CUP_O_Ural_Empty_CHDKZ", 25],
+ ["CUP_O_Ural_Empty_TKA", 25],
+ ["CUP_O_Ural_Repair_SLA", 25],
+ ["CUP_O_Ural_Repair_TKA", 25],
+ ["CUP_O_Ural_Repair_CHDKZ", 25],
+ ["CUP_O_Ural_Repair_RU", 25],
+ ["CUP_I_Ural_Repair_UN", 25],
+ ["CUP_B_Ural_Repair_CDF", 25],
+ ["CUP_B_Ural_Refuel_CDF", 25],
+ ["CUP_O_Ural_Refuel_RU", 25],
+ ["CUP_O_Ural_Refuel_CHDKZ", 25],
+ ["CUP_O_Ural_Refuel_TKA", 25],
+ ["CUP_O_Ural_Refuel_SLA", 25],
+ ["CUP_C_LR_Transport_CTK", 50],
+ ["CUP_O_LR_Transport_TKA", 50],
+ ["CUP_O_LR_Transport_TKM", 50],
+ ["CUP_B_LR_Transport_CZ_W", 50],
+ ["CUP_B_LR_Transport_CZ_D", 50],
+ ["CUP_B_LR_Transport_GB_W", 50],
+ ["CUP_B_LR_Transport_GB_D", 50],
+ ["CUP_B_LR_Ambulance_CZ_W", 25],
+ ["CUP_B_LR_Ambulance_CZ_D", 25],
+ ["CUP_B_LR_Ambulance_GB_W", 25],
+ ["CUP_B_LR_Ambulance_GB_D", 25],
+ ["CUP_O_LR_Ambulance_TKA", 25],
+ ["CUP_C_UAZ_Unarmed_TK_CIV", 25],
+ ["CUP_O_UAZ_Unarmed_RU", 25],
+ ["CUP_I_UAZ_Unarmed_UN", 25],
+ ["CUP_O_UAZ_Unarmed_TKA", 25],
+ ["CUP_O_UAZ_Unarmed_CHDKZ", 25],
+ ["CUP_B_UAZ_Unarmed_ACR", 25],
+ ["CUP_B_UAZ_Unarmed_CDF", 25],
+ ["CUP_C_UAZ_Open_TK_CIV", 25],
+ ["CUP_O_UAZ_Open_CHDKZ", 25],
+ ["CUP_O_UAZ_Open_RU", 25],
+ ["CUP_O_UAZ_Open_TKA", 25],
+ ["CUP_I_UAZ_Open_UN", 25],
+ ["CUP_B_UAZ_Open_ACR", 25],
+ ["CUP_B_UAZ_Open_CDF", 25],
+ ["CUP_B_HMMWV_Unarmed_USA", 25],
+ ["CUP_B_HMMWV_Unarmed_USMC", 25],
+ ["CUP_B_HMMWV_Ambulance_USMC", 25],
+ ["CUP_B_HMMWV_Ambulance_USA", 25],
+ ["CUP_B_HMMWV_Ambulance_ACR", 25],
+ ["CUP_B_HMMWV_Transport_USA", 50],
+ ["CUP_I_M113_Med_RACS", 25],
+ ["CUP_I_M113_Med_UN", 25],
+
+ //Armed
+ ["Wheeled_APC_F",50],
+ ["CUP_StrykerBase", 50],
+ ["CUP_O_LR_MG_TKM", 25],
+ ["CUP_O_LR_MG_TKA", 25],
+ ["CUP_I_Datsun_PK", 25],
+ ["CUP_I_Datsun_PK_Random", 25],
+ ["CUP_I_Datsun_PK_TK", 25],
+ ["CUP_I_Datsun_PK_TK_Random", 25],
+ ["CUP_O_Datsun_PK", 25],
+ ["CUP_O_Datsun_PK_Random", 25],
+ ["CUP_O_UAZ_MG_CHDKZ", 25],
+ ["CUP_O_UAZ_MG_RU", 25],
+ ["CUP_O_UAZ_MG_TKA", 25],
+ ["CUP_I_UAZ_MG_UN", 25],
+ ["CUP_B_UAZ_MG_ACR", 25],
+ ["CUP_B_UAZ_MG_CDF", 25],
+ ["CUP_B_UAZ_AGS30_CDF", 25],
+ ["CUP_O_UAZ_AGS30_CHDKZ", 25],
+ ["CUP_O_UAZ_AGS30_RU", 25],
+ ["CUP_O_UAZ_AGS30_TKA", 25],
+ ["CUP_I_UAZ_AGS30_UN", 25],
+ ["CUP_I_M113_RACS", 25],
+ ["CUP_I_M113_UN", 25],
+ ["CUP_BAF_Jackal2_L2A1_W", 25],
+ ["CUP_BAF_Jackal2_L2A1_D", 25],
+ ["CUP_BAF_Jackal2_GMG_D", 25],
+ ["CUP_BAF_Jackal2_GMG_W", 25],
+ ["CUP_B_LR_Special_CZ_W", 25],
+ ["CUP_B_LR_Special_Des_CZ_D", 25],
+ ["CUP_B_LR_MG_CZ_W", 25],
+ ["CUP_B_LR_MG_GB_W", 25],
+ ["CUP_B_HMMWV_M1114_USMC", 25],
+ ["CUP_B_HMMWV_M2_USMC", 25],
+ ["CUP_B_HMMWV_Crows_M2_USA", 25],
+ ["CUP_B_HMMWV_M2_GPK_USA", 25],
+ ["CUP_B_HMMWV_M2_USA", 25],
+ ["CUP_B_HMMWV_DSHKM_GPK_ACR", 25],
+ ["CUP_B_HMMWV_AGS_GPK_ACR", 25],
+ ["CUP_B_HMMWV_MK19_USMC", 25],
+ ["CUP_B_HMMWV_MK19_USA", 25],
+ ["CUP_B_HMMWV_Crows_MK19_USA", 25],
+ ["CUP_B_HMMWV_SOV_USA", 25],
+ ["CUP_B_BRDM2_HQ_CDF", 25],
+ ["CUP_O_BRDM2_HQ_SLA", 25],
+ ["CUP_I_BRDM2_HQ_UN", 25],
+ ["CUP_I_BRDM2_HQ_NAPA", 25],
+ ["CUP_I_BRDM2_HQ_TK_Gue", 25],
+ ["CUP_O_BRDM2_HQ_TKA", 25],
+ ["CUP_O_BRDM2_HQ_CHDKZ", 25],
+ ["CUP_O_BRDM2_CHDKZ", 25],
+ ["CUP_O_BRDM2_SLA", 25],
+ ["CUP_O_BRDM2_TKA", 25],
+ ["CUP_I_BRDM2_NAPA", 25],
+ ["CUP_I_BRDM2_TK_Gue", 25],
+ ["CUP_I_BRDM2_UN", 25],
+ ["CUP_B_BRDM2_CDF", 25]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/others.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/others.sqf
new file mode 100644
index 0000000..946f995
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/others.sqf
@@ -0,0 +1,29 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/reammobox.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/reammobox.sqf
new file mode 100644
index 0000000..59e4b87
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/reammobox.sqf
@@ -0,0 +1,29 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/ship.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/ship.sqf
new file mode 100644
index 0000000..59822dc
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/cup/ship.sqf
@@ -0,0 +1,32 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile.sqf
new file mode 100644
index 0000000..2f17e7e
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile.sqf
@@ -0,0 +1,10 @@
+/**
+ * Logistics configuration for All in Arma.
+ * The configuration is splitted in categories dispatched in the included files.
+ */
+#include "Exile\Air.sqf"
+#include "Exile\LandVehicle.sqf"
+#include "Exile\Ship.sqf"
+#include "Exile\Building.sqf"
+#include "Exile\ReammoBox.sqf"
+#include "Exile\Others.sqf"
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/air.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/air.sqf
new file mode 100644
index 0000000..d3b4b0c
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/air.sqf
@@ -0,0 +1,33 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+ "Helicopter",
+ "Helicopter_Base_F"
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ ["Air", 50]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/building.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/building.sqf
new file mode 100644
index 0000000..c5dd49d
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/building.sqf
@@ -0,0 +1,31 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/landvehicle.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/landvehicle.sqf
new file mode 100644
index 0000000..33fce12
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/landvehicle.sqf
@@ -0,0 +1,169 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+ //Larger Vehicles
+ "BRDM2_HQ_Base",
+ "BTR40_MG_base_EP1",
+ "Landrover_civ",
+ "Offroad_02_base_F",
+ "Offroad_01_unarmed_base_F",
+ "Offroad_01_repair_base_F",
+ "LSV_01_base_F",
+ "LSV_02_base_F",
+ "MRAP_03_base_F",
+ "SUV_01_base_F",
+ "SUV_armored_Base",
+ "SUV_Base",
+ "UAZ_Base",
+ "HMMWV_Base",
+
+ //Trucks
+ "Truck_F",
+ "MRAP_01_base_F",
+ "MRAP_02_base_F",
+
+ //Armed
+ "Offroad_01_military_base_F",
+
+ //Boats
+ "Boat_Transport_02_base_F",
+ "SDV_01_base_F",
+ "Boat_Civil_01_base_F"
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ //Cars
+ "Hatchback_01_base_F",
+ "Lada_Base",
+ "Octavia_Base",
+ "volha_Base",
+
+ //Larger Vehicles
+ "BRDM2_HQ_Base",
+ "BTR40_MG_base_EP1",
+ "Landrover_civ",
+ "Offroad_02_base_F",
+ "Offroad_01_unarmed_base_F",
+ "Offroad_01_repair_base_F",
+ "LSV_01_base_F",
+ "LSV_02_base_F",
+ "MRAP_03_base_F",
+ "SUV_01_base_F",
+ "SUV_armored_Base",
+ "SUV_Base",
+ "UAZ_Base",
+ "HMMWV_Base",
+
+ //Trucks
+ "Truck_F",
+ "MRAP_01_base_F",
+ "MRAP_02_base_F",
+
+ //Armed
+ "Offroad_01_military_base_F",
+
+ //Boats
+ "Boat_Transport_02_base_F",
+ "SDV_01_base_F",
+ "Boat_Civil_01_base_F"
+
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ //Cars
+ "Hatchback_01_base_F",
+ "Lada_Base",
+ "Octavia_Base",
+ "volha_Base",
+
+ //Larger Vehicles
+ "BRDM2_HQ_Base",
+ "BTR40_MG_base_EP1",
+ "Landrover_civ",
+ "Offroad_02_base_F",
+ "Offroad_01_unarmed_base_F",
+ "Offroad_01_repair_base_F",
+ "LSV_01_base_F",
+ "LSV_02_base_F",
+ "MRAP_03_base_F",
+ "SUV_01_base_F",
+ "SUV_armored_Base",
+ "SUV_Base",
+ "UAZ_Base",
+ "HMMWV_Base",
+
+ //Trucks
+ "Truck_F",
+ "MRAP_01_base_F",
+ "MRAP_02_base_F",
+
+ //Armed
+ "Offroad_01_military_base_F",
+ "Tank_F",
+
+
+ //Boats
+ "Boat_Transport_02_base_F",
+ "SDV_01_base_F",
+ "Boat_Civil_01_base_F"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ //Cars
+ ["Hatchback_01_base_F", 10],
+ ["Lada_Base", 10],
+ ["Octavia_Base", 10],
+ ["volha_Base", 10],
+
+ //Larger Vehicles
+ ["BRDM2_HQ_Base", 25],
+ ["BTR40_MG_base_EP1", 25],
+ ["Landrover_civ", 25],
+ ["Offroad_02_base_F", 25],
+ ["Offroad_01_unarmed_base_F", 25],
+ ["Offroad_01_repair_base_F", 25],
+ ["LSV_01_base_F", 50],
+ ["LSV_02_base_F", 50],
+ ["MRAP_03_base_F", 50],
+ ["SUV_01_base_F", 25],
+ ["SUV_armored_Base", 25],
+ ["SUV_Base", 25],
+ ["UAZ_Base", 25],
+ ["HMMWV_Base", 25],
+ ["MRAP_01_base_F", 50],
+ ["MRAP_02_base_F", 50],
+
+ //Trucks
+ ["Truck_F", 100],
+
+ //Armed
+ ["Offroad_01_military_base_F", 25],
+
+ //Boats
+ ["Boat_Transport_02_base_F", 25],
+ ["SDV_01_base_F", 25],
+ ["Boat_Civil_01_base_F", 25]
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["Quadbike_01_base_F", 25],
+ ["Bicycle", 10],
+ ["Golf_Base", 25],
+ ["Kart_01_Base_F", 25],
+ ["Tractor_Base", 25],
+ ["Rubber_duck_base_F", 25],
+ ["TowingTractor", 25]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ "Bicycle"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/others.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/others.sqf
new file mode 100644
index 0000000..946f995
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/others.sqf
@@ -0,0 +1,29 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/reammobox.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/reammobox.sqf
new file mode 100644
index 0000000..59e4b87
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/reammobox.sqf
@@ -0,0 +1,29 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/ship.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/ship.sqf
new file mode 100644
index 0000000..59822dc
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/exile/ship.sqf
@@ -0,0 +1,32 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/dump_config.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/dump_config.sqf
new file mode 100644
index 0000000..dc00e32
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/dump_config.sqf
@@ -0,0 +1,78 @@
+/**
+ * Dump the effective logistics configuration to the RPT file.
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+private ["_idx"];
+
+systemChat "DUMPING CONFIG...";
+diag_log text "============= BEGIN OF LOGISTICS CONFIG DUMP =============";
+
+diag_log text "R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +";
+diag_log text "[";
+for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_tow}, {_idx = _idx+1}] do
+{
+ diag_log text format [" ""%1""%2", R3F_LOG_CFG_can_tow select _idx, if (_idx < count R3F_LOG_CFG_can_tow - 1) then {","} else {""}];
+};
+diag_log text "];";
+diag_log text "";
+
+diag_log text "R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +";
+diag_log text "[";
+for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_be_towed}, {_idx = _idx+1}] do
+{
+ diag_log text format [" ""%1""%2", R3F_LOG_CFG_can_be_towed select _idx, if (_idx < count R3F_LOG_CFG_can_be_towed - 1) then {","} else {""}];
+};
+diag_log text "];";
+diag_log text "";
+
+diag_log text "R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +";
+diag_log text "[";
+for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_lift}, {_idx = _idx+1}] do
+{
+ diag_log text format [" ""%1""%2", R3F_LOG_CFG_can_lift select _idx, if (_idx < count R3F_LOG_CFG_can_lift - 1) then {","} else {""}];
+};
+diag_log text "];";
+diag_log text "";
+
+diag_log text "R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +";
+diag_log text "[";
+for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_be_lifted}, {_idx = _idx+1}] do
+{
+ diag_log text format [" ""%1""%2", R3F_LOG_CFG_can_be_lifted select _idx, if (_idx < count R3F_LOG_CFG_can_be_lifted - 1) then {","} else {""}];
+};
+diag_log text "];";
+diag_log text "";
+
+diag_log text "R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +";
+diag_log text "[";
+for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_transport_cargo}, {_idx = _idx+1}] do
+{
+ diag_log text format [" [""%1"", %2]%3", R3F_LOG_CFG_can_transport_cargo select _idx select 0, R3F_LOG_CFG_can_transport_cargo select _idx select 1, if (_idx < count R3F_LOG_CFG_can_transport_cargo - 1) then {","} else {""}];
+};
+diag_log text "];";
+diag_log text "";
+
+diag_log text "R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +";
+diag_log text "[";
+for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_be_transported_cargo}, {_idx = _idx+1}] do
+{
+ diag_log text format [" [""%1"", %2]%3", R3F_LOG_CFG_can_be_transported_cargo select _idx select 0, R3F_LOG_CFG_can_be_transported_cargo select _idx select 1, if (_idx < count R3F_LOG_CFG_can_be_transported_cargo - 1) then {","} else {""}];
+};
+diag_log text "];";
+diag_log text "";
+
+diag_log text "R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +";
+diag_log text "[";
+for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_be_moved_by_player}, {_idx = _idx+1}] do
+{
+ diag_log text format [" ""%1""%2", R3F_LOG_CFG_can_be_moved_by_player select _idx, if (_idx < count R3F_LOG_CFG_can_be_moved_by_player - 1) then {","} else {""}];
+};
+diag_log text "];";
+
+diag_log text "============== END OF LOGISTICS CONFIG DUMP ==============";
+systemChat "CONFIG DUMPED TO RPT !";
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/launch_config_tool.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/launch_config_tool.sqf
new file mode 100644
index 0000000..6b1c243
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/launch_config_tool.sqf
@@ -0,0 +1,321 @@
+/**
+ * Launch the tool helping to edit the logistics configuration.
+ *
+ * THIS TOOL IS UNOFFICIAL AND FOR EXPERT ONLY !
+ * READ THE PDF DOCUMENTATION TO KNOW HOW TO USE IT !
+ *
+ * @usage Don't forget to fill the list of class names to configure in list_of_objects_to_config.sqf.
+ * @usage execVM "R3F_LOG\addons_config\logistics_config_maker_tool\launch_config_tool.sqf";
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+waitUntil {!isNil "R3F_LOG_active"};
+waitUntil {!isNull player};
+
+if (!isServer || {isPlayer _x} count playableUnits > 1) exitWith {systemChat "NOT FOR USE IN MULTIPLAYER !";};
+if (!isNil "BOOL_continue" && {BOOL_continue}) exitWith {systemChat "CONFIG TOOLS ALREADY IN USE !";};
+R3F_LOG_CFG_string_condition_allow_logistics_on_this_client = "false";
+
+TAB_class_names_to_config = [
+ #include "list_of_objects_to_config.sqf"
+];
+
+/*
+ * On inverse l'ordre de toutes les listes de noms de classes pour donner
+ * la priorité aux classes spécifiques sur les classes génériques
+ */
+reverse R3F_LOG_CFG_can_tow;
+reverse R3F_LOG_CFG_can_be_towed;
+reverse R3F_LOG_CFG_can_lift;
+reverse R3F_LOG_CFG_can_be_lifted;
+reverse R3F_LOG_CFG_can_transport_cargo;
+reverse R3F_LOG_CFG_can_be_transported_cargo;
+reverse R3F_LOG_CFG_can_be_moved_by_player;
+reverse R3F_LOG_classes_transporteurs;
+reverse R3F_LOG_classes_objets_transportables;
+
+R3F_LOG_spawn_position = player modelToWorld [0, 30, 0];
+
+player addAction ["Dump config to RPT", "R3F_LOG\addons_config\logistics_config_maker_tool\dump_config.sqf"];
+player addAction ["Set new spawn position", {R3F_LOG_spawn_position = player modelToWorld [0, 30, 0]; systemChat "New spawn position defined.";}];
+player addEventHandler ["HandleDamage", {0}];
+
+BOOL_continue = true;
+IDX_requested_vehicle = 0;
+
+KEY_mode = "";
+INT_capacity = 0;
+
+disableSerialization;
+while {isNull (findDisplay 46)} do {sleep 1;};
+FNCT_onKeyDown =
+{
+ private ["_ret"];
+ _ret = false;
+
+ switch (_this select 1) do
+ {
+ // Left key - previous
+ case 203:
+ {
+ IDX_requested_vehicle = 0 max (IDX_requested_vehicle - 1);
+ _ret = true;
+ };
+ // Right key - next
+ case 205:
+ {
+ IDX_requested_vehicle = (count TAB_class_names_to_config - 1) min (IDX_requested_vehicle + 1);
+ _ret = true;
+ };
+ // Enter key - add the selected feature
+ case 28:
+ {
+ private ["_class_name"];
+ _class_name = toLower configName (configFile >> "CfgVehicles" >> (TAB_class_names_to_config select IDX_requested_vehicle));
+
+ switch (KEY_mode) do
+ {
+ case "m":
+ {
+ R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player - [_class_name];
+ R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player + [_class_name];
+ };
+ case "l":
+ {
+ R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted - [_class_name];
+ R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted + [_class_name];
+ };
+ case "t":
+ {
+ R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed - [_class_name];
+ R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed + [_class_name];
+ };
+ case "L":
+ {
+ R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift - [_class_name];
+ R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift + [_class_name];
+ };
+ case "T":
+ {
+ R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow - [_class_name];
+ R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow + [_class_name];
+ };
+ case "c":
+ {
+ private ["_idx"];
+
+ R3F_LOG_classes_objets_transportables = R3F_LOG_classes_objets_transportables - [_class_name];
+ R3F_LOG_classes_objets_transportables = R3F_LOG_classes_objets_transportables + [_class_name];
+
+ R3F_LOG_CFG_objets_transportables_new = [];
+ for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_be_transported_cargo}, {_idx = _idx+1}] do
+ {
+ if (toLower (R3F_LOG_CFG_can_be_transported_cargo select _idx select 0) != _class_name) then
+ {
+ R3F_LOG_CFG_objets_transportables_new = R3F_LOG_CFG_objets_transportables_new + [R3F_LOG_CFG_can_be_transported_cargo select _idx];
+ };
+ };
+ R3F_LOG_CFG_can_be_transported_cargo = +R3F_LOG_CFG_objets_transportables_new;
+
+ R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo + [[_class_name, INT_capacity]];
+ };
+ case "C":
+ {
+ private ["_idx"];
+
+ R3F_LOG_classes_transporteurs = R3F_LOG_classes_transporteurs - [_class_name];
+ R3F_LOG_classes_transporteurs = R3F_LOG_classes_transporteurs + [_class_name];
+
+ R3F_LOG_CFG_transporteurs_new = [];
+ for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_transport_cargo}, {_idx = _idx+1}] do
+ {
+ if (toLower (R3F_LOG_CFG_can_transport_cargo select _idx select 0) != _class_name) then
+ {
+ R3F_LOG_CFG_transporteurs_new = R3F_LOG_CFG_transporteurs_new + [R3F_LOG_CFG_can_transport_cargo select _idx];
+ };
+ };
+ R3F_LOG_CFG_can_transport_cargo = +R3F_LOG_CFG_transporteurs_new;
+
+ R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo + [[_class_name, INT_capacity]];
+ };
+ };
+ KEY_mode = "";
+ INT_capacity = 0;
+ _ret = true;
+ };
+ // Del key - delete the selected feature
+ case 211:
+ {
+ private ["_class_name"];
+ _class_name = toLower configName (configFile >> "CfgVehicles" >> (TAB_class_names_to_config select IDX_requested_vehicle));
+
+ switch (KEY_mode) do
+ {
+ case "m":
+ {
+ R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player - [_class_name];
+ };
+ case "l":
+ {
+ R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted - [_class_name];
+ };
+ case "t":
+ {
+ R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed - [_class_name];
+ };
+ case "L":
+ {
+ R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift - [_class_name];
+ };
+ case "T":
+ {
+ R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow - [_class_name];
+ };
+ case "c":
+ {
+ private ["_idx"];
+
+ R3F_LOG_classes_objets_transportables = R3F_LOG_classes_objets_transportables - [_class_name];
+
+ R3F_LOG_CFG_objets_transportables_new = [];
+ for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_be_transported_cargo}, {_idx = _idx+1}] do
+ {
+ if (toLower (R3F_LOG_CFG_can_be_transported_cargo select _idx select 0) != _class_name) then
+ {
+ R3F_LOG_CFG_objets_transportables_new = R3F_LOG_CFG_objets_transportables_new + [R3F_LOG_CFG_can_be_transported_cargo select _idx];
+ };
+ };
+ R3F_LOG_CFG_can_be_transported_cargo = +R3F_LOG_CFG_objets_transportables_new;
+ };
+ case "C":
+ {
+ private ["_idx"];
+
+ R3F_LOG_classes_transporteurs = R3F_LOG_classes_transporteurs - [_class_name];
+
+ R3F_LOG_CFG_transporteurs_new = [];
+ for [{_idx = 0}, {_idx < count R3F_LOG_CFG_can_transport_cargo}, {_idx = _idx+1}] do
+ {
+ if (toLower (R3F_LOG_CFG_can_transport_cargo select _idx select 0) != _class_name) then
+ {
+ R3F_LOG_CFG_transporteurs_new = R3F_LOG_CFG_transporteurs_new + [R3F_LOG_CFG_can_transport_cargo select _idx];
+ };
+ };
+ R3F_LOG_CFG_can_transport_cargo = +R3F_LOG_CFG_transporteurs_new;
+ };
+ };
+ KEY_mode = "";
+ INT_capacity = 0;
+ _ret = true;
+ };
+ case 39:{KEY_mode = "m"; _ret = true;};
+ case 38:{KEY_mode = if (_this select 2) then {"L"} else {"l"}; _ret = true;};
+ case 20:{KEY_mode = if (_this select 2) then {"T"} else {"t"}; _ret = true;};
+ case 46:{KEY_mode = if (_this select 2) then {"C"} else {"c"}; _ret = true;};
+ case 82:{INT_capacity = INT_capacity * 10 + 0; _ret = true;};
+ case 79:{INT_capacity = INT_capacity * 10 + 1; _ret = true;};
+ case 80:{INT_capacity = INT_capacity * 10 + 2; _ret = true;};
+ case 81:{INT_capacity = INT_capacity * 10 + 3; _ret = true;};
+ case 75:{INT_capacity = INT_capacity * 10 + 4; _ret = true;};
+ case 76:{INT_capacity = INT_capacity * 10 + 5; _ret = true;};
+ case 77:{INT_capacity = INT_capacity * 10 + 6; _ret = true;};
+ case 71:{INT_capacity = INT_capacity * 10 + 7; _ret = true;};
+ case 72:{INT_capacity = INT_capacity * 10 + 8; _ret = true;};
+ case 73:{INT_capacity = INT_capacity * 10 + 9; _ret = true;};
+ };
+
+ _ret
+};
+(findDisplay 46) displayAddEventHandler ["KeyDown", "_this call FNCT_onKeyDown"];
+
+while {BOOL_continue} do
+{
+ private ["_idx_current_vehicle", "_class", "_class_name", "_vehicle", "_class_infos"];
+
+ _idx_current_vehicle = IDX_requested_vehicle;
+ _class = configFile >> "CfgVehicles" >> (TAB_class_names_to_config select _idx_current_vehicle);
+ _class_name = toLower configName _class;
+ _vehicle = _class_name createVehicle R3F_LOG_spawn_position;
+
+ while {_idx_current_vehicle == IDX_requested_vehicle} do
+ {
+ _class_infos = "";
+ _class_infos = _class_infos + "%1 (%2/%3)
";
+ _class_infos = _class_infos + "
";
+ _class_infos = _class_infos + "Specific config :
";
+ _class_infos = _class_infos + format ["[%1] Movable
", if (_class_name in R3F_LOG_CFG_can_be_moved_by_player) then {"M"} else {" "}];
+ _class_infos = _class_infos + format ["[%1] Liftable
", if (_class_name in R3F_LOG_CFG_can_be_lifted) then {"L"} else {" "}];
+ _class_infos = _class_infos + format ["[%1] Towable
", if (_class_name in R3F_LOG_CFG_can_be_towed) then {"T"} else {" "}];
+ _class_infos = _class_infos + format ["[%1] Cargo-able (transport)
", if (_class_name in R3F_LOG_classes_objets_transportables) then {format ["C%1", R3F_LOG_CFG_can_be_transported_cargo select (R3F_LOG_classes_objets_transportables find _class_name) select 1]} else {" "}];
+ _class_infos = _class_infos + "
";
+ _class_infos = _class_infos + format ["[%1] Lifter
", if (_class_name in R3F_LOG_CFG_can_lift) then {"L"} else {" "}];
+ _class_infos = _class_infos + format ["[%1] Tower
", if (_class_name in R3F_LOG_CFG_can_tow) then {"T"} else {" "}];
+ _class_infos = _class_infos + format ["[%1] Cargo (transporter)
", if (_class_name in R3F_LOG_classes_transporteurs) then {format ["C%1", R3F_LOG_CFG_can_transport_cargo select (R3F_LOG_classes_transporteurs find _class_name) select 1]} else {" "}];
+ _class_infos = _class_infos + "
";
+ _class_infos = _class_infos + "Inherited config :
";
+
+ private ["_j", "_tab_inheritance_tree"];
+ _tab_inheritance_tree = [_class];
+ while {isClass inheritsFrom (_tab_inheritance_tree select 0)} do
+ {
+ _tab_inheritance_tree = [inheritsFrom (_tab_inheritance_tree select 0)] + _tab_inheritance_tree;
+ };
+
+ for [{_j = 0}, {_j < count _tab_inheritance_tree}, {_j = _j+1}] do
+ {
+ private ["_class_name_inherit", "_options"];
+
+ _class_name_inherit = toLower configName (_tab_inheritance_tree select _j);
+
+ _options = "[";
+
+ if (_class_name_inherit in R3F_LOG_CFG_can_be_moved_by_player)
+ then {_options = _options + "M";};
+
+ if (_class_name_inherit in R3F_LOG_CFG_can_be_lifted)
+ then {_options = _options + "L";};
+
+ if (_class_name_inherit in R3F_LOG_CFG_can_be_towed)
+ then {_options = _options + "T";};
+
+ if (_class_name_inherit in R3F_LOG_classes_objets_transportables)
+ then {_options = _options + format ["C%1", R3F_LOG_CFG_can_be_transported_cargo select (R3F_LOG_classes_objets_transportables find _class_name_inherit) select 1];};
+
+ _options = _options + "|";
+
+ if (_class_name_inherit in R3F_LOG_CFG_can_lift)
+ then {_options = _options + "L";};
+
+ if (_class_name_inherit in R3F_LOG_CFG_can_tow)
+ then {_options = _options + "T";};
+
+ if (_class_name_inherit in R3F_LOG_classes_transporteurs)
+ then {_options = _options + format ["C%1", R3F_LOG_CFG_can_transport_cargo select (R3F_LOG_classes_transporteurs find _class_name_inherit) select 1];};
+
+ _options = _options + "] ";
+
+ _class_infos = _class_infos + _options + _class_name_inherit + "
";
+ };
+
+ _class_infos = _class_infos + "";
+
+ hintSilent parseText format [_class_infos, _class_name, (_idx_current_vehicle+1), count TAB_class_names_to_config];
+ sleep 0.05;
+ };
+
+ deleteVehicle _vehicle;
+ sleep 0.01;
+
+ // Clean potential object spawned by the vehicle (effect, etc.)
+ {
+ if (_x != player) then
+ {
+ deleteVehicle _x;
+ };
+ } forEach nearestObjects [R3F_LOG_spawn_position, ["All"], 50];
+ sleep 0.025;
+};
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/list_of_objects_to_config.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/list_of_objects_to_config.sqf
new file mode 100644
index 0000000..c49201e
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/logistics_config_maker_tool/list_of_objects_to_config.sqf
@@ -0,0 +1,27 @@
+"B_static_AA_F",
+"I_static_AA_F",
+"O_static_AA_F",
+"AT_01_base_F",
+"B_static_AT_F",
+"I_static_AT_F",
+"O_static_AT_F",
+"HMG_01_base_F",
+"B_HMG_01_F",
+"HMG_01_A_base_F",
+"B_HMG_01_A_F",
+"I_HMG_01_A_F",
+"O_HMG_01_A_F",
+"HMG_01_high_base_F",
+"B_HMG_01_high_F",
+"I_HMG_01_high_F",
+"O_HMG_01_high_F",
+"I_HMG_01_F",
+"O_HMG_01_F",
+"StaticMortar",
+"Mortar_01_base_F",
+"B_Mortar_01_F",
+"I_G_Mortar_01_F",
+"B_G_Mortar_01_F",
+"O_G_Mortar_01_F",
+"I_Mortar_01_F",
+"O_Mortar_01_F"
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/r3f_addons.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/r3f_addons.sqf
new file mode 100644
index 0000000..7315b5d
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/r3f_addons.sqf
@@ -0,0 +1,31 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ "r3f_uniformbox",
+ "r3f_weaponstock"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["r3f_uniformbox", 5],
+ ["r3f_weaponstock", 5]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/super.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super.sqf
new file mode 100644
index 0000000..92b7748
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super.sqf
@@ -0,0 +1,15 @@
+/**
+ * Logistics configuration for All in Arma.
+ * The configuration is splitted in categories dispatched in the included files.
+ */
+
+// Load the logistics config only if the addon is used
+if (isClass (configfile >> "CfgPatches" >> "AiA_Core")) then
+{
+ #include "Super\Air.sqf"
+ #include "Super\LandVehicle.sqf"
+ #include "Super\Ship.sqf"
+ #include "Super\Building.sqf"
+ #include "Super\ReammoBox.sqf"
+ #include "Super\Others.sqf"
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/air.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/air.sqf
new file mode 100644
index 0000000..13085b7
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/air.sqf
@@ -0,0 +1,170 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+ "Helicopter",
+ "Helicopter_Base_F"
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+//Cars
+ "B_G_Offroad_01_F",
+ "B_G_Offroad_01_repair_F",
+ "B_G_Quadbike_01_F",
+ "B_MRAP_01_F",
+ "B_Quadbike_01_F",
+ "O_G_Quadbike_01_F",
+ "O_MRAP_02_F",
+ "O_Quadbike_01_F",
+ "I_Quadbike_01_F",
+ "I_G_Quadbike_01_F",
+ "I_MRAP_03_F",
+ "C_Offroad_02_unarmed_F",
+ "C_Offroad_02_unarmed_black_F",
+ "C_Offroad_02_unarmed_blue_F",
+ "C_Offroad_02_unarmed_green_F",
+ "C_Offroad_02_unarmed_orange_F",
+ "C_Offroad_02_unarmed_red_F",
+ "C_Offroad_02_unarmed_white_F",
+ "I_C_Offroad_02_unarmed_F",
+ "I_C_Offroad_02_unarmed_brown_F",
+ "I_C_Offroad_02_unarmed_olive_F",
+ "B_T_MRAP_01_F",
+ "B_T_LSV_01_armed_F",
+ "B_T_LSV_01_armed_CTRG_F",
+ "B_T_LSV_01_unarmed_F",
+ "B_T_LSV_01_unarmed_CTRG_F",
+ "B_LSV_01_armed_F",
+ "B_LSV_01_unarmed_F",
+ "B_CTRG_LSV_01_light_F",
+ "B_LSV_01_armed_black_F",
+ "B_LSV_01_armed_olive_F",
+ "B_LSV_01_armed_sand_F",
+ "B_LSV_01_unarmed_black_F",
+ "B_LSV_01_unarmed_olive_F",
+ "B_LSV_01_unarmed_sand_F",
+ "B_T_LSV_01_armed_black_F",
+ "B_T_LSV_01_armed_olive_F",
+ "B_T_LSV_01_armed_sand_F",
+ "B_T_LSV_01_unarmed_black_F",
+ "B_T_LSV_01_unarmed_olive_F",
+ "B_T_LSV_01_unarmed_sand_F",
+ "O_T_LSV_02_armed_F",
+ "O_T_LSV_02_armed_viper_F",
+ "O_T_LSV_02_unarmed_F",
+ "O_T_LSV_02_unarmed_viper_F",
+ "O_LSV_02_armed_F",
+ "O_LSV_02_armed_viper_F",
+ "O_LSV_02_unarmed_F",
+ "O_LSV_02_unarmed_viper_F",
+ "O_T_LSV_02_armed_black_F",
+ "O_T_LSV_02_armed_ghex_F",
+ "O_T_LSV_02_armed_arid_F",
+ "O_T_LSV_02_unarmed_black_F",
+ "O_T_LSV_02_unarmed_ghex_F",
+ "O_T_LSV_02_unarmed_arid_F",
+ "O_LSV_02_armed_black_F",
+ "O_LSV_02_armed_ghex_F",
+ "O_LSV_02_armed_arid_F",
+ "O_LSV_02_unarmed_black_F",
+ "O_LSV_02_unarmed_ghex_F",
+ "O_LSV_02_unarmed_arid_F",
+ "O_T_Quadbike_01_ghex_F",
+
+ //Trucks
+ "B_Truck_01_transport_F",
+ "B_Truck_01_covered_F",
+ "B_Truck_01_mover_F",
+ "B_Truck_01_box_F",
+ "B_Truck_01_Repair_F",
+ "B_Truck_01_ammo_F",
+ "B_Truck_01_fuel_F",
+ "B_Truck_01_medical_F",
+ "B_G_Van_01_transport_F",
+ "B_G_Van_01_fuel_F",
+ "O_G_Offroad_01_repair_F",
+ "O_G_Offroad_01_F",
+ "O_Truck_02_covered_F",
+ "O_Truck_02_transport_F",
+ "O_Truck_03_transport_F",
+ "O_Truck_03_covered_F",
+ "O_Truck_03_repair_F",
+ "O_Truck_03_ammo_F",
+ "O_Truck_03_fuel_F",
+ "O_Truck_03_medical_F",
+ "O_Truck_03_device_F",
+ "O_Truck_02_box_F",
+ "O_Truck_02_medical_F",
+ "O_Truck_02_Ammo_F",
+ "O_Truck_02_fuel_F",
+ "O_G_Van_01_transport_F",
+ "O_G_Van_01_fuel_F",
+ "I_G_Offroad_01_F",
+ "I_G_Offroad_01_armed_F",
+ "I_Truck_02_transport_F",
+ "I_Truck_02_ammo_F",
+ "I_Truck_02_box_F",
+ "I_Truck_02_medical_F",
+ "I_Truck_02_fuel_F",
+ "I_G_Van_01_transport_F",
+ "I_G_Van_01_fuel_F",
+ "B_T_Truck_01_mover_F",
+ "B_T_Truck_01_transport_F",
+ "B_T_Truck_01_covered_F",
+ "O_T_Truck_03_transport_ghex_F",
+ "O_T_Truck_03_covered_ghex_F",
+ "O_T_Truck_03_device_ghex_F",
+ "I_C_Van_01_transport_F",
+ "I_C_Van_01_transport_brown_F",
+ "I_C_Van_01_transport_olive_F",
+
+ //Armed
+ "B_G_Offroad_01_armed_F",
+ "O_G_Offroad_01_armed_F",
+ "B_MRAP_01_gmg_F",
+ "B_MRAP_01_hmg_F",
+ "O_MRAP_02_gmg_F",
+ "O_MRAP_02_hmg_F",
+ "I_MRAP_03_hmg_F",
+ "I_MRAP_03_gmg_F",
+ "B_APC_Wheeled_01_cannon_F",
+ "I_APC_Wheeled_03_cannon_F",
+
+ //Tanks
+ "Tank",
+ "B_APC_Tracked_01_rcws_F",
+ "B_APC_Tracked_01_CRV_F",
+ "B_APC_Tracked_01_AA_F",
+ "B_MBT_01_arty_F",
+ "B_MBT_01_mlrs_F",
+ "B_MBT_01_TUSK_F",
+ "O_APC_Tracked_02_cannon_F",
+ "O_APC_Tracked_02_AA_F",
+ "O_MBT_02_cannon_F",
+ "O_MBT_02_arty_F",
+ "O_APC_Wheeled_02_rcws_F",
+ "I_APC_tracked_03_cannon_F",
+ "I_MBT_03_cannon_F"
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/building.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/building.sqf
new file mode 100644
index 0000000..c5dd49d
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/building.sqf
@@ -0,0 +1,31 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/landvehicle.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/landvehicle.sqf
new file mode 100644
index 0000000..9909d59
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/landvehicle.sqf
@@ -0,0 +1,373 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+ //Trucks
+ "B_Truck_01_transport_F",
+ "B_Truck_01_covered_F",
+ "B_Truck_01_mover_F",
+ "B_Truck_01_box_F",
+ "B_Truck_01_Repair_F",
+ "B_Truck_01_ammo_F",
+ "B_Truck_01_fuel_F",
+ "B_Truck_01_medical_F",
+ "B_G_Van_01_transport_F",
+ "B_G_Van_01_fuel_F",
+ "O_G_Offroad_01_repair_F",
+ "O_G_Offroad_01_F",
+ "O_Truck_02_covered_F",
+ "O_Truck_02_transport_F",
+ "O_Truck_03_transport_F",
+ "O_Truck_03_covered_F",
+ "O_Truck_03_repair_F",
+ "O_Truck_03_ammo_F",
+ "O_Truck_03_fuel_F",
+ "O_Truck_03_medical_F",
+ "O_Truck_03_device_F",
+ "O_Truck_02_box_F",
+ "O_Truck_02_medical_F",
+ "O_Truck_02_Ammo_F",
+ "O_Truck_02_fuel_F",
+ "O_G_Van_01_transport_F",
+ "O_G_Van_01_fuel_F",
+ "I_G_Offroad_01_F",
+ "I_G_Offroad_01_armed_F",
+ "I_Truck_02_transport_F",
+ "I_Truck_02_ammo_F",
+ "I_Truck_02_box_F",
+ "I_Truck_02_medical_F",
+ "I_Truck_02_fuel_F",
+ "I_G_Van_01_transport_F",
+ "I_G_Van_01_fuel_F",
+
+ //Armed
+ "B_G_Offroad_01_armed_F",
+ "O_G_Offroad_01_armed_F",
+ "B_MRAP_01_gmg_F",
+ "B_MRAP_01_hmg_F",
+ "O_MRAP_02_gmg_F",
+ "O_MRAP_02_hmg_F",
+ "I_MRAP_03_hmg_F",
+ "I_MRAP_03_gmg_F",
+ "B_APC_Wheeled_01_cannon_F",
+ "I_APC_Wheeled_03_cannon_F",
+
+ //Tanks
+ "B_APC_Tracked_01_rcws_F",
+ "B_APC_Tracked_01_CRV_F",
+ "B_APC_Tracked_01_AA_F",
+ "B_MBT_01_arty_F",
+ "B_MBT_01_mlrs_F",
+ "B_MBT_01_TUSK_F",
+ "O_APC_Tracked_02_cannon_F",
+ "O_APC_Tracked_02_AA_F",
+ "O_MBT_02_cannon_F",
+ "O_MBT_02_arty_F",
+ "O_APC_Wheeled_02_rcws_F",
+ "I_APC_tracked_03_cannon_F",
+ "I_MBT_03_cannon_F"
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ //Cars
+ "B_G_Offroad_01_F",
+ "B_G_Offroad_01_repair_F",
+ "B_G_Quadbike_01_F",
+ "B_MRAP_01_F",
+ "B_Quadbike_01_F",
+ "O_G_Quadbike_01_F",
+ "O_MRAP_02_F",
+ "O_Quadbike_01_F",
+ "I_Quadbike_01_F",
+ "I_G_Quadbike_01_F",
+ "I_MRAP_03_F",
+ "C_Offroad_02_unarmed_F",
+ "C_Offroad_02_unarmed_black_F",
+ "C_Offroad_02_unarmed_blue_F",
+ "C_Offroad_02_unarmed_green_F",
+ "C_Offroad_02_unarmed_orange_F",
+ "C_Offroad_02_unarmed_red_F",
+ "C_Offroad_02_unarmed_white_F",
+ "I_C_Offroad_02_unarmed_F",
+ "I_C_Offroad_02_unarmed_brown_F",
+ "I_C_Offroad_02_unarmed_olive_F",
+ "B_T_MRAP_01_F",
+ "B_T_LSV_01_armed_F",
+ "B_T_LSV_01_armed_CTRG_F",
+ "B_T_LSV_01_unarmed_F",
+ "B_T_LSV_01_unarmed_CTRG_F",
+ "B_LSV_01_armed_F",
+ "B_LSV_01_unarmed_F",
+ "B_CTRG_LSV_01_light_F",
+ "B_LSV_01_armed_black_F",
+ "B_LSV_01_armed_olive_F",
+ "B_LSV_01_armed_sand_F",
+ "B_LSV_01_unarmed_black_F",
+ "B_LSV_01_unarmed_olive_F",
+ "B_LSV_01_unarmed_sand_F",
+ "B_T_LSV_01_armed_black_F",
+ "B_T_LSV_01_armed_olive_F",
+ "B_T_LSV_01_armed_sand_F",
+ "B_T_LSV_01_unarmed_black_F",
+ "B_T_LSV_01_unarmed_olive_F",
+ "B_T_LSV_01_unarmed_sand_F",
+ "O_T_LSV_02_armed_F",
+ "O_T_LSV_02_armed_viper_F",
+ "O_T_LSV_02_unarmed_F",
+ "O_T_LSV_02_unarmed_viper_F",
+ "O_LSV_02_armed_F",
+ "O_LSV_02_armed_viper_F",
+ "O_LSV_02_unarmed_F",
+ "O_LSV_02_unarmed_viper_F",
+ "O_T_LSV_02_armed_black_F",
+ "O_T_LSV_02_armed_ghex_F",
+ "O_T_LSV_02_armed_arid_F",
+ "O_T_LSV_02_unarmed_black_F",
+ "O_T_LSV_02_unarmed_ghex_F",
+ "O_T_LSV_02_unarmed_arid_F",
+ "O_LSV_02_armed_black_F",
+ "O_LSV_02_armed_ghex_F",
+ "O_LSV_02_armed_arid_F",
+ "O_LSV_02_unarmed_black_F",
+ "O_LSV_02_unarmed_ghex_F",
+ "O_LSV_02_unarmed_arid_F",
+ "O_T_Quadbike_01_ghex_F",
+
+ //Trucks
+ "B_Truck_01_transport_F",
+ "B_Truck_01_covered_F",
+ "B_Truck_01_mover_F",
+ "B_Truck_01_box_F",
+ "B_Truck_01_Repair_F",
+ "B_Truck_01_ammo_F",
+ "B_Truck_01_fuel_F",
+ "B_Truck_01_medical_F",
+ "B_G_Van_01_transport_F",
+ "B_G_Van_01_fuel_F",
+ "O_G_Offroad_01_repair_F",
+ "O_G_Offroad_01_F",
+ "O_Truck_02_covered_F",
+ "O_Truck_02_transport_F",
+ "O_Truck_03_transport_F",
+ "O_Truck_03_covered_F",
+ "O_Truck_03_repair_F",
+ "O_Truck_03_ammo_F",
+ "O_Truck_03_fuel_F",
+ "O_Truck_03_medical_F",
+ "O_Truck_03_device_F",
+ "O_Truck_02_box_F",
+ "O_Truck_02_medical_F",
+ "O_Truck_02_Ammo_F",
+ "O_Truck_02_fuel_F",
+ "O_G_Van_01_transport_F",
+ "O_G_Van_01_fuel_F",
+ "I_G_Offroad_01_F",
+ "I_G_Offroad_01_armed_F",
+ "I_Truck_02_transport_F",
+ "I_Truck_02_ammo_F",
+ "I_Truck_02_box_F",
+ "I_Truck_02_medical_F",
+ "I_Truck_02_fuel_F",
+ "I_G_Van_01_transport_F",
+ "I_G_Van_01_fuel_F",
+ "B_T_Truck_01_mover_F",
+ "B_T_Truck_01_transport_F",
+ "B_T_Truck_01_covered_F",
+ "O_T_Truck_03_transport_ghex_F",
+ "O_T_Truck_03_covered_ghex_F",
+ "O_T_Truck_03_device_ghex_F",
+ "I_C_Van_01_transport_F",
+ "I_C_Van_01_transport_brown_F",
+ "I_C_Van_01_transport_olive_F",
+
+ //Armed
+ "B_G_Offroad_01_armed_F",
+ "O_G_Offroad_01_armed_F",
+ "B_MRAP_01_gmg_F",
+ "B_MRAP_01_hmg_F",
+ "O_MRAP_02_gmg_F",
+ "O_MRAP_02_hmg_F",
+ "I_MRAP_03_hmg_F",
+ "I_MRAP_03_gmg_F",
+ "B_APC_Wheeled_01_cannon_F",
+ "I_APC_Wheeled_03_cannon_F",
+
+ //Tanks
+ "B_APC_Tracked_01_rcws_F",
+ "B_APC_Tracked_01_CRV_F",
+ "B_APC_Tracked_01_AA_F",
+ "B_MBT_01_arty_F",
+ "B_MBT_01_mlrs_F",
+ "B_MBT_01_TUSK_F",
+ "O_APC_Tracked_02_cannon_F",
+ "O_APC_Tracked_02_AA_F",
+ "O_MBT_02_cannon_F",
+ "O_MBT_02_arty_F",
+ "O_APC_Wheeled_02_rcws_F",
+ "I_APC_tracked_03_cannon_F",
+ "I_MBT_03_cannon_F"
+
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ //Cars
+ ["B_G_Offroad_01_F", 20],
+ ["B_G_Offroad_01_repair_F", 20],
+ ["B_G_Quadbike_01_F", 10],
+ ["B_MRAP_01_F", 25],
+ ["B_Quadbike_01_F", 10],
+ ["O_G_Quadbike_01_F", 10],
+ ["O_MRAP_02_F", 25],
+ ["O_Quadbike_01_F", 10],
+ ["I_Quadbike_01_F", 10],
+ ["I_G_Quadbike_01_F", 10],
+ ["I_MRAP_03_F", 25],
+ ["C_Offroad_02_unarmed_F", 20],
+ ["C_Offroad_02_unarmed_black_F", 20],
+ ["C_Offroad_02_unarmed_blue_F", 20],
+ ["C_Offroad_02_unarmed_green_F", 20],
+ ["C_Offroad_02_unarmed_orange_F", 20],
+ ["C_Offroad_02_unarmed_red_F", 20],
+ ["C_Offroad_02_unarmed_white_F", 20],
+ ["I_C_Offroad_02_unarmed_F", 20],
+ ["I_C_Offroad_02_unarmed_brown_F", 20],
+ ["I_C_Offroad_02_unarmed_olive_F", 20],
+ ["B_T_MRAP_01_F", 25],
+ ["B_T_LSV_01_armed_F", 25],
+ ["B_T_LSV_01_armed_CTRG_F", 25],
+ ["B_T_LSV_01_unarmed_F", 25],
+ ["B_T_LSV_01_unarmed_CTRG_F", 25],
+ ["B_LSV_01_armed_F", 25],
+ ["B_LSV_01_unarmed_F", 25],
+ ["B_CTRG_LSV_01_light_F", 25],
+ ["B_LSV_01_armed_black_F", 25],
+ ["B_LSV_01_armed_olive_F", 25],
+ ["B_LSV_01_armed_sand_F", 25],
+ ["B_LSV_01_unarmed_black_F", 25],
+ ["B_LSV_01_unarmed_olive_F", 25],
+ ["B_LSV_01_unarmed_sand_F", 25],
+ ["B_T_LSV_01_armed_black_F", 25],
+ ["B_T_LSV_01_armed_olive_F", 25],
+ ["B_T_LSV_01_armed_sand_F", 25],
+ ["B_T_LSV_01_unarmed_black_F", 25],
+ ["B_T_LSV_01_unarmed_olive_F", 25],
+ ["B_T_LSV_01_unarmed_sand_F", 25],
+ ["O_T_LSV_02_armed_F", 25],
+ ["O_T_LSV_02_armed_viper_F", 25],
+ ["O_T_LSV_02_unarmed_F", 25],
+ ["O_T_LSV_02_unarmed_viper_F", 25],
+ ["O_LSV_02_armed_F", 25],
+ ["O_LSV_02_armed_viper_F", 25],
+ ["O_LSV_02_unarmed_F", 25],
+ ["O_LSV_02_unarmed_viper_F", 25],
+ ["O_T_LSV_02_armed_black_F", 25],
+ ["O_T_LSV_02_armed_ghex_F", 25],
+ ["O_T_LSV_02_armed_arid_F", 25],
+ ["O_T_LSV_02_unarmed_black_F", 25],
+ ["O_T_LSV_02_unarmed_ghex_F", 25],
+ ["O_T_LSV_02_unarmed_arid_F", 25],
+ ["O_LSV_02_armed_black_F", 25],
+ ["O_LSV_02_armed_ghex_F", 25],
+ ["O_LSV_02_armed_arid_F", 25],
+ ["O_LSV_02_unarmed_black_F", 25],
+ ["O_LSV_02_unarmed_ghex_F", 25],
+ ["O_LSV_02_unarmed_arid_F", 25],
+ ["O_T_Quadbike_01_ghex_F", 10],
+
+ //Trucks
+ ["B_Truck_01_transport_F", 100],
+ ["B_Truck_01_covered_F", 100],
+ ["B_Truck_01_mover_F", 100],
+ ["B_Truck_01_box_F", 100],
+ ["B_Truck_01_Repair_F", 25],
+ ["B_Truck_01_ammo_F", 50],
+ ["B_Truck_01_fuel_F", 25],
+ ["B_Truck_01_medical_F", 25],
+ ["B_G_Van_01_transport_F", 50],
+ ["B_G_Van_01_fuel_F", 25],
+ ["O_G_Offroad_01_repair_F", 25],
+ ["O_G_Offroad_01_F", 25],
+ ["O_Truck_02_covered_F", 50],
+ ["O_Truck_02_transport_F", 100],
+ ["O_Truck_03_transport_F", 100],
+ ["O_Truck_03_covered_F", 100],
+ ["O_Truck_03_repair_F", 25],
+ ["O_Truck_03_ammo_F", 50],
+ ["O_Truck_03_fuel_F", 25],
+ ["O_Truck_03_medical_F", 25],
+ ["O_Truck_03_device_F", 25],
+ ["O_Truck_02_box_F", 100],
+ ["O_Truck_02_medical_F", 25],
+ ["O_Truck_02_Ammo_F", 50],
+ ["O_Truck_02_fuel_F", 25],
+ ["O_G_Van_01_transport_F", 50],
+ ["O_G_Van_01_fuel_F", 25],
+ ["I_G_Offroad_01_F", 25],
+ ["I_G_Offroad_01_armed_F", 25],
+ ["I_Truck_02_transport_F", 100],
+ ["I_Truck_02_ammo_F", 50],
+ ["I_Truck_02_box_F", 25],
+ ["I_Truck_02_medical_F", 25],
+ ["I_Truck_02_fuel_F", 25],
+ ["I_G_Van_01_transport_F", 50],
+ ["I_G_Van_01_fuel_F", 25],
+ ["B_T_Truck_01_mover_F", 100],
+ ["B_T_Truck_01_transport_F", 100],
+ ["B_T_Truck_01_covered_F", 100],
+ ["O_T_Truck_03_transport_ghex_F", 100],
+ ["O_T_Truck_03_covered_ghex_F", 100],
+ ["O_T_Truck_03_device_ghex_F", 100],
+ ["I_C_Van_01_transport_F", 100],
+ ["I_C_Van_01_transport_brown_F", 100],
+ ["I_C_Van_01_transport_olive_F", 100],
+
+ //Armed
+ ["B_G_Offroad_01_armed_F", 25],
+ ["O_G_Offroad_01_armed_F", 25],
+ ["B_MRAP_01_gmg_F", 50],
+ ["B_MRAP_01_hmg_F", 50],
+ ["O_MRAP_02_gmg_F", 50],
+ ["O_MRAP_02_hmg_F", 50],
+ ["I_MRAP_03_hmg_F", 50],
+ ["I_MRAP_03_gmg_F", 50],
+ ["B_APC_Wheeled_01_cannon_F", 10],
+ ["I_APC_Wheeled_03_cannon_F", 10],
+
+ //Tanks
+ ["B_APC_Tracked_01_rcws_F", 50],
+ ["B_APC_Tracked_01_CRV_F", 50],
+ ["B_APC_Tracked_01_AA_F", 50],
+ ["B_MBT_01_arty_F", 50],
+ ["B_MBT_01_mlrs_F", 50],
+ ["B_MBT_01_TUSK_F", 50],
+ ["O_APC_Tracked_02_cannon_F", 50],
+ ["O_APC_Tracked_02_AA_F", 50],
+ ["O_MBT_02_cannon_F", 50],
+ ["O_MBT_02_arty_F", 50],
+ ["O_APC_Wheeled_02_rcws_F", 50],
+ ["I_APC_tracked_03_cannon_F", 50],
+ ["I_MBT_03_cannon_F", 50]
+
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ ["kart_01_base_f", 40],
+ ["quadbike_01_base_f", 40],
+ ["ugv_01_base_f", 100]
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/others.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/others.sqf
new file mode 100644
index 0000000..946f995
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/others.sqf
@@ -0,0 +1,29 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/reammobox.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/reammobox.sqf
new file mode 100644
index 0000000..59e4b87
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/reammobox.sqf
@@ -0,0 +1,29 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/ship.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/ship.sqf
new file mode 100644
index 0000000..59822dc
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/super/ship.sqf
@@ -0,0 +1,32 @@
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+];
+
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+
+];
+
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+
+];
+
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+];
+
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+
+];
+
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/addons_config/template.sqf b/mpmissions/Exile.Altis/R3F_LOG/addons_config/template.sqf
new file mode 100644
index 0000000..5fa5745
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/addons_config/template.sqf
@@ -0,0 +1,121 @@
+/**
+ * English and French comments
+ * Commentaires anglais et français
+ *
+ * This file is a template to add objetcs from an addon in the configuration variables of the logistics system.
+ * Make a copy of this file and fill it. Then add a #include to this file in the file R3F_LOG\config.sqf.
+ *
+ * IMPORTANT NOTE : when a logistics feature is given to an object/vehicle class name, all the classes which inherit
+ * of the parent/generic class (according to the CfgVehicles) will also have this feature.
+ * CfgVehicles tree view example : http://madbull.arma.free.fr/A3_stable_1.20.124746_CfgVehicles_tree.html
+ *
+ *
+ * Ce fichier est un exemple vierge permettant d'ajouter des objets d'un addon dans la configuration du système de logistique.
+ * Faites une copie de ce fichier et remplissez-le. Puis ajouter un #include vers celui-ci dans le fichier R3F_LOG\config.sqf.
+ *
+ * NOTE IMPORTANTE : lorsqu'une fonctionnalité logistique est accordée à un nom de classe d'objet/véhicule, les classes
+ * héritant de cette classe mère/générique (selon le CfgVehicles) se verront également dotées de cette fonctionnalité.
+ * Exemple d'arborescence du CfgVehicles : http://madbull.arma.free.fr/A3_stable_1.20.124746_CfgVehicles_tree.html
+ */
+
+/**
+ * List of class names of ground vehicles which can tow objects.
+ * Liste des noms de classes des véhicules terrestres pouvant remorquer des objets.
+ */
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+ // e.g. : "MyTowingVehicleClassName1", "MyTowingVehicleClassName2"
+];
+
+/**
+ * List of class names of objects which can be towed.
+ * Liste des noms de classes des objets remorquables.
+ */
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+ // e.g. : "MyTowableObjectClassName1", "MyTowableObjectClassName2"
+];
+
+
+/****** LIFT WITH VEHICLE / HELIPORTER AVEC VEHICULE ******/
+
+/**
+ * List of class names of helicopters which can lift objects.
+ * Liste des noms de classes des hélicoptères pouvant héliporter des objets.
+ */
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+ // e.g. : "MyLifterVehicleClassName1", "MyLifterVehicleClassName2"
+];
+
+/**
+ * List of class names of objects which can be lifted.
+ * Liste des noms de classes des objets héliportables.
+ */
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+ // e.g. : "MyLiftableObjectClassName1", "MyLiftableObjectClassName2"
+];
+
+
+/****** LOAD IN VEHICLE / CHARGER DANS LE VEHICULE ******/
+
+/*
+ * This section uses a numeric quantification of capacity and cost of the objets.
+ * For example, in a vehicle has a capacity of 100, we will be able to load in 5 objects costing 20 capacity units.
+ * The capacity doesn't represent a real volume or weight, but a choice made for gameplay.
+ *
+ * Note : the priority of a declaration of cost/capacity to another one corresponds to the inverse order in the tables.
+ * It means that the most generic classes should be listed before the less generic classes.
+ * For example : the "Truck_F" class is a child of the "Car_F" class (see http://madbull.arma.free.fr/A3_stable_1.20.124746_CfgVehicles_tree.html).
+ * If "Car_F" is declared before "Truck_F" with a capacity of 40, and "Truck_F" is declared after with a capacity of 140,
+ * Then all the child classes of "Truck_F" will have a capacity of 140.
+ * And all the derived classes of "Car_F", not in "Truck_F", will have a capacity of 40.
+ *
+ *
+ * Cette section utilise une quantification numérique de la capacité et du coût des objets.
+ * Par exemple, dans un véhicule d'une capacité de 100, nous pouvons charger 5 objets coûtant 20 unités de capacité.
+ * La capacité ne représente ni un poids, ni un volume, mais un choix fait pour la jouabilité.
+ *
+ * Note : la priorité d'une déclaration de coût/capacité sur une autre correspond à l'ordre inverse dans les tableaux.
+ * Cela implique que les classes les plus génériques doivent être listées avant les classes moins gnériques.
+ * Par exemple : la classe "Truck_F" est une classe dérviée de "Car_F" (voir http://madbull.arma.free.fr/A3_stable_1.20.124746_CfgVehicles_tree.html).
+ * Si "Car_F" est déclaré avant "Truck_F" avec une capacité de 40, et que "Truck_F" est déclaré après avec une capacité de 140,
+ * Alors toutes les classes dérivées de "Truck_F" auront une capacité de 140.
+ * Et toutes les classes dans "Car_F", non présentes dans "Truck_F", auront une capacité de 40.
+ */
+
+/**
+ * List of class names of vehicles or cargo objects which can transport objects.
+ * The second element of the nested arrays is the load capacity (in relation with the capacity cost of the objects).
+ *
+ * Liste des noms de classes des véhicules ou "objets contenant" pouvant transporter des objets.
+ * Le deuxième élément des sous-tableaux est la capacité de chargement (en relation avec le coût de capacité des objets).
+ */
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+ // e.g. : ["MyTransporterClassName1", itsCapacity], ["MyTransporterClassName2", itsCapacity]
+];
+
+/**
+ * List of class names of objects which can be loaded in transport vehicle/cargo.
+ * The second element of the nested arrays is the cost capacity (in relation with the capacity of the vehicles).
+ *
+ * Liste des noms de classes des objets transportables.
+ * Le deuxième élément des sous-tableaux est le coût de capacité (en relation avec la capacité des véhicules).
+ */
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ // e.g. : ["MyTransportableObjectClassName1", itsCost], ["MyTransportableObjectClassName2", itsCost]
+];
+
+/****** MOVABLE-BY-PLAYER OBJECTS / OBJETS DEPLACABLES PAR LE JOUEUR ******/
+
+/**
+ * List of class names of objects which can be carried and moved by a player.
+ * Liste des noms de classes des objets qui peuvent être portés et déplacés par le joueur.
+ */
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ // e.g. : "MyMovableObjectClassName1", "MyMovableObjectClassName2"
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/changelog.txt b/mpmissions/Exile.Altis/R3F_LOG/changelog.txt
new file mode 100644
index 0000000..4581dfe
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/changelog.txt
@@ -0,0 +1,95 @@
+v3.1
+- Added : ability to send/sell back objects to the creation factory (fully configurable)
+- Added : the objects are locked to the side/faction/player/none (default config : side, optional unlocking countdown)
+- Added : planes and wheeled vehicles have been set as towable in default configuration
+- Added : countdown during the helicopter lift hooking process (stay hover)
+- Added : logistics configuration for the "All in Arma" addon (auto-activated only if used)
+- Added : logistics configuration update from A3 1.22 to A3 1.35
+- Added : disable the R3F's airlift when the BIS' airlift is currently in use
+- Added : tutorial mission to learn how to use logistics
+- Improved : the towing feature is allowed only if the front side of towable object is near of the rear of towing object
+- Improved : the cost of creation in the factories are configurable and more realistic (see R3F_LOG_CFG_CF_creation_cost_factor)
+- Improved : the vehicle's content interface shows the place taken by each item and a global progress bar of the cargo load
+- Improved : easier and more efficient way to protect essential objects (see USER_FUNCT\do_not_lose_it.sqf)
+- Improved : when creating/unloading a movable object, the initial height fits to the player's sight
+- Improved : when creating/unloading a non-movable object, the warning message is replaced by a confirm dialog
+- Improved : take benefits of the getHit command in the injury protection system (http://feedback.arma3.com/view.php?id=18261)
+- Improved : performance optimizations to determine the logistics capabilities of an object/vehicle
+- Fixed : AI can no longer walk through walls and other objects (http://feedback.arma3.com/view.php?id=19588)
+- Fixed : autonomous vehicles can now be loaded/moved/towed
+- Fixed : autonomous vehicles from the creation factory can now be used
+- Fixed : underwater diver can now take an object in its hands
+
+v3.0 (migration to Arma 3)
+- Removed : the [R3F] Artillery is moved to an independent addon (not released)
+- Added : new full documentation, please read it carefully before asking questions
+- Added : functions to automatically load objects in vehicles at mission start
+- Added : creation factory to spawn objects and vehicles, with a credits management
+- Improved : player can no longer injure other players while moving objects
+- Improved : movable objects can be placed in height (floor, roof and any other surface)
+- Improved : movable objects has three pitch orientation methods
+- Improved : movable objects can be rotated and translated during their moves
+- Improved : the loaded objects interface is now refreshed when the vehicle content changes
+- Improved : possibility to enable logistics only on some specific objects and clients
+- Improved : several improvements about movements and interactions
+- Improved : many other improvements, fixes and optimizations
+- See also the v2.0 changes (not publicly released)
+
+v2.0 (not publicly released)
+- Added : vehicles and objects from BAF/PMC/ACR/ACE are available for logistics
+- Added : the RM70 is available for artillery
+- Fixed : take into account the altitude offset on map click (e.g. 2000m offset on Takistan)
+- Improved : dialogs and interactions improvements
+- Improved : smoke shells are now more efficients
+- Improved : the player is automatically forced to walk while moving an object
+- Improved : the island height is automatically detected for artillery coordinates
+- Improved : the player identity is no longer used in the info messages in the chat
+- Improved : the player's language is now automatically detected
+
+v1.6
+- Added : smoke shells and cluster shells (sub-munitions/DPICM)
+- Added : the mortar of the Stryker MC has now the artillery features
+- Added : check if the AI is really able to aim in the requested direction before firing
+
+v1.5
+- Added : the AIs can now receive and execute a fire order
+- Added : virtual magazines system wich allows to add different charges and effects without addon
+- Added : MLRS and BM-21 Grad ballistics calculation for AA:OA and AA:CO 1.54+
+- Added : config variables to give access to the artillery computer from inside or outside
+- Added : the M109 gun from the vilas' project '85 is in the default configuration
+- Fixed : compatibility with the OA 1.54 patch
+- Fixed : UTF-8 encoding for the language files
+- Improved : source optimization and beautification
+
+v1.4
+- Added : compatibility to ArmA 2 (alone) + Operation Arrowhead (alone) + Combined Operations (A2 + OA)
+- Added : the Arrowhead (and ArmA 2) objects are now in the logisitics default config
+- Added : the ACE OA objects are now in the logisitics default config
+- Improved : the artillery system now manages both north-west and south-west origin coord systems
+- Added : many new island heights are listed in the config file
+- The stringtable.csv is replaced by a simpler alternative system
+- Fixed : script warning when a JIP player was not fully initialized
+- Added : we can now remove the logistics system (like we already could with the artillery part)
+
+v1.3
+- Improved : Lightweightness of the logistics (objects auto-detection)
+- Improved : Fire solution search algorithm (max duration decreased and script warning removed)
+- Fixed : Something seemed to make the ArmA 2 game engine unstable on specific computer configurations
+- Only the players in the same faction are now displayed in the arty computer interface
+- Help in the arty computer interface slightly improved
+
+v1.2
+- Fix the displayed value for elevation when the artillery piece is in slope
+- Adjust the cost capacity of the containers which were equals to their own capacity
+- Optimization of the ballistic calculations (speed and precision)
+- The longitude/latitude coordinates format are now in a 4 digits notation
+- The fire adjustments is now in a "Add, Drop, Left, Right + Dir. to target" notation
+- Add the possibility to close/open the interface in an artillery piece
+
+v1.1
+- Fix of a bug with velocity of objects with ACE2
+- Add the possibility to have a non-movable artillery command quarter
+- Some additional precisions in the explanation about the ballistic table generation
+
+v1.0
+- First public release
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/config.sqf b/mpmissions/Exile.Altis/R3F_LOG/config.sqf
new file mode 100644
index 0000000..50123c7
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/config.sqf
@@ -0,0 +1,363 @@
+/**
+ * MAIN CONFIGURATION FILE
+ *
+ * English and French comments
+ * Commentaires anglais et français
+ *
+ * (EN)
+ * This file contains the configuration variables of the logistics system.
+ * For the configuration of the creation factory, see the file "config_creation_factory.sqf".
+ * IMPORTANT NOTE : when a logistics feature is given to an object/vehicle class name, all the classes which inherit
+ * of the parent/generic class (according to the CfgVehicles) will also have this feature.
+ * CfgVehicles tree view example : http://madbull.arma.free.fr/A3_stable_1.20.124746_CfgVehicles_tree.html
+ *
+ * (FR)
+ * Fichier contenant les variables de configuration du système de logistique.
+ * Pour la configuration de l'usine de création, voir le fichier "config_creation_factory.sqf".
+ * NOTE IMPORTANTE : lorsqu'une fonctionnalité logistique est accordée à un nom de classe d'objet/véhicule, les classes
+ * héritant de cette classe mère/générique (selon le CfgVehicles) se verront également dotées de cette fonctionnalité.
+ * Exemple d'arborescence du CfgVehicles : http://madbull.arma.free.fr/A3_stable_1.20.124746_CfgVehicles_tree.html
+ */
+
+/**
+ * DISABLE LOGISTICS ON OBJECTS BY DEFAULT
+ *
+ * (EN)
+ * Define if objects and vehicles have logistics features by default,
+ * or if it must be allowed explicitely on specific objects/vehicles.
+ *
+ * If false : all objects are enabled according to the class names listed in this configuration file
+ * You can disable some objects with : object setVariable ["R3F_LOG_disabled", true];
+ * If true : all objects are disabled by default
+ * You can enable some objects with : object setVariable ["R3F_LOG_disabled", false];
+ *
+ *
+ * (FR)
+ * Défini si les objets et véhicules disposent des fonctionnalités logistiques par défaut,
+ * ou si elles doivent être autorisés explicitement sur des objets/véhicules spécifiques.
+ *
+ * Si false : tous les objets sont actifs en accord avec les noms de classes listés dans ce fichier
+ * Vous pouvez désactiver certains objets avec : objet setVariable ["R3F_LOG_disabled", true];
+ * Si true : tous les objets sont inactifs par défaut
+ * Vous pouvez activer quelques objets avec : objet setVariable ["R3F_LOG_disabled", false];
+ */
+R3F_LOG_CFG_disabled_by_default = false;
+
+/**
+ * LOCK THE LOGISTICS FEATURES TO SIDE, FACTION OR PLAYER
+ *
+ * (EN)
+ * Define the lock mode of the logistics features for an object.
+ * An object can be locked to the a side, faction, a player (respawn) or a unit (life).
+ * If the object is locked, the player can unlock it according to the
+ * value of the config variable R3F_LOG_CFG_unlock_objects_timer.
+ *
+ * If "none" : no lock features, everyone can used the logistics features.
+ * If "side" : the object is locked to the last side which interacts with it.
+ * If "faction" : the object is locked to the last faction which interacts with it.
+ * If "player" : the object is locked to the last player which interacts with it. The lock is transmitted after respawn.
+ * If "unit" : the object is locked to the last player which interacts with it. The lock is lost when the unit dies.
+ *
+ * Note : for military objects (not civilian), the lock is initialized to the object's side.
+ *
+ * See also the config variable R3F_LOG_CFG_unlock_objects_timer.
+ *
+ * (FR)
+ * Défini le mode de verrouillage des fonctionnalités logistics pour un objet donné.
+ * Un objet peut être verrouillé pour une side, une faction, un joueur (respawn) ou une unité (vie).
+ * Si l'objet est verrouillé, le joueur peut le déverrouiller en fonction de la
+ * valeur de la variable de configiration R3F_LOG_CFG_unlock_objects_timer.
+ *
+ * Si "none" : pas de verrouillage, tout le monde peut utiliser les fonctionnalités logistiques.
+ * Si "side" : l'objet est verrouillé pour la dernière side ayant interagit avec lui.
+ * Si "faction" : l'objet est verrouillé pour la dernière faction ayant interagit avec lui.
+ * Si "player" : l'objet est verrouillé pour le dernier joueur ayant interagit avec lui. Le verrou est transmis après respawn.
+ * Si "unit" : l'objet est verrouillé pour le dernier joueur ayant interagit avec lui. Le verrou est perdu quand l'unité meurt.
+ *
+ * Note : pour les objets militaires (non civils), le verrou est initialisé à la side de l'objet.
+ *
+ * Voir aussi la variable de configiration R3F_LOG_CFG_unlock_objects_timer.
+ */
+R3F_LOG_CFG_lock_objects_mode = "none";
+
+/**
+ * COUNTDOWN TO UNLOCK AN OBJECT
+ *
+ * Define the countdown duration (in seconds) to unlock a locked object.
+ * Set to -1 to deny the unlock of objects.
+ * See also the config variable R3F_LOG_CFG_lock_objects_mode.
+ *
+ * Défini la durée (en secondes) du compte-à -rebours pour déverrouiller un objet.
+ * Mettre à -1 pour qu'on ne puisse pas déverrouiller les objets.
+ * Voir aussi la variable de configiration R3F_LOG_CFG_lock_objects_mode.
+ */
+R3F_LOG_CFG_unlock_objects_timer = 30;
+
+/**
+ * ALLOW NO GRAVITY OVER GROUND
+ *
+ * Define if movable objects with no gravity simulation can be set in height over the ground (no ground contact).
+ * The no gravity objects corresponds to most of decoration and constructions items.
+ *
+ * Défini si les objets déplaçable sans simulation de gravité peuvent être position en hauteur sans être contact avec le sol.
+ * Les objets sans gravité correspondent à la plupart des objets de décors et de construction.
+ */
+R3F_LOG_CFG_no_gravity_objects_can_be_set_in_height_over_ground = true;
+
+/**
+ * LANGUAGE
+ *
+ * Automatic language selection according to the game language.
+ * New languages can be easily added (read below).
+ *
+ * Sélection automatique de la langue en fonction de la langue du jeu.
+ * De nouveaux langages peuvent facilement être ajoutés (voir ci-dessous).
+ */
+R3F_LOG_CFG_language = switch (language) do
+{
+ case "English":{"en"};
+ case "French":{"fr"};
+
+ // Feel free to create you own language file named "XX_strings_lang.sqf", where "XX" is the language code.
+ // Make a copy of an existing language file (e.g. en_strings_lang.sqf) and translate it.
+ // Then add a line with this syntax : case "YOUR_GAME_LANGUAGE":{"LANGUAGE_CODE"};
+ // For example :
+
+ //case "Czech":{"cz"}; // Not supported. Need your own "cz_strings_lang.sqf"
+ //case "Polish":{"pl"}; // Not supported. Need your own "pl_strings_lang.sqf"
+ //case "Portuguese":{"pt"}; // Not supported. Need your own "pt_strings_lang.sqf"
+ //case "YOUR_GAME_LANGUAGE":{"LANGUAGE_CODE"}; // Need your own "LANGUAGE_CODE_strings_lang.sqf"
+
+ default {"en"}; // If language is not supported, use English
+};
+
+/**
+ * CONDITION TO ALLOW LOGISTICS
+ *
+ * (EN)
+ * This variable allow to set a dynamic SQF condition to allow/deny all logistics features only on specific clients.
+ * The variable must be a STRING delimited by quotes and containing a valid SQF condition to evaluate during the game.
+ * For example you can allow logistics only on few clients having a known game ID by setting the variable to :
+ * "getPlayerUID player in [""76xxxxxxxxxxxxxxx"", ""76yyyyyyyyyyyyyyy"", ""76zzzzzzzzzzzzzzz""]"
+ * Or based on the profile name : "profileName in [""john"", ""jack"", ""james""]"
+ * Or only for the server admin : "serverCommandAvailable "#kick"""
+ * The condition is evaluted in real time, so it can use condition depending on the mission progress : "alive officer && taskState task1 == ""Succeeded"""
+ * Or to deny logistics in a circular area defined by a marker : "player distance getMarkerPos ""markerName"" > getMarkerSize ""markerName"" select 0"
+ * Note that quotes of the strings inside the string condition must be doubled.
+ * Note : if the condition depends of the aimed objects/vehicle, you can use the command cursorTarget
+ * To allow the logistics to everyone, just set the condition to "true".
+ *
+ * (FR)
+ * Cette variable permet d'utiliser une condition SQF dynamique pour autoriser ou non les fonctions logistiques sur des clients spécifiques.
+ * La variable doit être une CHAINE de caractères délimitée par des guillemets et doit contenir une condition SQF valide qui sera évaluée durant la mission.
+ * Par exemple pour autoriser la logistique sur seulement quelques joueurs ayant un ID de jeu connu, la variable peut être défini comme suit :
+ * "getPlayerUID player in [""76xxxxxxxxxxxxxxx"", ""76yyyyyyyyyyyyyyy"", ""76zzzzzzzzzzzzzzz""]"
+ * Ou elle peut se baser sur le nom de profil : "profileName in [""maxime"", ""martin"", ""marc""]"
+ * Ou pour n'autoriser que l'admin de serveur : "serverCommandAvailable "#kick"""
+ * Les condition sont évaluées en temps réel, et peuvent donc dépendre du déroulement de la mission : "alive officier && taskState tache1 == ""Succeeded"""
+ * Ou pour interdire la logistique dans la zone défini par un marqueur circulaire : "player distance getMarkerPos ""markerName"" > getMarkerSize ""markerName"" select 0"
+ * Notez que les guillemets des chaînes de caractères dans la chaîne de condition doivent être doublés.
+ * Note : si la condition dépend de l'objet/véhicule pointé, vous pouvez utiliser la commande cursorTarget
+ * Pour autoriser la logistique chez tout le monde, il suffit de définir la condition à "true".
+ */
+R3F_LOG_CFG_string_condition_allow_logistics_on_this_client = "true";
+
+/**
+ * CONDITION TO ALLOW CREATION FACTORY
+ *
+ * (EN)
+ * This variable allow to set a dynamic SQF condition to allow/deny the access to the creation factory only on specific clients.
+ * The variable must be a STRING delimited by quotes and containing a valid SQF condition to evaluate during the game.
+ * For example you can allow the creation factory only on few clients having a known game ID by setting the variable to :
+ * "getPlayerUID player in [""76xxxxxxxxxxxxxxx"", ""76yyyyyyyyyyyyyyy"", ""76zzzzzzzzzzzzzzz""]"
+ * Or based on the profile name : "profileName in [""john"", ""jack"", ""james""]"
+ * Or only for the server admin : "serverCommandAvailable "#kick"""
+ * Note that quotes of the strings inside the string condition must be doubled.
+ * Note : if the condition depends of the aimed objects/véhicule, you can use the command cursorTarget
+ * Note also that the condition is evaluted in real time, so it can use condition depending on the mission progress :
+ * "alive officer && taskState task1 == ""Succeeded"""
+ * To allow the creation factory to everyone, just set the condition to "true".
+ *
+ * (FR)
+ * Cette variable permet d'utiliser une condition SQF dynamique pour rendre accessible ou non l'usine de création sur des clients spécifiques.
+ * La variable doit être une CHAINE de caractères délimitée par des guillemets et doit contenir une condition SQF valide qui sera évaluée durant la mission.
+ * Par exemple pour autoriser l'usine de création sur seulement quelques joueurs ayant un ID de jeu connu, la variable peut être défini comme suit :
+ * "getPlayerUID player in [""76xxxxxxxxxxxxxxx"", ""76yyyyyyyyyyyyyyy"", ""76zzzzzzzzzzzzzzz""]"
+ * Ou elle peut se baser sur le nom de profil : "profileName in [""maxime"", ""martin"", ""marc""]"
+ * Ou pour n'autoriser que l'admin de serveur : "serverCommandAvailable "#kick"""
+ * Notez que les guillemets des chaînes de caractères dans la chaîne de condition doivent être doublés.
+ * Note : si la condition dépend de l'objet/véhicule pointé, vous pouvez utiliser la commande cursorTarget
+ * Notez aussi que les condition sont évaluées en temps réel, et peuvent donc dépendre du déroulement de la mission :
+ * "alive officier && taskState tache1 == ""Succeeded"""
+ * Pour autoriser l'usine de création chez tout le monde, il suffit de définir la condition à "true".
+ */
+R3F_LOG_CFG_string_condition_allow_creation_factory_on_this_client = "false";
+
+/*
+ ********************************************************************************************
+ * BELOW IS THE CLASS NAMES CONFIGURATION / CI-DESSOUS LA CONFIGURATION DES NOMS DE CLASSES *
+ ********************************************************************************************
+ *
+ * (EN)
+ * There are two ways to manage new objects with the logistics system. The first one is to add these objects in the
+ * following appropriate lists. The second one is to create a new external file in the /addons_config/ directory,
+ * based on /addons_config/TEMPLATE.sqf, and to add a #include below to.
+ * The first method is better to add/fix only some various class names.
+ * The second method is better to take into account an additional addon.
+ *
+ * These variables are based on the inheritance principle according to the CfgVehicles tree.
+ * It means that a features accorded to a class name, is also accorded to all child classes.
+ * Inheritance tree view : http://madbull.arma.free.fr/A3_1.32_CfgVehicles_tree.html
+ *
+ * (FR)
+ * Deux moyens existent pour gérer de nouveaux objets avec le système logistique. Le premier consiste à ajouter
+ * ces objets dans les listes appropriées ci-dessous. Le deuxième est de créer un fichier externe dans le répertoire
+ * /addons_config/ basé sur /addons_config/TEMPLATE.sqf, et d'ajouter un #include ci-dessous.
+ * La première méthode est préférable lorsqu'il s'agit d'ajouter ou corriger quelques classes diverses.
+ * La deuxième méthode est préférable s'il s'agit de prendre en compte le contenu d'un addon supplémentaire.
+ *
+ * Ces variables sont basées sur le principe d'héritage utilisés dans l'arborescence du CfgVehicles.
+ * Cela signifie qu'une fonctionnalité accordée à une classe, le sera aussi pour toutes ses classes filles.
+ * Vue de l'arborescence d'héritage : http://madbull.arma.free.fr/A3_1.32_CfgVehicles_tree.html
+ */
+
+/****** LIST OF ADDONS CONFIG TO INCLUDE / LISTE DES CONFIG D'ADDONS A INCLURE ******/
+//#include "addons_config\A3_vanilla.sqf" // THIS IS INCLUDED IN EXILE.SQF
+//#include "addons_config\CUP.sqf" // REMOVE THIS LINE IF YOU DONT USE CUP VEHICLES
+#include "addons_config\Exile.sqf"
+//#include "addons_config\Super.sqf"
+//#include "addons_config\YOUR_ADDITIONAL_ADDON.sqf"
+
+/****** TOW WITH VEHICLE / REMORQUER AVEC VEHICULE ******/
+
+/**
+ * List of class names of ground vehicles which can tow objects.
+ * Liste des noms de classes des véhicules terrestres pouvant remorquer des objets.
+ */
+R3F_LOG_CFG_can_tow = R3F_LOG_CFG_can_tow +
+[
+
+];
+
+/**
+ * List of class names of objects which can be towed.
+ * Liste des noms de classes des objets remorquables.
+ */
+R3F_LOG_CFG_can_be_towed = R3F_LOG_CFG_can_be_towed +
+[
+
+];
+
+
+/****** LIFT WITH VEHICLE / HELIPORTER AVEC VEHICULE ******/
+
+/**
+ * List of class names of helicopters which can lift objects.
+ * Liste des noms de classes des hélicoptères pouvant héliporter des objets.
+ */
+R3F_LOG_CFG_can_lift = R3F_LOG_CFG_can_lift +
+[
+
+];
+
+/**
+ * List of class names of objects which can be lifted.
+ * Liste des noms de classes des objets héliportables.
+ */
+R3F_LOG_CFG_can_be_lifted = R3F_LOG_CFG_can_be_lifted +
+[
+
+];
+
+
+/****** LOAD IN VEHICLE / CHARGER DANS LE VEHICULE ******/
+
+/*
+* (EN)
+ * This section uses a numeric quantification of capacity and cost of the objets.
+ * For example, in a vehicle has a capacity of 100, we will be able to load in 5 objects costing 20 capacity units.
+ * The capacity doesn't represent a real volume or weight, but a choice made for gameplay.
+ *
+ * (FR)
+ * Cette section utilise une quantification numérique de la capacité et du coût des objets.
+ * Par exemple, dans un véhicule d'une capacité de 100, nous pouvons charger 5 objets coûtant 20 unités de capacité.
+ * La capacité ne représente ni un poids, ni un volume, mais un choix fait pour la jouabilité.
+ */
+
+/**
+ * List of class names of vehicles or cargo objects which can transport objects.
+ * The second element of the nested arrays is the load capacity (in relation with the capacity cost of the objects).
+ *
+ * Liste des noms de classes des véhicules ou "objets contenant" pouvant transporter des objets.
+ * Le deuxième élément des sous-tableaux est la capacité de chargement (en relation avec le coût de capacité des objets).
+ */
+R3F_LOG_CFG_can_transport_cargo = R3F_LOG_CFG_can_transport_cargo +
+[
+
+];
+
+/**
+ * List of class names of objects which can be loaded in transport vehicle/cargo.
+ * The second element of the nested arrays is the cost capacity (in relation with the capacity of the vehicles).
+ *
+ * Liste des noms de classes des objets transportables.
+ * Le deuxième élément des sous-tableaux est le coût de capacité (en relation avec la capacité des véhicules).
+ */
+R3F_LOG_CFG_can_be_transported_cargo = R3F_LOG_CFG_can_be_transported_cargo +
+[
+ // e.g. : ["MyTransportableObjectClassName1", itsCost], ["MyTransportableObjectClassName2", itsCost]
+ // Here Comes the Stuff what you want to load in the Vehicle example: ["IG_supplyCrate_F", 40]
+ ["Box_IND_AmmoVeh_F", 25],
+ ["CUP_BAF_BasicAmmunitionBox", 25],
+ ["Box_NATO_Uniforms_F", 5],
+ ["CargoNet_01_box_F", 25],
+ ["Exile_Container_SupplyBox", 25],
+ ["Box_NATO_AmmoVeh_F", 25],
+ ["B_supplyCrate_F", 25],
+ ["I_CargoNET_01_F", 25],
+ ["Box_NATO_Wps_F", 25],
+ ["C_supplyCrate_F", 25],
+ ["IG_supplyCrate_F", 25],
+ ["I_supplyCrate_F", 25],
+ ["Box_NATO_Ammo_F", 25]
+];
+
+/****** MOVABLE-BY-PLAYER OBJECTS / OBJETS DEPLACABLES PAR LE JOUEUR ******/
+
+/**
+ * List of class names of objects which can be carried and moved by a player.
+ * Liste des noms de classes des objets qui peuvent être portés et déplacés par le joueur.
+ */
+R3F_LOG_CFG_can_be_moved_by_player = R3F_LOG_CFG_can_be_moved_by_player +
+[
+ // Here Comes that stuff in what a player can Move
+ // e.g. : "MyMovableObjectClassName1", "MyMovableObjectClassName2"
+ "CargoNet_01_box_F",
+ "Exile_Container_SupplyBox",
+ "Box_NATO_AmmoVeh_F",
+ "B_supplyCrate_F",
+ "I_CargoNET_01_F",
+ "Box_NATO_Wps_F",
+ "C_supplyCrate_F",
+ "IG_supplyCrate_F",
+ "Box_IND_AmmoVeh_F",
+ "B_Slingload_01_Cargo_F",
+ "B_Slingload_01_Fuel_F",
+ "B_Slingload_01_Ammo_F",
+ "B_Slingload_01_Medevac_F",
+ "B_Slingload_01_Repair_F",
+ "Land_Pod_Heli_Transport_04_covered_F",
+ "Land_Pod_Heli_Transport_04_fuel_F",
+ "Land_Pod_Heli_Transport_04_box_F",
+ "Land_Pod_Heli_Transport_04_repair_F",
+ "Land_Pod_Heli_Transport_04_medevac_F",
+ "Land_Pod_Heli_Transport_04_bench_F",
+ "Land_Pod_Heli_Transport_04_covered_black_F",
+ "Land_Pod_Heli_Transport_04_fuel_black_F",
+ "Land_Pod_Heli_Transport_04_box_black_F",
+ "Land_Pod_Heli_Transport_04_repair_black_F",
+ "Land_Pod_Heli_Transport_04_medevac_black_F",
+ "Land_Pod_Heli_Transport_04_bench_black_F",
+ "Box_NATO_Ammo_F"
+
+];
diff --git a/mpmissions/Exile.Altis/R3F_LOG/config_creation_factory.sqf b/mpmissions/Exile.Altis/R3F_LOG/config_creation_factory.sqf
new file mode 100644
index 0000000..061474e
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/config_creation_factory.sqf
@@ -0,0 +1,248 @@
+/**
+ * CREATION FACTORY CONFIGURATION FILE
+ *
+ * English and French comments
+ * Commentaires anglais et français
+ *
+ * (EN)
+ * This file contains the predefined lists of available categories in the creation factory.
+ * The objects/vehicles categories are the same as in the mission editor.
+ * It corresponds to the tree CfgVehicleClasses in the config file.
+ * To add a category in one of the lists, you must write its class name. Use the BIS' "Config viewer".
+ *
+ * To understand the white or black list system, read also the needed parameters in USER_FUNCT\init_creation_factory.sqf
+ * There are three white list "FULL", "MEDIUM" and "LIGHT", and a black list.
+ * The black list is used if no white list is mentioned when calling USER_FUNCT\init_creation_factory.sqf.
+ *
+ * (FR)
+ * Ce fichier contient la liste des catégories disponibles dans l'usine de création.
+ * Les catégories d'objets/véhicules sont les mêmes que dans l'éditeur de mission.
+ * Cela correspond à l'arborescence CfgVehicleClasses dans le config file.
+ * Pour ajouter une catégorie dans une des listes, vous devez écrire son nom de classe. Utilisez le "Config viewer" de BIS.
+ *
+ * Pour comprendre le système de white/black list, consultez les paramètres requis par USER_FUNCT\init_creation_factory.sqf
+ * Il y a trois white list "FULL", "MEDIUM" and "LIGHT", et une black list.
+ * La black list est utilisée si aucune white list n'est mentionnée lors de l'appel de USER_FUNCT\init_creation_factory.sqf.
+ */
+
+/**
+ * SELL BACK REIMBURSEMENT RATE
+ *
+ * Rate of reimbursement from the buying price granted to the factory when the object is send back to it.
+ * Value of 0 means no credits back, 0.5 means half buying price, 1 means full buying price, and so on.
+ * Set to -1 to disable the possibility to give back objects to the creation factory.
+ * Note : the reimbursement amount take also into account of the damage level of the object.
+ *
+ * Taux de remboursement par rapport au prix d'achat accordé à l'usine lors de la restitution d'un objet.
+ * Une valeur de 0 signifie pas de crédits en retour, 0.5 donne 50% du prix d'achat, 1 correspond à 100% du prix d'achat.
+ * Mettre à -1 pour désactiver la possibilité de redonner les objets à l'usine de création.
+ * Note : le montant du remboursement prend aussi en compte l'état (dommage) de l'objet.
+ */
+R3F_LOG_CFG_CF_sell_back_bargain_rate = 0.75;
+
+/**
+ * LIGHT WHITE LIST
+ * Categories of objects/vehicles available in a "LIGHT" factory (see USER_FUNCT\init_creation_factory.sqf).
+ */
+R3F_LOG_CFG_CF_whitelist_light_categories =
+[
+ "Objects", // Objects (1 entries)
+ "Armory", // Armory (0 entries)
+ "Targets", // Targets (0 entries)
+ "Cargo", // Objects (Construction) (43 entries)
+ "Flag", // Objects (Flags) (35 entries)
+ "Lamps", // Objects (Lamps) (0 entries)
+ "Communication", // Objects (Communications) (0 entries)
+ "Furniture", // Objects (Furniture) (22 entries)
+ "Misc", // Objects (0 entries)
+ "Signs", // Objects (Signs) (50 entries)
+ "Small_items", // Objects (Small) (88 entries)
+ "Training", // Training (80 entries)
+ "Shelters", // Objects (Shelters) (0 entries)
+ "Fortifications", // Objects (Fortifications) (47 entries)
+ "Tents", // Objects (Camping) (46 entries)
+ "Market", // Objects (Market) (11 entries)
+ "Structures", // Structures (0 entries)
+ "Structures_Military", // Structures (Military) (12 entries)
+ "Structures_Walls", // Structures (Walls) (0 entries)
+ "Structures_Fences" // Structures (Fences) (1 entries)
+];
+
+/**
+ * MEDIUM WHITE LIST
+ * Categories of objects/vehicles available in a "MEDIUM" factory (see USER_FUNCT\init_creation_factory.sqf).
+ * It includes all the categories of the "LIGHT" list, and the listed categories below.
+ */
+R3F_LOG_CFG_CF_whitelist_medium_categories = R3F_LOG_CFG_CF_whitelist_light_categories +
+[
+ "Ammo", // Ammo (49 entries)
+ "Static", // Static (28 entries)
+ "Container", // Objects (Containers) (39 entries)
+ "Objects_Airport", // Objects (Airport) (20 entries)
+
+ // All in Arma
+ "StaticW", // Static (woodland) (4 entries)
+ "Static_ChDKZ", // Static (Insurgency) (0 entries)
+ "Static_USMC", // Static (USMC) (0 entries)
+ "Static_RU", // Static (RU) (0 entries)
+ "Static_CDF" // Static (CDF) (0 entries)
+];
+
+/**
+ * FULL WHITE LIST
+ * Categories of objects/vehicles available in a "FULL" factory (see USER_FUNCT\init_creation_factory.sqf).
+ * It includes all the categories of the "MEDIUM" list, and the listed categories below.
+ */
+R3F_LOG_CFG_CF_whitelist_full_categories = R3F_LOG_CFG_CF_whitelist_medium_categories +
+[
+ "Car", // Cars (42 entries)
+ "Armored", // Armored (16 entries)
+ "Air", // Air (19 entries)
+ "Support", // Supports (21 entries)
+ "Ship", // Ships (13 entries)
+ "Autonomous", // Autonomous (15 entries)
+ "Submarine", // Submarines (3 entries)
+ "Wreck", // Wrecks (24 entries)
+ "Wreck_sub", // Wrecks (Submerged) (5 entries)
+ "Military", // Objects (Military) (9 entries)
+ "Structures_Commercial", // Structures (Commercial) (1 entries)
+ "Structures_Infrastructure", // Structures (Infrastructure) (1 entries)
+ "Structures_Town", // Structures (Town) (4 entries)
+ "Structures_Cultural", // Structures (Cultural) (0 entries)
+ "Structures_Industrial", // Structures (Industrial) (0 entries)
+ "Structures_Transport", // Structures (Transport) (0 entries)
+ "Structures_Village", // Structures (Village) (0 entries)
+ "Structures_Slums", // Structures (Slums) (0 entries)
+ "Structures_Airport", // Structures (Airport) (0 entries)
+
+ // All in Arma
+ "Wrecks", // Wrecks (19 entries)
+ "Military_US_EP1", // Military (US) (12 entries)
+ "Military_TKA_EP1", // Military (TKA) (12 entries)
+ "Military_GUE_EP1", // Military (Guerillas) (12 entries)
+ "SupportWoodland_ACR", // Support (woodland) (4 entries)
+ "WarfareBuildingsClassname", // Warfare Buildings (79 entries)
+ "ArmouredD", // Armored (desert) (1 entries)
+ "ArmouredW", // Armored (woodland) (7 entries)
+ "CarD", // Cars (desert) (4 entries)
+ "CarW", // Cars (woodland) (10 entries)
+ "Military_With_side", // Military (36 entries)
+ "WarfareClassName", // Warfare (16 entries)
+ "Armored_CDF", // Armored (CDF) (0 entries)
+ "Armored_ChDKZ", // Armored (Insurgency) (0 entries)
+ "Armored_USMC", // Armored (USMC) (0 entries)
+ "Armored_RU", // Armored (RU) (0 entries)
+ "Car_USMC", // Cars (USMC) (0 entries)
+ "Car_RU", // Cars (RU) (0 entries)
+ "Car_ChDKZ", // Cars (Insurgency) (0 entries)
+ "Car_CDF", // Cars (CDF) (0 entries)
+ "Air_ChDKZ", // Air (Insurgency) (0 entries)
+ "Air_USMC", // Air (USMC) (0 entries)
+ "Air_RU", // Air (RU) (0 entries)
+ "Air_CDF", // Air (CDF) (0 entries)
+ "Ship_CDF", // Ship (CDF) (0 entries)
+ "Ship_ChDKZ", // Ship (Insurgency) (0 entries)
+ "Ship_USMC", // Ship (USMC) (0 entries)
+ "Ship_RU", // Ship (RU) (0 entries)
+ "support_ChDKZ", // Support (Insurgency) (0 entries)
+ "support_USMC", // Support (USMC) (0 entries)
+ "support_RU", // Support (RU) (0 entries)
+ "support_CDF", // Support (CDF) (0 entries)
+ "Structures_E", // Structures EP1 (0 entries)
+ "Ruins" // Ruins (0 entries)
+];
+
+/**
+ * BLACK LIST
+ * Categories of objects/vehicles to deny if no white list is set to the factory (see USER_FUNCT\init_creation_factory.sqf).
+ */
+R3F_LOG_CFG_CF_blacklist_categories =
+[
+ "Submerged", // Objects (Sea) (2 entries)
+ "Camera", // Cameras (0 entries)
+ "Sounds", // Sounds (9 entries)
+ "Mines", // Mines (15 entries)
+ "Backpacks", // Backpacks (157 entries)
+ "Uniforms", // Uniforms (0 entries)
+ "Anomalies", // Anomalies (0 entries)
+ "Test", // TEST (0 entries)
+ "Locations", // Locations (0 entries)
+ "Modules", // Modules (128 entries)
+ "Emitters", // Emitters (0 entries)
+ "WeaponsPrimary", // Weapons (Primary) (30 entries)
+ "WeaponsSecondary", // Weapons (Launchers) (10 entries)
+ "WeaponsHandguns", // Weapons (Sidearms) (6 entries)
+ "WeaponAccessories", // Weapon Accessories (26 entries)
+ "Magazines", // Magazines (0 entries)
+ "Items", // Items (18 entries)
+ "ItemsHeadgear", // Items (Headgear) (110 entries)
+ "ItemsVests", // Items (Vests) (39 entries)
+ "ItemsUniforms", // Items (Uniforms) (53 entries)
+ "Intel", // Intel (3 entries)
+ "Virtual", // Virtual Entities (0 entries)
+ "Garbage", // Objects (Garbage) (15 entries)
+ "Helpers", // Objects (Helpers) (34 entries)
+ "Dead_bodies", // Objects (Dead bodies) (12 entries)
+ "SystemLocations", // Locations (11 entries)
+ "SystemSides", // Sides (3 entries)
+ "SystemMisc", // Misc (3 entries)
+ "Objects_VR", // Objects (Virtual Reality) (1 entries)
+ "Objects_Sports", // Objects (Sports) (24 entries)
+ "Structures_VR", // Structures (Virtual Reality) (10 entries)
+ "Structures_Sports", // Structures (Sports) (11 entries)
+ "Explosives", // Explosives (0 entries)
+ "Respawn", // Respawn (5 entries)
+
+ // All in Arma
+ "IEDs", // IEDs (4 entries)
+ "LocationLogics", // Locations (14 entries)
+ "Test_EP1" // Test EP1 (0 entries)
+];
+
+/**
+ * CREATION COST FACTOR
+ *
+ * Multiplication factor to fix the CfgVehicles' "cost" property values of vehicles/objects.
+ * It permits to have a better homogeneity between values.
+ * For example a SDV (Submarine) has a cost (divided by 100) of 100 and a Hunter (Car) of 5000.
+ * By fixing the values with factors, the SDV (Submarine) costs 100x4000 = 400.000 and the Hunter (Car) 5000x12 = 60.000.
+ * The format of the array is ["categorie class name", multiplication factor].
+ * All non-listed categories have a factor of 1x.
+ *
+ * Facteur de multiplication pour corriger la propriété "cost" des objets/véhicules dans le CfgVehicles.
+ * Par exemple, un sous-marins SDV (Submarine) a un coût (divisé par 100) de 100 et un Hunter (Car) du 5000.
+ * En appliquant un facteur de correction, le SDV (Submarine) vaut 100x4000 = 400 000 et le Hunter (Car) 5000x12 = 60 000.
+ * Le format du tableau est ["nom de classe de la catégorie", facteur de multiplication]
+ * Les catégories non listées ont un facteur de 1x.
+ */
+R3F_LOG_CFG_CF_creation_cost_factor =
+[
+ ["Car", 12],
+ ["Armored", 15],
+ ["Air", 15],
+ ["Support", 100],
+ ["Ammo", 5000],
+ ["Ship", 8],
+ ["Static", 3],
+ ["Autonomous", 10],
+ ["Submarine", 1500],
+ ["Wreck", 100],
+ ["Wreck_sub", 100],
+ ["Cargo", 10],
+ ["Container", 5],
+ ["Objects_Airport", 50],
+
+ // All in Arma
+ ["StaticW", 3],
+ ["Military_US_EP1", 8000],
+ ["Military_TKA_EP1", 8000],
+ ["Military_GUE_EP1", 8000],
+ ["SupportWoodland_ACR", 70],
+ ["WarfareBuildingsClassname", 100],
+ ["ArmouredD", 5],
+ ["ArmouredW", 20],
+ ["CarD", 60],
+ ["CarW", 60],
+ ["Military_With_side", 1000],
+ ["WarfareClassName", 50]
+];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/desc_include.h b/mpmissions/Exile.Altis/R3F_LOG/desc_include.h
new file mode 100644
index 0000000..0cc9d58
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/desc_include.h
@@ -0,0 +1,6 @@
+#include "R3F_LOG_ENABLE.h"
+
+#ifdef R3F_LOG_enable
+#include "transporteur\dlg_contenu_vehicule.h"
+#include "usine_creation\dlg_liste_objets.h"
+#endif
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/en_strings_lang.sqf b/mpmissions/Exile.Altis/R3F_LOG/en_strings_lang.sqf
new file mode 100644
index 0000000..2abe519
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/en_strings_lang.sqf
@@ -0,0 +1,93 @@
+/*
+ * TRANSLATION FILE (ENGLIGH)
+ *
+ * Alternative to stringtable.csv which is simpler to install for the mission maker.
+ * The token ""%1"" represents a dynamic value generated by the scripts, like a vehicle name.
+ *
+ * Alternative au stringtable.csv qui est plus simple à installer pour le créateur de mission.
+ * Le mot-clé ""%1"" représente une valeur dynamique fournie par les scripts, comme par exemple un nom de véhicule.
+ */
+
+STR_R3F_LOG_action_heliporter = "Lift the object";
+STR_R3F_LOG_action_heliporter_fait = "Object ""%1"" attached.";
+STR_R3F_LOG_action_heliport_larguer = "Drop the object";
+STR_R3F_LOG_action_heliport_larguer_fait = "Object ""%1"" dropped.";
+STR_R3F_LOG_action_heliport_attente = "Hooking... (%1)";
+STR_R3F_LOG_action_heliport_echec_attente = "Lift aborted ! Stay hover during the hooking.";
+
+STR_R3F_LOG_action_deplacer_objet = "Take ""%1""";
+STR_R3F_LOG_action_relacher_objet = "Release ""%1""";
+STR_R3F_LOG_action_aligner_pente = "Adjust to the slope";
+STR_R3F_LOG_action_aligner_sol = "Adjust to the ground";
+STR_R3F_LOG_action_aligner_horizon = "Adjust horizontally";
+STR_R3F_LOG_action_tourner = "Turn left/right (X / C keys)";
+STR_R3F_LOG_action_rapprocher = "Closer/further (F / R keys)";
+STR_R3F_LOG_ne_pas_monter_dans_vehicule = "You can't get in a vehicle while you're carrying this object !";
+
+STR_R3F_LOG_action_charger_deplace = "Load in the vehicle";
+STR_R3F_LOG_action_selectionner_objet_charge = "Load ""%1"" in...";
+STR_R3F_LOG_action_charger_selection = "... load in ""%1""";
+STR_R3F_LOG_action_selectionner_objet_fait = "Now select the destination for ""%1""...";
+STR_R3F_LOG_action_charger_en_cours = "Loading in progress...";
+STR_R3F_LOG_action_charger_fait = "The object ""%1"" has been loaded in ""%2"".";
+STR_R3F_LOG_action_charger_pas_assez_de_place = "There is not enough space for this object in this vehicle !";
+
+STR_R3F_LOG_action_remorquer_direct = "Tow ""%1""";
+STR_R3F_LOG_action_remorquer_deplace = "Tow the object";
+STR_R3F_LOG_action_detacher = "Untow the object";
+STR_R3F_LOG_action_detacher_fait = "Object untowed.";
+STR_R3F_LOG_action_detacher_impossible_pour_ce_vehicule = "Only the pilot can detach this object.";
+
+STR_R3F_LOG_action_contenu_vehicule = "View the vehicle's content";
+STR_R3F_LOG_action_decharger_en_cours = "Unloading in progress...";
+STR_R3F_LOG_action_decharger_fait = "The object ""%1"" has been unloaded from the vehicle.";
+STR_R3F_LOG_action_decharger_deja_fait = "The object has already been unloaded !";
+STR_R3F_LOG_action_decharger_deplacable_exceptionnel = "Once released, this object will no more be movable manually.
Do you confirm the action ?";
+
+STR_R3F_LOG_action_ouvrir_usine = "Open the creation factory";
+STR_R3F_LOG_action_creer_en_cours = "Creation in progress...";
+STR_R3F_LOG_action_creer_fait = "The object ""%1"" has been created.";
+STR_R3F_LOG_action_creer_pas_assez_credits = "The factory has not enough credits to create this object.";
+STR_R3F_LOG_action_revendre_usine_direct = "Send back ""%1"" to the factory";
+STR_R3F_LOG_action_revendre_usine_deplace = "Send back to the factory";
+STR_R3F_LOG_action_revendre_usine_selection = "... send back to the factory";
+STR_R3F_LOG_action_revendre_en_cours = "Sending back to the factory...";
+STR_R3F_LOG_action_revendre_fait = "The object ""%1"" has been sent back to the factory.";
+STR_R3F_LOG_action_revendre_decharger_avant = "You can't sent it back while its cargo content is not empty !";
+
+STR_R3F_LOG_mutex_action_en_cours = "The current operation isn't finished !";
+STR_R3F_LOG_joueur_dans_objet = "There is a player in the object ""%1"" !";
+STR_R3F_LOG_objet_en_cours_transport = "The object ""%1"" is already in transit !";
+STR_R3F_LOG_objet_remorque_en_cours = "Impossible because the object ""%1"" is towing another object !";
+STR_R3F_LOG_trop_loin = "Impossible because the object ""%1"" is too far !";
+
+STR_R3F_LOG_dlg_CV_titre = "Vehicle's content";
+STR_R3F_LOG_dlg_CV_capacite_vehicule = "Loading : %1/%2";
+STR_R3F_LOG_dlg_CV_btn_decharger = "UNLOAD";
+STR_R3F_LOG_dlg_CV_btn_fermer = "CANCEL";
+
+STR_R3F_LOG_dlg_LO_titre = "Creation factory";
+STR_R3F_LOG_dlg_LO_credits_restants = "Remaining credits : %1";
+STR_R3F_LOG_dlg_LO_btn_creer = "CREATE";
+STR_R3F_LOG_dlg_LO_btn_fermer = "CANCEL";
+
+STR_R3F_LOG_nom_fonctionnalite_proprietes = "Properties";
+STR_R3F_LOG_nom_fonctionnalite_side = "Side";
+STR_R3F_LOG_nom_fonctionnalite_places = "Seating";
+STR_R3F_LOG_nom_fonctionnalite_passif = "It can be :";
+STR_R3F_LOG_nom_fonctionnalite_passif_deplace = "Moved by player";
+STR_R3F_LOG_nom_fonctionnalite_passif_heliporte = "Lifted";
+STR_R3F_LOG_nom_fonctionnalite_passif_remorque = "Towed";
+STR_R3F_LOG_nom_fonctionnalite_passif_transporte = "Transported";
+STR_R3F_LOG_nom_fonctionnalite_passif_transporte_capacite = "load cost %1";
+STR_R3F_LOG_nom_fonctionnalite_actif = "It can :";
+STR_R3F_LOG_nom_fonctionnalite_actif_heliporte = "Lift";
+STR_R3F_LOG_nom_fonctionnalite_actif_remorque = "Tow";
+STR_R3F_LOG_nom_fonctionnalite_actif_transporte = "Transport";
+STR_R3F_LOG_nom_fonctionnalite_actif_transporte_capacite = "max load %1";
+
+STR_R3F_LOG_deverrouillage_en_cours = "Unlocking... (%1)";
+STR_R3F_LOG_deverrouillage_echec_attente = "Unlock canceled ! Hold the aiming of the object during the countdown.";
+STR_R3F_LOG_deverrouillage_succes_attente = "Object unlocked.";
+STR_R3F_LOG_action_deverrouiller = "Unlock ""%1""";
+STR_R3F_LOG_action_deverrouiller_impossible = "Object locked";
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/determiner_fonctionnalites_logistique.sqf b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/determiner_fonctionnalites_logistique.sqf
new file mode 100644
index 0000000..7866806
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/determiner_fonctionnalites_logistique.sqf
@@ -0,0 +1,112 @@
+/**
+ * Détermine les fonctionnalités logistique disponibles pour une classe donnée
+ *
+ * @param 0 le nom de classe pour lequel déterminer les fonctionnalités logistique
+ *
+ * @return 0 true si can_be_depl_heli_remorq_transp
+ * @return 1 true si can_be_moved_by_player
+ * @return 2 true si can_be_lifted
+ * @return 3 true si can_be_towed
+ * @return 4 true si can_be_transported_cargo
+ * @return 5 true si can_lift
+ * @return 6 true si can_tow
+ * @return 7 true si can_transport_cargo
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_classe", "_tab_classe_heritage", "_config", "_idx"];
+private ["_can_be_depl_heli_remorq_transp", "_can_lift", "_can_tow", "_can_transport_cargo", "_can_transport_cargo_cout"];
+private ["_can_be_moved_by_player", "_can_be_lifted", "_can_be_towed", "_can_be_transported_cargo", "_can_be_transported_cargo_cout"];
+
+_classe = _this select 0;
+
+// Calcul de l'arborescence d'héritage
+_tab_classe_heritage = [];
+for [
+ {_config = configFile >> "CfgVehicles" >> _classe},
+ {isClass _config},
+ {_config = inheritsFrom _config}
+] do
+{
+ _tab_classe_heritage pushBack (toLower configName _config);
+};
+
+// Calcul des fonctionnalités
+
+_can_be_depl_heli_remorq_transp = false;
+{
+ if (_x in R3F_LOG_objets_depl_heli_remorq_transp) exitWith {_can_be_depl_heli_remorq_transp = true;};
+} forEach _tab_classe_heritage;
+
+_can_be_moved_by_player = false;
+_can_be_lifted = false;
+_can_be_towed = false;
+_can_be_transported_cargo = false;
+_can_be_transported_cargo_cout = 0;
+
+if (_can_be_depl_heli_remorq_transp) then
+{
+ {
+ if (_x in R3F_LOG_CFG_can_be_moved_by_player) exitWith {_can_be_moved_by_player = true;};
+ } forEach _tab_classe_heritage;
+
+ {
+ if (_x in R3F_LOG_CFG_can_be_lifted) exitWith {_can_be_lifted = true;};
+ } forEach _tab_classe_heritage;
+
+ {
+ if (_x in R3F_LOG_CFG_can_be_towed) exitWith {_can_be_towed = true;};
+ } forEach _tab_classe_heritage;
+
+ {
+ _idx = R3F_LOG_classes_objets_transportables find _x;
+ if (_idx != -1) exitWith
+ {
+ _can_be_transported_cargo = true;
+ _can_be_transported_cargo_cout = R3F_LOG_CFG_can_be_transported_cargo select _idx select 1;
+ };
+ } forEach _tab_classe_heritage;
+};
+
+_can_lift = false;
+{
+ if (_x in R3F_LOG_CFG_can_lift) exitWith {_can_lift = true;};
+} forEach _tab_classe_heritage;
+
+_can_tow = false;
+{
+ if (_x in R3F_LOG_CFG_can_tow) exitWith {_can_tow = true;};
+} forEach _tab_classe_heritage;
+
+_can_transport_cargo = false;
+_can_transport_cargo_cout = 0;
+{
+ _idx = R3F_LOG_classes_transporteurs find _x;
+ if (_idx != -1) exitWith
+ {
+ _can_transport_cargo = true;
+ _can_transport_cargo_cout = R3F_LOG_CFG_can_transport_cargo select _idx select 1;
+ };
+} forEach _tab_classe_heritage;
+
+// Cargo de capacité nulle
+if (_can_transport_cargo_cout <= 0) then {_can_transport_cargo = false;};
+
+// Retour des fonctionnalités
+[
+ _can_be_depl_heli_remorq_transp,
+ _can_be_moved_by_player,
+ _can_lift,
+ _can_be_lifted,
+ _can_tow,
+ _can_be_towed,
+ _can_transport_cargo,
+ _can_transport_cargo_cout,
+ _can_be_transported_cargo,
+ _can_be_transported_cargo_cout
+]
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/formater_fonctionnalites_logistique.sqf b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/formater_fonctionnalites_logistique.sqf
new file mode 100644
index 0000000..cc918f6
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/formater_fonctionnalites_logistique.sqf
@@ -0,0 +1,63 @@
+/**
+ * Affiche dans la zone "hint" les fonctionnalités logistique disponibles pour une classe donnée
+ *
+ * @param 0 le nom de classe pour lequel consulter les fonctionnalités logistique
+ * @return structuredText des fonctionnalités logistique
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_classe", "_fonctionnalites", "_side", "_places", "_infos", "_j", "_tab_inheritance_tree"];
+
+_classe = _this select 0;
+
+if !(isClass (configFile >> "CfgVehicles" >> _classe)) exitWith {};
+
+_fonctionnalites = [_classe] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique;
+
+_side = switch (getNumber (configFile >> "CfgVehicles" >> _classe >> "side")) do
+{
+ case 0: {"EAST"};
+ case 1: {"WEST"};
+ case 2: {"GUER"};
+ case 3: {"CIV"};
+ default {"NONE"};
+};
+
+_places = 0;
+if (!isNil "R3F_LOG_VIS_objet" && {!isNull R3F_LOG_VIS_objet && {typeOf R3F_LOG_VIS_objet == _classe}}) then
+{
+ {
+ _places = _places + (R3F_LOG_VIS_objet emptyPositions _x);
+ } forEach ["Commander", "Driver", "Gunner", "Cargo"];
+};
+
+_infos = "";
+_infos = _infos + format ["%1 : %2
", STR_R3F_LOG_nom_fonctionnalite_side, _side];
+if (_places != 0) then {_infos = _infos + format ["%1 : %2
", STR_R3F_LOG_nom_fonctionnalite_places, _places]} else {_infos = _infos + "
";};
+_infos = _infos + "
";
+_infos = _infos + format ["%1
", STR_R3F_LOG_nom_fonctionnalite_passif];
+_infos = _infos + format ["- %1
", STR_R3F_LOG_nom_fonctionnalite_passif_deplace, if (_fonctionnalites select R3F_LOG_IDX_can_be_moved_by_player) then {"#00eeff"} else {"#777777"}];
+_infos = _infos + format ["- %1
", STR_R3F_LOG_nom_fonctionnalite_passif_heliporte, if (_fonctionnalites select R3F_LOG_IDX_can_be_lifted) then {"#00ee00"} else {"#777777"}];
+_infos = _infos + format ["- %1
", STR_R3F_LOG_nom_fonctionnalite_passif_remorque, if (_fonctionnalites select R3F_LOG_IDX_can_be_towed) then {"#00ee00"} else {"#777777"}];
+_infos = _infos + format ["- %1%3
",
+ STR_R3F_LOG_nom_fonctionnalite_passif_transporte,
+ if (_fonctionnalites select R3F_LOG_IDX_can_be_transported_cargo) then {"#f5f500"} else {"#777777"},
+ if (_fonctionnalites select R3F_LOG_IDX_can_be_transported_cargo) then {format [" (" + STR_R3F_LOG_nom_fonctionnalite_passif_transporte_capacite + ")", _fonctionnalites select R3F_LOG_IDX_can_be_transported_cargo_cout]} else {""}
+];
+_infos = _infos + "
";
+_infos = _infos + format ["%1
", STR_R3F_LOG_nom_fonctionnalite_actif];
+_infos = _infos + format ["- %1
", STR_R3F_LOG_nom_fonctionnalite_actif_heliporte, if (_fonctionnalites select R3F_LOG_IDX_can_lift) then {"#00ee00"} else {"#777777"}];
+_infos = _infos + format ["- %1
", STR_R3F_LOG_nom_fonctionnalite_actif_remorque, if (_fonctionnalites select R3F_LOG_IDX_can_tow) then {"#00ee00"} else {"#777777"}];
+_infos = _infos + format ["- %1%3
",
+ STR_R3F_LOG_nom_fonctionnalite_actif_transporte,
+ if (_fonctionnalites select R3F_LOG_IDX_can_transport_cargo) then {"#f5f500"} else {"#777777"},
+ if (_fonctionnalites select R3F_LOG_IDX_can_transport_cargo) then {format [" (" + STR_R3F_LOG_nom_fonctionnalite_actif_transporte_capacite + ")", _fonctionnalites select R3F_LOG_IDX_can_transport_cargo_cout]} else {""}
+];
+_infos = _infos + "";
+
+parseText _infos
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/formater_nombre_entier_milliers.sqf b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/formater_nombre_entier_milliers.sqf
new file mode 100644
index 0000000..33ef17a
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/formater_nombre_entier_milliers.sqf
@@ -0,0 +1,46 @@
+/**
+ * Formate un nombre entier avec des séparateurs de milliers
+ *
+ * @param 0 le nombre à formater
+ * @return chaîne de caractère représentant le nombre formaté
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_nombre", "_centaines", "_str_signe", "_str_nombre", "_str_centaines"];
+
+_nombre = _this select 0;
+
+_str_signe = if (_nombre < 0) then {"-"} else {""};
+_nombre = floor abs _nombre;
+
+_str_nombre = "";
+while {_nombre >= 1000} do
+{
+ _centaines = _nombre - (1000 * floor (0.001 * _nombre));
+ _nombre = floor (0.001 * _nombre);
+
+ if (_centaines < 100) then
+ {
+ if (_centaines < 10) then
+ {
+ _str_centaines = "00" + str _centaines;
+ }
+ else
+ {
+ _str_centaines = "0" + str _centaines;
+ };
+ }
+ else
+ {
+ _str_centaines = str _centaines;
+ };
+
+ _str_nombre = "." + _str_centaines + _str_nombre;
+};
+
+_str_signe + str _nombre + _str_nombre
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/lib_geometrie_3d.sqf b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/lib_geometrie_3d.sqf
new file mode 100644
index 0000000..000b2b0
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/lib_geometrie_3d.sqf
@@ -0,0 +1,1097 @@
+/**
+ * Bibliothèque de fonctions de calculs dans un espace 3D (calculs d'intersection, rotations, etc.).
+ *
+ * Fournit une série de fonctions de calculs d'intersection (bounding sphere, bounding box, rayon-bbox)
+ * Fournit des fonctions de génération de matrices 3x3 de rotations yaw, pitch, roll
+ * Fournit des fonctions de multiplications vec3 x mat3x3 et mat3x3 x mat3x3
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * Liste des fonctions :
+ * ---------------------
+ * // Calculs d'intersection rayon/bounding box/sphere/mesh
+ * R3F_LOG_FNCT_3D_ray_intersect_bbox
+ * R3F_LOG_FNCT_3D_ray_intersect_bbox_obj
+ * R3F_LOG_FNCT_3D_cam_intersect_bbox_obj
+ *
+ * R3F_LOG_FNCT_3D_pos_est_dans_bbox
+ * R3F_LOG_FNCT_3D_distance_min_pos_bbox
+ *
+ * R3F_LOG_FNCT_3D_bounding_sphere_intersect_bounding_sphere
+ * R3F_LOG_FNCT_3D_intersect_bounding_sphere_objs
+ * R3F_LOG_FNCT_3D_bounding_sphere_intersect_bounding_box
+ * R3F_LOG_FNCT_3D_bbox_intersect_bbox
+ * R3F_LOG_FNCT_3D_bbox_intersect_bbox_objs
+ * R3F_LOG_FNCT_3D_mesh_collision_objs
+ *
+ * // Recherche de position
+ * R3F_LOG_FNCT_3D_tirer_position_degagee_ciel
+ * R3F_LOG_FNCT_3D_tirer_position_degagee_sol
+ *
+ * // Utilitaires
+ * R3F_LOG_FNCT_3D_cursorTarget_distance_bbox
+ * R3F_LOG_FNCT_3D_cursorTarget_virtuel
+ * R3F_LOG_FNCT_3D_get_huit_coins_bounding_box_model
+ * R3F_LOG_FNCT_3D_get_huit_coins_bounding_box_world
+ * R3F_LOG_FNCT_3D_get_objets_genants_rayon
+ * R3F_LOG_FNCT_3D_get_bounding_box_depuis_classname
+ * R3F_LOG_FNCT_3D_get_hauteur_terrain_min_max_objet
+ *
+ * // Transformation 3D
+ * R3F_LOG_FNCT_3D_mult_mat3x3
+ * R3F_LOG_FNCT_3D_mult_vec_mat3x3
+ * R3F_LOG_FNCT_3D_mat_rot_roll
+ * R3F_LOG_FNCT_3D_mat_rot_pitch
+ * R3F_LOG_FNCT_3D_mat_rot_yaw
+ *
+ * // Visualisation
+ * R3F_LOG_FNCT_3D_tracer_bbox
+ * R3F_LOG_FNCT_3D_tracer_bbox_obj
+ */
+
+/**
+ * Calcule l'intersection d'un rayon avec une bounding box
+ * @param 0 position du rayon (dans le repère de la bbox)
+ * @param 1 direction du rayon (dans le repère de la bbox)
+ * @param 2 position min de la bounding box
+ * @param 3 position max de la bounding box
+ * @return la distance entre la position du rayon et la bounding box; 1E39 (infini) si pas d'intersection
+ * @note le rayon doit être défini dans le repère de la bbox (worldToModel)
+ */
+R3F_LOG_FNCT_3D_ray_intersect_bbox =
+{
+ private ["_ray_pos", "_ray_dir", "_bbox_min", "_bbox_max", "_inv_ray_x", "_inv_ray_y", "_inv_ray_z"];
+ private ["_tmin", "_tmax", "_tymin", "_tymax", "_tzmin", "_tzmax"];
+
+ _ray_pos = _this select 0;
+ _ray_dir = _this select 1;
+ _bbox_min = _this select 2;
+ _bbox_max = _this select 3;
+
+ // Optimisation (1 div + 2 mul au lieu de 2 div) et gestion de la division par zéro
+ _inv_ray_x = if (_ray_dir select 0 != 0) then {1 / (_ray_dir select 0)} else {1E39};
+ _inv_ray_y = if (_ray_dir select 1 != 0) then {1 / (_ray_dir select 1)} else {1E39};
+ _inv_ray_z = if (_ray_dir select 2 != 0) then {1 / (_ray_dir select 2)} else {1E39};
+
+ /* Pour chaque axe, on calcule la distance d'intersection du rayon avec les deux plans de la bounding box */
+
+ if (_inv_ray_x < 0) then
+ {
+ _tmax = ((_bbox_min select 0) - (_ray_pos select 0)) * _inv_ray_x;
+ _tmin = ((_bbox_max select 0) - (_ray_pos select 0)) * _inv_ray_x;
+ }
+ else
+ {
+ _tmin = ((_bbox_min select 0) - (_ray_pos select 0)) * _inv_ray_x;
+ _tmax = ((_bbox_max select 0) - (_ray_pos select 0)) * _inv_ray_x;
+ };
+
+ if (_inv_ray_y < 0) then
+ {
+ _tymax = ((_bbox_min select 1) - (_ray_pos select 1)) * _inv_ray_y;
+ _tymin = ((_bbox_max select 1) - (_ray_pos select 1)) * _inv_ray_y;
+ }
+ else
+ {
+ _tymin = ((_bbox_min select 1) - (_ray_pos select 1)) * _inv_ray_y;
+ _tymax = ((_bbox_max select 1) - (_ray_pos select 1)) * _inv_ray_y;
+ };
+
+ if ((_tmin > _tymax) || (_tymin > _tmax)) exitWith {1E39};
+
+ _tmin = _tmin max _tymin;
+ _tmax = _tmax min _tymax;
+
+ if (_inv_ray_z < 0) then
+ {
+ _tzmax = ((_bbox_min select 2) - (_ray_pos select 2)) * _inv_ray_z;
+ _tzmin = ((_bbox_max select 2) - (_ray_pos select 2)) * _inv_ray_z;
+ }
+ else
+ {
+ _tzmin = ((_bbox_min select 2) - (_ray_pos select 2)) * _inv_ray_z;
+ _tzmax = ((_bbox_max select 2) - (_ray_pos select 2)) * _inv_ray_z;
+ };
+
+ if ((_tmin > _tzmax) || (_tzmin > _tmax)) exitWith {1E39};
+
+ _tmin = _tmin max _tzmin;
+ _tmax = _tmax min _tzmax;
+
+ if (_tmax < 0) exitWith {1E39};
+
+ _tmin
+};
+
+/**
+ * Calcule l'intersection d'un rayon avec un objet
+ * @param 0 position du rayon (dans le repère worldATL)
+ * @param 1 direction du rayon (dans le repère world)
+ * @param 2 l'objet pour lequel calculer l'intersection de bounding box
+ * @return la distance entre la position du rayon et la bounding box; 1E39 (infini) si pas d'intersection
+ */
+R3F_LOG_FNCT_3D_ray_intersect_bbox_obj =
+{
+ private ["_ray_pos", "_ray_dir", "_objet"];
+
+ _ray_pos = _this select 0;
+ _ray_dir = _this select 1;
+ _objet = _this select 2;
+
+ [
+ _objet worldToModel _ray_pos,
+ // (_objet worldToModel _ray_dir) vectorDiff (_objet worldToModel [0,0,0]), Manque de précision numérique, d'où l'expression ci-dessous
+ (_objet worldToModel ASLtoATL (_ray_dir vectorAdd getPosASL _objet)) vectorDiff (_objet worldToModel ASLtoATL (getPosASL _objet)),
+ boundingBoxReal _objet select 0,
+ boundingBoxReal _objet select 1
+ ] call R3F_LOG_FNCT_3D_ray_intersect_bbox
+};
+
+/**
+ * Calcule l'intersection du centre de la caméra avec la bounding box d'un objet
+ * @param 0 l'objet pour lequel on souhaite calculer l'intersection de bounding box
+ * @return la distance entre la caméra du joueur et la bounding box; 1E39 (infini) si pas d'intersection
+ */
+R3F_LOG_FNCT_3D_cam_intersect_bbox_obj =
+{
+ private ["_objet", "_pos_cam", "_pos_devant", "_dir_cam"];
+
+ _objet = _this select 0;
+
+ if (isNull _objet) exitWith {1E39};
+
+ _pos_cam = positionCameraToWorld [0, 0, 0];
+ _pos_devant = positionCameraToWorld [0, 0, 1];
+ _dir_cam = (ATLtoASL _pos_devant) vectorDiff (ATLtoASL _pos_cam);
+
+ [_pos_cam, _dir_cam, _objet] call R3F_LOG_FNCT_3D_ray_intersect_bbox_obj
+};
+
+/**
+ * Indique si une position se trouve à l'intérieur d'une bounding box
+ * @param 0 position à tester (dans le repère de la bbox)
+ * @param 1 position min de la bounding box
+ * @param 2 position max de la bounding box
+ * @return true si la position se trouve à l'intérieur de la bounding box, false sinon
+ * @note la position doit être défini dans le repère de la bbox (worldToModel)
+ */
+R3F_LOG_FNCT_3D_pos_est_dans_bbox =
+{
+ private ["_pos", "_bbox_min", "_bbox_max"];
+
+ _pos = _this select 0;
+ _bbox_min = _this select 1;
+ _bbox_max = _this select 2;
+
+ (_bbox_min select 0 <= _pos select 0) && (_pos select 0 <= _bbox_max select 0) &&
+ (_bbox_min select 1 <= _pos select 1) && (_pos select 1 <= _bbox_max select 1) &&
+ (_bbox_min select 2 <= _pos select 2) && (_pos select 2 <= _bbox_max select 2)
+};
+
+/**
+ * Calcule la distance minimale entre une position et une bounding box
+ * @param 0 la position pour laquelle calculer la distance avec la bbox (dans le repère de la bbox)
+ * @param 1 position min de la bounding box
+ * @param 2 position max de la bounding box
+ * @return distance du segment le plus court reliant la position à la bounding box
+ */
+R3F_LOG_FNCT_3D_distance_min_pos_bbox =
+{
+ private ["_pos", "_bbox_min", "_bbox_max", "_pos_intersect_min_bbox"];
+
+ _pos = _this select 0;
+ _bbox_min = _this select 1;
+ _bbox_max = _this select 2;
+
+ _pos_intersect_min_bbox =
+ [
+ (_bbox_min select 0) max (_pos select 0) min (_bbox_max select 0),
+ (_bbox_min select 1) max (_pos select 1) min (_bbox_max select 1),
+ (_bbox_min select 2) max (_pos select 2) min (_bbox_max select 2)
+ ];
+
+ _pos_intersect_min_bbox distance _pos
+};
+
+/**
+ * Indique s'il y a intersection entre deux bounding sphere
+ * @param 0 position centrale de la première bounding sphere
+ * @param 1 rayon de la première bounding sphere
+ * @param 2 position centrale de la deuxième bounding sphere
+ * @param 3 rayon de la deuxième bounding sphere
+ * @return true s'il y a intersection entre les deux bounding sphere, false sinon
+ * @note les deux bounding sphere doivent être définies dans le même repère (worldASL ou model)
+ * @note pour effecteur un test entre un point et une sphere, définir un rayon de 0
+ */
+R3F_LOG_FNCT_3D_bounding_sphere_intersect_bounding_sphere =
+{
+ private ["_pos1", "_rayon1", "_pos2", "_rayon2"];
+
+ _pos1 = _this select 0;
+ _rayon1 = _this select 1;
+ _pos2 = _this select 2;
+ _rayon2 = _this select 3;
+
+ (_pos1 distance _pos2) <= (_rayon1 + _rayon2)
+};
+
+/**
+ * Détermine s'il y a intersection entre les bounding spheres de deux objets
+ * @param 0 le premier objet pour lequel calculer l'intersection de bounding sphere
+ * @param 1 le deuxième objet pour lequel calculer l'intersection de bounding sphere
+ * @return true s'il y a intersection entre les bounding sphere des deux objets, false sinon
+ */
+R3F_LOG_FNCT_3D_intersect_bounding_sphere_objs =
+{
+ private ["_objet1", "_objet2"];
+
+ _objet1 = _this select 0;
+ _objet2 = _this select 1;
+
+ // Valeurs selon le formule de R3F_LOG_FNCT_3D_bounding_sphere_intersect_bounding_sphere
+ //_pos1 = [0,0,0];
+ //_rayon1 = (vectorMagnitude (boundingBoxReal _objet1 select 0)) max (vectorMagnitude (boundingBoxReal _objet1 select 1));
+ //_pos2 = _objet1 worldToModel (_objet2 modelToWorld [0,0,0]);
+ //_rayon2 = (vectorMagnitude (boundingBoxReal _objet2 select 0)) max (vectorMagnitude (boundingBoxReal _objet2 select 1));
+ // Retour : (_pos1 distance _pos2) <= (_rayon1 + _rayon2)
+
+ // Ce qui donne
+ vectorMagnitude (_objet1 worldToModel (_objet2 modelToWorld [0,0,0])) <= (
+ ((vectorMagnitude (boundingBoxReal _objet1 select 0)) max (vectorMagnitude (boundingBoxReal _objet1 select 1)))
+ +
+ ((vectorMagnitude (boundingBoxReal _objet2 select 0)) max (vectorMagnitude (boundingBoxReal _objet2 select 1)))
+ )
+};
+
+/**
+ * Détermine s'il y a intersection entre entre une bounding box et une bounding sphere
+ * @param 0 la position centrale de la bounding sphere (dans le repère de la bbox)
+ * @param 1 rayon de la bounding sphere
+ * @param 2 position min de la bounding box
+ * @param 3 position max de la bounding box
+ * @return true s'il y a intersection entre la bounding box et la bounding sphere, false sinon
+ */
+R3F_LOG_FNCT_3D_bounding_sphere_intersect_bounding_box =
+{
+ private ["_pos_bsphere", "_rayon_bsphere", "_bbox_min", "_bbox_max", "_pos_intersect_min_bbox"];
+
+ // Utilisation "inline" de la fonction R3F_LOG_FNCT_3D_distance_min_pos_bbox
+ _pos_bsphere = _this select 0;
+ _rayon_bsphere = _this select 1;
+ _bbox_min = _this select 2;
+ _bbox_max = _this select 3;
+
+ _pos_intersect_min_bbox =
+ [
+ (_bbox_min select 0) max (_pos_bsphere select 0) min (_bbox_max select 0),
+ (_bbox_min select 1) max (_pos_bsphere select 1) min (_bbox_max select 1),
+ (_bbox_min select 2) max (_pos_bsphere select 2) min (_bbox_max select 2)
+ ];
+
+ (_pos_intersect_min_bbox distance _pos_bsphere) <= _rayon_bsphere
+};
+
+/**
+ * Détermine s'il y a intersection entre les bounding box de deux objets
+ * @param 0 le premier objet pour lequel calculer l'intersection
+ * @param 1 position min de la bounding box du premier objet
+ * @param 2 position max de la bounding box du premier objet
+ * @param 3 le deuxième objet pour lequel calculer l'intersection
+ * @param 4 position min de la bounding box du deuxième objet
+ * @param 5 position max de la bounding box du deuxième objet
+ * @return true s'il y a intersection entre les bounding box des deux objets, false sinon
+ * @note les objets peuvent être d'un type ne correspondant pas aux bounding box
+ * @note cela permet par exemple d'utiliser une logique de jeu, pour un calcul à priori
+ */
+R3F_LOG_FNCT_3D_bbox_intersect_bbox =
+{
+ private ["_objet1", "_objet2", "_bbox1_min", "_bbox1_max", "_bbox2_min", "_bbox2_max", "_intersect", "_coins", "_rayons"];
+
+ _objet1 = _this select 0;
+ _bbox1_min = _this select 1;
+ _bbox1_max = _this select 2;
+ _objet2 = _this select 3;
+ _bbox2_min = _this select 4;
+ _bbox2_max = _this select 5;
+
+ // Quitter dès maintenant s'il est impossible d'avoir une intersection
+ if !(
+ [
+ _objet2 worldToModel (_objet1 modelToWorld [0,0,0]),
+ (vectorMagnitude _bbox1_min) max (vectorMagnitude _bbox1_max),
+ _bbox2_min,
+ _bbox2_max
+ ] call R3F_LOG_FNCT_3D_bounding_sphere_intersect_bounding_box
+ &&
+ [
+ _objet1 worldToModel (_objet2 modelToWorld [0,0,0]),
+ (vectorMagnitude _bbox2_min) max (vectorMagnitude _bbox2_max),
+ _bbox1_min,
+ _bbox1_max
+ ] call R3F_LOG_FNCT_3D_bounding_sphere_intersect_bounding_box
+ ) exitWith {false};
+
+ _intersect = false;
+ _coins = [];
+
+ // Composition des coordonnées des 8 coins de la bounding box de l'objet1, dans l'espace du modèle _objet2
+ _coins set [0, _objet2 worldToModel (_objet1 modelToWorld [_bbox1_min select 0, _bbox1_min select 1, _bbox1_min select 2])];
+ _coins set [1, _objet2 worldToModel (_objet1 modelToWorld [_bbox1_min select 0, _bbox1_min select 1, _bbox1_max select 2])];
+ _coins set [2, _objet2 worldToModel (_objet1 modelToWorld [_bbox1_min select 0, _bbox1_max select 1, _bbox1_min select 2])];
+ _coins set [3, _objet2 worldToModel (_objet1 modelToWorld [_bbox1_min select 0, _bbox1_max select 1, _bbox1_max select 2])];
+ _coins set [4, _objet2 worldToModel (_objet1 modelToWorld [_bbox1_max select 0, _bbox1_min select 1, _bbox1_min select 2])];
+ _coins set [5, _objet2 worldToModel (_objet1 modelToWorld [_bbox1_max select 0, _bbox1_min select 1, _bbox1_max select 2])];
+ _coins set [6, _objet2 worldToModel (_objet1 modelToWorld [_bbox1_max select 0, _bbox1_max select 1, _bbox1_min select 2])];
+ _coins set [7, _objet2 worldToModel (_objet1 modelToWorld [_bbox1_max select 0, _bbox1_max select 1, _bbox1_max select 2])];
+
+ // Test de présence de chacun des coins de la bounding box de l'objet1, dans la bounding box de l'objet2
+ {
+ // Utilisation "inline" de la fonction R3F_LOG_FNCT_3D_pos_est_dans_bbox
+ if (
+ (_bbox2_min select 0 <= _x select 0) && (_x select 0 <= _bbox2_max select 0) &&
+ (_bbox2_min select 1 <= _x select 1) && (_x select 1 <= _bbox2_max select 1) &&
+ (_bbox2_min select 2 <= _x select 2) && (_x select 2 <= _bbox2_max select 2)
+ ) exitWith {_intersect = true;};
+ } forEach _coins;
+
+ if (_intersect) exitWith {true};
+
+ // Composition des coordonnées des 8 coins de la bounding box de l'objet2, dans l'espace du modèle _objet1
+ _coins set [0, _objet1 worldToModel (_objet2 modelToWorld [_bbox2_min select 0, _bbox2_min select 1, _bbox2_min select 2])];
+ _coins set [1, _objet1 worldToModel (_objet2 modelToWorld [_bbox2_min select 0, _bbox2_min select 1, _bbox2_max select 2])];
+ _coins set [2, _objet1 worldToModel (_objet2 modelToWorld [_bbox2_min select 0, _bbox2_max select 1, _bbox2_min select 2])];
+ _coins set [3, _objet1 worldToModel (_objet2 modelToWorld [_bbox2_min select 0, _bbox2_max select 1, _bbox2_max select 2])];
+ _coins set [4, _objet1 worldToModel (_objet2 modelToWorld [_bbox2_max select 0, _bbox2_min select 1, _bbox2_min select 2])];
+ _coins set [5, _objet1 worldToModel (_objet2 modelToWorld [_bbox2_max select 0, _bbox2_min select 1, _bbox2_max select 2])];
+ _coins set [6, _objet1 worldToModel (_objet2 modelToWorld [_bbox2_max select 0, _bbox2_max select 1, _bbox2_min select 2])];
+ _coins set [7, _objet1 worldToModel (_objet2 modelToWorld [_bbox2_max select 0, _bbox2_max select 1, _bbox2_max select 2])];
+
+ // Test de présence de chacun des coins de la bounding box de l'objet2, dans la bounding box de l'objet1
+ {
+ // Utilisation "inline" de la fonction R3F_LOG_FNCT_3D_pos_est_dans_bbox
+ if (
+ (_bbox1_min select 0 <= _x select 0) && (_x select 0 <= _bbox1_max select 0) &&
+ (_bbox1_min select 1 <= _x select 1) && (_x select 1 <= _bbox1_max select 1) &&
+ (_bbox1_min select 2 <= _x select 2) && (_x select 2 <= _bbox1_max select 2)
+ ) exitWith {_intersect = true;};
+ } forEach _coins;
+
+ if (_intersect) exitWith {true};
+
+ // Composition des 12 rayons [pos, dir, longueur] correspondant aux segments de la bounding box de l'objet2, dans l'espace du modèle _objet1
+ _rayons = [];
+ _rayons set [ 0, [_coins select 1, _coins select 0, vectorMagnitude ((_coins select 1) vectorDiff (_coins select 0))]];
+ _rayons set [ 1, [_coins select 2, _coins select 0, vectorMagnitude ((_coins select 2) vectorDiff (_coins select 0))]];
+ _rayons set [ 2, [_coins select 1, _coins select 3, vectorMagnitude ((_coins select 1) vectorDiff (_coins select 3))]];
+ _rayons set [ 3, [_coins select 2, _coins select 3, vectorMagnitude ((_coins select 2) vectorDiff (_coins select 3))]];
+ _rayons set [ 4, [_coins select 5, _coins select 4, vectorMagnitude ((_coins select 5) vectorDiff (_coins select 4))]];
+ _rayons set [ 5, [_coins select 6, _coins select 4, vectorMagnitude ((_coins select 6) vectorDiff (_coins select 4))]];
+ _rayons set [ 6, [_coins select 5, _coins select 7, vectorMagnitude ((_coins select 5) vectorDiff (_coins select 7))]];
+ _rayons set [ 7, [_coins select 6, _coins select 7, vectorMagnitude ((_coins select 6) vectorDiff (_coins select 7))]];
+ _rayons set [ 8, [_coins select 0, _coins select 4, vectorMagnitude ((_coins select 0) vectorDiff (_coins select 4))]];
+ _rayons set [ 9, [_coins select 1, _coins select 5, vectorMagnitude ((_coins select 1) vectorDiff (_coins select 5))]];
+ _rayons set [10, [_coins select 2, _coins select 6, vectorMagnitude ((_coins select 2) vectorDiff (_coins select 6))]];
+ _rayons set [11, [_coins select 3, _coins select 7, vectorMagnitude ((_coins select 3) vectorDiff (_coins select 7))]];
+
+ // Test d'intersection de chaque rayon avec la bounding box de l'objet1
+ {
+ // Si la dimension de la bbox, dans l'axe concerné, est nulle, on fait un calcul basé sur la position (rayon de longueur nulle)
+ if (_x select 2 == 0) then
+ {
+ if ([_x select 0, _bbox1_min, _bbox1_max] call R3F_LOG_FNCT_3D_pos_est_dans_bbox) exitWith {_intersect = true;};
+ }
+ else
+ {
+ if ([
+ _x select 0,
+ ((_x select 1) vectorDiff (_x select 0)) vectorMultiply (1 / (_x select 2)), // Direction rayon
+ _bbox1_min,
+ _bbox1_max
+ ] call R3F_LOG_FNCT_3D_ray_intersect_bbox <= (_x select 2)) exitWith {_intersect = true;};
+ };
+ } forEach _rayons;
+
+ _intersect
+};
+
+/**
+ * Détermine s'il y a intersection entre les bounding box de deux objets
+ * @param 0 le premier objet pour lequel calculer l'intersection
+ * @param 1 le deuxième objet pour lequel calculer l'intersection
+ * @return true s'il y a intersection entre les bounding box des deux objets, false sinon
+ */
+R3F_LOG_FNCT_3D_bbox_intersect_bbox_objs =
+{
+ private ["_objet1", "_objet2"];
+
+ _objet1 = _this select 0;
+ _objet2 = _this select 1;
+
+ [
+ _objet1,
+ boundingBoxReal _objet1 select 0,
+ boundingBoxReal _objet1 select 1,
+ _objet2,
+ boundingBoxReal _objet2 select 0,
+ boundingBoxReal _objet2 select 1
+ ] call R3F_LOG_FNCT_3D_bbox_intersect_bbox
+};
+
+/**
+ * Détermine s'il y a une collision physique réelle (mesh) entre deux objets
+ * @param 0 le premier objet pour lequel calculer l'intersection
+ * @param 1 le deuxième objet pour lequel calculer l'intersection
+ * @param 2 (optionnel) true pour tester directement la collision de mesh sans tester les bbox, false pour d'abord tester les bbox (défaut : false)
+ * @return true s'il y a une collision physique réelle (mesh) entre deux objets, false sinon
+ * @note le calcul est basé sur les collisions PhysX, des objets non PhysX ne genère pas de collision
+ *
+ * @note WARNING WORK IN PROGRESS FUNCTION, NOT FOR USE !!! TODO FINALIZE IT
+ */
+R3F_LOG_FNCT_3D_mesh_collision_objs =
+{
+ private ["_objet1", "_objet2", "_objet_test1", "_objet_test2", "_force_test_mesh", "_pos_test", "_num_frame_start", "_collision"];
+
+ _objet1 = _this select 0;
+ _objet2 = _this select 1;
+ _force_test_mesh = if (count _this > 2) then {_this select 2} else {false};
+
+ // Quitter dès maintenant s'il est impossible d'avoir une intersection (sauf test forcé)
+ if (!_force_test_mesh && {!(
+ [
+ _objet1,
+ boundingBoxReal _objet1 select 0,
+ boundingBoxReal _objet1 select 1,
+ _objet2,
+ boundingBoxReal _objet2 select 0,
+ boundingBoxReal _objet2 select 1
+ ] call R3F_LOG_FNCT_3D_bbox_intersect_bbox
+ )}) exitWith {false};
+
+ systemChat format ["PROBABLE INTERSECT MESH : %1 @ %2", _objet2, time];//TODO REMOVE
+
+ _pos_test = ATLtoASL (player modelToWorld [0,16,20]);// TODO remplacer par R3F_LOG_FNCT_3D_tirer_position_degagee_ciel
+
+ _objet_test1 = (typeOf _objet1) createVehicleLocal ([] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel);
+ _objet_test1 setVectorDirAndUp [vectorDir _objet1, vectorUp _objet1];
+ _objet_test1 allowDamage false;
+ _objet_test1 addEventHandler ["EpeContactStart", {if (!isNull (_this select 1)) then {(_this select 0) setVariable ["R3F_LOG_3D_collision", true, false];};}];
+ _objet_test1 setVariable ["R3F_LOG_3D_collision", false, false];
+
+ _objet_test2 = (typeOf _objet2) createVehicleLocal ([] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel);
+ _objet_test2 setVectorDirAndUp [vectorDir _objet2, vectorUp _objet2];
+ _objet_test2 allowDamage false;
+ _objet_test2 addEventHandler ["EpeContactStart", {if (!isNull (_this select 1)) then {(_this select 0) setVariable ["R3F_LOG_3D_collision", true, false];};}];
+ _objet_test2 setVariable ["R3F_LOG_3D_collision", false, false];
+
+ _objet_test1 setVelocity [0,0,0];
+ _objet_test1 setVectorDirAndUp [vectorDir _objet1, vectorUp _objet1];
+ _objet_test1 setPosASL _pos_test;
+ _objet_test2 setVelocity [0,0,0];
+ _objet_test2 setVectorDirAndUp [vectorDir _objet2, vectorUp _objet2];
+ _objet_test2 setPosASL (_pos_test vectorAdd ((_objet1 worldToModel (_objet2 modelToWorld [0,0,0])) vectorDiff (_objet1 modelToWorld [0,0,0])));
+
+ _num_frame_start = diag_frameno;
+ waitUntil
+ {
+ _collision = (_objet_test1 getVariable "R3F_LOG_3D_collision") || (_objet_test2 getVariable "R3F_LOG_3D_collision");
+ _collision || (diag_frameno - _num_frame_start > 10)
+ };
+
+ if (_collision) then {systemChat format ["RESULTAT COLLISION: %1 @ %2", _objet2, time];};//TODO REMOVE
+
+ sleep 0.02;// TODO REMOVE
+
+ deleteVehicle _objet_test1;
+ deleteVehicle _objet_test2;
+
+ _collision
+};
+
+/**
+ * Retourne une position dégagée dans le ciel
+ * @param 0 (optionnel) offset 3D du cube dans lequel chercher une position (défaut [0,0,0])
+ * @return position dégagée (sphère de 50m de rayon) dans le ciel
+ */
+R3F_LOG_FNCT_3D_tirer_position_degagee_ciel =
+{
+ private ["_offset", "_nb_tirages", "_position_degagee"];
+
+ _offset = if (count _this > 0) then {_this select 0} else {[0,0,0]};
+
+ // Trouver une position dégagée (sphère de 50m de rayon) dans le ciel
+ for [
+ {
+ _position_degagee = [random 3000, random 3000, 10000 + (random 20000)] vectorAdd _offset;
+ _nb_tirages = 1;
+ },
+ {
+ !isNull (nearestObject _position_degagee) && _nb_tirages < 25
+ },
+ {
+ _position_degagee = [random 3000, random 3000, 10000 + (random 20000)] vectorAdd _offset;
+ _nb_tirages = _nb_tirages+1;
+ }
+ ] do {};
+
+ _position_degagee
+};
+
+/**
+ * Retourne une position suffisamment dégagée au sol pour créer un objet
+ * @param 0 le rayon de la zone dégagée à trouver au sein de la zone de recherche
+ * @param 1 la position centrale autour de laquelle chercher
+ * @param 2 le rayon maximal autour de la position centrale dans lequel chercher la position dégagée
+ * @param 3 (optionnel) nombre limite de tentatives de sélection d'une position dégagée avant abandon (défaut : 30)
+ * @param 4 (optionnel) true pour autoriser de retourner une position sur l'eau, false sinon (défaut : false)
+ * @return position dégagée du rayon indiqué, au sein de la zone de recherche, ou un tableau vide en cas d'échec
+ * @note cette fonction pallie au manque de fiabilité des commandes findEmptyPosition et isFlatEmpty concernant les collisions
+ */
+R3F_LOG_FNCT_3D_tirer_position_degagee_sol =
+{
+ private ["_rayon_degage", "_pos_centre", "_rayon_max", "_nb_tirages_max", "_eau_autorise", "_rayon_max_carre"];
+ private ["_nb_tirages", "_objets_genants", "_position_degagee", "_rayon_curr", "_angle_curr", "_intersect"];
+
+ _rayon_degage = 1 max (_this select 0);
+ _pos_centre = _this select 1;
+ _rayon_max = _rayon_degage max (_this select 2);
+ _nb_tirages_max = if (count _this > 3) then {_this select 3} else {30};
+ _eau_autorise = if (count _this > 4) then {_this select 4} else {false};
+
+ _rayon_max_carre = _rayon_max * _rayon_max;
+
+ for [
+ {
+ _position_degagee = [_pos_centre select 0, _pos_centre select 1, 0];
+ _nb_tirages = 0;
+ },
+ {
+ if (!_eau_autorise && surfaceIsWater _position_degagee) then {_nb_tirages < _nb_tirages_max}
+ else
+ {
+ _intersect = false;
+
+ // Pour chaque objets à proximité de la zone à tester
+ {
+ // Test de collision de la bbox de l'objet avec la bounding sphere de la zone à tester
+ if (
+ [
+ _x worldToModel _position_degagee,
+ _rayon_degage,
+ boundingBoxReal _x select 0,
+ boundingBoxReal _x select 1
+ ] call R3F_LOG_FNCT_3D_bounding_sphere_intersect_bounding_box
+ ) exitWith {_intersect = true;};
+ } forEach ([_position_degagee, _rayon_degage+15] call R3F_LOG_FNCT_3D_get_objets_genants_rayon);
+
+ _intersect && _nb_tirages < _nb_tirages_max
+ }
+ },
+ {
+ // Tirage d'un angle aléatoire, et d'une rayon aléatoirement (distribution surfacique uniforme)
+ _angle_curr = random 360;
+ _rayon_curr = sqrt random _rayon_max_carre;
+
+ _position_degagee =
+ [
+ (_pos_centre select 0) + _rayon_curr * sin _angle_curr,
+ (_pos_centre select 1) + _rayon_curr * cos _angle_curr,
+ 0
+ ];
+
+ _nb_tirages = _nb_tirages+1;
+ }
+ ] do {};
+
+ // Echec, position introuvée
+ if (_nb_tirages >= _nb_tirages_max) then {_position_degagee = [];};
+
+ _position_degagee
+};
+
+/**
+ * Calcule la distance entre le joueur et la bbox de l'objet pointé
+ * @return tableau avec en premier élément l'objet pointé (ou objNull), et en deuxième élément la distance entre le joueur et la bbox de l'objet pointé
+ */
+R3F_LOG_FNCT_3D_cursorTarget_distance_bbox =
+{
+ private ["_objet", "_joueur"];
+
+ _objet = cursorTarget;
+ _joueur = player;
+
+ if (!isNull _objet && !isNull _joueur && alive _joueur && cameraOn == _joueur) then
+ {
+ [
+ _objet,
+ [
+ _objet worldToModel (_joueur modelToWorld (_joueur selectionPosition "head")),
+ boundingBoxReal _objet select 0,
+ boundingBoxReal _objet select 1
+ ] call R3F_LOG_FNCT_3D_distance_min_pos_bbox
+ ]
+ }
+ else
+ {
+ [objNull, 1E39]
+ };
+};
+
+/**
+ * Retourne l'objet pointé par le joueur à une distance max de la bounding box de l'objet pointé
+ * @param 0 (optionnel) liste d'objets à ignorer (défaut [])
+ * @param 1 (optionnel) distance maximale entre l'unité et la bounding box des objets (défaut : 10)
+ * @return l'objet pointé par le joueur ou objNull
+ */
+R3F_LOG_FNCT_3D_cursorTarget_virtuel =
+{
+ private ["_liste_ingores", "_distance_max", "_joueur", "_objet_pointe", "_cursorTarget_distance"];
+
+ if (isNull player) exitWith {objNull};
+
+ _liste_ingores = if (!isNil "_this" && {typeName _this == "ARRAY" && {count _this > 0}}) then {_this select 0} else {[]};
+ _distance_max = if (!isNil "_this" && {typeName _this == "ARRAY" && {count _this > 1}}) then {_this select 1} else {10};
+ _joueur = player;
+
+ _objet_pointe = objNull;
+
+ _cursorTarget_distance = call R3F_LOG_FNCT_3D_cursorTarget_distance_bbox;
+
+ if (!isNull (_cursorTarget_distance select 0) &&
+ {!((_cursorTarget_distance select 0) in _liste_ingores) && (_cursorTarget_distance select 1) <= _distance_max}
+ ) then
+ {
+ _objet_pointe = cursorTarget;
+ }
+ else
+ {
+ private ["_vec_dir_unite_world", "_pos_unite_world", "_liste_objets"];
+
+ _vec_dir_unite_world = (ATLtoASL positionCameraToWorld [0, 0, 1]) vectorDiff (ATLtoASL positionCameraToWorld [0,0,0]);
+ _pos_unite_world = _joueur modelToWorld (_joueur selectionPosition "head");
+
+ _liste_objets = lineIntersectsObjs [
+ (ATLtoASL _pos_unite_world),
+ (ATLtoASL _pos_unite_world) vectorAdd (_vec_dir_unite_world vectorMultiply _distance_max),
+ objNull,
+ player,
+ true,
+ 16 + 32
+ ];
+
+ {
+ if (!(_x in _liste_ingores) &&
+ [
+ _x worldToModel _pos_unite_world,
+ boundingBoxReal _x select 0,
+ boundingBoxReal _x select 1
+ ] call R3F_LOG_FNCT_3D_distance_min_pos_bbox <= _distance_max
+ ) exitWith {_objet_pointe = _x;};
+ } forEach _liste_objets;
+ };
+
+ _objet_pointe
+};
+
+/**
+ * Retourne la position des huit coins d'une bounding box dans le repère du modèle
+ * @param 0 position min de la bounding box
+ * @param 1 position max de la bounding box
+ * @return tableau contenant la position des huit coins d'une bounding box dans le repère du modèle
+ */
+R3F_LOG_FNCT_3D_get_huit_coins_bounding_box_model =
+{
+ private ["_bbox_min", "_bbox_max"];
+
+ _bbox_min = _this select 0;
+ _bbox_max = _this select 1;
+
+ [
+ [_bbox_min select 0, _bbox_min select 1, _bbox_min select 2],
+ [_bbox_min select 0, _bbox_min select 1, _bbox_max select 2],
+ [_bbox_min select 0, _bbox_max select 1, _bbox_min select 2],
+ [_bbox_min select 0, _bbox_max select 1, _bbox_max select 2],
+ [_bbox_max select 0, _bbox_min select 1, _bbox_min select 2],
+ [_bbox_max select 0, _bbox_min select 1, _bbox_max select 2],
+ [_bbox_max select 0, _bbox_max select 1, _bbox_min select 2],
+ [_bbox_max select 0, _bbox_max select 1, _bbox_max select 2]
+ ]
+};
+
+/**
+ * Retourne la position des huit coins d'une bounding box dans le repère world
+ * @param 0 l'objet pour lequel calculer les huit coins de la bbox dans le repère world
+ * @return tableau contenant la position des huit coins d'une bounding box dans le repère world
+ */
+R3F_LOG_FNCT_3D_get_huit_coins_bounding_box_world =
+{
+ private ["_objet", "_bbox_min", "_bbox_max"];
+
+ _objet = _this select 0;
+
+ _bbox_min = boundingBoxReal _objet select 0;
+ _bbox_max = boundingBoxReal _objet select 1;
+
+ [
+ _objet modelToWorld [_bbox_min select 0, _bbox_min select 1, _bbox_min select 2],
+ _objet modelToWorld [_bbox_min select 0, _bbox_min select 1, _bbox_max select 2],
+ _objet modelToWorld [_bbox_min select 0, _bbox_max select 1, _bbox_min select 2],
+ _objet modelToWorld [_bbox_min select 0, _bbox_max select 1, _bbox_max select 2],
+ _objet modelToWorld [_bbox_max select 0, _bbox_min select 1, _bbox_min select 2],
+ _objet modelToWorld [_bbox_max select 0, _bbox_min select 1, _bbox_max select 2],
+ _objet modelToWorld [_bbox_max select 0, _bbox_max select 1, _bbox_min select 2],
+ _objet modelToWorld [_bbox_max select 0, _bbox_max select 1, _bbox_max select 2]
+ ]
+};
+
+/**
+ * Retourne la liste des objets présents dans un périmètre et pouvant avoir une collision physique, y compris les éléments de décors propres à la carte
+ * @param 0 la position centrale de la zone de recherche
+ * @param 1 le rayon de recherche
+ * @return la liste des objets présents dans un périmètre et pouvant avoir une collision physique
+ * @note la liste des objets retournées contient également les éléments de terrain tels que les rochers et les arbres, murs, bâtiments, ...
+ */
+R3F_LOG_FNCT_3D_get_objets_genants_rayon =
+{
+ private ["_pos_centre", "_rayon", "_obj_proches", "_elements_terrain", "_bbox_dim", "_volume", "_e"];
+
+ _pos_centre = _this select 0;
+ _rayon = _this select 1;
+
+ // Récupération des objets et véhicules proches avec bounding suffisamment grande
+ _obj_proches = [];
+ {
+ _bbox_dim = (boundingBoxReal _x select 1) vectorDiff (boundingBoxReal _x select 0);
+ _volume = (_bbox_dim select 0) * (_bbox_dim select 1) * (_bbox_dim select 2);
+
+ // Filtre : volume suffisamment important
+ if (_volume > 0.08) then
+ {
+ // Filtre : insectes et vie ambiante
+ if !(typeOf _x in ["Snake_random_F", "ButterFly_random", "HouseFly", "HoneyBee", "Mosquito"]) then
+ {
+ _obj_proches pushBack _x;
+ };
+ };
+ } forEach (nearestObjects [_pos_centre, ["All"], _rayon]);
+
+ // Récupération de TOUS les éléments à proximité (y compris les rochers, végétations, insectes, particules en suspension, ...)
+ // On ignore les éléments non gênants tels que les traces de pas, insectes, particules en suspension, ...
+ _elements_terrain = [];
+ {
+ _e = _x;
+
+ // Filtre : objet immobile
+ if (vectorMagnitude velocity _e == 0) then
+ {
+ _bbox_dim = (boundingBoxReal _e select 1) vectorDiff (boundingBoxReal _e select 0);
+ _volume = (_bbox_dim select 0) * (_bbox_dim select 1) * (_bbox_dim select 2);
+
+ // Filtre : volume suffisamment important
+ if (_volume > 0.08) then
+ {
+ // Filtre : insectes et vie ambiante
+ if !(typeOf _x in ["Snake_random_F", "ButterFly_random", "HouseFly", "HoneyBee", "Mosquito"]) then
+ {
+ // Filtre : ignorer les segments de routes
+ if ({_x == _e} count (getPos _e nearRoads 1) == 0) then
+ {
+ _elements_terrain pushBack _e;
+ };
+ };
+ };
+ };
+ } forEach nearestObjects [_pos_centre, [], _rayon];
+
+ _elements_terrain - _obj_proches + _obj_proches
+};
+
+/**
+ * Retourne la bounding box d'un objet depuis son nom de classe
+ * @param 0 le nom de classe de l'objet
+ * @return la bounding box d'un objet correspondant au nom de classe
+ */
+R3F_LOG_FNCT_3D_get_bounding_box_depuis_classname =
+{
+ private ["_classe", "_objet_tmp", "_bbox"];
+
+ _classe = _this select 0;
+
+ // Création du véhicule local temporaire dans le ciel pour connaître la bounding box de l'objet
+ _objet_tmp = _classe createVehicleLocal ([] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel);
+ sleep 0.01;
+ _bbox = boundingBoxReal _objet_tmp;
+ deleteVehicle _objet_tmp;
+
+ _bbox
+};
+
+/**
+ * Calcule les hauteurs de terrain ASL minimale et maximale des quatre coins inférieurs d'un objet
+ * @param 0 l'objet pour lequel calculer les hauteur de terrains min et max
+ * @return tableau contenant respectivement las hauteurs de terrain ASL minimal et maximal
+ */
+R3F_LOG_FNCT_3D_get_hauteur_terrain_min_max_objet =
+{
+ private ["_objet", "_x1", "_x2", "_y1", "_y2", "_z", "_hauteur_min", "_hauteur_max", "_hauteur"];
+
+ _objet = _this select 0;
+
+ _x1 = boundingBoxReal _objet select 0 select 0;
+ _x2 = boundingBoxReal _objet select 1 select 0;
+ _y1 = boundingBoxReal _objet select 0 select 1;
+ _y2 = boundingBoxReal _objet select 1 select 1;
+
+ _z = boundingBoxReal _objet select 0 select 2;
+
+ _hauteur_min = 1E39;
+ _hauteur_max = -1E39;
+
+ // Pour chaque coin de l'objet
+ {
+ _hauteur = getTerrainHeightASL (_objet modelToWorld _x);
+
+ if (_hauteur < _hauteur_min) then {_hauteur_min = _hauteur};
+ if (_hauteur > _hauteur_max) then {_hauteur_max = _hauteur};
+ } forEach [[_x1, _y1, _z], [_x1, _y2, _z], [_x2, _y1, _z], [_x2, _y2, _z]];
+
+ [_hauteur_min, _hauteur_max]
+};
+
+/**
+ * Multiplie deux matrices 3x3
+ * @param 0 la première matrice 3x3 à multiplier
+ * @param 1 la deuxième matrice 3x3 à multiplier
+ * @return la matrice 3x3 résultant de la multiplication
+ */
+R3F_LOG_FNCT_3D_mult_mat3x3 =
+{
+ private ["_a", "_b"];
+
+ _a = _this select 0;
+ _b = _this select 1;
+
+ [
+ [
+ (_a select 0 select 0) * (_b select 0 select 0) + (_a select 0 select 1) * (_b select 1 select 0) + (_a select 0 select 2) * (_b select 2 select 0),
+ (_a select 0 select 0) * (_b select 0 select 1) + (_a select 0 select 1) * (_b select 1 select 1) + (_a select 0 select 2) * (_b select 2 select 1),
+ (_a select 0 select 0) * (_b select 0 select 2) + (_a select 0 select 1) * (_b select 1 select 2) + (_a select 0 select 2) * (_b select 2 select 2)
+ ],
+ [
+ (_a select 1 select 0) * (_b select 0 select 0) + (_a select 1 select 1) * (_b select 1 select 0) + (_a select 1 select 2) * (_b select 2 select 0),
+ (_a select 1 select 0) * (_b select 0 select 1) + (_a select 1 select 1) * (_b select 1 select 1) + (_a select 1 select 2) * (_b select 2 select 1),
+ (_a select 1 select 0) * (_b select 0 select 2) + (_a select 1 select 1) * (_b select 1 select 2) + (_a select 1 select 2) * (_b select 2 select 2)
+ ],
+ [
+ (_a select 2 select 0) * (_b select 0 select 0) + (_a select 2 select 1) * (_b select 1 select 0) + (_a select 2 select 2) * (_b select 2 select 0),
+ (_a select 2 select 0) * (_b select 0 select 1) + (_a select 2 select 1) * (_b select 1 select 1) + (_a select 2 select 2) * (_b select 2 select 1),
+ (_a select 2 select 0) * (_b select 0 select 2) + (_a select 2 select 1) * (_b select 1 select 2) + (_a select 2 select 2) * (_b select 2 select 2)
+ ]
+ ]
+};
+
+/**
+ * Multiplie un vecteur 3D avec une matrice 3x3
+ * @param 0 le vecteur 3D Ã multiplier
+ * @param 1 le matrice 3x3 avec laquelle multiplier le vecteur
+ * @return le vecteur 3D résultant de la multiplication
+ */
+R3F_LOG_FNCT_3D_mult_vec_mat3x3 =
+{
+ private ["_vec", "_mat"];
+
+ _vec = _this select 0;
+ _mat = _this select 1;
+
+ [
+ (_vec select 0) * (_mat select 0 select 0) + (_vec select 1) * (_mat select 1 select 0) + (_vec select 2) * (_mat select 2 select 0),
+ (_vec select 0) * (_mat select 0 select 1) + (_vec select 1) * (_mat select 1 select 1) + (_vec select 2) * (_mat select 2 select 1),
+ (_vec select 0) * (_mat select 0 select 2) + (_vec select 1) * (_mat select 1 select 2) + (_vec select 2) * (_mat select 2 select 2)
+ ]
+};
+
+/**
+ * Retourne la matrice 3x3 de rotation en roulis (roll) pour un angle donné
+ * @param l'angle de rotation en degrés
+ * @return la matrice 3x3 de rotation en roulis (roll) pour un angle donné
+ */
+R3F_LOG_FNCT_3D_mat_rot_roll =
+{
+ [
+ [cos _this, 0, sin _this],
+ [0, 1, 0],
+ [-sin _this, 0, cos _this]
+ ]
+};
+
+/**
+ * Retourne la matrice 3x3 de rotation en tangage (pitch) pour un angle donné
+ * @param l'angle de rotation en degrés
+ * @return la matrice 3x3 de rotation en tangage (pitch) pour un angle donné
+ */
+R3F_LOG_FNCT_3D_mat_rot_pitch =
+{
+ [
+ [1, 0, 0],
+ [0, cos _this, -sin _this],
+ [0, sin _this, cos _this]
+ ]
+};
+
+/**
+ * Retourne la matrice 3x3 de rotation en lacet (yaw) pour un angle donné
+ * @param l'angle de rotation en degrés
+ * @return la matrice 3x3 de rotation en lacet (yaw) pour un angle donné
+ */
+R3F_LOG_FNCT_3D_mat_rot_yaw =
+{
+ [
+ [cos _this, -sin _this, 0],
+ [sin _this, cos _this, 0],
+ [0, 0, 1]
+ ]
+};
+
+/**
+ * Trace dans le jeu une bounding box donnée pour un objet passé en paramètre
+ * @param 0 l'objet pour lequel tracer la bounding box
+ * @param 1 position min de la bounding box de l'objet
+ * @param 2 position max de la bounding box de l'objet
+ * @note les objets peuvent être d'un type ne correspondant pas aux bounding box
+ * @note cela permet par exemple d'utiliser une logique de jeu, pour un calcul à priori
+ */
+R3F_LOG_FNCT_3D_tracer_bbox =
+{
+ private ["_objet", "_bbox_min", "_bbox_max", "_coins", "_couleur"];
+
+ _objet = _this select 0;
+ _bbox_min = _this select 1;
+ _bbox_max = _this select 2;
+
+ if !(isNull _objet) then
+ {
+ // Composition des coordonnées des 8 coins, dans l'espace world
+ _coins = [_objet] call R3F_LOG_FNCT_3D_get_huit_coins_bounding_box_world;
+
+ // Faire clignoter en rouge/vert le tracé
+ _couleur = if (floor (2*diag_tickTime) % 2 == 0) then {[0.95,0,0,1]} else {[0,1,0,1]};
+
+ // Tracer les segments de la bounding box
+ drawLine3D [_coins select 1, _coins select 0, _couleur];
+ drawLine3D [_coins select 2, _coins select 0, _couleur];
+ drawLine3D [_coins select 1, _coins select 3, _couleur];
+ drawLine3D [_coins select 2, _coins select 3, _couleur];
+
+ drawLine3D [_coins select 5, _coins select 4, _couleur];
+ drawLine3D [_coins select 6, _coins select 4, _couleur];
+ drawLine3D [_coins select 5, _coins select 7, _couleur];
+ drawLine3D [_coins select 6, _coins select 7, _couleur];
+
+ drawLine3D [_coins select 0, _coins select 4, _couleur];
+ drawLine3D [_coins select 1, _coins select 5, _couleur];
+ drawLine3D [_coins select 2, _coins select 6, _couleur];
+ drawLine3D [_coins select 3, _coins select 7, _couleur];
+ };
+};
+
+/**
+ * Trace dans le jeu la bounding box de l'objet passé en paramètre
+ * @param 0 l'objet pour lequel tracer la bounding box
+ */
+R3F_LOG_FNCT_3D_tracer_bbox_obj =
+{
+ private ["_objet"];
+
+ _objet = _this select 0;
+
+ if !(isNull _objet) then
+ {
+ [_objet, boundingBoxReal _objet select 0, boundingBoxReal _objet select 1] call R3F_LOG_FNCT_3D_tracer_bbox;
+ };
+};
+
+// Quelques contrôles et visualisations in-game durant le développement
+//#define R3F_LOG_3D_dev_mode // TODO commenter cette ligne lors du release
+#ifdef R3F_LOG_3D_dev_mode
+if (isNil "R3F_LOG_joueur_deplace_objet") then {R3F_LOG_joueur_deplace_objet = objNull};
+addMissionEventHandler ["Draw3D",
+{
+ if !(isNull player) then
+ {
+ private ["_objet"];
+
+ _objet = cursorTarget;
+
+ if (!isNull R3F_LOG_joueur_deplace_objet) then
+ {
+ //[R3F_LOG_joueur_deplace_objet] call R3F_LOG_FNCT_3D_tracer_bbox_obj;
+
+ {
+ if ([
+ R3F_LOG_joueur_deplace_objet,
+ boundingBoxReal R3F_LOG_joueur_deplace_objet select 0,
+ boundingBoxReal R3F_LOG_joueur_deplace_objet select 1,
+ _x,
+ boundingBoxReal _x select 0,
+ boundingBoxReal _x select 1
+ ] call R3F_LOG_FNCT_3D_bbox_intersect_bbox) then
+ {
+ //systemChat format ["COLLISION BBOX %1 @ %2", typeOf _x, time];
+ [_x] call R3F_LOG_FNCT_3D_tracer_bbox_obj;
+ };
+ } forEach (nearestObjects [R3F_LOG_joueur_deplace_objet, ["All"], 15] - [player, R3F_LOG_joueur_deplace_objet]);
+ }
+ else
+ {
+ if (false && !isNull _objet) then
+ {
+ hintSilent format ["%1 | %2 | %3", typeOf _objet, [_objet] call R3F_LOG_FNCT_3D_cam_intersect_bbox_obj,
+ [_objet worldToModel (positionCameraToWorld [0, 0, 0]), boundingBoxReal _objet select 0, boundingBoxReal _objet select 1] call R3F_LOG_FNCT_3D_pos_est_dans_bbox];
+
+ [_objet] call R3F_LOG_FNCT_3D_tracer_bbox_obj;
+ }
+ else
+ {
+ _cursorTarget_distance = call R3F_LOG_FNCT_3D_cursorTarget_distance_bbox;
+ hintSilent format ["%1 | %2", typeOf (_cursorTarget_distance select 0), _cursorTarget_distance select 1];
+
+ if !(isNull (_cursorTarget_distance select 0)) then
+ {
+ [_cursorTarget_distance select 0] call R3F_LOG_FNCT_3D_tracer_bbox_obj;
+ };
+ };
+ };
+
+ //{
+ // // Calcul de la bbox élargie par rapport au gabarit max d'une unité
+ // _bbox_min_elargie = (boundingBoxReal _x select 0) vectorDiff [1, 1, 2];
+ // _bbox_max_elargie = (boundingBoxReal _x select 1) vectorAdd [1, 1, 2];
+ //
+ // if ([_x worldToModel (player modelToWorld [0,0,0]), _bbox_min_elargie, _bbox_max_elargie] call R3F_LOG_FNCT_3D_pos_est_dans_bbox) then
+ // {
+ // //systemChat format ["JOUEUR PROCHE %1 @ %2", typeOf _x, time];
+ // };
+ //} forEach (nearestObjects [player, ["All"], 15] - [player]);
+
+ drawIcon3D ["\A3\ui_f\data\map\vehicleicons\iconManMedic_ca.paa", [1,0,0,1], positionCameraToWorld [0, 0, 1], 0.2, 0.2, 0, "", 1, 0, "TahomaB"];
+
+ //if !(isNil "R3F_LOG_liste_objets_en_deplacement") then
+ //{
+ // {
+ // [_x] call R3F_LOG_FNCT_3D_tracer_bbox_obj;
+ // } forEach R3F_LOG_liste_objets_en_deplacement;
+ //};
+
+ //{
+ // [_x] call R3F_LOG_FNCT_3D_tracer_bbox_obj;
+ //} forEach [[[R3F_LOG_joueur_deplace_objet]] call R3F_LOG_FNCT_3D_cursorTarget_virtuel];
+
+ //{
+ // [_x] call R3F_LOG_FNCT_3D_tracer_bbox_obj;
+ //} forEach ([player, 100] call R3F_LOG_FNCT_3D_get_objets_genants_rayon);
+ };
+}];
+#endif
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/lib_visualisation_objet.sqf b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/lib_visualisation_objet.sqf
new file mode 100644
index 0000000..0b5494d
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/lib_visualisation_objet.sqf
@@ -0,0 +1,108 @@
+/**
+ * Bibliothèque de fonctions permettant la visualisation 3D d'objets
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/**
+ * Démarre le mode de visualisation 3D
+ */
+R3F_LOG_VIS_FNCT_demarrer_visualisation =
+{
+ // Création d'une caméra
+ R3F_LOG_VIS_cam = "camera" camCreate ([[5000, 5000, 0]] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel);
+ R3F_LOG_VIS_cam cameraEffect ["Internal", "BACK"];
+ R3F_LOG_VIS_cam camSetFocus [-1, -1];
+ showCinemaBorder false;
+ R3F_LOG_VIS_cam camCommit 0;
+ camUseNVG (sunOrMoon == 0);
+
+ R3F_LOG_VIS_objet = objNull;
+
+ // Fil d'exécution réalisant une rotation continue de la caméra autour de l'objet à visualiser
+ 0 spawn
+ {
+ // Tant qu'on ne quitte pas la visualisation
+ while {!isNull R3F_LOG_VIS_cam} do
+ {
+ private ["_objet", "_distance_cam", "_azimut_cam"];
+
+ // Attente d'un objet à visualiser
+ waitUntil {!isNull R3F_LOG_VIS_objet};
+
+ _objet = R3F_LOG_VIS_objet;
+
+ _distance_cam = 2.25 * (
+ [boundingBoxReal _objet select 0 select 0, boundingBoxReal _objet select 0 select 2]
+ distance
+ [boundingBoxReal _objet select 1 select 0, boundingBoxReal _objet select 1 select 2]
+ );
+ _azimut_cam = 0;
+
+ R3F_LOG_VIS_cam camSetTarget _objet;
+ R3F_LOG_VIS_cam camSetPos (_objet modelToWorld [_distance_cam * sin _azimut_cam, _distance_cam * cos _azimut_cam, _distance_cam * 0.33]);
+ R3F_LOG_VIS_cam camCommit 0;
+
+ // Rotation autour de l'objet
+ while {R3F_LOG_VIS_objet == _objet} do
+ {
+ _azimut_cam = _azimut_cam + 3.25;
+
+ R3F_LOG_VIS_cam camSetPos (_objet modelToWorld [_distance_cam * sin _azimut_cam, _distance_cam * cos _azimut_cam, _distance_cam * 0.33]);
+ R3F_LOG_VIS_cam camCommit 0.05;
+
+ sleep 0.05;
+ };
+ };
+ };
+};
+
+/**
+ * Termine le mode de visualisation 3D
+ */
+R3F_LOG_VIS_FNCT_terminer_visualisation =
+{
+ if (!isNull R3F_LOG_VIS_objet) then {detach R3F_LOG_VIS_objet; deleteVehicle R3F_LOG_VIS_objet;};
+ R3F_LOG_VIS_objet = objNull;
+
+ R3F_LOG_VIS_cam cameraEffect ["Terminate", "BACK"];
+ camDestroy R3F_LOG_VIS_cam;
+ R3F_LOG_VIS_cam = objNull;
+};
+
+/**
+ * Visualiser un type d'objet en 3D
+ *
+ * @param 0 le nom de classe de l'objet à visualiser
+ */
+R3F_LOG_VIS_FNCT_voir_objet =
+{
+ private ["_classe_a_visualiser", "_objet", "_position_attache"];
+
+ if (isNil "R3F_LOG_VIS_cam") then
+ {
+ call R3F_LOG_VIS_FNCT_demarrer_visualisation;
+ };
+
+ _classe_a_visualiser = _this select 0;
+
+ // Ignorer les objets non instanciables
+ if (_classe_a_visualiser != "" && {isClass (configFile >> "CfgVehicles" >> _classe_a_visualiser) && {getNumber (configFile >> "CfgVehicles" >> _classe_a_visualiser >> "scope") > 0}}) then
+ {
+ // Ignorer si l'objet à visualiser est le même que précédemment
+ if (isNull R3F_LOG_VIS_objet || {_classe_a_visualiser != typeOf R3F_LOG_VIS_objet}) then
+ {
+ // Créer et placer l'objet dans le ciel
+ _position_attache = [[5000, 5000, 0]] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel;
+ _objet = _classe_a_visualiser createVehicleLocal _position_attache;
+ _objet attachTo [R3F_LOG_PUBVAR_point_attache, _position_attache];
+
+ if (!isNull R3F_LOG_VIS_objet) then {detach R3F_LOG_VIS_objet; deleteVehicle R3F_LOG_VIS_objet;};
+ R3F_LOG_VIS_objet = _objet;
+ };
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/unite_marche_dessus.sqf b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/unite_marche_dessus.sqf
new file mode 100644
index 0000000..58ea496
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/fonctions_generales/unite_marche_dessus.sqf
@@ -0,0 +1,41 @@
+/**
+ * Vérifie si une unité marche sur un objet ou est collée contre celui-ci
+ *
+ * @param 0 l'unité
+ * @param 1 l'objet pour lequel vérifier si l'unité marche dessus
+ *
+ * @return vrai si une unité marche sur un objet ou est collée contre celui-ci
+ *
+ * @note les bounding box, trop approximatives, ne sont pas utilisées
+ * @note le calcul se fait à l'aide de quelques dizaines de "lineIntersectsWith"
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_unite", "_objet", "_contact", "_rayon", "_angle", "_pos_debut_segment", "_pos_fin_segment"];
+
+_unite = _this select 0;
+_objet = _this select 1;
+
+_contact = false;
+
+// On scanne autour de l'unité avec des segments répartis sur 3 cercles
+for "_rayon" from 0.3 to 0.9 step 0.3 do
+{
+ for "_angle" from 0 to 359 step 360 / (40 * _rayon) do
+ {
+ _pos_debut_segment = _unite modelToWorld [_rayon*sin _angle, _rayon*cos _angle, 1];
+ _pos_fin_segment = [_pos_debut_segment select 0, _pos_debut_segment select 1, -1];
+
+ if (_objet in lineIntersectsWith [ATLtoASL _pos_debut_segment, ATLtoASL _pos_fin_segment, _unite, objNull, false]) then
+ {
+ _contact = true;
+ };
+ };
+};
+
+_contact
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/fr_strings_lang.sqf b/mpmissions/Exile.Altis/R3F_LOG/fr_strings_lang.sqf
new file mode 100644
index 0000000..1b6a001
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/fr_strings_lang.sqf
@@ -0,0 +1,93 @@
+/*
+ * TRANSLATION FILE (FRENCH)
+ *
+ * Alternative to stringtable.csv which is simpler to install for the mission maker.
+ * The token ""%1"" represents a dynamic value generated by the scripts, like a vehicle name.
+ *
+ * Alternative au stringtable.csv qui est plus simple à installer pour le créateur de mission.
+ * Le mot-clé ""%1"" représente une valeur dynamique fournie par les scripts, comme par exemple un nom de véhicule.
+ */
+
+STR_R3F_LOG_action_heliporter = "Heliporter l'objet";
+STR_R3F_LOG_action_heliporter_fait = "Objet ""%1"" accroché.";
+STR_R3F_LOG_action_heliport_larguer = "Larguer l'objet";
+STR_R3F_LOG_action_heliport_larguer_fait = "Objet ""%1"" largué.";
+STR_R3F_LOG_action_heliport_attente = "Accrochage... (%1)";
+STR_R3F_LOG_action_heliport_echec_attente = "Heliportage annulé ! Restez en stationnaire pendant l'accrochage.";
+
+STR_R3F_LOG_action_deplacer_objet = "Prendre ""%1""";
+STR_R3F_LOG_action_relacher_objet = "Relâcher ""%1""";
+STR_R3F_LOG_action_aligner_pente = "Ajuster à la pente";
+STR_R3F_LOG_action_aligner_sol = "Ajuster au sol";
+STR_R3F_LOG_action_aligner_horizon = "Ajuster de niveau";
+STR_R3F_LOG_action_tourner = "Pivoter (touches X / C)";
+STR_R3F_LOG_action_rapprocher = "Rapprocher (touches F / R)";
+STR_R3F_LOG_ne_pas_monter_dans_vehicule = "Vous ne pouvez pas monter dans un véhicule tant que vous déplacez cet objet !";
+
+STR_R3F_LOG_action_charger_deplace = "Charger dans le véhicule";
+STR_R3F_LOG_action_selectionner_objet_charge = "Charger ""%1"" dans...";
+STR_R3F_LOG_action_charger_selection = "... charger dans ""%1""";
+STR_R3F_LOG_action_selectionner_objet_fait = "Sélectionnez maintenant la destination pour ""%1""...";
+STR_R3F_LOG_action_charger_en_cours = "Chargement en cours...";
+STR_R3F_LOG_action_charger_fait = "L'objet ""%1"" a été chargé dans ""%2"".";
+STR_R3F_LOG_action_charger_pas_assez_de_place = "Il n'y pas assez de place pour cet objet dans ce véhicule !";
+
+STR_R3F_LOG_action_remorquer_direct = "Remorquer ""%1""";
+STR_R3F_LOG_action_remorquer_deplace = "Remorquer l'objet";
+STR_R3F_LOG_action_detacher = "Décrocher l'objet";
+STR_R3F_LOG_action_detacher_fait = "Objet décroché.";
+STR_R3F_LOG_action_detacher_impossible_pour_ce_vehicule = "Seul le pilote peut décrocher cet objet.";
+
+STR_R3F_LOG_action_contenu_vehicule = "Voir le contenu du véhicule";
+STR_R3F_LOG_action_decharger_en_cours = "Déchargement en cours...";
+STR_R3F_LOG_action_decharger_fait = "L'objet ""%1"" a été déchargé du véhicule.";
+STR_R3F_LOG_action_decharger_deja_fait = "L'objet a déjà été déchargé !";
+STR_R3F_LOG_action_decharger_deplacable_exceptionnel = "Une fois relâché, cet objet ne pourra plus être déplacé manuellement.
Confirmez-vous l'action ?";
+
+STR_R3F_LOG_action_ouvrir_usine = "Ouvrir l'usine de création";
+STR_R3F_LOG_action_creer_en_cours = "Création en cours...";
+STR_R3F_LOG_action_creer_fait = "L'objet ""%1"" a été créé.";
+STR_R3F_LOG_action_creer_pas_assez_credits = "L'usine ne dispose pas assez de crédits pour créer cet objet.";
+STR_R3F_LOG_action_revendre_usine_direct = "Renvoyer ""%1"" Ã l'usine";
+STR_R3F_LOG_action_revendre_usine_deplace = "Renvoyer à l'usine";
+STR_R3F_LOG_action_revendre_usine_selection = "... renvoyer à l'usine";
+STR_R3F_LOG_action_revendre_en_cours = "Renvoi à l'usine en cours...";
+STR_R3F_LOG_action_revendre_fait = "L'objet ""%1"" a été renvoyé à l'usine.";
+STR_R3F_LOG_action_revendre_decharger_avant = "Vous ne pouvez pas le renvoyer à l'usine tant que sa cargaison n'est pas vide !";
+
+STR_R3F_LOG_mutex_action_en_cours = "L'opération en cours n'est pas terminée !";
+STR_R3F_LOG_joueur_dans_objet = "Un joueur se trouve dans l'objet ""%1"" !";
+STR_R3F_LOG_objet_en_cours_transport = "L'objet ""%1"" est déjà en cours de transport !";
+STR_R3F_LOG_objet_remorque_en_cours = "Impossible car l'objet ""%1"" remorque un autre objet !";
+STR_R3F_LOG_trop_loin = "Impossible car l'objet ""%1"" est trop loin !";
+
+STR_R3F_LOG_dlg_CV_titre = "Contenu du véhicule";
+STR_R3F_LOG_dlg_CV_capacite_vehicule = "Chargement : %1/%2";
+STR_R3F_LOG_dlg_CV_btn_decharger = "DECHARGER";
+STR_R3F_LOG_dlg_CV_btn_fermer = "ANNULER";
+
+STR_R3F_LOG_dlg_LO_titre = "Usine de création";
+STR_R3F_LOG_dlg_LO_credits_restants = "Crédits restants : %1";
+STR_R3F_LOG_dlg_LO_btn_creer = "CREER";
+STR_R3F_LOG_dlg_LO_btn_fermer = "ANNULER";
+
+STR_R3F_LOG_nom_fonctionnalite_proprietes = "Propriétés";
+STR_R3F_LOG_nom_fonctionnalite_side = "Camp";
+STR_R3F_LOG_nom_fonctionnalite_places = "Places assises";
+STR_R3F_LOG_nom_fonctionnalite_passif = "Il peut être :";
+STR_R3F_LOG_nom_fonctionnalite_passif_deplace = "Déplacé par le joueur";
+STR_R3F_LOG_nom_fonctionnalite_passif_heliporte = "Héliporté";
+STR_R3F_LOG_nom_fonctionnalite_passif_remorque = "Remorqué";
+STR_R3F_LOG_nom_fonctionnalite_passif_transporte = "Transporté";
+STR_R3F_LOG_nom_fonctionnalite_passif_transporte_capacite = "coût charg. %1";
+STR_R3F_LOG_nom_fonctionnalite_actif = "Il peut :";
+STR_R3F_LOG_nom_fonctionnalite_actif_heliporte = "Héliporter";
+STR_R3F_LOG_nom_fonctionnalite_actif_remorque = "Remorquer";
+STR_R3F_LOG_nom_fonctionnalite_actif_transporte = "Transporter";
+STR_R3F_LOG_nom_fonctionnalite_actif_transporte_capacite = "charg. max %1";
+
+STR_R3F_LOG_deverrouillage_en_cours = "Déverrouillage... (%1)";
+STR_R3F_LOG_deverrouillage_echec_attente = "Déverrouillage annulé ! Maintenez la visée de l'objet pendant le compte-à -rebours.";
+STR_R3F_LOG_deverrouillage_succes_attente = "Objet déverrouillé.";
+STR_R3F_LOG_action_deverrouiller = "Déverrouiller ""%1""";
+STR_R3F_LOG_action_deverrouiller_impossible = "Objet verrouillé";
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/heliporteur/heliporter.sqf b/mpmissions/Exile.Altis/R3F_LOG/heliporteur/heliporter.sqf
new file mode 100644
index 0000000..4dcc7f5
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/heliporteur/heliporter.sqf
@@ -0,0 +1,219 @@
+/**
+ * Héliporte un objet avec un héliporteur
+ *
+ * @param 0 l'héliporteur
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_heliporteur", "_objet"];
+
+ _heliporteur = _this select 0;
+
+ // Recherche de l'objet à héliporter
+ _objet = objNull;
+ {
+ if (
+ (_x getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select R3F_LOG_IDX_can_be_lifted) &&
+ _x != _heliporteur && !(_x getVariable "R3F_LOG_disabled") &&
+ ((getPosASL _heliporteur select 2) - (getPosASL _x select 2) > 2 && (getPosASL _heliporteur select 2) - (getPosASL _x select 2) < 15)
+ ) exitWith {_objet = _x;};
+ } forEach (nearestObjects [_heliporteur, ["All"], 20]);
+
+ if (!isNull _objet) then
+ {
+ if !(_objet getVariable "R3F_LOG_disabled") then
+ {
+ if (isNull (_objet getVariable "R3F_LOG_est_transporte_par") && (isNull (_objet getVariable "R3F_LOG_est_deplace_par") || (!alive (_objet getVariable "R3F_LOG_est_deplace_par")) || (!isPlayer (_objet getVariable "R3F_LOG_est_deplace_par")))) then
+ {
+ // Finalement on autorise l'héliport d'un véhicule avec du personnel à bord
+ //if (count crew _objet == 0 || getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ //{
+ // Ne pas héliporter quelque chose qui remorque autre chose
+ if (isNull (_objet getVariable ["R3F_LOG_remorque", objNull])) then
+ {
+ private ["_duree", "_ctrl_titre", "_ctrl_fond", "_ctrl_jauge", "_time_debut", "_attente_valide", "_pas_de_hook"];
+
+ _duree = 10;
+
+ #define _JAUGE_Y 0.7
+ #define _JAUGE_W 0.4
+ #define _JAUGE_H 0.025
+
+ disableSerialization;
+
+ // Création du titre du compte-à-rebours dans le display du jeu
+ _ctrl_titre = (findDisplay 46) ctrlCreate ["RscText", -1];
+ _ctrl_titre ctrlSetPosition [0.5 - 0.5*_JAUGE_W, _JAUGE_Y - 1.5*_JAUGE_H, _JAUGE_W, 1.5*_JAUGE_H];
+ _ctrl_titre ctrlSetFontHeight 1.5*_JAUGE_H;
+ _ctrl_titre ctrlSetText format [STR_R3F_LOG_action_heliport_attente, _duree];
+ _ctrl_titre ctrlCommit 0;
+
+ // Création de l'arrière-plan de la jauge dans le display du jeu
+ _ctrl_fond = (findDisplay 46) ctrlCreate ["RscText", -1];
+ _ctrl_fond ctrlSetBackgroundColor [0, 0, 0, 0.4];
+ _ctrl_fond ctrlSetPosition [0.5 - 0.5*_JAUGE_W, _JAUGE_Y, _JAUGE_W, _JAUGE_H];
+ _ctrl_fond ctrlCommit 0;
+
+ // Création d'une jauge à 0% dans le display du jeu
+ _ctrl_jauge = (findDisplay 46) ctrlCreate ["RscText", -1];
+ _ctrl_jauge ctrlSetBackgroundColor [0, 0.6, 0, 1];
+ _ctrl_jauge ctrlSetPosition [0.5 - 0.5*_JAUGE_W, _JAUGE_Y, 0, _JAUGE_H];
+ _ctrl_jauge ctrlCommit 0;
+
+ // La jauge passe progressivement de 0% à 100%
+ _ctrl_jauge ctrlSetPosition [0.5 - 0.5*_JAUGE_W, _JAUGE_Y, _JAUGE_W, _JAUGE_H];
+ _ctrl_jauge ctrlCommit _duree;
+
+ _time_debut = time;
+ _attente_valide = true;
+
+ while {_attente_valide && time - _time_debut < _duree} do
+ {
+ _ctrl_titre ctrlSetText format [STR_R3F_LOG_action_heliport_attente, ceil (_duree - (time - _time_debut))];
+
+ // A partir des versions > 1.32, on interdit le lift si le hook de BIS est utilisé
+ if (productVersion select 2 > 132) then
+ {
+ // Call compile car la commande getSlingLoad n'existe pas en 1.32
+ _pas_de_hook = _heliporteur call compile format ["isNull getSlingLoad _this"];
+ }
+ else
+ {
+ _pas_de_hook = true;
+ };
+
+ // Pour valider l'héliportage, il faut rester en stationnaire au dessus de l'objet pendant le compte-à-rebours
+ if !(
+ alive player && vehicle player == _heliporteur && !(_heliporteur getVariable "R3F_LOG_disabled") && _pas_de_hook &&
+ isNull (_heliporteur getVariable "R3F_LOG_heliporte") && (vectorMagnitude velocity _heliporteur < 6) && (_heliporteur distance _objet < 15) &&
+ !(_objet getVariable "R3F_LOG_disabled") && isNull (_objet getVariable "R3F_LOG_est_transporte_par") &&
+ (isNull (_objet getVariable "R3F_LOG_est_deplace_par") || (!alive (_objet getVariable "R3F_LOG_est_deplace_par")) || (!isPlayer (_objet getVariable "R3F_LOG_est_deplace_par"))) &&
+ ((getPosASL _heliporteur select 2) - (getPosASL _objet select 2) > 2 && (getPosASL _heliporteur select 2) - (getPosASL _objet select 2) < 15)
+ ) then
+ {
+ _attente_valide = false;
+ };
+
+ sleep 0.1;
+ };
+
+ // On effecture l'héliportage
+ if (_attente_valide) then
+ {
+ ctrlDelete _ctrl_titre;
+ ctrlDelete _ctrl_fond;
+ ctrlDelete _ctrl_jauge;
+
+ _heliporteur setVariable ["R3F_LOG_heliporte", _objet, true];
+ _objet setVariable ["R3F_LOG_est_transporte_par", _heliporteur, true];
+
+ // Attacher sous l'héliporteur au ras du sol
+ _objet attachTo [_heliporteur, [
+ 0,
+ 0,
+ (boundingBoxReal _heliporteur select 0 select 2) - (boundingBoxReal _objet select 0 select 2) - (getPos _heliporteur select 2) + 0.5
+ ]];
+
+ // Ré-aligner dans le sens de la longueur si besoin
+ if (((boundingBoxReal _objet select 1 select 0) - (boundingBoxReal _objet select 0 select 0)) >
+ ((boundingBoxReal _objet select 1 select 1) - (boundingBoxReal _objet select 0 select 1))) then
+ {
+ [_objet, "setDir", 90] call R3F_LOG_FNCT_exec_commande_MP;
+ };
+
+ systemChat format [STR_R3F_LOG_action_heliporter_fait, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+
+ // Boucle de contrôle pendant l'héliportage
+ [_heliporteur, _objet] spawn
+ {
+ private ["_heliporteur", "_objet", "_a_ete_souleve"];
+
+ _heliporteur = _this select 0;
+ _objet = _this select 1;
+
+ _a_ete_souleve = false;
+
+ while {_heliporteur getVariable "R3F_LOG_heliporte" == _objet} do
+ {
+ // Mémoriser si l'objet a déjà été soulevé (cables tendus)
+ if (!_a_ete_souleve && getPos _objet select 2 > 3) then
+ {
+ _a_ete_souleve = true;
+ };
+
+ // Si l'hélico se fait détruire ou si l'objet héliporté entre en contact avec le sol, on largue l'objet
+ if (!alive _heliporteur || (_a_ete_souleve && getPos _objet select 2 < 0)) exitWith
+ {
+ _heliporteur setVariable ["R3F_LOG_heliporte", objNull, true];
+ _objet setVariable ["R3F_LOG_est_transporte_par", objNull, true];
+
+ // Détacher l'objet et lui appliquer la vitesse de l'héliporteur (inertie)
+ [_objet, "detachSetVelocity", velocity _heliporteur] call R3F_LOG_FNCT_exec_commande_MP;
+
+ systemChat format [STR_R3F_LOG_action_heliport_larguer_fait, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+
+ sleep 0.1;
+ };
+ };
+ }
+ else
+ {
+ systemChat STR_R3F_LOG_action_heliport_echec_attente;
+
+ // La jauge s'arrête
+ _ctrl_jauge ctrlSetPosition ctrlPosition _ctrl_jauge;
+
+ // La jauge clignote rouge
+ _ctrl_jauge ctrlSetBackgroundColor [1, 0, 0, 1];
+ _ctrl_jauge ctrlCommit 0; sleep 0.175;
+ _ctrl_jauge ctrlSetBackgroundColor [1, 0, 0, 0];
+ _ctrl_jauge ctrlCommit 0; sleep 0.175;
+ _ctrl_jauge ctrlSetBackgroundColor [1, 0, 0, 1];
+ _ctrl_jauge ctrlCommit 0; sleep 0.175;
+ _ctrl_jauge ctrlSetBackgroundColor [1, 0, 0, 0];
+ _ctrl_jauge ctrlCommit 0; sleep 0.175;
+ _ctrl_jauge ctrlSetBackgroundColor [1, 0, 0, 1];
+ _ctrl_jauge ctrlCommit 0; sleep 0.175;
+ _ctrl_jauge ctrlSetBackgroundColor [1, 0, 0, 0];
+ _ctrl_jauge ctrlCommit 0; sleep 0.175;
+ _ctrl_jauge ctrlSetBackgroundColor [1, 0, 0, 1];
+ _ctrl_jauge ctrlCommit 0; sleep 0.175;
+
+ ctrlDelete _ctrl_titre;
+ ctrlDelete _ctrl_fond;
+ ctrlDelete _ctrl_jauge;
+ };
+ }
+ else
+ {
+ systemChat format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ //}
+ //else
+ //{
+ // systemChat format [STR_R3F_LOG_joueur_dans_objet, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ //};
+ }
+ else
+ {
+ systemChat format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ };
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/heliporteur/heliporteur_init.sqf b/mpmissions/Exile.Altis/R3F_LOG/heliporteur/heliporteur_init.sqf
new file mode 100644
index 0000000..efdde42
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/heliporteur/heliporteur_init.sqf
@@ -0,0 +1,19 @@
+/**
+ * Initialise un véhicule héliporteur
+ *
+ * @param 0 l'héliporteur
+ */
+
+private ["_heliporteur"];
+
+_heliporteur = _this select 0;
+
+// Définition locale de la variable si elle n'est pas définie sur le réseau
+if (isNil {_heliporteur getVariable "R3F_LOG_heliporte"}) then
+{
+ _heliporteur setVariable ["R3F_LOG_heliporte", objNull, false];
+};
+
+_heliporteur addAction [("" + STR_R3F_LOG_action_heliporter + ""), {_this call R3F_LOG_FNCT_heliporteur_heliporter}, nil, 6, true, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_heliporter_valide"];
+
+_heliporteur addAction [("" + STR_R3F_LOG_action_heliport_larguer + ""), {_this call R3F_LOG_FNCT_heliporteur_larguer}, nil, 6, true, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_heliport_larguer_valide"];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/heliporteur/larguer.sqf b/mpmissions/Exile.Altis/R3F_LOG/heliporteur/larguer.sqf
new file mode 100644
index 0000000..3351519
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/heliporteur/larguer.sqf
@@ -0,0 +1,35 @@
+/**
+ * Larguer un objet en train d'être héliporté
+ *
+ * @param 0 l'héliporteur
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_heliporteur", "_objet"];
+
+ _heliporteur = _this select 0;
+ _objet = _heliporteur getVariable "R3F_LOG_heliporte";
+
+ _heliporteur setVariable ["R3F_LOG_heliporte", objNull, true];
+ _objet setVariable ["R3F_LOG_est_transporte_par", objNull, true];
+
+ // Détacher l'objet et lui appliquer la vitesse de l'héliporteur (inertie)
+ [_objet, "detachSetVelocity", velocity _heliporteur] call R3F_LOG_FNCT_exec_commande_MP;
+
+ systemChat format [STR_R3F_LOG_action_heliport_larguer_fait, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/init.sqf b/mpmissions/Exile.Altis/R3F_LOG/init.sqf
new file mode 100644
index 0000000..438e2e1
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/init.sqf
@@ -0,0 +1,345 @@
+/**
+ * Script principal qui initialise le système de logistique
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "R3F_LOG_ENABLE.h"
+
+#ifdef R3F_LOG_enable
+ /* DEBUT import config */
+
+ // Initialise les listes vides avant que le config.sqf les concatène
+ R3F_LOG_CFG_can_tow = [];
+ R3F_LOG_CFG_can_be_towed = [];
+ R3F_LOG_CFG_can_lift = [];
+ R3F_LOG_CFG_can_be_lifted = [];
+ R3F_LOG_CFG_can_transport_cargo = [];
+ R3F_LOG_CFG_can_be_transported_cargo = [];
+ R3F_LOG_CFG_can_be_moved_by_player = [];
+
+ // Initialise les listes vides de config_creation_factory.sqf
+ R3F_LOG_CFG_CF_whitelist_full_categories = [];
+ R3F_LOG_CFG_CF_whitelist_medium_categories = [];
+ R3F_LOG_CFG_CF_whitelist_light_categories = [];
+ R3F_LOG_CFG_CF_blacklist_categories = [];
+
+ #include "config.sqf"
+ //#include "config_creation_factory.sqf"
+
+ // Chargement du fichier de langage
+ call compile preprocessFile format ["R3F_LOG\%1_strings_lang.sqf", R3F_LOG_CFG_language];
+
+ /*
+ * On inverse l'ordre de toutes les listes de noms de classes pour donner
+ * la priorité aux classes spécifiques sur les classes génériques
+ */
+ reverse R3F_LOG_CFG_can_tow;
+ reverse R3F_LOG_CFG_can_be_towed;
+ reverse R3F_LOG_CFG_can_lift;
+ reverse R3F_LOG_CFG_can_be_lifted;
+ reverse R3F_LOG_CFG_can_transport_cargo;
+ reverse R3F_LOG_CFG_can_be_transported_cargo;
+ reverse R3F_LOG_CFG_can_be_moved_by_player;
+
+ // On passe tous les noms de classes en minuscules
+ {R3F_LOG_CFG_can_tow set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_tow;
+ {R3F_LOG_CFG_can_be_towed set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_be_towed;
+ {R3F_LOG_CFG_can_lift set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_lift;
+ {R3F_LOG_CFG_can_be_lifted set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_be_lifted;
+ {R3F_LOG_CFG_can_transport_cargo select _forEachIndex set [0, toLower (_x select 0)];} forEach R3F_LOG_CFG_can_transport_cargo;
+ {R3F_LOG_CFG_can_be_transported_cargo select _forEachIndex set [0, toLower (_x select 0)];} forEach R3F_LOG_CFG_can_be_transported_cargo;
+ {R3F_LOG_CFG_can_be_moved_by_player set [_forEachIndex, toLower _x];} forEach R3F_LOG_CFG_can_be_moved_by_player;
+
+ // On construit la liste des classes des transporteurs dans les quantités associées (pour les nearestObjects, count isKindOf, ...)
+ R3F_LOG_classes_transporteurs = [];
+ {
+ R3F_LOG_classes_transporteurs pushBack (_x select 0);
+ } forEach R3F_LOG_CFG_can_transport_cargo;
+
+ // On construit la liste des classes des transportables dans les quantités associées (pour les nearestObjects, count isKindOf, ...)
+ R3F_LOG_classes_objets_transportables = [];
+ {
+ R3F_LOG_classes_objets_transportables pushBack (_x select 0);
+ } forEach R3F_LOG_CFG_can_be_transported_cargo;
+
+ // Union des tableaux de types d'objets servant dans un isKindOf
+ R3F_LOG_objets_depl_heli_remorq_transp = [];
+ {
+ if !(_x in R3F_LOG_objets_depl_heli_remorq_transp) then
+ {
+ R3F_LOG_objets_depl_heli_remorq_transp pushBack _x;
+ };
+ } forEach (R3F_LOG_CFG_can_be_moved_by_player + R3F_LOG_CFG_can_be_lifted + R3F_LOG_CFG_can_be_towed + R3F_LOG_classes_objets_transportables);
+
+ // Gestion compatibilité fichier de config 3.0 => 3.1 (définition de valeurs par défaut)
+ if (isNil "R3F_LOG_CFG_lock_objects_mode") then {R3F_LOG_CFG_lock_objects_mode = "side";};
+ if (isNil "R3F_LOG_CFG_unlock_objects_timer") then {R3F_LOG_CFG_unlock_objects_timer = 30;};
+ if (isNil "R3F_LOG_CFG_CF_sell_back_bargain_rate") then {R3F_LOG_CFG_CF_sell_back_bargain_rate = 0.75;};
+ if (isNil "R3F_LOG_CFG_CF_creation_cost_factor") then {R3F_LOG_CFG_CF_creation_cost_factor = [];};
+
+ /* FIN import config */
+
+ if (isServer) then
+ {
+ // On crée le point d'attache qui servira aux attachTo pour les objets à charger virtuellement dans les véhicules
+ R3F_LOG_PUBVAR_point_attache = "Land_HelipadEmpty_F" createVehicle [0,0,0];
+ R3F_LOG_PUBVAR_point_attache setPosASL [0,0,0];
+ R3F_LOG_PUBVAR_point_attache setVectorDirAndUp [[0,1,0], [0,0,1]];
+
+ // Partage du point d'attache avec tous les joueurs
+ publicVariable "R3F_LOG_PUBVAR_point_attache";
+
+ /** Liste des objets à ne pas perdre dans un vehicule/cargo détruit */
+ R3F_LOG_liste_objets_a_proteger = [];
+
+ /* Protège les objets présents dans R3F_LOG_liste_objets_a_proteger */
+ execVM "R3F_LOG\surveiller_objets_a_proteger.sqf";
+ };
+
+ /**
+ * Suite à une PVEH, exécute une commande en fonction de la localité de l'argument
+ * @param 0 l'argument sur lequel exécuter la commande
+ * @param 1 la commande à exécuter (chaîne de caractères)
+ * @param 2 les éventuels paramètres de la commande (optionnel)
+ * @note il faut passer par la fonction R3F_LOG_FNCT_exec_commande_MP
+ */
+ R3F_LOG_FNCT_PVEH_commande_MP =
+ {
+ private ["_argument", "_commande", "_parametre"];
+ _argument = _this select 1 select 0;
+ _commande = _this select 1 select 1;
+ _parametre = if (count (_this select 1) == 3) then {_this select 1 select 2} else {0};
+
+ // Commandes à argument global et effet local
+ switch (_commande) do
+ {
+ // Aucune pour l'instant
+ // ex : case "switchMove": {_argument switchMove _parametre;};
+ };
+
+ // Commandes à argument local et effet global
+ if (local _argument) then
+ {
+ switch (_commande) do
+ {
+ case "setDir": {_argument setDir _parametre;};
+ case "setVelocity": {_argument setVelocity _parametre;};
+ case "detachSetVelocity": {detach _argument; _argument setVelocity _parametre;};
+ };
+ };
+
+ // Commandes à faire uniquement sur le serveur
+ if (isServer) then
+ {
+ if (_commande == "setOwnerTo") then
+ {
+ _argument setOwner (owner _parametre);
+ };
+ };
+ };
+ "R3F_LOG_PV_commande_MP" addPublicVariableEventHandler R3F_LOG_FNCT_PVEH_commande_MP;
+
+ /**
+ * Ordonne l'exécution d'une commande quelque soit la localité de l'argument ou de l'effet
+ * @param 0 l'argument sur lequel exécuter la commande
+ * @param 1 la commande à exécuter (chaîne de caractères)
+ * @param 2 les éventuels paramètres de la commande (optionnel)
+ * @usage [_objet, "setDir", 160] call R3F_LOG_FNCT_exec_commande_MP
+ */
+ R3F_LOG_FNCT_exec_commande_MP =
+ {
+ R3F_LOG_PV_commande_MP = _this;
+ publicVariable "R3F_LOG_PV_commande_MP";
+ ["R3F_LOG_PV_commande_MP", R3F_LOG_PV_commande_MP] spawn R3F_LOG_FNCT_PVEH_commande_MP;
+ };
+
+ /** Pseudo-mutex permettant de n'exécuter qu'un script de manipulation d'objet à la fois (true : vérouillé) */
+ R3F_LOG_mutex_local_verrou = false;
+
+ call compile preprocessFile "R3F_LOG\fonctions_generales\lib_geometrie_3D.sqf";
+
+ // Indices du tableau des fonctionnalités retourné par R3F_LOG_FNCT_determiner_fonctionnalites_logistique
+ R3F_LOG_IDX_can_be_depl_heli_remorq_transp = 0;
+ R3F_LOG_IDX_can_be_moved_by_player = 1;
+ R3F_LOG_IDX_can_lift = 2;
+ R3F_LOG_IDX_can_be_lifted = 3;
+ R3F_LOG_IDX_can_tow = 4;
+ R3F_LOG_IDX_can_be_towed = 5;
+ R3F_LOG_IDX_can_transport_cargo = 6;
+ R3F_LOG_IDX_can_transport_cargo_cout = 7;
+ R3F_LOG_IDX_can_be_transported_cargo = 8;
+ R3F_LOG_IDX_can_be_transported_cargo_cout = 9;
+ R3F_LOG_CST_zero_log = [false, false, false, false, false, false, false, 0, false, 0];
+
+ R3F_LOG_FNCT_determiner_fonctionnalites_logistique = compile preprocessFile "R3F_LOG\fonctions_generales\determiner_fonctionnalites_logistique.sqf";
+
+ R3F_LOG_FNCT_calculer_chargement_vehicule = compile preprocessFile "R3F_LOG\transporteur\calculer_chargement_vehicule.sqf";
+ R3F_LOG_FNCT_transporteur_charger_auto = compile preprocessFile "R3F_LOG\transporteur\charger_auto.sqf";
+
+ // Un serveur dédié n'en a pas besoin
+ if !(isDedicated) then
+ {
+ // Le client attend que le serveur ai créé et publié la référence de l'objet servant de point d'attache
+ waitUntil {!isNil "R3F_LOG_PUBVAR_point_attache"};
+
+ /** Indique quel objet le joueur est en train de déplacer, objNull si aucun */
+ R3F_LOG_joueur_deplace_objet = objNull;
+
+ /** Objet actuellement sélectionner pour être chargé/remorqué */
+ R3F_LOG_objet_selectionne = objNull;
+
+ /** Tableau contenant toutes les usines créées */
+ R3F_LOG_CF_liste_usines = [];
+
+ call compile preprocessFile "R3F_LOG\fonctions_generales\lib_visualisation_objet.sqf";
+
+ R3F_LOG_FNCT_objet_relacher = compile preprocessFile "R3F_LOG\objet_deplacable\relacher.sqf";
+ R3F_LOG_FNCT_objet_deplacer = compile preprocessFile "R3F_LOG\objet_deplacable\deplacer.sqf";
+
+ R3F_LOG_FNCT_heliporteur_heliporter = compile preprocessFile "R3F_LOG\heliporteur\heliporter.sqf";
+ R3F_LOG_FNCT_heliporteur_larguer = compile preprocessFile "R3F_LOG\heliporteur\larguer.sqf";
+ R3F_LOG_FNCT_heliporteur_init = compile preprocessFile "R3F_LOG\heliporteur\heliporteur_init.sqf";
+
+ R3F_LOG_FNCT_remorqueur_detacher = compile preprocessFile "R3F_LOG\remorqueur\detacher.sqf";
+ R3F_LOG_FNCT_remorqueur_remorquer_deplace = compile preprocessFile "R3F_LOG\remorqueur\remorquer_deplace.sqf";
+ R3F_LOG_FNCT_remorqueur_remorquer_direct = compile preprocessFile "R3F_LOG\remorqueur\remorquer_direct.sqf";
+ R3F_LOG_FNCT_remorqueur_init = compile preprocessFile "R3F_LOG\remorqueur\remorqueur_init.sqf";
+
+ R3F_LOG_FNCT_transporteur_charger_deplace = compile preprocessFile "R3F_LOG\transporteur\charger_deplace.sqf";
+ R3F_LOG_FNCT_transporteur_charger_selection = compile preprocessFile "R3F_LOG\transporteur\charger_selection.sqf";
+ R3F_LOG_FNCT_transporteur_decharger = compile preprocessFile "R3F_LOG\transporteur\decharger.sqf";
+ R3F_LOG_FNCT_transporteur_selectionner_objet = compile preprocessFile "R3F_LOG\transporteur\selectionner_objet.sqf";
+ R3F_LOG_FNCT_transporteur_voir_contenu_vehicule = compile preprocessFile "R3F_LOG\transporteur\voir_contenu_vehicule.sqf";
+ R3F_LOG_FNCT_transporteur_init = compile preprocessFile "R3F_LOG\transporteur\transporteur_init.sqf";
+
+ /*
+ R3F_LOG_FNCT_usine_remplir_liste_objets = compile preprocessFile "R3F_LOG\usine_creation\remplir_liste_objets.sqf";
+ R3F_LOG_FNCT_usine_creer_objet = compile preprocessFile "R3F_LOG\usine_creation\creer_objet.sqf";
+ R3F_LOG_FNCT_usine_ouvrir_usine = compile preprocessFile "R3F_LOG\usine_creation\ouvrir_usine.sqf";
+ R3F_LOG_FNCT_usine_init = compile preprocessFile "R3F_LOG\usine_creation\usine_init.sqf";
+ R3F_LOG_FNCT_usine_revendre_deplace = compile preprocessFile "R3F_LOG\usine_creation\revendre_deplace.sqf";
+ R3F_LOG_FNCT_usine_revendre_selection = compile preprocessFile "R3F_LOG\usine_creation\revendre_selection.sqf";
+ R3F_LOG_FNCT_usine_revendre_direct = compile preprocessFile "R3F_LOG\usine_creation\revendre_direct.sqf";
+ R3F_LOG_FNCT_recuperer_liste_cfgVehicles_par_categories = compile preprocessFile "R3F_LOG\usine_creation\recuperer_liste_cfgVehicles_par_categories.sqf";
+ R3F_LOG_FNCT_determiner_cout_creation = compile preprocessFile "R3F_LOG\usine_creation\determiner_cout_creation.sqf";
+ */
+
+ R3F_LOG_FNCT_objet_init = compile preprocessFile "R3F_LOG\objet_commun\objet_init.sqf";
+ R3F_LOG_FNCT_objet_est_verrouille = compile preprocessFile "R3F_LOG\objet_commun\objet_est_verrouille.sqf";
+ R3F_LOG_FNCT_deverrouiller_objet = compile preprocessFile "R3F_LOG\objet_commun\deverrouiller_objet.sqf";
+ R3F_LOG_FNCT_definir_proprietaire_verrou = compile preprocessFile "R3F_LOG\objet_commun\definir_proprietaire_verrou.sqf";
+
+ R3F_LOG_FNCT_formater_fonctionnalites_logistique = compile preprocessFile "R3F_LOG\fonctions_generales\formater_fonctionnalites_logistique.sqf";
+ R3F_LOG_FNCT_formater_nombre_entier_milliers = compile preprocessFile "R3F_LOG\fonctions_generales\formater_nombre_entier_milliers.sqf";
+
+ // Liste des variables activant ou non les actions de menu
+ R3F_LOG_action_charger_deplace_valide = false;
+ R3F_LOG_action_charger_selection_valide = false;
+ R3F_LOG_action_contenu_vehicule_valide = false;
+
+ R3F_LOG_action_remorquer_deplace_valide = false;
+
+ R3F_LOG_action_heliporter_valide = false;
+ R3F_LOG_action_heliport_larguer_valide = false;
+
+ R3F_LOG_action_deplacer_objet_valide = false;
+ R3F_LOG_action_remorquer_direct_valide = false;
+ R3F_LOG_action_detacher_valide = false;
+ R3F_LOG_action_selectionner_objet_charge_valide = false;
+
+ R3F_LOG_action_ouvrir_usine_valide = false;
+ R3F_LOG_action_revendre_usine_direct_valide = false;
+ R3F_LOG_action_revendre_usine_deplace_valide = false;
+ R3F_LOG_action_revendre_usine_selection_valide = false;
+
+ R3F_LOG_action_deverrouiller_valide = false;
+
+ /** Sur ordre (publicVariable), révéler la présence d'un objet au joueur (accélérer le retour des addActions) */
+ R3F_LOG_FNCT_PUBVAR_reveler_au_joueur =
+ {
+ private ["_objet"];
+ _objet = _this select 1;
+
+ if (alive player) then
+ {
+ player reveal _objet;
+ };
+ };
+ "R3F_LOG_PUBVAR_reveler_au_joueur" addPublicVariableEventHandler R3F_LOG_FNCT_PUBVAR_reveler_au_joueur;
+
+ /** Event handler GetIn : ne pas monter dans un véhicule qui est en cours de transport */
+ R3F_LOG_FNCT_EH_GetIn =
+ {
+ if (local (_this select 2)) then
+ {
+ _this spawn
+ {
+ sleep 0.1;
+ if ((!(isNull (_this select 0 getVariable "R3F_LOG_est_deplace_par")) && (alive (_this select 0 getVariable "R3F_LOG_est_deplace_par")) && (isPlayer (_this select 0 getVariable "R3F_LOG_est_deplace_par"))) || !(isNull (_this select 0 getVariable "R3F_LOG_est_transporte_par"))) then
+ {
+ (_this select 2) action ["GetOut", _this select 0];
+ (_this select 2) action ["Eject", _this select 0];
+ if (player == _this select 2) then {hintC format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf (_this select 0)) >> "displayName")];};
+ };
+ };
+ };
+ };
+
+ // Actions à faire quand le joueur est apparu
+ 0 spawn
+ {
+ waitUntil {!isNull player};
+
+ // Ajout d'un event handler "WeaponDisassembled" pour gérer le cas où une arme est démontée alors qu'elle est en cours de transport
+ player addEventHandler ["WeaponDisassembled",
+ {
+ private ["_objet"];
+
+ // Récupération de l'arme démontée avec cursorTarget au lieu de _this (http://feedback.arma3.com/view.php?id=18090)
+ _objet = cursorTarget;
+
+ if (!isNull _objet && {!isNull (_objet getVariable ["R3F_LOG_est_deplace_par", objNull])}) then
+ {
+ _objet setVariable ["R3F_LOG_est_deplace_par", objNull, true];
+ };
+ }];
+ };
+
+ /** Variable publique passer à true pour informer le script surveiller_nouveaux_objets.sqf de la création d'un objet */
+ R3F_LOG_PUBVAR_nouvel_objet_a_initialiser = false;
+
+ /* Vérification permanente des conditions donnant accès aux addAction */
+ execVM "R3F_LOG\surveiller_conditions_actions_menu.sqf";
+
+ /* Auto-détection permanente des objets sur le jeu */
+ execVM "R3F_LOG\surveiller_nouveaux_objets.sqf";
+
+ /*
+ * Système assurant la protection contre les blessures lors du déplacement d'objets
+ * On choisit de ne pas faire tourner le système sur un serveur dédié par économie de ressources.
+ * Seuls les joueurs et les IA commandées par les joueurs (locales) seront protégés.
+ * Les IA n'étant pas commandées par un joueur ne seront pas protégées, ce qui est un moindre mal.
+ */
+ execVM "R3F_LOG\systeme_protection_blessures.sqf";
+ };
+
+ R3F_LOG_active = true;
+#else
+ // Pour les actions du PC d'arti
+ R3F_LOG_joueur_deplace_objet = objNull;
+ R3F_LOG_active = false;
+#endif
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/objet_commun/definir_proprietaire_verrou.sqf b/mpmissions/Exile.Altis/R3F_LOG/objet_commun/definir_proprietaire_verrou.sqf
new file mode 100644
index 0000000..cbf66f8
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/objet_commun/definir_proprietaire_verrou.sqf
@@ -0,0 +1,29 @@
+/**
+ * Défini le propriétaire (side/faction/player) du verrou d'un objet
+ *
+ * @param 0 l'objet pour lequel définir le propriétaire du verrou
+ * @param 1 l'unité pour laquelle définir le verrou
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_objet", "_unite"];
+
+_objet = _this select 0;
+_unite = _this select 1;
+
+// Si le verrou de l'objet ne correspond pas à l'unité, on redéfini sa valeur pour lui correspondre
+if (isNil {_objet getVariable "R3F_LOG_proprietaire_verrou"} || {[_objet, _unite] call R3F_LOG_FNCT_objet_est_verrouille}) then
+{
+ switch (R3F_LOG_CFG_lock_objects_mode) do
+ {
+ case "side": {_objet setVariable ["R3F_LOG_proprietaire_verrou", side group _unite, true];};
+ case "faction": {_objet setVariable ["R3F_LOG_proprietaire_verrou", faction _unite, true];};
+ case "player": {_objet setVariable ["R3F_LOG_proprietaire_verrou", name _unite, true];};
+ case "unit": {_objet setVariable ["R3F_LOG_proprietaire_verrou", _unite, true];};
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/objet_commun/deverrouiller_objet.sqf b/mpmissions/Exile.Altis/R3F_LOG/objet_commun/deverrouiller_objet.sqf
new file mode 100644
index 0000000..1ca1e1c
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/objet_commun/deverrouiller_objet.sqf
@@ -0,0 +1,90 @@
+/**
+ * Gestion du déverrouillage d'un objet et du compte-à-rebours
+ *
+ * @param 0 l'objet à déverrouiller
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_objet", "_duree", "_ctrl_titre", "_ctrl_fond", "_ctrl_jauge", "_time_debut", "_attente_valide", "_cursorTarget_distance"];
+
+ _objet = _this select 0;
+ _duree = R3F_LOG_CFG_unlock_objects_timer;
+
+ #define _JAUGE_Y 0.7
+ #define _JAUGE_W 0.4
+ #define _JAUGE_H 0.025
+
+ disableSerialization;
+
+ // Création du titre du compte-à-rebours dans le display du jeu
+ _ctrl_titre = (findDisplay 46) ctrlCreate ["RscText", -1];
+ _ctrl_titre ctrlSetPosition [0.5 - 0.5*_JAUGE_W, _JAUGE_Y - 1.5*_JAUGE_H, _JAUGE_W, 1.5*_JAUGE_H];
+ _ctrl_titre ctrlSetFontHeight 1.5*_JAUGE_H;
+ _ctrl_titre ctrlSetText format [STR_R3F_LOG_deverrouillage_en_cours, _duree];
+ _ctrl_titre ctrlCommit 0;
+
+ // Création de l'arrière-plan de la jauge dans le display du jeu
+ _ctrl_fond = (findDisplay 46) ctrlCreate ["RscText", -1];
+ _ctrl_fond ctrlSetBackgroundColor [0, 0, 0, 0.4];
+ _ctrl_fond ctrlSetPosition [0.5 - 0.5*_JAUGE_W, _JAUGE_Y, _JAUGE_W, _JAUGE_H];
+ _ctrl_fond ctrlCommit 0;
+
+ // Création d'une jauge à 0% dans le display du jeu
+ _ctrl_jauge = (findDisplay 46) ctrlCreate ["RscText", -1];
+ _ctrl_jauge ctrlSetBackgroundColor [0, 0.6, 0, 1];
+ _ctrl_jauge ctrlSetPosition [0.5 - 0.5*_JAUGE_W, _JAUGE_Y, 0, _JAUGE_H];
+ _ctrl_jauge ctrlCommit 0;
+
+ // La jauge passe progressivement de 0% à 100%
+ _ctrl_jauge ctrlSetPosition [0.5 - 0.5*_JAUGE_W, _JAUGE_Y, _JAUGE_W, _JAUGE_H];
+ _ctrl_jauge ctrlCommit _duree;
+
+ _time_debut = time;
+ _attente_valide = true;
+
+ while {_attente_valide && time - _time_debut < _duree} do
+ {
+ _ctrl_titre ctrlSetText format [STR_R3F_LOG_deverrouillage_en_cours, ceil (_duree - (time - _time_debut))];
+
+ _cursorTarget_distance = call R3F_LOG_FNCT_3D_cursorTarget_distance_bbox;
+
+ // Pour valider le déverrouillage, il faut maintenir la visée l'objet pendant le compte-à-rebours
+ if (!alive player || _cursorTarget_distance select 0 != _objet || _cursorTarget_distance select 1 > 5) then
+ {
+ _attente_valide = false;
+ };
+
+ sleep 0.1;
+ };
+
+ ctrlDelete _ctrl_titre;
+ ctrlDelete _ctrl_fond;
+ ctrlDelete _ctrl_jauge;
+
+ if (_attente_valide) then
+ {
+ // Mise à jour du propriétaire du verrou
+ [_objet, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ systemChat STR_R3F_LOG_deverrouillage_succes_attente;
+ }
+ else
+ {
+ hintC STR_R3F_LOG_deverrouillage_echec_attente;
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/objet_commun/objet_est_verrouille.sqf b/mpmissions/Exile.Altis/R3F_LOG/objet_commun/objet_est_verrouille.sqf
new file mode 100644
index 0000000..76b83dd
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/objet_commun/objet_est_verrouille.sqf
@@ -0,0 +1,30 @@
+/**
+ * Détermine si un objet est verrouillé ou non pour un joueur donné
+ *
+ * @param 0 l'objet pour lequel savoir s'il est verrouillé
+ * @param 1 l'unité pour laquelle savoir si l'objet est verrouillé
+ *
+ * @return true si l'objet est verrouillé, false sinon
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_objet", "_unite", "_objet_verrouille"];
+
+_objet = _this select 0;
+_unite = _this select 1;
+
+_objet_verrouille = switch (R3F_LOG_CFG_lock_objects_mode) do
+{
+ case "side": {_objet getVariable ["R3F_LOG_proprietaire_verrou", side group _unite] != side group _unite};
+ case "faction": {_objet getVariable ["R3F_LOG_proprietaire_verrou", faction _unite] != faction _unite};
+ case "player": {_objet getVariable ["R3F_LOG_proprietaire_verrou", name _unite] != name _unite};
+ case "unit": {_objet getVariable ["R3F_LOG_proprietaire_verrou", _unite] != _unite};
+ default {false};
+};
+
+_objet_verrouille
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/objet_commun/objet_init.sqf b/mpmissions/Exile.Altis/R3F_LOG/objet_commun/objet_init.sqf
new file mode 100644
index 0000000..a12170e
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/objet_commun/objet_init.sqf
@@ -0,0 +1,119 @@
+/**
+ * Initialise un objet déplaçable/héliportable/remorquable/transportable
+ *
+ * @param 0 l'objet
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_objet", "_config", "_nom", "_fonctionnalites"];
+
+_objet = _this select 0;
+
+_config = configFile >> "CfgVehicles" >> (typeOf _objet);
+_nom = getText (_config >> "displayName");
+
+// Définition locale de la variable si elle n'est pas définie sur le réseau
+if (isNil {_objet getVariable "R3F_LOG_est_transporte_par"}) then
+{
+ _objet setVariable ["R3F_LOG_est_transporte_par", objNull, false];
+};
+
+// Définition locale de la variable si elle n'est pas définie sur le réseau
+if (isNil {_objet getVariable "R3F_LOG_est_deplace_par"}) then
+{
+ _objet setVariable ["R3F_LOG_est_deplace_par", objNull, false];
+};
+
+// Définition locale de la variable si elle n'est pas définie sur le réseau
+if (isNil {_objet getVariable "R3F_LOG_proprietaire_verrou"}) then
+{
+ // En mode de lock side : uniquement si l'objet appartient initialement à une side militaire
+ if (R3F_LOG_CFG_lock_objects_mode == "side") then
+ {
+ switch (getNumber (_config >> "side")) do
+ {
+ case 0: {_objet setVariable ["R3F_LOG_proprietaire_verrou", east, false];};
+ case 1: {_objet setVariable ["R3F_LOG_proprietaire_verrou", west, false];};
+ case 2: {_objet setVariable ["R3F_LOG_proprietaire_verrou", independent, false];};
+ };
+ }
+ else
+ {
+ // En mode de lock faction : uniquement si l'objet appartient initialement à une side militaire
+ if (R3F_LOG_CFG_lock_objects_mode == "faction") then
+ {
+ switch (getNumber (_config >> "side")) do
+ {
+ case 0; case 1; case 2:
+ {_objet setVariable ["R3F_LOG_proprietaire_verrou", getText (_config >> "faction"), false];};
+ };
+ };
+ };
+};
+
+// Si on peut embarquer dans l'objet
+if (isNumber (_config >> "preciseGetInOut")) then
+{
+ // Ne pas monter dans un véhicule qui est en cours de transport
+ _objet addEventHandler ["GetIn", R3F_LOG_FNCT_EH_GetIn];
+};
+
+// Indices du tableau des fonctionnalités retourné par R3F_LOG_FNCT_determiner_fonctionnalites_logistique
+#define __can_be_depl_heli_remorq_transp 0
+#define __can_be_moved_by_player 1
+#define __can_lift 2
+#define __can_be_lifted 3
+#define __can_tow 4
+#define __can_be_towed 5
+#define __can_transport_cargo 6
+#define __can_transport_cargo_cout 7
+#define __can_be_transported_cargo 8
+#define __can_be_transported_cargo_cout 9
+
+_fonctionnalites = _objet getVariable "R3F_LOG_fonctionnalites";
+
+if (R3F_LOG_CFG_unlock_objects_timer != -1) then
+{
+ _objet addAction [("" + format [STR_R3F_LOG_action_deverrouiller, _nom] + ""), {_this call R3F_LOG_FNCT_deverrouiller_objet}, false, 11, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_deverrouiller_valide"];
+}
+else
+{
+ _objet addAction [("" + STR_R3F_LOG_action_deverrouiller_impossible + ""), {hintC STR_R3F_LOG_action_deverrouiller_impossible;}, false, 11, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_deverrouiller_valide"];
+};
+
+if (_fonctionnalites select __can_be_moved_by_player) then
+{
+ _objet addAction [("" + format [STR_R3F_LOG_action_deplacer_objet, _nom] + ""), {_this call R3F_LOG_FNCT_objet_deplacer}, false, 5, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_deplacer_objet_valide"];
+};
+
+if (_fonctionnalites select __can_be_towed) then
+{
+ if (_fonctionnalites select __can_be_moved_by_player) then
+ {
+ _objet addAction [("" + STR_R3F_LOG_action_remorquer_deplace + ""), {_this call R3F_LOG_FNCT_remorqueur_remorquer_deplace}, nil, 6, true, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_joueur_deplace_objet == _target && R3F_LOG_action_remorquer_deplace_valide"];
+ };
+
+ _objet addAction [("" + format [STR_R3F_LOG_action_remorquer_direct, _nom] + ""), {_this call R3F_LOG_FNCT_remorqueur_remorquer_direct}, nil, 5, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_remorquer_direct_valide"];
+
+ _objet addAction [("" + STR_R3F_LOG_action_detacher + ""), {_this call R3F_LOG_FNCT_remorqueur_detacher}, nil, 6, true, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_detacher_valide"];
+};
+
+if (_fonctionnalites select __can_be_transported_cargo) then
+{
+ if (_fonctionnalites select __can_be_moved_by_player) then
+ {
+ _objet addAction [("" + STR_R3F_LOG_action_charger_deplace + ""), {_this call R3F_LOG_FNCT_transporteur_charger_deplace}, nil, 8, true, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_joueur_deplace_objet == _target && R3F_LOG_action_charger_deplace_valide"];
+ };
+
+ _objet addAction [("" + format [STR_R3F_LOG_action_selectionner_objet_charge, _nom] + ""), {_this call R3F_LOG_FNCT_transporteur_selectionner_objet}, nil, 5, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_selectionner_objet_charge_valide"];
+};
+
+if (_fonctionnalites select __can_be_moved_by_player) then
+{
+ _objet addAction [("" + STR_R3F_LOG_action_revendre_usine_deplace + ""), {_this call R3F_LOG_FNCT_usine_revendre_deplace}, nil, 7, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_revendre_usine_deplace_valide"];
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/objet_deplacable/deplacer.sqf b/mpmissions/Exile.Altis/R3F_LOG/objet_deplacable/deplacer.sqf
new file mode 100644
index 0000000..362b400
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/objet_deplacable/deplacer.sqf
@@ -0,0 +1,498 @@
+/**
+ * Fait déplacer un objet par le joueur. Il garde l'objet tant qu'il ne le relâche pas ou ne meurt pas.
+ * L'objet est relaché quand la variable R3F_LOG_joueur_deplace_objet passe à objNull ce qui terminera le script
+ *
+ * @param 0 l'objet à déplacer
+ * @param 3 true si l'objet est chargé dans un véhicule
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ R3F_LOG_objet_selectionne = objNull;
+
+ private ["_objet", "_decharger", "_joueur", "_dir_joueur", "_arme_courante", "_muzzle_courant", "_mode_muzzle_courant", "_restaurer_arme"];
+ private ["_vec_dir_rel", "_vec_dir_up", "_dernier_vec_dir_up", "_avant_dernier_vec_dir_up", "_normale_surface"];
+ private ["_pos_rel_objet_initial", "_pos_rel_objet", "_dernier_pos_rel_objet", "_avant_dernier_pos_rel_objet"];
+ private ["_elev_cam_initial", "_elev_cam", "_offset_hauteur_cam", "_offset_bounding_center", "_offset_hauteur_terrain"];
+ private ["_offset_hauteur", "_dernier_offset_hauteur", "_avant_dernier_offset_hauteur"];
+ private ["_hauteur_terrain_min_max_objet", "_offset_hauteur_terrain_min", "_offset_hauteur_terrain_max"];
+ private ["_action_relacher", "_action_aligner_pente", "_action_aligner_sol", "_action_aligner_horizon", "_action_tourner", "_action_rapprocher"];
+ private ["_idx_eh_fired", "_idx_eh_keyDown", "_idx_eh_keyUp", "_time_derniere_rotation", "_time_derniere_translation"];
+
+ _objet = _this select 0;
+ _decharger = if (count _this >= 4) then {_this select 3} else {false};
+ _joueur = player;
+ _dir_joueur = getDir _joueur;
+
+ if (isNull (_objet getVariable ["R3F_LOG_est_transporte_par", objNull]) && (isNull (_objet getVariable ["R3F_LOG_est_deplace_par", objNull]) || (!alive (_objet getVariable ["R3F_LOG_est_deplace_par", objNull])) || (!isPlayer (_objet getVariable ["R3F_LOG_est_deplace_par", objNull])))) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_remorque", objNull])) then
+ {
+ if (count crew _objet == 0 || getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ {
+ [_objet, _joueur] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ _objet setVariable ["R3F_LOG_est_deplace_par", _joueur, true];
+
+ _joueur forceWalk true;
+
+ R3F_LOG_joueur_deplace_objet = _objet;
+
+ if (_decharger) then
+ {
+ // Orienter l'objet en fonction de son profil
+ if (((boundingBoxReal _objet select 1 select 1) - (boundingBoxReal _objet select 0 select 1)) != 0 && // Div par 0
+ {
+ ((boundingBoxReal _objet select 1 select 0) - (boundingBoxReal _objet select 0 select 0)) > 3.2 &&
+ ((boundingBoxReal _objet select 1 select 0) - (boundingBoxReal _objet select 0 select 0)) /
+ ((boundingBoxReal _objet select 1 select 1) - (boundingBoxReal _objet select 0 select 1)) > 1.25
+ }
+ ) then
+ {R3F_LOG_deplace_dir_rel_objet = 90;} else {R3F_LOG_deplace_dir_rel_objet = 0;};
+
+ // Calcul de la position relative, de sorte à éloigner l'objet suffisamment pour garder un bon champ de vision
+ _pos_rel_objet_initial = [
+ (boundingCenter _objet select 0) * cos R3F_LOG_deplace_dir_rel_objet - (boundingCenter _objet select 1) * sin R3F_LOG_deplace_dir_rel_objet,
+ ((-(boundingBoxReal _objet select 0 select 0) * sin R3F_LOG_deplace_dir_rel_objet) max (-(boundingBoxReal _objet select 1 select 0) * sin R3F_LOG_deplace_dir_rel_objet)) +
+ ((-(boundingBoxReal _objet select 0 select 1) * cos R3F_LOG_deplace_dir_rel_objet) max (-(boundingBoxReal _objet select 1 select 1) * cos R3F_LOG_deplace_dir_rel_objet)) +
+ 2 + 0.3 * (
+ ((boundingBoxReal _objet select 1 select 1)-(boundingBoxReal _objet select 0 select 1)) * abs sin R3F_LOG_deplace_dir_rel_objet +
+ ((boundingBoxReal _objet select 1 select 0)-(boundingBoxReal _objet select 0 select 0)) * abs cos R3F_LOG_deplace_dir_rel_objet
+ ),
+ -(boundingBoxReal _objet select 0 select 2)
+ ];
+
+ _elev_cam_initial = acos ((ATLtoASL positionCameraToWorld [0, 0, 1] select 2) - (ATLtoASL positionCameraToWorld [0, 0, 0] select 2));
+
+ _pos_rel_objet_initial set [2, 0.1 + (_joueur selectionPosition "head" select 2) + (_pos_rel_objet_initial select 1) * tan (89 min (-89 max (90-_elev_cam_initial)))];
+ }
+ else
+ {
+ R3F_LOG_deplace_dir_rel_objet = (getDir _objet) - _dir_joueur;
+
+ _pos_rel_objet_initial = _joueur worldToModel (_objet modelToWorld [0,0,0]);
+
+ // Calcul de la position relative de l'objet, basée sur la position initiale, et sécurisée pour ne pas que l'objet rentre dans le joueur lors de la rotation
+ // L'ajout de ce calcul a également rendu inutile le test avec la fonction R3F_LOG_FNCT_unite_marche_dessus lors de la prise de l'objet
+ _pos_rel_objet_initial = [
+ _pos_rel_objet_initial select 0,
+ (_pos_rel_objet_initial select 1) max
+ (
+ ((-(boundingBoxReal _objet select 0 select 0) * sin R3F_LOG_deplace_dir_rel_objet) max (-(boundingBoxReal _objet select 1 select 0) * sin R3F_LOG_deplace_dir_rel_objet)) +
+ ((-(boundingBoxReal _objet select 0 select 1) * cos R3F_LOG_deplace_dir_rel_objet) max (-(boundingBoxReal _objet select 1 select 1) * cos R3F_LOG_deplace_dir_rel_objet)) +
+ 1.2
+ ),
+ _pos_rel_objet_initial select 2
+ ];
+
+ _elev_cam_initial = acos ((ATLtoASL positionCameraToWorld [0, 0, 1] select 2) - (ATLtoASL positionCameraToWorld [0, 0, 0] select 2));
+ };
+ R3F_LOG_deplace_distance_rel_objet = _pos_rel_objet_initial select 1;
+
+ // Détermination du mode d'alignement initial en fonction du type d'objet, de ses dimensions, ...
+ R3F_LOG_deplace_mode_alignement = switch (true) do
+ {
+ case !(_objet isKindOf "Static"): {"sol"};
+ // Objet statique allongé
+ case (
+ ((boundingBoxReal _objet select 1 select 1) - (boundingBoxReal _objet select 0 select 1)) != 0 && // Div par 0
+ {
+ ((boundingBoxReal _objet select 1 select 0) - (boundingBoxReal _objet select 0 select 0)) /
+ ((boundingBoxReal _objet select 1 select 1) - (boundingBoxReal _objet select 0 select 1)) > 1.75
+ }
+ ): {"pente"};
+ // Objet statique carré ou peu allongé
+ default {"horizon"};
+ };
+
+ // On demande à ce que l'objet soit local au joueur pour réduire les latences (setDir, attachTo périodique)
+ if (!local _objet) then
+ {
+ private ["_time_demande_setOwner"];
+ _time_demande_setOwner = time;
+ [_objet, "setOwnerTo", _joueur] call R3F_LOG_FNCT_exec_commande_MP;
+ waitUntil {local _objet || time > _time_demande_setOwner + 1.5};
+ };
+
+ // On prévient tout le monde qu'un nouveau objet va être déplace pour ingorer les éventuelles blessures
+ R3F_LOG_PV_nouvel_objet_en_deplacement = _objet;
+ publicVariable "R3F_LOG_PV_nouvel_objet_en_deplacement";
+ ["R3F_LOG_PV_nouvel_objet_en_deplacement", R3F_LOG_PV_nouvel_objet_en_deplacement] call R3F_LOG_FNCT_PVEH_nouvel_objet_en_deplacement;
+
+ // Mémorisation de l'arme courante et de son mode de tir
+ _arme_courante = currentWeapon _joueur;
+ _muzzle_courant = currentMuzzle _joueur;
+ _mode_muzzle_courant = currentWeaponMode _joueur;
+
+ // Sous l'eau on n'a pas le choix de l'arme
+ if (!surfaceIsWater getPos _joueur) then
+ {
+ // Prise du PA si le joueur en a un
+ if (handgunWeapon _joueur != "") then
+ {
+ _restaurer_arme = false;
+ for [{_idx_muzzle = 0}, {currentWeapon _joueur != handgunWeapon _joueur}, {_idx_muzzle = _idx_muzzle+1}] do
+ {
+ _joueur action ["SWITCHWEAPON", _joueur, _joueur, _idx_muzzle];
+ };
+ }
+ // Sinon pas d'arme dans les mains
+ else
+ {
+ _restaurer_arme = true;
+ _joueur action ["SWITCHWEAPON", _joueur, _joueur, 99999];
+ };
+ } else {_restaurer_arme = false;};
+
+ sleep 0.5;
+
+ // Vérification qu'on ai bien obtenu la main (conflit d'accès simultanés)
+ if (_objet getVariable "R3F_LOG_est_deplace_par" == _joueur && isNull (_objet getVariable ["R3F_LOG_est_transporte_par", objNull])) then
+ {
+ R3F_LOG_deplace_force_setVector = false; // Mettre à true pour forcer la ré-otientation de l'objet, en forçant les filtres anti-flood
+ R3F_LOG_deplace_force_attachTo = false; // Mettre à true pour forcer le repositionnement de l'objet, en forçant les filtres anti-flood
+
+ // Ajout des actions de gestion de l'orientation
+ _action_relacher = _joueur addAction [("" + format [STR_R3F_LOG_action_relacher_objet, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")] + ""), {_this call R3F_LOG_FNCT_objet_relacher}, nil, 10, true, true];
+ _action_aligner_pente = _joueur addAction [("" + STR_R3F_LOG_action_aligner_pente + ""), {R3F_LOG_deplace_mode_alignement = "pente"; R3F_LOG_deplace_force_setVector = true;}, nil, 6, false, true, "", "R3F_LOG_deplace_mode_alignement != ""pente"""];
+ _action_aligner_sol = _joueur addAction [("" + STR_R3F_LOG_action_aligner_sol + ""), {R3F_LOG_deplace_mode_alignement = "sol"; R3F_LOG_deplace_force_setVector = true;}, nil, 6, false, true, "", "R3F_LOG_deplace_mode_alignement != ""sol"""];
+ _action_aligner_horizon = _joueur addAction [("" + STR_R3F_LOG_action_aligner_horizon + ""), {R3F_LOG_deplace_mode_alignement = "horizon"; R3F_LOG_deplace_force_setVector = true;}, nil, 6, false, true, "", "R3F_LOG_deplace_mode_alignement != ""horizon"""];
+ _action_tourner = _joueur addAction [("" + STR_R3F_LOG_action_tourner + ""), {R3F_LOG_deplace_dir_rel_objet = R3F_LOG_deplace_dir_rel_objet + 12; R3F_LOG_deplace_force_setVector = true;}, nil, 6, false, false];
+ _action_rapprocher = _joueur addAction [("" + STR_R3F_LOG_action_rapprocher + ""), {R3F_LOG_deplace_distance_rel_objet = R3F_LOG_deplace_distance_rel_objet - 0.4; R3F_LOG_deplace_force_attachTo = true;}, nil, 6, false, false];
+
+ // Relâcher l'objet dès que le joueur tire. Le detach sert à rendre l'objet solide pour ne pas tirer au travers.
+ _idx_eh_fired = _joueur addEventHandler ["Fired", {if (!surfaceIsWater getPos player) then {detach R3F_LOG_joueur_deplace_objet; R3F_LOG_joueur_deplace_objet = objNull;};}];
+
+ // Gestion des évènements KeyDown et KeyUp pour faire tourner l'objet avec les touches X/C
+ R3F_LOG_joueur_deplace_key_rotation = "";
+ R3F_LOG_joueur_deplace_key_translation = "";
+ _time_derniere_rotation = 0;
+ _time_derniere_translation = 0;
+ _idx_eh_keyDown = (findDisplay 46) displayAddEventHandler ["KeyDown",
+ {
+ switch (_this select 1) do
+ {
+ case 45: {R3F_LOG_joueur_deplace_key_rotation = "X"; true};
+ case 46: {R3F_LOG_joueur_deplace_key_rotation = "C"; true};
+ case 33: {R3F_LOG_joueur_deplace_key_translation = "F"; true};
+ case 19: {R3F_LOG_joueur_deplace_key_translation = "R"; true};
+ default {false};
+ }
+ }];
+ _idx_eh_keyUp = (findDisplay 46) displayAddEventHandler ["KeyUp",
+ {
+ switch (_this select 1) do
+ {
+ case 45: {R3F_LOG_joueur_deplace_key_rotation = ""; true};
+ case 46: {R3F_LOG_joueur_deplace_key_rotation = ""; true};
+ case 33: {R3F_LOG_joueur_deplace_key_translation = ""; true};
+ case 19: {R3F_LOG_joueur_deplace_key_translation = ""; true};
+ default {false};
+ }
+ }];
+
+ // Initialisation de l'historique anti-flood
+ _offset_hauteur = _pos_rel_objet_initial select 2;
+ _dernier_offset_hauteur = _offset_hauteur + 100;
+ _avant_dernier_offset_hauteur = _dernier_offset_hauteur + 100;
+ _dernier_pos_rel_objet = _pos_rel_objet_initial;
+ _avant_dernier_pos_rel_objet = _dernier_pos_rel_objet;
+ _vec_dir_rel = [sin R3F_LOG_deplace_dir_rel_objet, cos R3F_LOG_deplace_dir_rel_objet, 0];
+ _vec_dir_up = [_vec_dir_rel, [0, 0, 1]];
+ _dernier_vec_dir_up = [[0,0,0] vectorDiff (_vec_dir_up select 0), _vec_dir_up select 1];
+ _avant_dernier_vec_dir_up = [_dernier_vec_dir_up select 0, [0,0,0] vectorDiff (_dernier_vec_dir_up select 1)];
+
+ _objet attachTo [_joueur, _pos_rel_objet_initial];
+
+ // Si échec transfert local, mode dégradé : on conserve la direction de l'objet par rapport au joueur
+ if (!local _objet) then {[_objet, "setDir", R3F_LOG_deplace_dir_rel_objet] call R3F_LOG_FNCT_exec_commande_MP;};
+
+ R3F_LOG_mutex_local_verrou = false;
+
+ // Boucle de gestion des évènements et du positionnement pendant le déplacement
+ while {!isNull R3F_LOG_joueur_deplace_objet && _objet getVariable "R3F_LOG_est_deplace_par" == _joueur && alive _joueur} do
+ {
+ // Gestion de l'orientation de l'objet en fonction du terrain
+ if (local _objet) then
+ {
+ // En fonction de la touche appuyée (X/C), on fait pivoter l'objet
+ if (R3F_LOG_joueur_deplace_key_rotation == "X" || R3F_LOG_joueur_deplace_key_rotation == "C") then
+ {
+ // Un cycle sur deux maxi (flood) on modifie de l'angle
+ if (time - _time_derniere_rotation > 0.045) then
+ {
+ if (R3F_LOG_joueur_deplace_key_rotation == "X") then {R3F_LOG_deplace_dir_rel_objet = R3F_LOG_deplace_dir_rel_objet + 4;};
+ if (R3F_LOG_joueur_deplace_key_rotation == "C") then {R3F_LOG_deplace_dir_rel_objet = R3F_LOG_deplace_dir_rel_objet - 4;};
+
+ R3F_LOG_deplace_force_setVector = true;
+ _time_derniere_rotation = time;
+ };
+ } else {_time_derniere_rotation = 0;};
+
+ _vec_dir_rel = [sin R3F_LOG_deplace_dir_rel_objet, cos R3F_LOG_deplace_dir_rel_objet, 0];
+
+ // Conversion de la normale du sol dans le repère du joueur car l'objet est attachTo
+ _normale_surface = surfaceNormal getPos _objet;
+ _normale_surface = (player worldToModel ASLtoATL (_normale_surface vectorAdd getPosASL player)) vectorDiff (player worldToModel ASLtoATL (getPosASL player));
+
+ // Redéfinir l'orientation en fonction du terrain et du mode d'alignement
+ _vec_dir_up = switch (R3F_LOG_deplace_mode_alignement) do
+ {
+ case "sol": {[[-cos R3F_LOG_deplace_dir_rel_objet, sin R3F_LOG_deplace_dir_rel_objet, 0] vectorCrossProduct _normale_surface, _normale_surface]};
+ case "pente": {[_vec_dir_rel, _normale_surface]};
+ default {[_vec_dir_rel, [0, 0, 1]]};
+ };
+
+ // On ré-oriente l'objet, lorsque nécessaire (pas de flood)
+ if (R3F_LOG_deplace_force_setVector ||
+ (
+ // Vecteur dir suffisamment différent du dernier
+ (_vec_dir_up select 0) vectorCos (_dernier_vec_dir_up select 0) < 0.999 &&
+ // et différent de l'avant dernier (pas d'oscillations sans fin)
+ vectorMagnitude ((_vec_dir_up select 0) vectorDiff (_avant_dernier_vec_dir_up select 0)) > 1E-9
+ ) ||
+ (
+ // Vecteur up suffisamment différent du dernier
+ (_vec_dir_up select 1) vectorCos (_dernier_vec_dir_up select 1) < 0.999 &&
+ // et différent de l'avant dernier (pas d'oscillations sans fin)
+ vectorMagnitude ((_vec_dir_up select 1) vectorDiff (_avant_dernier_vec_dir_up select 1)) > 1E-9
+ )
+ ) then
+ {
+ _objet setVectorDirAndUp _vec_dir_up;
+
+ _avant_dernier_vec_dir_up = _dernier_vec_dir_up;
+ _dernier_vec_dir_up = _vec_dir_up;
+
+ R3F_LOG_deplace_force_setVector = false;
+ };
+ };
+
+ sleep 0.015;
+
+ // En fonction de la touche appuyée (F/R), on fait avancer ou reculer l'objet
+ if (R3F_LOG_joueur_deplace_key_translation == "F" || R3F_LOG_joueur_deplace_key_translation == "R") then
+ {
+ // Un cycle sur deux maxi (flood) on modifie de l'angle
+ if (time - _time_derniere_translation > 0.045) then
+ {
+ if (R3F_LOG_joueur_deplace_key_translation == "F") then
+ {
+ R3F_LOG_deplace_distance_rel_objet = R3F_LOG_deplace_distance_rel_objet - 0.075;
+ }
+ else
+ {
+ R3F_LOG_deplace_distance_rel_objet = R3F_LOG_deplace_distance_rel_objet + 0.075;
+ };
+
+ // Borne min-max de la distance
+ R3F_LOG_deplace_distance_rel_objet = R3F_LOG_deplace_distance_rel_objet min (
+ (
+ vectorMagnitude [
+ (-(boundingBoxReal _objet select 0 select 0)) max (boundingBoxReal _objet select 1 select 0),
+ (-(boundingBoxReal _objet select 0 select 1)) max (boundingBoxReal _objet select 1 select 1),
+ 0
+ ] + 2
+ ) max (_pos_rel_objet_initial select 1)
+ ) max (
+ (
+ ((-(boundingBoxReal _objet select 0 select 0) * sin R3F_LOG_deplace_dir_rel_objet) max (-(boundingBoxReal _objet select 1 select 0) * sin R3F_LOG_deplace_dir_rel_objet)) +
+ ((-(boundingBoxReal _objet select 0 select 1) * cos R3F_LOG_deplace_dir_rel_objet) max (-(boundingBoxReal _objet select 1 select 1) * cos R3F_LOG_deplace_dir_rel_objet)) +
+ 1.2
+ )
+ );
+
+ R3F_LOG_deplace_force_attachTo = true;
+ _time_derniere_translation = time;
+ };
+ } else {_time_derniere_translation = 0;};
+
+ // Calcul de la position relative de l'objet, basée sur la position initiale, et sécurisée pour ne pas que l'objet rentre dans le joueur lors de la rotation
+ // L'ajout de ce calcul a également rendu inutile le test avec la fonction R3F_LOG_FNCT_unite_marche_dessus lors de la prise de l'objet
+ _pos_rel_objet = [
+ _pos_rel_objet_initial select 0,
+ R3F_LOG_deplace_distance_rel_objet max
+ (
+ ((-(boundingBoxReal _objet select 0 select 0) * sin R3F_LOG_deplace_dir_rel_objet) max (-(boundingBoxReal _objet select 1 select 0) * sin R3F_LOG_deplace_dir_rel_objet)) +
+ ((-(boundingBoxReal _objet select 0 select 1) * cos R3F_LOG_deplace_dir_rel_objet) max (-(boundingBoxReal _objet select 1 select 1) * cos R3F_LOG_deplace_dir_rel_objet)) +
+ 1.2
+ ),
+ _pos_rel_objet_initial select 2
+ ];
+
+ _elev_cam = acos ((ATLtoASL positionCameraToWorld [0, 0, 1] select 2) - (ATLtoASL positionCameraToWorld [0, 0, 0] select 2));
+ _offset_hauteur_cam = (vectorMagnitude [_pos_rel_objet select 0, _pos_rel_objet select 1, 0]) * tan (89 min (-89 max (_elev_cam_initial - _elev_cam)));
+ _offset_bounding_center = ((_objet modelToWorld boundingCenter _objet) select 2) - ((_objet modelToWorld [0,0,0]) select 2);
+
+ // Calcul de la hauteur de l'objet en fonction de l'élévation de la caméra et du terrain
+ if (_objet isKindOf "Static") then
+ {
+ // En mode horizontal, la plage d'offset terrain est calculée de sorte à conserver au moins un des quatre coins inférieurs en contact avec le sol
+ if (R3F_LOG_deplace_mode_alignement == "horizon") then
+ {
+ _hauteur_terrain_min_max_objet = [_objet] call R3F_LOG_FNCT_3D_get_hauteur_terrain_min_max_objet;
+ _offset_hauteur_terrain_min = (_hauteur_terrain_min_max_objet select 0) - (getPosASL _joueur select 2) + _offset_bounding_center;
+ _offset_hauteur_terrain_max = (_hauteur_terrain_min_max_objet select 1) - (getPosASL _joueur select 2) + _offset_bounding_center;
+
+ // On autorise un léger enterrement jusqu'à 40% de la hauteur de l'objet
+ _offset_hauteur_terrain_min = _offset_hauteur_terrain_min min (_offset_hauteur_terrain_max - 0.4 * ((boundingBoxReal _objet select 1 select 2) - (boundingBoxReal _objet select 0 select 2)) / (_dernier_vec_dir_up select 1 select 2));
+ }
+ // Dans les autres modes d'alignement, on autorise un léger enterrement jusqu'à 40% de la hauteur de l'objet
+ else
+ {
+ _offset_hauteur_terrain_max = getTerrainHeightASL (getPos _objet) - (getPosASL _joueur select 2) + _offset_bounding_center;
+ _offset_hauteur_terrain_min = _offset_hauteur_terrain_max - 0.4 * ((boundingBoxReal _objet select 1 select 2) - (boundingBoxReal _objet select 0 select 2)) / (_dernier_vec_dir_up select 1 select 2);
+ };
+
+ if (R3F_LOG_CFG_no_gravity_objects_can_be_set_in_height_over_ground) then
+ {
+ _offset_hauteur = _offset_hauteur_terrain_min max ((-1.4 + _offset_bounding_center) max ((2.75 + _offset_bounding_center) min ((_pos_rel_objet select 2) + _offset_hauteur_cam)));
+ }
+ else
+ {
+ _offset_hauteur = _offset_hauteur_terrain_min max (_offset_hauteur_terrain_max min ((_pos_rel_objet select 2) + _offset_hauteur_cam)) + (getPosATL _joueur select 2);
+ };
+ }
+ else
+ {
+ _offset_hauteur_terrain = getTerrainHeightASL (getPos _objet) - (getPosASL _joueur select 2) + _offset_bounding_center;
+ _offset_hauteur = _offset_hauteur_terrain max ((-1.4 + _offset_bounding_center) max ((2.75 + _offset_bounding_center) min ((_pos_rel_objet select 2) + _offset_hauteur_cam)));
+ };
+
+ // On repositionne l'objet par rapport au joueur, lorsque nécessaire (pas de flood)
+ if (R3F_LOG_deplace_force_attachTo ||
+ (
+ // Positionnement en hauteur suffisamment différent
+ abs (_offset_hauteur - _dernier_offset_hauteur) > 0.025 &&
+ // et différent de l'avant dernier (pas d'oscillations sans fin)
+ abs (_offset_hauteur - _avant_dernier_offset_hauteur) > 1E-9
+ ) ||
+ (
+ // Position relative suffisamment différente
+ vectorMagnitude (_pos_rel_objet vectorDiff _dernier_pos_rel_objet) > 0.025 &&
+ // et différente de l'avant dernier (pas d'oscillations sans fin)
+ vectorMagnitude (_pos_rel_objet vectorDiff _avant_dernier_pos_rel_objet) > 1E-9
+ )
+ ) then
+ {
+ _objet attachTo [_joueur, [
+ _pos_rel_objet select 0,
+ _pos_rel_objet select 1,
+ _offset_hauteur
+ ]];
+
+ _avant_dernier_offset_hauteur = _dernier_offset_hauteur;
+ _dernier_offset_hauteur = _offset_hauteur;
+
+ _avant_dernier_pos_rel_objet = _dernier_pos_rel_objet;
+ _dernier_pos_rel_objet = _pos_rel_objet;
+
+ R3F_LOG_deplace_force_attachTo = false;
+ };
+
+ // On interdit de monter dans un véhicule tant que l'objet est porté
+ if (vehicle _joueur != _joueur) then
+ {
+ systemChat STR_R3F_LOG_ne_pas_monter_dans_vehicule;
+ _joueur action ["GetOut", vehicle _joueur];
+ _joueur action ["Eject", vehicle _joueur];
+ sleep 1;
+ };
+
+ // Le joueur change d'arme, on stoppe le déplacement et on ne reprendra pas l'arme initiale
+ if (currentWeapon _joueur != "" && currentWeapon _joueur != handgunWeapon _joueur && !surfaceIsWater getPos _joueur) then
+ {
+ R3F_LOG_joueur_deplace_objet = objNull;
+ _restaurer_arme = false;
+ };
+
+ sleep 0.015;
+ };
+
+ // Si l'objet est relaché (et donc pas chargé dans un véhicule)
+ if (isNull (_objet getVariable ["R3F_LOG_est_transporte_par", objNull])) then
+ {
+ // L'objet n'est plus porté, on le repose. Le léger setVelocity vers le haut sert à defreezer les objets qui pourraient flotter.
+ // TODO gestion collision, en particulier si le joueur meurt
+ [_objet, "detachSetVelocity", [0, 0, 0.1]] call R3F_LOG_FNCT_exec_commande_MP;
+ };
+
+ _joueur removeEventHandler ["Fired", _idx_eh_fired];
+ (findDisplay 46) displayRemoveEventHandler ["KeyDown", _idx_eh_keyDown];
+ (findDisplay 46) displayRemoveEventHandler ["KeyUp", _idx_eh_keyUp];
+
+ _joueur removeAction _action_relacher;
+ _joueur removeAction _action_aligner_pente;
+ _joueur removeAction _action_aligner_sol;
+ _joueur removeAction _action_aligner_horizon;
+ _joueur removeAction _action_tourner;
+ _joueur removeAction _action_rapprocher;
+
+ _objet setVariable ["R3F_LOG_est_deplace_par", objNull, true];
+ }
+ // Echec d'obtention de l'objet
+ else
+ {
+ _objet setVariable ["R3F_LOG_est_deplace_par", objNull, true];
+ R3F_LOG_mutex_local_verrou = false;
+ };
+
+ _joueur forceWalk false;
+ R3F_LOG_joueur_deplace_objet = objNull;
+
+ // Reprise de l'arme et restauration de son mode de tir, si nécessaire
+ if (alive _joueur && !surfaceIsWater getPos _joueur && _restaurer_arme) then
+ {
+ for [{_idx_muzzle = 0},
+ {currentWeapon _joueur != _arme_courante ||
+ currentMuzzle _joueur != _muzzle_courant ||
+ currentWeaponMode _joueur != _mode_muzzle_courant},
+ {_idx_muzzle = _idx_muzzle+1}] do
+ {
+ _joueur action ["SWITCHWEAPON", _joueur, _joueur, _idx_muzzle];
+ };
+ };
+
+ sleep 5; // Délai de 5 secondes pour attendre la chute/stabilisation
+ if (!isNull _objet) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_est_deplace_par", objNull]) ||
+ {(!alive (_objet getVariable "R3F_LOG_est_deplace_par")) || (!isPlayer (_objet getVariable "R3F_LOG_est_deplace_par"))}
+ ) then
+ {
+ R3F_LOG_PV_fin_deplacement_objet = _objet;
+ publicVariable "R3F_LOG_PV_fin_deplacement_objet";
+ ["R3F_LOG_PV_fin_deplacement_objet", R3F_LOG_PV_fin_deplacement_objet] call R3F_LOG_FNCT_PVEH_fin_deplacement_objet;
+ };
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_joueur_dans_objet, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ R3F_LOG_mutex_local_verrou = false;
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ R3F_LOG_mutex_local_verrou = false;
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ R3F_LOG_mutex_local_verrou = false;
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/objet_deplacable/relacher.sqf b/mpmissions/Exile.Altis/R3F_LOG/objet_deplacable/relacher.sqf
new file mode 100644
index 0000000..27b3337
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/objet_deplacable/relacher.sqf
@@ -0,0 +1,17 @@
+/**
+ * Passe la variable R3F_LOG_joueur_deplace_objet à objNull pour informer le script "deplacer" d'arrêter de déplacer l'objet
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ R3F_LOG_joueur_deplace_objet = objNull;
+ sleep 0.25;
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/r3f_log_enable.h b/mpmissions/Exile.Altis/R3F_LOG/r3f_log_enable.h
new file mode 100644
index 0000000..eea6cee
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/r3f_log_enable.h
@@ -0,0 +1,9 @@
+/*
+ * Add a double-slash ( // ) at the begining of the #include line to disable the logistics system.
+ * To enable the logistics system, write #define R3F_LOG_enable withouth the double-slash.
+ *
+ * Ajoutez deux barres obliques ( // ) au début de la ligne #include pour désactiver le système logistique.
+ * Pour activer le système logistique, écrivez #define R3F_LOG_enable sans les deux barres obliques.
+ */
+
+#define R3F_LOG_enable
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/remorqueur/detacher.sqf b/mpmissions/Exile.Altis/R3F_LOG/remorqueur/detacher.sqf
new file mode 100644
index 0000000..bf763ea
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/remorqueur/detacher.sqf
@@ -0,0 +1,72 @@
+/**
+ * Détacher un objet d'un véhicule
+ *
+ * @param 0 l'objet à détacher
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_remorqueur", "_objet"];
+
+ _objet = _this select 0;
+ _remorqueur = _objet getVariable "R3F_LOG_est_transporte_par";
+
+ // Ne pas permettre de décrocher un objet s'il est en fait héliporté
+ if (_remorqueur getVariable "R3F_LOG_fonctionnalites" select R3F_LOG_IDX_can_tow) then
+ {
+ [_objet, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ _remorqueur setVariable ["R3F_LOG_remorque", objNull, true];
+ _objet setVariable ["R3F_LOG_est_transporte_par", objNull, true];
+
+ // Le léger setVelocity vers le haut sert à defreezer les objets qui pourraient flotter.
+ [_objet, "detachSetVelocity", [0, 0, 0.1]] call R3F_LOG_FNCT_exec_commande_MP;
+
+ player playMove format ["AinvPknlMstpSlay%1Dnon_medic", switch (currentWeapon player) do
+ {
+ case "": {"Wnon"};
+ case primaryWeapon player: {"Wrfl"};
+ case secondaryWeapon player: {"Wlnr"};
+ case handgunWeapon player: {"Wpst"};
+ default {"Wrfl"};
+ }];
+ sleep 7;
+
+ if (alive player) then
+ {
+ if (_objet getVariable "R3F_LOG_fonctionnalites" select R3F_LOG_IDX_can_be_moved_by_player) then
+ {
+ // Si personne n'a touché à l'objet pendant le sleep 7
+ if (isNull (_remorqueur getVariable "R3F_LOG_remorque") &&
+ (isNull (_objet getVariable "R3F_LOG_est_transporte_par")) &&
+ (isNull (_objet getVariable "R3F_LOG_est_deplace_par"))
+ ) then
+ {
+ [_objet, player, 0, true] spawn R3F_LOG_FNCT_objet_deplacer;
+ };
+ }
+ else
+ {
+ systemChat STR_R3F_LOG_action_detacher_fait;
+ };
+ };
+ }
+ else
+ {
+ hintC STR_R3F_LOG_action_detacher_impossible_pour_ce_vehicule;
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorquer_deplace.sqf b/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorquer_deplace.sqf
new file mode 100644
index 0000000..16fd674
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorquer_deplace.sqf
@@ -0,0 +1,102 @@
+/**
+ * Remorque l'objet déplacé par le joueur avec un remorqueur
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_objet", "_remorqueur", "_offset_attach_y"];
+
+ _objet = R3F_LOG_joueur_deplace_objet;
+ _remorqueur = [_objet, 5] call R3F_LOG_FNCT_3D_cursorTarget_virtuel;
+
+ if (!isNull _remorqueur && {
+ _remorqueur getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select R3F_LOG_IDX_can_tow &&
+ alive _remorqueur && isNull (_remorqueur getVariable "R3F_LOG_remorque") && (vectorMagnitude velocity _remorqueur < 6) && !(_remorqueur getVariable "R3F_LOG_disabled")
+ }) then
+ {
+ [_remorqueur, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ _remorqueur setVariable ["R3F_LOG_remorque", _objet, true];
+ _objet setVariable ["R3F_LOG_est_transporte_par", _remorqueur, true];
+
+ // On place le joueur sur le côté du véhicule en fonction qu'il se trouve à sa gauche ou droite
+ if ((_remorqueur worldToModel (player modelToWorld [0,0,0])) select 0 > 0) then
+ {
+ player attachTo [_remorqueur, [
+ (boundingBoxReal _remorqueur select 1 select 0) + 0.5,
+ (boundingBoxReal _remorqueur select 0 select 1),
+ (boundingBoxReal _remorqueur select 0 select 2) - (boundingBoxReal player select 0 select 2)
+ ]];
+
+ player setDir 270;
+ }
+ else
+ {
+ player attachTo [_remorqueur, [
+ (boundingBoxReal _remorqueur select 0 select 0) - 0.5,
+ (boundingBoxReal _remorqueur select 0 select 1),
+ (boundingBoxReal _remorqueur select 0 select 2) - (boundingBoxReal player select 0 select 2)
+ ]];
+
+ player setDir 90;
+ };
+
+ // Faire relacher l'objet au joueur
+ R3F_LOG_joueur_deplace_objet = objNull;
+
+ player playMove format ["AinvPknlMstpSlay%1Dnon_medic", switch (currentWeapon player) do
+ {
+ case "": {"Wnon"};
+ case primaryWeapon player: {"Wrfl"};
+ case secondaryWeapon player: {"Wlnr"};
+ case handgunWeapon player: {"Wpst"};
+ default {"Wrfl"};
+ }];
+ sleep 2;
+
+ // Quelques corrections visuelles pour des classes spécifiques
+ if (typeOf _remorqueur == "B_Truck_01_mover_F") then {_offset_attach_y = 1.0;}
+ else {_offset_attach_y = 0.2;};
+
+ // Attacher à l'arrière du véhicule au ras du sol
+ _objet attachTo [_remorqueur, [
+ (boundingCenter _objet select 0),
+ (boundingBoxReal _remorqueur select 0 select 1) + (boundingBoxReal _objet select 0 select 1) + _offset_attach_y,
+ (boundingBoxReal _remorqueur select 0 select 2) - (boundingBoxReal _objet select 0 select 2)
+ ]];
+
+ detach player;
+
+ // Si l'objet est une arme statique, on corrige l'orientation en fonction de la direction du canon
+ if (_objet isKindOf "StaticWeapon") then
+ {
+ private ["_azimut_canon"];
+
+ _azimut_canon = ((_objet weaponDirection (weapons _objet select 0)) select 0) atan2 ((_objet weaponDirection (weapons _objet select 0)) select 1);
+
+ // Seul le D30 a le canon pointant vers le véhicule
+ if !(_objet isKindOf "D30_Base") then // All in Arma
+ {
+ _azimut_canon = _azimut_canon + 180;
+ };
+
+ [_objet, "setDir", (getDir _objet)-_azimut_canon] call R3F_LOG_FNCT_exec_commande_MP;
+ };
+
+ sleep 7;
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorquer_direct.sqf b/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorquer_direct.sqf
new file mode 100644
index 0000000..afc1216
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorquer_direct.sqf
@@ -0,0 +1,140 @@
+/**
+ * Remorque l'objet pointé au véhicule remorqueur valide le plus proche
+ *
+ * @param 0 l'objet à remorquer
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_objet", "_remorqueur", "_offset_attach_y"];
+
+ _objet = _this select 0;
+
+ // Recherche du remorqueur valide le plus proche
+ _remorqueur = objNull;
+ {
+ if (
+ _x != _objet && (_x getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select R3F_LOG_IDX_can_tow) &&
+ alive _x && isNull (_x getVariable "R3F_LOG_est_transporte_par") &&
+ isNull (_x getVariable "R3F_LOG_remorque") && (vectorMagnitude velocity _x < 6) &&
+ !([_x, player] call R3F_LOG_FNCT_objet_est_verrouille) && !(_x getVariable "R3F_LOG_disabled") &&
+ {
+ private ["_delta_pos"];
+
+ _delta_pos =
+ (
+ _objet modelToWorld
+ [
+ boundingCenter _objet select 0,
+ boundingBoxReal _objet select 1 select 1,
+ boundingBoxReal _objet select 0 select 2
+ ]
+ ) vectorDiff (
+ _x modelToWorld
+ [
+ boundingCenter _x select 0,
+ boundingBoxReal _x select 0 select 1,
+ boundingBoxReal _x select 0 select 2
+ ]
+ );
+
+ // L'arrière du remorqueur est proche de l'avant de l'objet pointé
+ abs (_delta_pos select 0) < 3 && abs (_delta_pos select 1) < 5
+ }
+ ) exitWith {_remorqueur = _x;};
+ } forEach (nearestObjects [_objet, ["All"], 30]);
+
+ if (!isNull _remorqueur) then
+ {
+ if (isNull (_objet getVariable "R3F_LOG_est_transporte_par") && (isNull (_objet getVariable "R3F_LOG_est_deplace_par") || (!alive (_objet getVariable "R3F_LOG_est_deplace_par")) || (!isPlayer (_objet getVariable "R3F_LOG_est_deplace_par")))) then
+ {
+ [_remorqueur, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ _remorqueur setVariable ["R3F_LOG_remorque", _objet, true];
+ _objet setVariable ["R3F_LOG_est_transporte_par", _remorqueur, true];
+
+ // On place le joueur sur le côté du véhicule en fonction qu'il se trouve à sa gauche ou droite
+ if ((_remorqueur worldToModel (player modelToWorld [0,0,0])) select 0 > 0) then
+ {
+ player attachTo [_remorqueur, [
+ (boundingBoxReal _remorqueur select 1 select 0) + 0.5,
+ (boundingBoxReal _remorqueur select 0 select 1),
+ (boundingBoxReal _remorqueur select 0 select 2) - (boundingBoxReal player select 0 select 2)
+ ]];
+
+ player setDir 270;
+ }
+ else
+ {
+ player attachTo [_remorqueur, [
+ (boundingBoxReal _remorqueur select 0 select 0) - 0.5,
+ (boundingBoxReal _remorqueur select 0 select 1),
+ (boundingBoxReal _remorqueur select 0 select 2) - (boundingBoxReal player select 0 select 2)
+ ]];
+
+ player setDir 90;
+ };
+
+ player playMove format ["AinvPknlMstpSlay%1Dnon_medic", switch (currentWeapon player) do
+ {
+ case "": {"Wnon"};
+ case primaryWeapon player: {"Wrfl"};
+ case secondaryWeapon player: {"Wlnr"};
+ case handgunWeapon player: {"Wpst"};
+ default {"Wrfl"};
+ }];
+ sleep 2;
+
+ // Quelques corrections visuelles pour des classes spécifiques
+ if (typeOf _remorqueur == "B_Truck_01_mover_F") then {_offset_attach_y = 1.0;}
+ else {_offset_attach_y = 0.2;};
+
+ // Attacher à l'arrière du véhicule au ras du sol
+ _objet attachTo [_remorqueur, [
+ (boundingCenter _objet select 0),
+ (boundingBoxReal _remorqueur select 0 select 1) + (boundingBoxReal _objet select 0 select 1) + _offset_attach_y,
+ (boundingBoxReal _remorqueur select 0 select 2) - (boundingBoxReal _objet select 0 select 2)
+ ]];
+
+ R3F_LOG_objet_selectionne = objNull;
+
+ detach player;
+
+ // Si l'objet est une arme statique, on corrige l'orientation en fonction de la direction du canon
+ if (_objet isKindOf "StaticWeapon") then
+ {
+ private ["_azimut_canon"];
+
+ _azimut_canon = ((_objet weaponDirection (weapons _objet select 0)) select 0) atan2 ((_objet weaponDirection (weapons _objet select 0)) select 1);
+
+ // Seul le D30 a le canon pointant vers le véhicule
+ if !(_objet isKindOf "D30_Base") then // All in Arma
+ {
+ _azimut_canon = _azimut_canon + 180;
+ };
+
+ [_objet, "setDir", (getDir _objet)-_azimut_canon] call R3F_LOG_FNCT_exec_commande_MP;
+ };
+
+ sleep 7;
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorqueur_init.sqf b/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorqueur_init.sqf
new file mode 100644
index 0000000..f212a0b
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/remorqueur/remorqueur_init.sqf
@@ -0,0 +1,17 @@
+/**
+ * Initialise un véhicule remorqueur
+ *
+ * @param 0 le remorqueur
+ */
+
+private ["_remorqueur"];
+
+_remorqueur = _this select 0;
+
+// Définition locale de la variable si elle n'est pas définie sur le réseau
+if (isNil {_remorqueur getVariable "R3F_LOG_remorque"}) then
+{
+ _remorqueur setVariable ["R3F_LOG_remorque", objNull, false];
+};
+
+_remorqueur addAction [("" + STR_R3F_LOG_action_remorquer_deplace + ""), {_this call R3F_LOG_FNCT_remorqueur_remorquer_deplace}, nil, 7, true, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_joueur_deplace_objet != _target && R3F_LOG_action_remorquer_deplace_valide"];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/surveiller_conditions_actions_menu.sqf b/mpmissions/Exile.Altis/R3F_LOG/surveiller_conditions_actions_menu.sqf
new file mode 100644
index 0000000..f245694
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/surveiller_conditions_actions_menu.sqf
@@ -0,0 +1,291 @@
+/**
+ * Evalue régulièrement les conditions à vérifier pour autoriser les actions logistiques
+ * Permet de diminuer la fréquence des vérifications des conditions normalement faites
+ * dans les addAction (~60Hz) et donc de limiter la consommation CPU.
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_joueur", "_vehicule_joueur", "_cursorTarget_distance", "_objet_pointe", "_objet_pas_en_cours_de_deplacement", "_fonctionnalites", "_pas_de_hook"];
+private ["_objet_deverrouille", "_objet_pointe_autre_que_deplace", "_objet_pointe_autre_que_deplace_deverrouille", "_isUav", "_usine_autorisee_client"];
+
+// Indices du tableau des fonctionnalités retourné par R3F_LOG_FNCT_determiner_fonctionnalites_logistique
+#define __can_be_depl_heli_remorq_transp 0
+#define __can_be_moved_by_player 1
+#define __can_lift 2
+#define __can_be_lifted 3
+#define __can_tow 4
+#define __can_be_towed 5
+#define __can_transport_cargo 6
+#define __can_transport_cargo_cout 7
+#define __can_be_transported_cargo 8
+#define __can_be_transported_cargo_cout 9
+
+sleep 2;
+
+while {true} do
+{
+ _joueur = player;
+ _vehicule_joueur = vehicle _joueur;
+
+ _cursorTarget_distance = call R3F_LOG_FNCT_3D_cursorTarget_distance_bbox;
+ _objet_pointe = _cursorTarget_distance select 0;
+
+ if (call compile R3F_LOG_CFG_string_condition_allow_logistics_on_this_client &&
+ !R3F_LOG_mutex_local_verrou && _vehicule_joueur == _joueur && !isNull _objet_pointe && _cursorTarget_distance select 1 < 3.75
+ ) then
+ {
+ R3F_LOG_objet_addAction = _objet_pointe;
+
+ _fonctionnalites = _objet_pointe getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log];
+
+ _objet_pas_en_cours_de_deplacement = (isNull (_objet_pointe getVariable ["R3F_LOG_est_deplace_par", objNull]) ||
+ {(!alive (_objet_pointe getVariable "R3F_LOG_est_deplace_par")) || (!isPlayer (_objet_pointe getVariable "R3F_LOG_est_deplace_par"))});
+
+ _isUav = (getNumber (configFile >> "CfgVehicles" >> (typeOf _objet_pointe) >> "isUav") == 1);
+
+ _usine_autorisee_client = call compile R3F_LOG_CFG_string_condition_allow_creation_factory_on_this_client;
+
+ // L'objet est-il déverrouillé
+ _objet_deverrouille = !([_objet_pointe, _joueur] call R3F_LOG_FNCT_objet_est_verrouille);
+
+ // Trouver l'objet pointé qui se trouve derrière l'objet en cours de déplacement
+ _objet_pointe_autre_que_deplace = [R3F_LOG_joueur_deplace_objet, 3.75] call R3F_LOG_FNCT_3D_cursorTarget_virtuel;
+
+ if (!isNull _objet_pointe_autre_que_deplace) then
+ {
+ // L'objet (pointé qui se trouve derrière l'objet en cours de déplacement) est-il déverrouillé
+ _objet_pointe_autre_que_deplace_deverrouille = !([_objet_pointe_autre_que_deplace, _joueur] call R3F_LOG_FNCT_objet_est_verrouille);
+ };
+
+ // Si l'objet est un objet déplaçable
+ if (_fonctionnalites select __can_be_moved_by_player) then
+ {
+ // Condition action deplacer_objet
+ R3F_LOG_action_deplacer_objet_valide = (count crew _objet_pointe == 0 || _isUav) && (isNull R3F_LOG_joueur_deplace_objet) &&
+ _objet_pas_en_cours_de_deplacement && isNull (_objet_pointe getVariable "R3F_LOG_est_transporte_par") &&
+ _objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled");
+
+ // Condition action revendre_usine_deplace
+ R3F_LOG_action_revendre_usine_deplace_valide = _usine_autorisee_client && R3F_LOG_CFG_CF_sell_back_bargain_rate != -1 &&
+ _objet_pointe getVariable ["R3F_LOG_CF_depuis_usine", false] && (count crew _objet_pointe == 0 || _isUav) &&
+ (R3F_LOG_joueur_deplace_objet == _objet_pointe) && !(_objet_pointe getVariable "R3F_LOG_disabled") && !isNull _objet_pointe_autre_que_deplace &&
+ {
+ !(_objet_pointe_autre_que_deplace getVariable ["R3F_LOG_CF_disabled", true]) &&
+ _objet_pointe_autre_que_deplace getVariable ["R3F_LOG_CF_side_addAction", side group _joueur] == side group _joueur &&
+ (abs ((getPosASL _objet_pointe_autre_que_deplace select 2) - (getPosASL player select 2)) < 2.5) &&
+ alive _objet_pointe_autre_que_deplace && (vectorMagnitude velocity _objet_pointe_autre_que_deplace < 6)
+ };
+ };
+
+ // Si l'objet est un objet remorquable
+ if (_fonctionnalites select __can_be_towed) then
+ {
+ // Et qu'il est déplaçable
+ if (_fonctionnalites select __can_be_moved_by_player) then
+ {
+ // Condition action remorquer_deplace
+ R3F_LOG_action_remorquer_deplace_valide = !(_objet_pointe getVariable "R3F_LOG_disabled") && (count crew _objet_pointe == 0 || _isUav) &&
+ (R3F_LOG_joueur_deplace_objet == _objet_pointe) && !isNull _objet_pointe_autre_que_deplace &&
+ {
+ (_objet_pointe_autre_que_deplace getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select __can_tow) && alive _objet_pointe_autre_que_deplace &&
+ isNull (_objet_pointe_autre_que_deplace getVariable "R3F_LOG_est_transporte_par") && isNull (_objet_pointe_autre_que_deplace getVariable "R3F_LOG_remorque") &&
+ (vectorMagnitude velocity _objet_pointe_autre_que_deplace < 6) &&
+ _objet_pointe_autre_que_deplace_deverrouille && !(_objet_pointe_autre_que_deplace getVariable "R3F_LOG_disabled")
+ };
+ };
+
+ // Condition action selectionner_objet_remorque
+ R3F_LOG_action_remorquer_direct_valide = (count crew _objet_pointe == 0 || _isUav) && isNull R3F_LOG_joueur_deplace_objet &&
+ isNull (_objet_pointe getVariable "R3F_LOG_est_transporte_par") && isNull (_objet_pointe getVariable ["R3F_LOG_remorque", objNull]) &&
+ _objet_pas_en_cours_de_deplacement && _objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled") &&
+ {
+ {
+ _x != _objet_pointe && (_x getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select __can_tow) &&
+ alive _x && isNull (_x getVariable "R3F_LOG_est_transporte_par") &&
+ isNull (_x getVariable "R3F_LOG_remorque") && (vectorMagnitude velocity _x < 6) &&
+ !([_x, _joueur] call R3F_LOG_FNCT_objet_est_verrouille) && !(_x getVariable "R3F_LOG_disabled") &&
+ {
+ private ["_delta_pos"];
+
+ _delta_pos =
+ (
+ _objet_pointe modelToWorld
+ [
+ boundingCenter _objet_pointe select 0,
+ boundingBoxReal _objet_pointe select 1 select 1,
+ boundingBoxReal _objet_pointe select 0 select 2
+ ]
+ ) vectorDiff (
+ _x modelToWorld
+ [
+ boundingCenter _x select 0,
+ boundingBoxReal _x select 0 select 1,
+ boundingBoxReal _x select 0 select 2
+ ]
+ );
+
+ // L'arrière du remorqueur est proche de l'avant de l'objet pointé
+ abs (_delta_pos select 0) < 3 && abs (_delta_pos select 1) < 5
+ }
+ } count (nearestObjects [_objet_pointe, ["All"], 30]) != 0
+ };
+
+ // Condition action detacher
+ R3F_LOG_action_detacher_valide = (isNull R3F_LOG_joueur_deplace_objet) &&
+ !isNull (_objet_pointe getVariable "R3F_LOG_est_transporte_par") && _objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled");
+ };
+
+ // Si l'objet est un objet transportable
+ if (_fonctionnalites select __can_be_transported_cargo) then
+ {
+ // Et qu'il est déplaçable
+ if (_fonctionnalites select __can_be_moved_by_player) then
+ {
+ // Condition action charger_deplace
+ R3F_LOG_action_charger_deplace_valide = (count crew _objet_pointe == 0 || _isUav) && (R3F_LOG_joueur_deplace_objet == _objet_pointe) &&
+ !(_objet_pointe getVariable "R3F_LOG_disabled") && !isNull _objet_pointe_autre_que_deplace &&
+ {
+ (_objet_pointe_autre_que_deplace getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select __can_transport_cargo) &&
+ (abs ((getPosASL _objet_pointe_autre_que_deplace select 2) - (getPosASL player select 2)) < 2.5) &&
+ alive _objet_pointe_autre_que_deplace && (vectorMagnitude velocity _objet_pointe_autre_que_deplace < 6) &&
+ _objet_pointe_autre_que_deplace_deverrouille && !(_objet_pointe_autre_que_deplace getVariable "R3F_LOG_disabled")
+ };
+ };
+
+ // Condition action selectionner_objet_charge
+ R3F_LOG_action_selectionner_objet_charge_valide = (count crew _objet_pointe == 0 || _isUav) && isNull R3F_LOG_joueur_deplace_objet &&
+ isNull (_objet_pointe getVariable "R3F_LOG_est_transporte_par") &&
+ _objet_pas_en_cours_de_deplacement && _objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled");
+ };
+
+ // Si l'objet est un véhicule remorqueur
+ if (_fonctionnalites select __can_tow) then
+ {
+ // Condition action remorquer_deplace
+ R3F_LOG_action_remorquer_deplace_valide = (alive _objet_pointe) && (!isNull R3F_LOG_joueur_deplace_objet) &&
+ !(R3F_LOG_joueur_deplace_objet getVariable "R3F_LOG_disabled") && (R3F_LOG_joueur_deplace_objet != _objet_pointe) &&
+ (R3F_LOG_joueur_deplace_objet getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select __can_be_towed) &&
+ isNull (_objet_pointe getVariable "R3F_LOG_est_transporte_par") &&
+ isNull (_objet_pointe getVariable "R3F_LOG_remorque") && (vectorMagnitude velocity _objet_pointe < 6) &&
+ _objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled");
+ };
+
+ // Si l'objet est un véhicule transporteur
+ if (_fonctionnalites select __can_transport_cargo) then
+ {
+ // Condition action charger_deplace
+ R3F_LOG_action_charger_deplace_valide = alive _objet_pointe && (!isNull R3F_LOG_joueur_deplace_objet) &&
+ !(R3F_LOG_joueur_deplace_objet getVariable "R3F_LOG_disabled") && (R3F_LOG_joueur_deplace_objet != _objet_pointe) &&
+ (R3F_LOG_joueur_deplace_objet getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select __can_be_transported_cargo) &&
+ (vectorMagnitude velocity _objet_pointe < 6) && _objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled");
+
+ // Condition action charger_selection
+ R3F_LOG_action_charger_selection_valide = alive _objet_pointe && (isNull R3F_LOG_joueur_deplace_objet) &&
+ (!isNull R3F_LOG_objet_selectionne) && (R3F_LOG_objet_selectionne != _objet_pointe) &&
+ !(R3F_LOG_objet_selectionne getVariable "R3F_LOG_disabled") &&
+ (R3F_LOG_objet_selectionne getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select __can_be_transported_cargo) &&
+ (vectorMagnitude velocity _objet_pointe < 6) && _objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled");
+
+ // Condition action contenu_vehicule
+ R3F_LOG_action_contenu_vehicule_valide = alive _objet_pointe && (isNull R3F_LOG_joueur_deplace_objet) &&
+ (vectorMagnitude velocity _objet_pointe < 6) && _objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled");
+ };
+
+ // Condition action ouvrir_usine
+ R3F_LOG_action_ouvrir_usine_valide = _usine_autorisee_client && isNull R3F_LOG_joueur_deplace_objet &&
+ !(_objet_pointe getVariable "R3F_LOG_CF_disabled") && alive _objet_pointe &&
+ _objet_pointe getVariable ["R3F_LOG_CF_side_addAction", side group _joueur] == side group _joueur;
+
+ // Condition action revendre_usine_deplace
+ R3F_LOG_action_revendre_usine_deplace_valide = _usine_autorisee_client && R3F_LOG_CFG_CF_sell_back_bargain_rate != -1 && alive _objet_pointe &&
+ (!isNull R3F_LOG_joueur_deplace_objet) && R3F_LOG_joueur_deplace_objet getVariable ["R3F_LOG_CF_depuis_usine", false] &&
+ !(R3F_LOG_joueur_deplace_objet getVariable "R3F_LOG_disabled") && (R3F_LOG_joueur_deplace_objet != _objet_pointe) &&
+ (vectorMagnitude velocity _objet_pointe < 6) && !(_objet_pointe getVariable "R3F_LOG_CF_disabled") &&
+ _objet_pointe getVariable ["R3F_LOG_CF_side_addAction", side group _joueur] == side group _joueur;
+
+ // Condition action revendre_usine_selection
+ R3F_LOG_action_revendre_usine_selection_valide = _usine_autorisee_client && R3F_LOG_CFG_CF_sell_back_bargain_rate != -1 && alive _objet_pointe &&
+ (isNull R3F_LOG_joueur_deplace_objet) && R3F_LOG_objet_selectionne getVariable ["R3F_LOG_CF_depuis_usine", false] &&
+ (!isNull R3F_LOG_objet_selectionne) && (R3F_LOG_objet_selectionne != _objet_pointe) && !(R3F_LOG_objet_selectionne getVariable "R3F_LOG_disabled") &&
+ (vectorMagnitude velocity _objet_pointe < 6) && !(_objet_pointe getVariable "R3F_LOG_CF_disabled") &&
+ _objet_pointe getVariable ["R3F_LOG_CF_side_addAction", side group _joueur] == side group _joueur;
+
+ // Condition action revendre_usine_direct
+ R3F_LOG_action_revendre_usine_direct_valide = _usine_autorisee_client && R3F_LOG_CFG_CF_sell_back_bargain_rate != -1 &&
+ _objet_pointe getVariable ["R3F_LOG_CF_depuis_usine", false] && (count crew _objet_pointe == 0 || _isUav) &&
+ isNull R3F_LOG_joueur_deplace_objet && isNull (_objet_pointe getVariable ["R3F_LOG_est_transporte_par", objNull]) &&
+ _objet_pas_en_cours_de_deplacement &&
+ {
+ _objet_pointe distance _x < 20 && !(_x getVariable "R3F_LOG_CF_disabled") &&
+ _x getVariable ["R3F_LOG_CF_side_addAction", side group _joueur] == side group _joueur
+ } count R3F_LOG_CF_liste_usines != 0;
+
+ // Condition déverrouiller objet
+ R3F_LOG_action_deverrouiller_valide = _objet_pas_en_cours_de_deplacement && !_objet_deverrouille && !(_objet_pointe getVariable "R3F_LOG_disabled");
+ }
+ else
+ {
+ R3F_LOG_action_deplacer_objet_valide = false;
+ R3F_LOG_action_remorquer_direct_valide = false;
+ R3F_LOG_action_detacher_valide = false;
+ R3F_LOG_action_selectionner_objet_charge_valide = false;
+ R3F_LOG_action_remorquer_deplace_valide = false;
+ R3F_LOG_action_charger_deplace_valide = false;
+ R3F_LOG_action_charger_selection_valide = false;
+ R3F_LOG_action_contenu_vehicule_valide = false;
+ R3F_LOG_action_ouvrir_usine_valide = false;
+ R3F_LOG_action_selectionner_objet_revendre_usine_valide = false;
+ R3F_LOG_action_revendre_usine_direct_valide = false;
+ R3F_LOG_action_revendre_usine_deplace_valide = false;
+ R3F_LOG_action_revendre_usine_selection_valide = false;
+ R3F_LOG_action_deverrouiller_valide = false;
+ };
+
+ // Si le joueur est pilote dans un héliporteur
+ if (call compile R3F_LOG_CFG_string_condition_allow_logistics_on_this_client &&
+ !R3F_LOG_mutex_local_verrou && _vehicule_joueur != _joueur && driver _vehicule_joueur == _joueur && {_vehicule_joueur getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select __can_lift}
+ ) then
+ {
+ R3F_LOG_objet_addAction = _vehicule_joueur;
+
+ // Note : pas de restriction liée à R3F_LOG_proprietaire_verrou pour l'héliportage
+
+ // A partir des versions > 1.32, on interdit le lift si le hook de BIS est utilisé
+ if (productVersion select 2 > 132) then
+ {
+ // Call compile car la commande getSlingLoad n'existe pas en 1.32
+ _pas_de_hook = _vehicule_joueur call compile format ["isNull getSlingLoad _this"];
+ }
+ else
+ {
+ _pas_de_hook = true;
+ };
+
+ // Condition action heliporter
+ R3F_LOG_action_heliporter_valide = !(_vehicule_joueur getVariable "R3F_LOG_disabled") && _pas_de_hook &&
+ isNull (_vehicule_joueur getVariable "R3F_LOG_heliporte") && (vectorMagnitude velocity _vehicule_joueur < 6) &&
+ {
+ {
+ (_x getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select __can_be_lifted) &&
+ _x != _vehicule_joueur && !(_x getVariable "R3F_LOG_disabled") &&
+ ((getPosASL _vehicule_joueur select 2) - (getPosASL _x select 2) > 2 && (getPosASL _vehicule_joueur select 2) - (getPosASL _x select 2) < 15)
+ } count (nearestObjects [_vehicule_joueur, ["All"], 15]) != 0
+ };
+
+ // Condition action heliport_larguer
+ R3F_LOG_action_heliport_larguer_valide = !isNull (_vehicule_joueur getVariable "R3F_LOG_heliporte") && !(_vehicule_joueur getVariable "R3F_LOG_disabled") &&
+ (vectorMagnitude velocity _vehicule_joueur < 25) && ((getPosASL _vehicule_joueur select 2) - (0 max getTerrainHeightASL getPos _vehicule_joueur) < 40);
+ }
+ else
+ {
+ R3F_LOG_action_heliporter_valide = false;
+ R3F_LOG_action_heliport_larguer_valide = false;
+ };
+
+ sleep 0.4;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/surveiller_nouveaux_objets.sqf b/mpmissions/Exile.Altis/R3F_LOG/surveiller_nouveaux_objets.sqf
new file mode 100644
index 0000000..a570f9a
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/surveiller_nouveaux_objets.sqf
@@ -0,0 +1,187 @@
+/**
+ * Recherche périodiquement les nouveaux objets pour leur ajouter les fonctionnalités de logistique si besoin
+ * Script à faire tourner dans un fil d'exécution dédié
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+sleep 4;
+
+private
+[
+ "_compteur_cyclique", "_liste_nouveaux_objets", "_liste_vehicules_connus", "_liste_statiques", "_liste_nouveaux_statiques",
+ "_liste_statiques_connus", "_liste_statiques_cycle_precedent", "_count_liste_objets", "_i", "_objet", "_fonctionnalites",
+ "_liste_purge", "_seuil_nb_statiques_avant_purge", "_seuil_nb_vehicules_avant_purge"
+];
+
+// Contiendra la liste des objets déjà parcourus récupérés avec la commande "vehicles"
+_liste_vehicules_connus = [];
+// Contiendra la liste des objets dérivant de "Static" (caisse de mun, drapeau, ...) déjà parcourus récupérés avec la commande "nearestObjects"
+_liste_statiques_connus = [];
+// Contiendra la liste des objets "Static" récupérés lors du tour de boucle précécent (optimisation des opérations sur les tableaux)
+_liste_statiques_cycle_precedent = [];
+
+// Indices du tableau des fonctionnalités retourné par R3F_LOG_FNCT_determiner_fonctionnalites_logistique
+#define __can_be_depl_heli_remorq_transp 0
+#define __can_be_moved_by_player 1
+#define __can_lift 2
+#define __can_be_lifted 3
+#define __can_tow 4
+#define __can_be_towed 5
+#define __can_transport_cargo 6
+#define __can_transport_cargo_cout 7
+#define __can_be_transported_cargo 8
+#define __can_be_transported_cargo_cout 9
+
+// Période de recherche des objets dérivant de "Static"
+#define __tempo 3
+// Utiliser la commande vehicles une fois tout les X cycles de période __tempo
+#define __nb_cycles_commande_vehicles 4
+
+_compteur_cyclique = 0;
+_seuil_nb_statiques_avant_purge = 150;
+_seuil_nb_vehicules_avant_purge = 150;
+
+while {true} do
+{
+ if (!isNull player) then
+ {
+ // Tout les __nb_cycles_commande_vehicles ou sur ordre, on récupère les nouveaux véhicules du jeu
+ if (_compteur_cyclique == 0 || R3F_LOG_PUBVAR_nouvel_objet_a_initialiser) then
+ {
+ R3F_LOG_PUBVAR_nouvel_objet_a_initialiser = false; // Acquittement local
+
+ // Purge de _liste_vehicules_connus quand nécessaire
+ if (count _liste_vehicules_connus > _seuil_nb_vehicules_avant_purge) then
+ {
+ _liste_purge = [];
+ {
+ if (!isNull _x) then
+ {
+ _liste_purge pushBack _x;
+ };
+ } forEach _liste_vehicules_connus;
+
+ _liste_vehicules_connus = _liste_purge;
+ _seuil_nb_vehicules_avant_purge = count _liste_vehicules_connus + 75;
+ };
+
+ // Purge de _liste_statiques_connus quand nécessaire
+ if (count _liste_statiques_connus > _seuil_nb_statiques_avant_purge) then
+ {
+ _liste_purge = [];
+ {
+ if (!isNull _x &&
+ {
+ !isNil {_x getVariable "R3F_LOG_fonctionnalites"} ||
+ (_x getVariable ["R3F_LOG_CF_depuis_usine", false])
+ }
+ ) then
+ {
+ _liste_purge pushBack _x;
+ };
+ } forEach _liste_statiques_connus;
+
+ _liste_statiques_connus = _liste_purge;
+ _seuil_nb_statiques_avant_purge = count _liste_statiques_connus + 150;
+ };
+
+ // Récupération des nouveaux véhicules
+ _liste_nouveaux_objets = vehicles - _liste_vehicules_connus;
+ _liste_vehicules_connus = _liste_vehicules_connus + _liste_nouveaux_objets;
+ }
+ else
+ {
+ _liste_nouveaux_objets = [];
+ };
+ _compteur_cyclique = (_compteur_cyclique + 1) mod __nb_cycles_commande_vehicles;
+
+ // En plus des nouveaux véhicules, on récupère les statiques (caisse de mun, drapeau, ...) proches du joueur non connus
+ // Optimisation "_liste_statiques_cycle_precedent" : et qui n'étaient pas proches du joueur au cycle précédent
+ _liste_statiques = nearestObjects [player, ["Static"], 25];
+ if (count _liste_statiques != 0) then
+ {
+ _liste_nouveaux_statiques = _liste_statiques - _liste_statiques_cycle_precedent - _liste_statiques_connus;
+ _liste_statiques_connus = _liste_statiques_connus + _liste_nouveaux_statiques;
+ _liste_statiques_cycle_precedent = _liste_statiques;
+ }
+ else
+ {
+ _liste_nouveaux_statiques = [];
+ _liste_statiques_cycle_precedent = [];
+ };
+
+ _liste_nouveaux_objets = _liste_nouveaux_objets + _liste_nouveaux_statiques;
+ _count_liste_objets = count _liste_nouveaux_objets;
+
+ if (_count_liste_objets > 0) then
+ {
+ // On parcoure tous les nouveaux objets en __tempo secondes
+ for [{_i = 0}, {_i < _count_liste_objets}, {_i = _i + 1}] do
+ {
+ _objet = _liste_nouveaux_objets select _i;
+ _fonctionnalites = [typeOf _objet] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique;
+
+ // Si au moins une fonctionnalité
+ if (
+ _fonctionnalites select __can_be_depl_heli_remorq_transp ||
+ _fonctionnalites select __can_lift ||
+ _fonctionnalites select __can_tow ||
+ _fonctionnalites select __can_transport_cargo
+ ) then
+ {
+ _objet setVariable ["R3F_LOG_fonctionnalites", _fonctionnalites, false];
+
+ if (isNil {_objet getVariable "R3F_LOG_disabled"}) then
+ {
+ _objet setVariable ["R3F_LOG_disabled", R3F_LOG_CFG_disabled_by_default, false];
+ };
+
+ // Si l'objet est un objet déplaçable/héliportable/remorquable/transportable
+ if (_fonctionnalites select __can_be_depl_heli_remorq_transp) then
+ {
+ [_objet] call R3F_LOG_FNCT_objet_init;
+ };
+
+ // Si l'objet est un véhicule héliporteur
+ if (_fonctionnalites select __can_lift) then
+ {
+ [_objet] call R3F_LOG_FNCT_heliporteur_init;
+ };
+
+ // Si l'objet est un véhicule remorqueur
+ if (_fonctionnalites select __can_tow) then
+ {
+ [_objet] call R3F_LOG_FNCT_remorqueur_init;
+ };
+
+ // Si l'objet est un véhicule transporteur
+ if (_fonctionnalites select __can_transport_cargo) then
+ {
+ [_objet] call R3F_LOG_FNCT_transporteur_init;
+ };
+ };
+
+ // Si l'objet a été créé depuis une usine, on ajoute la possibilité de revendre à l'usine, quelque soit ses fonctionnalités logistiques
+ if (_objet getVariable ["R3F_LOG_CF_depuis_usine", false]) then
+ {
+ _objet addAction [("" + format [STR_R3F_LOG_action_revendre_usine_direct, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")] + ""), {_this call R3F_LOG_FNCT_usine_revendre_direct}, nil, 5, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_revendre_usine_direct_valide"];
+ };
+
+ sleep (0.07 max (__tempo / _count_liste_objets));
+ };
+ }
+ else
+ {
+ sleep __tempo;
+ };
+ }
+ else
+ {
+ sleep 2;
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/surveiller_objets_a_proteger.sqf b/mpmissions/Exile.Altis/R3F_LOG/surveiller_objets_a_proteger.sqf
new file mode 100644
index 0000000..405dcd1
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/surveiller_objets_a_proteger.sqf
@@ -0,0 +1,93 @@
+/**
+* Vérifie périodiquement que les objets à protéger et ne pas perdre aient besoin d'être déchargés/téléportés.
+* Script à faire tourner dans un fil d'exécution dédié sur le serveur.
+*
+* Copyright (C) 2014 Team ~R3F~
+*
+* This program is free software under the terms of the GNU General Public License version 3.
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see .
+*/
+
+while {true} do
+{
+ // Pour chaque objet à protéger
+ {
+ private ["_objet", "_bbox_dim", "_pos_respawn", "_pos_degagee", "_rayon"];
+
+ _objet = _x;
+
+ if (!isNull _objet) then
+ {
+ // Si l'objet est transporté/héliporté/remorqué
+ if !(isNull (_objet getVariable ["R3F_LOG_est_transporte_par", objNull])) then
+ {
+ // Mais que le transporteur est détruit/héliporté/remorqué
+ if !(alive (_objet getVariable "R3F_LOG_est_transporte_par")) then
+ {
+ // Récupération de la position de respawn en accord avec le paramètre passé dans "do_not_lose_it"
+ if (typeName (_objet getVariable "R3F_LOG_pos_respawn") == "ARRAY") then
+ {
+ _pos_respawn = _objet getVariable "R3F_LOG_pos_respawn";
+ }
+ else
+ {
+ if (_objet getVariable "R3F_LOG_pos_respawn" == "cargo_pos") then
+ {
+ _pos_respawn = getPos (_objet getVariable "R3F_LOG_est_transporte_par");
+ }
+ else
+ {
+ _pos_respawn = getMarkerPos (_objet getVariable "R3F_LOG_pos_respawn");
+ };
+ };
+
+ _bbox_dim = (vectorMagnitude (boundingBoxReal _objet select 0)) max (vectorMagnitude (boundingBoxReal _objet select 1));
+
+ // Si mode de respawn != "exact_spawn_pos"
+ if (isNil {_objet getVariable "R3F_LOG_dir_respawn"}) then
+ {
+ // Recherche d'une position dégagée (on augmente progressivement le rayon jusqu'à trouver une position)
+ for [{_rayon = 5 max (2*_bbox_dim); _pos_degagee = [];}, {count _pos_degagee == 0 && _rayon <= 100 + (8*_bbox_dim)}, {_rayon = _rayon + 20 + (5*_bbox_dim)}] do
+ {
+ _pos_degagee = [
+ _bbox_dim,
+ _pos_respawn,
+ _rayon,
+ 100 min (5 + _rayon^1.2)
+ ] call R3F_LOG_FNCT_3D_tirer_position_degagee_sol;
+ };
+
+ // En cas d'échec de la recherche de position dégagée
+ if (count _pos_degagee == 0) then {_pos_degagee = _pos_respawn;};
+
+ // On ramène l'objet sur la position
+ detach _objet;
+ _objet setPos _pos_degagee;
+ }
+ else
+ {
+ // On ramène l'objet sur la position
+ detach _objet;
+ _objet setPosASL _pos_respawn;
+ _objet setDir (_objet getVariable "R3F_LOG_dir_respawn");
+ };
+
+ // On retire l'objet du contenu du véhicule (s'il est dedans)
+ _objets_charges = (_objet getVariable "R3F_LOG_est_transporte_par") getVariable ["R3F_LOG_objets_charges", []];
+ if (_objet in _objets_charges) then
+ {
+ _objets_charges = _objets_charges - [_objet];
+ (_objet getVariable "R3F_LOG_est_transporte_par") setVariable ["R3F_LOG_objets_charges", _objets_charges, true];
+ };
+
+ _objet setVariable ["R3F_LOG_est_transporte_par", objNull, true];
+
+ sleep 4;
+ };
+ };
+ };
+ } forEach R3F_LOG_liste_objets_a_proteger;
+
+ sleep 90;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/systeme_protection_blessures.sqf b/mpmissions/Exile.Altis/R3F_LOG/systeme_protection_blessures.sqf
new file mode 100644
index 0000000..9ccd6f7
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/systeme_protection_blessures.sqf
@@ -0,0 +1,171 @@
+/**
+ * Système assurant la protection contre les blessures des unités locales lors du déplacement manuels d'objets
+ * Les objets en cours de transport/heliport/remorquage ne sont pas concernés.
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/** Contient la liste de tous les objets en cours de déplacements manuels */
+R3F_LOG_liste_objets_en_deplacement = [];
+
+/**
+ * Fonction PVEH ajoutant les nouveaux objets en cours de déplacement dans la liste
+ * @param 1 le nouvel objet en cours de déplacement
+ */
+R3F_LOG_FNCT_PVEH_nouvel_objet_en_deplacement =
+{
+ private ["_objet"];
+
+ _objet = _this select 1;
+
+ R3F_LOG_liste_objets_en_deplacement = R3F_LOG_liste_objets_en_deplacement - [_objet];
+ R3F_LOG_liste_objets_en_deplacement pushBack _objet;
+
+ _objet allowDamage false;
+};
+"R3F_LOG_PV_nouvel_objet_en_deplacement" addPublicVariableEventHandler R3F_LOG_FNCT_PVEH_nouvel_objet_en_deplacement;
+
+/**
+ * Fonction PVEH retirant de la liste les objets dont le déplacement est terminé
+ * @param 1 l'objet dont le déplacement est terminé
+ */
+R3F_LOG_FNCT_PVEH_fin_deplacement_objet =
+{
+ private ["_objet"];
+
+ _objet = _this select 1;
+
+ R3F_LOG_liste_objets_en_deplacement = R3F_LOG_liste_objets_en_deplacement - [_this select 1];
+
+ // Limitation : si l'objet a été "allowDamage false" par ailleurs, il ne le sera plus. Voir http://feedback.arma3.com/view.php?id=19211
+ _objet allowDamage true;
+};
+"R3F_LOG_PV_fin_deplacement_objet" addPublicVariableEventHandler R3F_LOG_FNCT_PVEH_fin_deplacement_objet;
+
+/**
+ * Fonction traitant les event handler HandleDamage des unités locales,
+ * si la blessure provient d'un objet en déplacement, la blessure est ignorée
+ * @param voir https://community.bistudio.com/wiki/Arma_3:_Event_Handlers#HandleDamage
+ * @return niveau de blessure inchangé si due au déplacement d'un objet, sinon rien pour laisser A3 gérer la blessure
+ * @note implémentation de la commande getHit manquante ( http://feedback.arma3.com/view.php?id=18261 )
+ */
+R3F_LOG_FNCT_EH_HandleDamage =
+{
+ private ["_unite", "_selection", "_blessure", "_source"];
+
+ _unite = _this select 0;
+ _selection = _this select 1;
+ _blessure = _this select 2;
+ _source = _this select 3;
+
+ if (
+ // Filtre sur les blessures de type choc/collision
+ _this select 4 == "" && {(isNull _source || _source == _unite || _source in R3F_LOG_liste_objets_en_deplacement)
+ && {
+ // Si l'unité est potentiellement en collision avec un objet en cours de déplacement
+ {
+ !isNull _x &&
+ {
+ // Calcul de collision possible unité-objet
+ [
+ _x worldToModel (_unite modelToWorld [0,0,0]), // position de l'unité dans le repère de l'objet en déplacement
+ (boundingBoxReal _x select 0) vectorDiff [12, 12, 12], // bbox min élargie (zone de sûreté)
+ (boundingBoxReal _x select 1) vectorAdd [12, 12, 12] // bbox max élargie (zone de sûreté)
+ ] call R3F_LOG_FNCT_3D_pos_est_dans_bbox
+ }
+ } count R3F_LOG_liste_objets_en_deplacement != 0
+ }
+ }) then
+ {
+ // Retourner la valeur de blessure précédente de l'unité
+ if (_selection == "") then
+ {
+ damage _unite
+ }
+ else
+ {
+ _unite getHit _selection
+ };
+ };
+};
+
+sleep 5;
+
+while {true} do
+{
+ private ["_idx_objet"];
+
+ // Vérifier que les unités locales à la machine sont gérées, et ne plus gérées celles qui ne sont plus locales
+ // Par chaque unité
+ {
+ // Unité non gérée
+ if (isNil {_x getVariable "R3F_LOG_idx_EH_HandleDamage"}) then
+ {
+ // Et qui est locale
+ if (local _x) then
+ {
+ // Event handler de à chaque blessure, vérifiant si elle est due à un objet en déplacement
+ _x setVariable ["R3F_LOG_idx_EH_HandleDamage", _x addEventHandler ["HandleDamage", {_this call R3F_LOG_FNCT_EH_HandleDamage}]];
+ };
+ }
+ // Unité déjà gérée
+ else
+ {
+ // Mais qui n'est plus locale
+ if (!local _x) then
+ {
+ // Suppresion des event handler de gestion des blessures
+ _x removeEventHandler ["HandleDamage", _x getVariable "R3F_LOG_idx_EH_HandleDamage"];
+ _x setVariable ["R3F_LOG_idx_EH_HandleDamage", nil];
+ };
+ };
+ } forEach call {// Calcul du paramètre du forEach
+ /*
+ * Sur un serveur non-dédié, on ne protège que le joueur et son groupe (économie de ressources)
+ * Les IA non commandées par des joueurs ne seront donc pas protégées, ce qui est un moindre mal.
+ */
+ if (isServer && !isDedicated) then {if (!isNull player) then {units group player} else {[]}}
+ /*
+ * Chez un joueur (ou un serveur dédié), on protège toutes les unités locales.
+ * Dans la pratique un serveur dédié n'appelle pas ce script, par choix, pour économiser les ressources.
+ */
+ else {allUnits}
+ };
+
+ // Vérifier l'intégrité de la liste des objets en cours de déplacements, et la nettoyer si besoin
+ for [{_idx_objet = 0}, {_idx_objet < count R3F_LOG_liste_objets_en_deplacement}, {;}] do
+ {
+ private ["_objet"];
+
+ _objet = R3F_LOG_liste_objets_en_deplacement select _idx_objet;
+
+ if (isNull _objet) then
+ {
+ R3F_LOG_liste_objets_en_deplacement = R3F_LOG_liste_objets_en_deplacement - [objNull];
+
+ // On recommence la validation de la liste
+ _idx_objet = 0;
+ }
+ else
+ {
+ // Si l'objet n'est plus déplacé par une unité valide
+ if !(isNull (_objet getVariable ["R3F_LOG_est_deplace_par", objNull]) ||
+ {alive (_objet getVariable "R3F_LOG_est_deplace_par") && isPlayer (_objet getVariable "R3F_LOG_est_deplace_par")}
+ ) then
+ {
+ ["R3F_LOG_PV_fin_deplacement_objet", _objet] call R3F_LOG_FNCT_PVEH_fin_deplacement_objet;
+
+ // On recommence la validation de la liste
+ _idx_objet = 0;
+ }
+ // Si l'objet est toujours en déplacement, on poursuit le parcours de la liste
+ else {_idx_objet = _idx_objet+1;};
+ };
+ };
+
+ sleep 90;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/todolist.txt b/mpmissions/Exile.Altis/R3F_LOG/todolist.txt
new file mode 100644
index 0000000..cba52e8
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/todolist.txt
@@ -0,0 +1,6 @@
+- Simulation of pitch/yaw rotation between towing vehicle and towed object
+- Parachute drop of objects loaded in aircraft's cargo
+- Add visual ropes on airlifted and towed objects (waiting progress of ropeCreate)
+- Add a way to define custom categories in the creation factory
+- Deny to fire with the turret of airlifted vehicles (waiting for enablePersonTurret)
+- Implement a network-mutex on setVariable
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/calculer_chargement_vehicule.sqf b/mpmissions/Exile.Altis/R3F_LOG/transporteur/calculer_chargement_vehicule.sqf
new file mode 100644
index 0000000..361557c
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/calculer_chargement_vehicule.sqf
@@ -0,0 +1,45 @@
+/**
+ * Retourne le chargement actuel et la capacité maximale d'un véhicule
+ *
+ * @param 0 le transporteur pour lequel calculer le chargement
+ *
+ * @return tableau content le chargement actuel et la capacité d'un véhicule
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_transporteur", "_objets_charges", "_chargement_actuel", "_chargement_maxi"];
+
+_transporteur = _this select 0;
+
+_objets_charges = _transporteur getVariable ["R3F_LOG_objets_charges", []];
+
+// Calcul du chargement actuel
+_chargement_actuel = 0;
+{
+ if (isNil {_x getVariable "R3F_LOG_fonctionnalites"}) then
+ {
+ _chargement_actuel = _chargement_actuel + (([typeOf _x] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique) select R3F_LOG_IDX_can_be_transported_cargo_cout);
+ }
+ else
+ {
+ _chargement_actuel = _chargement_actuel + (_x getVariable "R3F_LOG_fonctionnalites" select R3F_LOG_IDX_can_be_transported_cargo_cout);
+ };
+
+} forEach _objets_charges;
+
+// Recherche de la capacité maximale du transporteur
+if (isNil {_transporteur getVariable "R3F_LOG_fonctionnalites"}) then
+{
+ _chargement_maxi = ([typeOf _transporteur] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique) select R3F_LOG_IDX_can_transport_cargo_cout;
+}
+else
+{
+ _chargement_maxi = _transporteur getVariable "R3F_LOG_fonctionnalites" select R3F_LOG_IDX_can_transport_cargo_cout;
+};
+
+[_chargement_actuel, _chargement_maxi]
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_auto.sqf b/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_auto.sqf
new file mode 100644
index 0000000..45d03ef
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_auto.sqf
@@ -0,0 +1,181 @@
+/**
+ * Charger automatiquement un ou plusieurs objets/noms de classe dans un transporteur
+ *
+ * @param 0 le transporteur
+ * @param 1 tableau d'objets et/ou noms de classe, pouvant être un mélange des formats suivants :
+ * objet
+ * nom de classe, dans ce cas, l'objet sera créé avant d'être chargé
+ * tableau ["nom de classe", quantité] à créer avant d'être chargé
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+// Attendre le mutex
+waitUntil
+{
+ if (R3F_LOG_mutex_local_verrou) then
+ {
+ false
+ }
+ else
+ {
+ R3F_LOG_mutex_local_verrou = true;
+ true
+ }
+};
+
+private ["_transporteur", "_liste_a_charger", "_chargement", "_chargement_actuel", "_chargement_maxi", "_objets_charges", "_cout_chargement_objet"];
+private ["_objet_ou_classe", "_quantite", "_objet", "_classe", "_bbox", "_bbox_dim", "_pos_degagee", "_fonctionnalites", "_i"];
+
+_transporteur = _this select 0;
+_liste_a_charger = _this select 1;
+
+_chargement = [_transporteur] call R3F_LOG_FNCT_calculer_chargement_vehicule;
+_chargement_actuel = _chargement select 0;
+_chargement_maxi = _chargement select 1;
+_objets_charges = _transporteur getVariable ["R3F_LOG_objets_charges", []];
+
+// Pour chaque élément de la liste à charger
+{
+ if (typeName _x == "ARRAY" && {count _x > 0}) then
+ {
+ _objet_ou_classe = _x select 0;
+
+ if (typeName _objet_ou_classe == "STRING" && count _x > 1) then
+ {
+ _quantite = _x select 1;
+ }
+ else
+ {
+ _quantite = 1;
+ };
+ }
+ else
+ {
+ _objet_ou_classe = _x;
+ _quantite = 1;
+ };
+
+ if (typeName _objet_ou_classe == "STRING") then
+ {
+ _classe = _objet_ou_classe;
+ _bbox = [_classe] call R3F_LOG_FNCT_3D_get_bounding_box_depuis_classname;
+ _bbox_dim = (vectorMagnitude (_bbox select 0)) max (vectorMagnitude (_bbox select 1));
+
+ // Recherche d'une position dégagée. Les véhicules doivent être créé au niveau du sol sinon ils ne peuvent être utilisés.
+ if (_classe isKindOf "AllVehicles") then
+ {
+ _pos_degagee = [_bbox_dim, getPos _transporteur, 200, 50] call R3F_LOG_FNCT_3D_tirer_position_degagee_sol;
+ }
+ else
+ {
+ _pos_degagee = [] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel;
+ };
+
+ if (count _pos_degagee == 0) then {_pos_degagee = getPosATL _transporteur;};
+ }
+ else
+ {
+ _classe = typeOf _objet_ou_classe;
+ };
+
+ _fonctionnalites = [_classe] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique;
+ _cout_chargement_objet = _fonctionnalites select R3F_LOG_IDX_can_be_transported_cargo_cout;
+
+ // S'assurer que le type d'objet à charger est transportable
+ if !(_fonctionnalites select R3F_LOG_IDX_can_be_transported_cargo) then
+ {
+ diag_log format ["[Auto-load ""%1"" in ""%2""] : %3",
+ getText (configFile >> "CfgVehicles" >> _classe >> "displayName"),
+ getText (configFile >> "CfgVehicles" >> (typeOf _transporteur) >> "displayName"),
+ "The object is not a transporable class."];
+
+ systemChat format ["[Auto-load ""%1"" in ""%2""] : %3",
+ getText (configFile >> "CfgVehicles" >> _classe >> "displayName"),
+ getText (configFile >> "CfgVehicles" >> (typeOf _transporteur) >> "displayName"),
+ "The object is not a transporable class."];
+ }
+ else
+ {
+ for [{_i = 0}, {_i < _quantite}, {_i = _i+1}] do
+ {
+ // Si l'objet à charger est donné en tant que nom de classe, on le crée
+ if (typeName _objet_ou_classe == "STRING") then
+ {
+ // Recherche d'une position dégagée. Les véhicules doivent être créé au niveau du sol sinon ils ne peuvent être utilisés.
+ if (_classe isKindOf "AllVehicles") then
+ {
+ _objet = _classe createVehicle _pos_degagee;
+ _objet setVectorDirAndUp [[-cos getDir _transporteur, sin getDir _transporteur, 0] vectorCrossProduct surfaceNormal _pos_degagee, surfaceNormal _pos_degagee];
+ _objet setVelocity [0, 0, 0];
+ }
+ else
+ {
+ _objet = _classe createVehicle _pos_degagee;
+ };
+ }
+ else
+ {
+ _objet = _objet_ou_classe;
+ };
+
+ if (!isNull _objet) then
+ {
+ // Vérifier qu'il n'est pas déjà transporté
+ if (isNull (_objet getVariable ["R3F_LOG_est_transporte_par", objNull]) &&
+ (isNull (_objet getVariable ["R3F_LOG_est_deplace_par", objNull]) || (!alive (_objet getVariable ["R3F_LOG_est_deplace_par", objNull])) || (!isPlayer (_objet getVariable ["R3F_LOG_est_deplace_par", objNull])))
+ ) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_remorque", objNull])) then
+ {
+ // Si l'objet loge dans le véhicule
+ if (_chargement_actuel + _cout_chargement_objet <= _chargement_maxi) then
+ {
+ _chargement_actuel = _chargement_actuel + _cout_chargement_objet;
+ _objets_charges pushBack _objet;
+
+ _objet setVariable ["R3F_LOG_est_transporte_par", _transporteur, true];
+ _objet attachTo [R3F_LOG_PUBVAR_point_attache, [] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel];
+ }
+ else
+ {
+ diag_log format ["[Auto-load ""%1"" in ""%2""] : %3",
+ getText (configFile >> "CfgVehicles" >> _classe >> "displayName"),
+ getText (configFile >> "CfgVehicles" >> (typeOf _transporteur) >> "displayName"),
+ STR_R3F_LOG_action_charger_pas_assez_de_place];
+
+ systemChat format ["[Auto-load ""%1"" in ""%2""] : %3",
+ getText (configFile >> "CfgVehicles" >> _classe >> "displayName"),
+ getText (configFile >> "CfgVehicles" >> (typeOf _transporteur) >> "displayName"),
+ STR_R3F_LOG_action_charger_pas_assez_de_place];
+
+ if (typeName _objet_ou_classe == "STRING") then
+ {
+ deleteVehicle _objet;
+ };
+ };
+ }
+ else
+ {
+ diag_log format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> _classe >> "displayName")];
+ systemChat format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> _classe >> "displayName")];
+ };
+ }
+ else
+ {
+ diag_log format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> _classe >> "displayName")];
+ systemChat format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> _classe >> "displayName")];
+ };
+ };
+ };
+ };
+} forEach _liste_a_charger;
+
+// On mémorise sur le réseau le nouveau contenu du véhicule
+_transporteur setVariable ["R3F_LOG_objets_charges", _objets_charges, true];
+
+R3F_LOG_mutex_local_verrou = false;
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_deplace.sqf b/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_deplace.sqf
new file mode 100644
index 0000000..f5b2997
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_deplace.sqf
@@ -0,0 +1,71 @@
+/**
+ * Charger l'objet déplacé par le joueur dans un transporteur
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_objet", "_transporteur"];
+
+ _objet = R3F_LOG_joueur_deplace_objet;
+ _transporteur = [_objet, 5] call R3F_LOG_FNCT_3D_cursorTarget_virtuel;
+
+ if (!isNull _transporteur && {
+ _transporteur getVariable ["R3F_LOG_fonctionnalites", R3F_LOG_CST_zero_log] select R3F_LOG_IDX_can_transport_cargo &&
+ alive _transporteur && (vectorMagnitude velocity _transporteur < 6) && !(_transporteur getVariable "R3F_LOG_disabled") &&
+ (abs ((getPosASL _transporteur select 2) - (getPosASL player select 2)) < 2.5)
+ }) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_remorque", objNull])) then
+ {
+ private ["_objets_charges", "_chargement", "_cout_chargement_objet"];
+
+ _chargement = [_transporteur] call R3F_LOG_FNCT_calculer_chargement_vehicule;
+ _cout_chargement_objet = _objet getVariable "R3F_LOG_fonctionnalites" select R3F_LOG_IDX_can_be_transported_cargo_cout;
+
+ // Si l'objet loge dans le véhicule
+ if ((_chargement select 0) + _cout_chargement_objet <= (_chargement select 1)) then
+ {
+ [_transporteur, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ // On mémorise sur le réseau le nouveau contenu du véhicule
+ _objets_charges = _transporteur getVariable ["R3F_LOG_objets_charges", []];
+ _objets_charges = _objets_charges + [_objet];
+ _transporteur setVariable ["R3F_LOG_objets_charges", _objets_charges, true];
+
+ _objet setVariable ["R3F_LOG_est_transporte_par", _transporteur, true];
+
+ // Faire relacher l'objet au joueur
+ R3F_LOG_joueur_deplace_objet = objNull;
+ waitUntil {_objet getVariable "R3F_LOG_est_deplace_par" != player};
+
+ _objet attachTo [R3F_LOG_PUBVAR_point_attache, [] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel];
+
+ systemChat format [STR_R3F_LOG_action_charger_fait,
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName"),
+ getText (configFile >> "CfgVehicles" >> (typeOf _transporteur) >> "displayName")];
+ }
+ else
+ {
+ hintC STR_R3F_LOG_action_charger_pas_assez_de_place;
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_selection.sqf b/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_selection.sqf
new file mode 100644
index 0000000..aae682e
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/charger_selection.sqf
@@ -0,0 +1,101 @@
+/**
+ * Charger l'objet sélectionné (R3F_LOG_objet_selectionne) dans un transporteur
+ *
+ * @param 0 le transporteur
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_objet", "_transporteur"];
+
+ _objet = R3F_LOG_objet_selectionne;
+ _transporteur = _this select 0;
+
+ if (!(isNull _objet) && !(_objet getVariable "R3F_LOG_disabled")) then
+ {
+ if (isNull (_objet getVariable "R3F_LOG_est_transporte_par") && (isNull (_objet getVariable "R3F_LOG_est_deplace_par") || (!alive (_objet getVariable "R3F_LOG_est_deplace_par")) || (!isPlayer (_objet getVariable "R3F_LOG_est_deplace_par")))) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_remorque", objNull])) then
+ {
+ if (count crew _objet == 0 || getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ {
+ private ["_objets_charges", "_chargement", "_cout_chargement_objet"];
+
+ _chargement = [_transporteur] call R3F_LOG_FNCT_calculer_chargement_vehicule;
+ _cout_chargement_objet = _objet getVariable "R3F_LOG_fonctionnalites" select R3F_LOG_IDX_can_be_transported_cargo_cout;
+
+ // Si l'objet loge dans le véhicule
+ if ((_chargement select 0) + _cout_chargement_objet <= (_chargement select 1)) then
+ {
+ if (_objet distance _transporteur <= 30) then
+ {
+ [_transporteur, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ // On mémorise sur le réseau le nouveau contenu du véhicule
+ _objets_charges = _transporteur getVariable ["R3F_LOG_objets_charges", []];
+ _objets_charges = _objets_charges + [_objet];
+ _transporteur setVariable ["R3F_LOG_objets_charges", _objets_charges, true];
+
+ _objet setVariable ["R3F_LOG_est_transporte_par", _transporteur, true];
+
+ systemChat STR_R3F_LOG_action_charger_en_cours;
+
+ sleep 2;
+
+ // Gestion conflit d'accès
+ if (_objet getVariable "R3F_LOG_est_transporte_par" == _transporteur && _objet in (_transporteur getVariable "R3F_LOG_objets_charges")) then
+ {
+ _objet attachTo [R3F_LOG_PUBVAR_point_attache, [] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel];
+
+ systemChat format [STR_R3F_LOG_action_charger_fait,
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName"),
+ getText (configFile >> "CfgVehicles" >> (typeOf _transporteur) >> "displayName")];
+ }
+ else
+ {
+ _objet setVariable ["R3F_LOG_est_transporte_par", objNull, true];
+ hintC format ["ERROR : " + STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_trop_loin, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC STR_R3F_LOG_action_charger_pas_assez_de_place;
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_joueur_dans_objet, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ };
+
+ R3F_LOG_objet_selectionne = objNull;
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/decharger.sqf b/mpmissions/Exile.Altis/R3F_LOG/transporteur/decharger.sqf
new file mode 100644
index 0000000..8e51c6f
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/decharger.sqf
@@ -0,0 +1,142 @@
+/**
+ * Décharger un objet d'un transporteur - appelé deuis l'interface listant le contenu du transporteur
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ #include "dlg_constantes.h"
+ private ["_transporteur", "_objets_charges", "_type_objet_a_decharger", "_objet_a_decharger", "_action_confirmee", "_est_deplacable"];
+
+ _transporteur = uiNamespace getVariable "R3F_LOG_dlg_CV_transporteur";
+ _objets_charges = _transporteur getVariable ["R3F_LOG_objets_charges", []];
+
+ if (lbCurSel R3F_LOG_IDC_dlg_CV_liste_contenu == -1) exitWith {R3F_LOG_mutex_local_verrou = false;};
+
+ _type_objet_a_decharger = lbData [R3F_LOG_IDC_dlg_CV_liste_contenu, lbCurSel R3F_LOG_IDC_dlg_CV_liste_contenu];
+
+ _est_deplacable = ([_type_objet_a_decharger] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique) select R3F_LOG_IDX_can_be_moved_by_player;
+
+ if (!(_type_objet_a_decharger isKindOf "AllVehicles") && !_est_deplacable) then
+ {
+ _action_confirmee = [STR_R3F_LOG_action_decharger_deplacable_exceptionnel, "Warning", true, true] call BIS_fnc_GUImessage;
+ }
+ else
+ {
+ _action_confirmee = true;
+ };
+
+ if (_action_confirmee) then
+ {
+ closeDialog 0;
+
+ // Recherche d'un objet du type demandé
+ _objet_a_decharger = objNull;
+ {
+ if (typeOf _x == _type_objet_a_decharger) exitWith
+ {
+ _objet_a_decharger = _x;
+ };
+ } forEach _objets_charges;
+
+ if !(isNull _objet_a_decharger) then
+ {
+ [_objet_a_decharger, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ // On mémorise sur le réseau le nouveau contenu du transporteur (càd avec cet objet en moins)
+ _objets_charges = _transporteur getVariable ["R3F_LOG_objets_charges", []];
+ _objets_charges = _objets_charges - [_objet_a_decharger];
+ _transporteur setVariable ["R3F_LOG_objets_charges", _objets_charges, true];
+
+ _objet_a_decharger setVariable ["R3F_LOG_est_transporte_par", objNull, true];
+
+ // Prise en compte de l'objet dans l'environnement du joueur (accélérer le retour des addActions)
+ _objet_a_decharger spawn
+ {
+ sleep 4;
+ R3F_LOG_PUBVAR_reveler_au_joueur = _this;
+ publicVariable "R3F_LOG_PUBVAR_reveler_au_joueur";
+ ["R3F_LOG_PUBVAR_reveler_au_joueur", R3F_LOG_PUBVAR_reveler_au_joueur] spawn R3F_LOG_FNCT_PUBVAR_reveler_au_joueur;
+ };
+
+ if (!(_objet_a_decharger isKindOf "AllVehicles") || _est_deplacable) then
+ {
+ R3F_LOG_mutex_local_verrou = false;
+ [_objet_a_decharger, player, 0, true] spawn R3F_LOG_FNCT_objet_deplacer;
+ }
+ else
+ {
+ private ["_bbox_dim", "_pos_degagee", "_rayon"];
+
+ systemChat STR_R3F_LOG_action_decharger_en_cours;
+
+ _bbox_dim = (vectorMagnitude (boundingBoxReal _objet_a_decharger select 0)) max (vectorMagnitude (boundingBoxReal _objet_a_decharger select 1));
+
+ sleep 1;
+
+ // Recherche d'une position dégagée (on augmente progressivement le rayon jusqu'à trouver une position)
+ for [{_rayon = 5 max (2*_bbox_dim); _pos_degagee = [];}, {count _pos_degagee == 0 && _rayon <= 30 + (8*_bbox_dim)}, {_rayon = _rayon + 10 + (2*_bbox_dim)}] do
+ {
+ _pos_degagee = [
+ _bbox_dim,
+ _transporteur modelToWorld [0, if (_transporteur isKindOf "AllVehicles") then {(boundingBoxReal _transporteur select 0 select 1) - 2 - 0.3*_rayon} else {0}, 0],
+ _rayon,
+ 100 min (5 + _rayon^1.2)
+ ] call R3F_LOG_FNCT_3D_tirer_position_degagee_sol;
+ };
+
+ if (count _pos_degagee > 0) then
+ {
+ detach _objet_a_decharger;
+ _objet_a_decharger setPos _pos_degagee;
+ _objet_a_decharger setVectorDirAndUp [[-cos getDir _transporteur, sin getDir _transporteur, 0] vectorCrossProduct surfaceNormal _pos_degagee, surfaceNormal _pos_degagee];
+ _objet_a_decharger setVelocity [0, 0, 0];
+
+ sleep 0.4; // Car la nouvelle position n'est pas prise en compte instantannément
+
+ // Si l'objet a été créé assez loin, on indique sa position relative
+ if (_objet_a_decharger distance _transporteur > 40) then
+ {
+ systemChat format [STR_R3F_LOG_action_decharger_fait + " (%2)",
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet_a_decharger) >> "displayName"),
+ format ["%1m %2deg", round (_objet_a_decharger distance _transporteur), round ([_transporteur, _objet_a_decharger] call BIS_fnc_dirTo)]
+ ];
+ }
+ else
+ {
+ systemChat format [STR_R3F_LOG_action_decharger_fait, getText (configFile >> "CfgVehicles" >> (typeOf _objet_a_decharger) >> "displayName")];
+ };
+ R3F_LOG_mutex_local_verrou = false;
+ }
+ // Si échec recherche position dégagée, on décharge l'objet comme un déplaçable
+ else
+ {
+ systemChat "WARNING : no free position found.";
+
+ R3F_LOG_mutex_local_verrou = false;
+ [_objet_a_decharger, player, 0, true] spawn R3F_LOG_FNCT_objet_deplacer;
+ };
+ };
+ }
+ else
+ {
+ hintC STR_R3F_LOG_action_decharger_deja_fait;
+ R3F_LOG_mutex_local_verrou = false;
+ };
+ }
+ else
+ {
+ R3F_LOG_mutex_local_verrou = false;
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/dlg_constantes.h b/mpmissions/Exile.Altis/R3F_LOG/transporteur/dlg_constantes.h
new file mode 100644
index 0000000..bb6e60e
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/dlg_constantes.h
@@ -0,0 +1,94 @@
+/**
+ * Constantes pour rendre les définitions des boîtes de dialogue plus lisible et maintenable
+ */
+
+#define R3F_LOG_ID_transporteur_START 65430
+
+#define R3F_LOG_IDD_dlg_contenu_vehicule (R3F_LOG_ID_transporteur_START + 1)
+
+#define R3F_LOG_IDC_dlg_CV_capacite_vehicule (R3F_LOG_ID_transporteur_START + 2)
+#define R3F_LOG_IDC_dlg_CV_liste_contenu (R3F_LOG_ID_transporteur_START + 3)
+#define R3F_LOG_IDC_dlg_CV_btn_decharger (R3F_LOG_ID_transporteur_START + 4)
+
+#define R3F_LOG_IDC_dlg_CV_titre (R3F_LOG_ID_transporteur_START + 10)
+#define R3F_LOG_IDC_dlg_CV_credits (R3F_LOG_ID_transporteur_START + 11)
+#define R3F_LOG_IDC_dlg_CV_btn_fermer (R3F_LOG_ID_transporteur_START + 12)
+
+#define R3F_LOG_IDC_dlg_CV_jauge_chargement (R3F_LOG_ID_transporteur_START + 13)
+
+// Control types
+#define CT_STATIC 0
+#define CT_BUTTON 1
+#define CT_EDIT 2
+#define CT_SLIDER 3
+#define CT_COMBO 4
+#define CT_LISTBOX 5
+#define CT_TOOLBOX 6
+#define CT_CHECKBOXES 7
+#define CT_PROGRESS 8
+#define CT_HTML 9
+#define CT_STATIC_SKEW 10
+#define CT_ACTIVETEXT 11
+#define CT_TREE 12
+#define CT_STRUCTURED_TEXT 13
+#define CT_CONTEXT_MENU 14
+#define CT_CONTROLS_GROUP 15
+#define CT_SHORTCUT_BUTTON 16 // Arma 2 - textured button
+
+#define CT_XKEYDESC 40
+#define CT_XBUTTON 41
+#define CT_XLISTBOX 42
+#define CT_XSLIDER 43
+#define CT_XCOMBO 44
+#define CT_ANIMATED_TEXTURE 45
+#define CT_OBJECT 80
+#define CT_OBJECT_ZOOM 81
+#define CT_OBJECT_CONTAINER 82
+#define CT_OBJECT_CONT_ANIM 83
+#define CT_LINEBREAK 98
+#define CT_USER 99
+#define CT_MAP 100
+#define CT_MAP_MAIN 101
+#define CT_List_N_Box 102 // Arma 2 - N columns list box
+
+// Static styles
+#define ST_POS 0x0F
+#define ST_HPOS 0x03
+#define ST_VPOS 0x0C
+#define ST_LEFT 0x00
+#define ST_RIGHT 0x01
+#define ST_CENTER 0x02
+#define ST_DOWN 0x04
+#define ST_UP 0x08
+#define ST_VCENTER 0x0c
+
+#define ST_TYPE 0xF0
+#define ST_SINGLE 0
+#define ST_MULTI 16
+#define ST_TITLE_BAR 32
+#define ST_PICTURE 48
+#define ST_FRAME 64
+#define ST_BACKGROUND 80
+#define ST_GROUP_BOX 96
+#define ST_GROUP_BOX2 112
+#define ST_HUD_BACKGROUND 128
+#define ST_TILE_PICTURE 144
+#define ST_WITH_RECT 160
+#define ST_LINE 176
+
+#define ST_SHADOW 0x100
+#define ST_NO_RECT 0x200
+#define ST_KEEP_ASPECT_RATIO 0x800
+
+#define ST_TITLE ST_TITLE_BAR + ST_CENTER
+
+// Slider styles
+#define SL_DIR 0x400
+#define SL_VERT 0
+#define SL_HORZ 0x400
+
+#define SL_TEXTURES 0x10
+
+// Listbox styles
+#define LB_TEXTURES 0x10
+#define LB_MULTI 0x20
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/dlg_contenu_vehicule.h b/mpmissions/Exile.Altis/R3F_LOG/transporteur/dlg_contenu_vehicule.h
new file mode 100644
index 0000000..21651c0
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/dlg_contenu_vehicule.h
@@ -0,0 +1,265 @@
+/**
+ * Interface d'affichage du contenu du véhicule
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "dlg_constantes.h"
+
+#define R3F_LOG_dlg_CV_jauge_chargement_h 0.027
+
+class R3F_LOG_dlg_contenu_vehicule
+{
+ idd = R3F_LOG_IDD_dlg_contenu_vehicule;
+ name = "R3F_LOG_dlg_contenu_vehicule";
+ movingEnable = false;
+
+ controlsBackground[] =
+ {
+ R3F_LOG_dlg_CV_titre_fond,
+ R3F_LOG_dlg_CV_fond_noir
+ };
+ objects[] = {};
+ controls[] =
+ {
+ R3F_LOG_dlg_CV_titre,
+ R3F_LOG_dlg_CV_capacite_vehicule,
+ R3F_LOG_dlg_CV_jauge_chargement,
+ R3F_LOG_dlg_CV_liste_contenu,
+
+ R3F_LOG_dlg_CV_credits,
+ R3F_LOG_dlg_CV_btn_decharger,
+ R3F_LOG_dlg_CV_btn_fermer
+ };
+
+ // Définition des classes de base
+ class R3F_LOG_dlg_CV_texte
+ {
+ idc = -1;
+ type = CT_STATIC;
+ style = ST_LEFT;
+ x = 0.0; w = 0.3;
+ y = 0.0; h = 0.03;
+ sizeEx = 0.023;
+ colorBackground[] = {0,0,0,0};
+ colorText[] = {1,1,1,1};
+ font = "PuristaMedium";
+ text = "";
+ };
+
+ class R3F_LOG_dlg_CV_btn
+ {
+ idc = -1;
+ type = 16;
+ style = 0;
+
+ text = "btn";
+ action = "";
+
+ x = 0; w = 0.17;
+ y = 0; h = 0.045;
+
+ font = "PuristaLight";
+ size = 0.038;
+ sizeEx = 0.038;
+
+ animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)";
+ animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)";
+ animTextureOver = "#(argb,8,8,3)color(1,1,1,0.5)";
+ animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)";
+ animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)";
+ animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)";
+ textureNoShortcut = "#(argb,8,8,3)color(0,0,0,0)";
+ colorBackground[] = {0,0,0,0.8};
+ colorBackground2[] = {1,1,1,0.5};
+ colorBackgroundFocused[] = {1,1,1,0.5};
+ color[] = {1,1,1,1};
+ color2[] = {1,1,1,1};
+ colorText[] = {1,1,1,1};
+ colorFocused[] = {1,1,1,1};
+ colorDisabled[] = {1,1,1,0.25};
+ period = 0.6;
+ periodFocus = 0.6;
+ periodOver = 0.6;
+ shadow = 0;
+
+ class HitZone
+ {
+ left = 0.000;
+ top = 0.000;
+ right = 0.000;
+ bottom = 0.000;
+ };
+
+ class ShortcutPos
+ {
+ left = 0.000;
+ top = 0.000;
+ w = 0.023;
+ h = 0.050;
+ };
+
+ class TextPos
+ {
+ left = 0.010;
+ top = 0.000;
+ right = 0.000;
+ bottom = 0.000;
+ };
+
+ soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",0.09,1};
+ soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1};
+ soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick",0.09,1};
+ soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1};
+
+ class Attributes
+ {
+ font = "PuristaLight";
+ color = "#E5E5E5";
+ align = "left";
+ shadow = "false";
+ };
+
+ class AttributesImage
+ {
+ font = "PuristaLight";
+ color = "#E5E5E5";
+ align = "left";
+ };
+ };
+
+ class R3F_LOG_dlg_CV_liste
+ {
+ type = CT_LISTBOX;
+ style = ST_MULTI;
+ idc = -1;
+ text = "";
+ w = 0.275;
+ h = 0.04;
+ wholeHeight = 0.45;
+ rowHeight = 0.06;
+ font = "PuristaSemibold";
+ sizeEx = 0.035;
+ soundSelect[] = {"",0.1,1};
+ soundExpand[] = {"",0.1,1};
+ soundCollapse[] = {"",0.1,1};
+ maxHistoryDelay = 1;
+ autoScrollSpeed = -1;
+ autoScrollDelay = 5;
+ autoScrollRewind = 0;
+
+ shadow = 0;
+ colorShadow[] = {0,0,0,0.5};
+ color[] = {1,1,1,1};
+ colorText[] = {1,1,1,1.0};
+ colorDisabled[] = {1,1,1,0.25};
+ colorScrollbar[] = {1,0,0,0};
+ colorSelect[] = {0,0,0,1};
+ colorSelect2[] = {0,0,0,1};
+ colorSelectBackground[] = {0.95,0.95,0.95,1};
+ colorSelectBackground2[] = {1,1,1,0.5};
+ colorBackground[] = {0,0,0,0};
+ period = 1.2;
+
+ class ListScrollBar
+ {
+ color[] = {1,1,1,0.6};
+ colorActive[] = {1,1,1,1};
+ colorDisabled[] = {1,1,1,0.3};
+ thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
+ arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
+ arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
+ border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
+ };
+ };
+ // FIN Définition des classes de base
+
+
+ class R3F_LOG_dlg_CV_titre_fond : R3F_LOG_dlg_CV_texte
+ {
+ x = 0.26; w = 0.45;
+ y = 0.145 - R3F_LOG_dlg_CV_jauge_chargement_h-0.005; h = 0.07;
+ colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])","(profilenamespace getvariable ['GUI_BCG_RGB_A',0.8])"};
+ };
+
+ class R3F_LOG_dlg_CV_titre : R3F_LOG_dlg_CV_texte
+ {
+ idc = R3F_LOG_IDC_dlg_CV_titre;
+ x = 0.26; w = 0.45;
+ y = 0.145 - R3F_LOG_dlg_CV_jauge_chargement_h-0.005; h = 0.04;
+ sizeEx = 0.05;
+ text = "";
+ };
+
+ class R3F_LOG_dlg_CV_capacite_vehicule : R3F_LOG_dlg_CV_texte
+ {
+ idc = R3F_LOG_IDC_dlg_CV_capacite_vehicule;
+ x = 0.255; w = 0.4;
+ y = 0.185 - R3F_LOG_dlg_CV_jauge_chargement_h-0.005; h = 0.03;
+ sizeEx = 0.03;
+ text = "";
+ };
+
+ class R3F_LOG_dlg_CV_fond_noir : R3F_LOG_dlg_CV_texte
+ {
+ x = 0.26; w = 0.45;
+ y = 0.220 - R3F_LOG_dlg_CV_jauge_chargement_h-0.005; h = R3F_LOG_dlg_CV_jauge_chargement_h + 0.010 + 0.54 - 0.005;
+ colorBackground[] = {0,0,0,0.5};
+ };
+
+ class R3F_LOG_dlg_CV_jauge_chargement
+ {
+ idc = R3F_LOG_IDC_dlg_CV_jauge_chargement;
+ type = CT_PROGRESS;
+ style = ST_LEFT;
+ x = 0.26 + 0.0035; w = 0.45 - 0.007;
+ y = 0.220 - R3F_LOG_dlg_CV_jauge_chargement_h-0.005 + 0.0035; h = R3F_LOG_dlg_CV_jauge_chargement_h;
+ shadow = 2;
+ colorBar[] = {0.9,0.9,0.9,0.9};
+ colorExtBar[] = {1,1,1,1};
+ colorFrame[] = {1,1,1,1};
+ texture = "";
+ textureExt = "";
+ };
+
+ class R3F_LOG_dlg_CV_liste_contenu : R3F_LOG_dlg_CV_liste
+ {
+ idc = R3F_LOG_IDC_dlg_CV_liste_contenu;
+ x = 0.26; w = 0.45;
+ y = 0.22 + 0.005; h = 0.54 - 0.005;
+ onLBDblClick = "0 spawn R3F_LOG_FNCT_transporteur_decharger;";
+ onLBSelChanged = "uiNamespace setVariable [""R3F_LOG_dlg_CV_lbCurSel_data"", (_this select 0) lbData (_this select 1)];";
+ };
+
+ class R3F_LOG_dlg_CV_credits : R3F_LOG_dlg_CV_texte
+ {
+ idc = R3F_LOG_IDC_dlg_CV_credits;
+ x = 0.255; w = 0.19;
+ y = 0.813; h = 0.02;
+ colorText[] = {0.5,0.5,0.5,0.75};
+ font = "PuristaLight";
+ sizeEx = 0.02;
+ text = "";
+ };
+
+ class R3F_LOG_dlg_CV_btn_decharger : R3F_LOG_dlg_CV_btn
+ {
+ idc = R3F_LOG_IDC_dlg_CV_btn_decharger;
+ x = 0.365; y = 0.765;
+ sizeEx = 0.02;
+ text = "";
+ action = "0 spawn R3F_LOG_FNCT_transporteur_decharger;";
+ };
+
+ class R3F_LOG_dlg_CV_btn_fermer : R3F_LOG_dlg_CV_btn
+ {
+ idc = R3F_LOG_IDC_dlg_CV_btn_fermer;
+ x = 0.54; y = 0.765;
+ text = "";
+ action = "closeDialog 0;";
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/selectionner_objet.sqf b/mpmissions/Exile.Altis/R3F_LOG/transporteur/selectionner_objet.sqf
new file mode 100644
index 0000000..b34ed6c
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/selectionner_objet.sqf
@@ -0,0 +1,42 @@
+/**
+ * Sélectionne un objet à charger dans un transporteur
+ *
+ * @param 0 l'objet à sélectionner
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ R3F_LOG_objet_selectionne = _this select 0;
+ systemChat format [STR_R3F_LOG_action_selectionner_objet_fait, getText (configFile >> "CfgVehicles" >> (typeOf R3F_LOG_objet_selectionne) >> "displayName")];
+
+ [R3F_LOG_objet_selectionne, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ // Déselectionner l'objet si le joueur n'en fait rien
+ [] spawn
+ {
+ while {!isNull R3F_LOG_objet_selectionne} do
+ {
+ if (!alive player) then
+ {
+ R3F_LOG_objet_selectionne = objNull;
+ }
+ else
+ {
+ if (vehicle player != player || (player distance R3F_LOG_objet_selectionne > 40) || !isNull R3F_LOG_joueur_deplace_objet) then
+ {
+ R3F_LOG_objet_selectionne = objNull;
+ };
+ };
+
+ sleep 0.2;
+ };
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/transporteur_init.sqf b/mpmissions/Exile.Altis/R3F_LOG/transporteur/transporteur_init.sqf
new file mode 100644
index 0000000..a9243da
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/transporteur_init.sqf
@@ -0,0 +1,21 @@
+/**
+ * Initialise un véhicule transporteur
+ *
+ * @param 0 le transporteur
+ */
+
+private ["_transporteur"];
+
+_transporteur = _this select 0;
+
+// Définition locale de la variable si elle n'est pas définie sur le réseau
+if (isNil {_transporteur getVariable "R3F_LOG_objets_charges"}) then
+{
+ _transporteur setVariable ["R3F_LOG_objets_charges", [], false];
+};
+
+_transporteur addAction [("" + STR_R3F_LOG_action_charger_deplace + ""), {_this call R3F_LOG_FNCT_transporteur_charger_deplace}, nil, 8, true, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_joueur_deplace_objet != _target && R3F_LOG_action_charger_deplace_valide"];
+
+_transporteur addAction [("" + format [STR_R3F_LOG_action_charger_selection, getText (configFile >> "CfgVehicles" >> (typeOf _transporteur) >> "displayName")] + ""), {_this call R3F_LOG_FNCT_transporteur_charger_selection}, nil, 7, true, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_charger_selection_valide"];
+
+_transporteur addAction [("" + STR_R3F_LOG_action_contenu_vehicule + ""), {_this call R3F_LOG_FNCT_transporteur_voir_contenu_vehicule}, nil, 4, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_contenu_vehicule_valide"];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/transporteur/voir_contenu_vehicule.sqf b/mpmissions/Exile.Altis/R3F_LOG/transporteur/voir_contenu_vehicule.sqf
new file mode 100644
index 0000000..ca57e47
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/transporteur/voir_contenu_vehicule.sqf
@@ -0,0 +1,155 @@
+/**
+ * Ouvre la boîte de dialogue du contenu du véhicule et la prérempli en fonction de véhicule
+ *
+ * @param 0 le véhicule dont il faut afficher le contenu
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "dlg_constantes.h"
+
+disableSerialization; // A cause des displayCtrl
+
+private ["_transporteur", "_chargement", "_chargement_precedent", "_contenu"];
+private ["_tab_objets", "_tab_quantite", "_i", "_dlg_contenu_vehicule", "_ctrl_liste"];
+
+R3F_LOG_objet_selectionne = objNull;
+
+_transporteur = _this select 0;
+uiNamespace setVariable ["R3F_LOG_dlg_CV_transporteur", _transporteur];
+
+[_transporteur, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+createDialog "R3F_LOG_dlg_contenu_vehicule";
+waitUntil (uiNamespace getVariable "R3F_LOG_dlg_contenu_vehicule");
+_dlg_contenu_vehicule = findDisplay R3F_LOG_IDD_dlg_contenu_vehicule;
+
+/**** DEBUT des traductions des labels ****/
+(_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_titre) ctrlSetText STR_R3F_LOG_dlg_CV_titre;
+(_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_credits) ctrlSetText "[R3F] Logistics";
+(_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_btn_decharger) ctrlSetText STR_R3F_LOG_dlg_CV_btn_decharger;
+(_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_btn_fermer) ctrlSetText STR_R3F_LOG_dlg_CV_btn_fermer;
+/**** FIN des traductions des labels ****/
+
+_ctrl_liste = _dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_liste_contenu;
+
+_chargement_precedent = [];
+
+while {!isNull _dlg_contenu_vehicule} do
+{
+ _chargement = [_transporteur] call R3F_LOG_FNCT_calculer_chargement_vehicule;
+
+ // Si le contenu a changé, on rafraichit l'interface
+ if !([_chargement, _chargement_precedent] call BIS_fnc_areEqual) then
+ {
+ _chargement_precedent = +_chargement;
+
+ _contenu = _transporteur getVariable ["R3F_LOG_objets_charges", []];
+
+ /** Liste des noms de classe des objets contenu dans le véhicule, sans doublon */
+ _tab_objets = [];
+ /** Quantité associé (par l'index) aux noms de classe dans _tab_objets */
+ _tab_quantite = [];
+ /** Coût de chargement associé (par l'index) aux noms de classe dans _tab_objets */
+ _tab_cout_chargement = [];
+
+ // Préparation de la liste du contenu et des quantités associées aux objets
+ for [{_i = 0}, {_i < count _contenu}, {_i = _i + 1}] do
+ {
+ private ["_objet"];
+ _objet = _contenu select _i;
+
+ if !((typeOf _objet) in _tab_objets) then
+ {
+ _tab_objets pushBack (typeOf _objet);
+ _tab_quantite pushBack 1;
+ if (!isNil {_objet getVariable "R3F_LOG_fonctionnalites"}) then
+ {
+ _tab_cout_chargement pushBack (_objet getVariable "R3F_LOG_fonctionnalites" select R3F_LOG_IDX_can_be_transported_cargo_cout);
+ }
+ else
+ {
+ _tab_cout_chargement pushBack (([typeOf _objet] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique) select R3F_LOG_IDX_can_be_transported_cargo_cout);
+ };
+ }
+ else
+ {
+ private ["_idx_objet"];
+ _idx_objet = _tab_objets find (typeOf _objet);
+ _tab_quantite set [_idx_objet, ((_tab_quantite select _idx_objet) + 1)];
+ };
+ };
+
+ lbClear _ctrl_liste;
+ (_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_capacite_vehicule) ctrlSetText (format [STR_R3F_LOG_dlg_CV_capacite_vehicule+" pl.", _chargement select 0, _chargement select 1]);
+ if (_chargement select 1 != 0) then {(_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_jauge_chargement) progressSetPosition ((_chargement select 0) / (_chargement select 1));};
+ (_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_jauge_chargement) ctrlShow ((_chargement select 0) != 0);
+
+ if (count _tab_objets == 0) then
+ {
+ (_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_btn_decharger) ctrlEnable false;
+ }
+ else
+ {
+ // Insertion de chaque type d'objets dans la liste
+ for [{_i = 0}, {_i < count _tab_objets}, {_i = _i + 1}] do
+ {
+ private ["_classe", "_quantite", "_icone", "_tab_icone", "_index"];
+
+ _classe = _tab_objets select _i;
+ _quantite = _tab_quantite select _i;
+ _cout_chargement = _tab_cout_chargement select _i;
+ _icone = getText (configFile >> "CfgVehicles" >> _classe >> "icon");
+
+ // Icône par défaut
+ if (_icone == "") then
+ {
+ _icone = "\A3\ui_f\data\map\VehicleIcons\iconObject_ca.paa";
+ };
+
+ // Si le chemin commence par A3\ ou a3\, on rajoute un \ au début
+ _tab_icone = toArray toLower _icone;
+ if (count _tab_icone >= 3 &&
+ {
+ _tab_icone select 0 == (toArray "a" select 0) &&
+ _tab_icone select 1 == (toArray "3" select 0) &&
+ _tab_icone select 2 == (toArray "\" select 0)
+ }) then
+ {
+ _icone = "\" + _icone;
+ };
+
+ // Si icône par défaut, on rajoute le chemin de base par défaut
+ _tab_icone = toArray _icone;
+ if (_tab_icone select 0 != (toArray "\" select 0)) then
+ {
+ _icone = format ["\A3\ui_f\data\map\VehicleIcons\%1_ca.paa", _icone];
+ };
+
+ // Si pas d'extension de fichier, on rajoute ".paa"
+ _tab_icone = toArray _icone;
+ if (count _tab_icone >= 4 && {_tab_icone select (count _tab_icone - 4) != (toArray "." select 0)}) then
+ {
+ _icone = _icone + ".paa";
+ };
+
+ _index = _ctrl_liste lbAdd (getText (configFile >> "CfgVehicles" >> _classe >> "displayName") + format [" (%1x %2pl.)", _quantite, _cout_chargement]);
+ _ctrl_liste lbSetPicture [_index, _icone];
+ _ctrl_liste lbSetData [_index, _classe];
+
+ if (uiNamespace getVariable ["R3F_LOG_dlg_CV_lbCurSel_data", ""] == _classe) then
+ {
+ _ctrl_liste lbSetCurSel _index;
+ };
+ };
+
+ (_dlg_contenu_vehicule displayCtrl R3F_LOG_IDC_dlg_CV_btn_decharger) ctrlEnable true;
+ };
+ };
+
+ sleep 0.15;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/user_funct/auto_load_in_vehicle.sqf b/mpmissions/Exile.Altis/R3F_LOG/user_funct/auto_load_in_vehicle.sqf
new file mode 100644
index 0000000..53d4958
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/user_funct/auto_load_in_vehicle.sqf
@@ -0,0 +1,33 @@
+/**
+ * Load automatically and instantly a list of sereval objects and/or class names into a vehicle/cargo.
+ *
+ * @param 0 the vehicle or cargo to be loaded
+ * @param 1 the array of objects and/or class name to load in, which can be a mix of these elements :
+ * object's name set in the editor or object's script variable
+ * class name as a string, if so an object of this class name will be spawned, then loaded
+ * an array ["class_name", quantity] to spawn then load several objects of the same type
+ *
+ * @usage The following command loads my_object1 and my_object2 into my_vehicle
+ * @usage nul = [my_vehicle, [my_object1, my_object2] ] execVM "R3F_LOG\USER_FUNCT\auto_load_in_vehicle.sqf";
+ *
+ * @usage The following command spawns and loads one "Box_IND_Ammo_F" and one "Box_IND_Grenades_F" into my_vehicle
+ * @usage nul = [my_vehicle, ["Box_IND_Ammo_F", "Box_IND_Grenades_F"] ] execVM "R3F_LOG\USER_FUNCT\auto_load_in_vehicle.sqf";
+ *
+ * @usage The following command spawns and loads two "Box_IND_Ammo_F" and one "Box_IND_Grenades_F" into my_vehicle
+ * @usage nul = [my_vehicle, [ ["Box_IND_Ammo_F", 2], "Box_IND_Grenades_F" ] ] execVM "R3F_LOG\USER_FUNCT\auto_load_in_vehicle.sqf";
+ *
+ * @usage The following command loads my_object1, two "Box_IND_Ammo_F" and one "Box_IND_Grenades_F" into my_vehicle
+ * @usage nul = [my_vehicle, [ my_object1, ["Box_IND_Ammo_F", 2], "Box_IND_Grenades_F" ] ] execVM "R3F_LOG\USER_FUNCT\auto_load_in_vehicle.sqf";
+ *
+ * @usage You can replace "my_vehicle" by "this" if you put the line in the initialization line in the mission editor.
+ */
+
+if (isServer) then
+{
+ waitUntil {!isNil "R3F_LOG_active"};
+
+ if (R3F_LOG_active) then
+ {
+ _this call R3F_LOG_FNCT_transporteur_charger_auto;
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/user_funct/do_not_lose_it.sqf b/mpmissions/Exile.Altis/R3F_LOG/user_funct/do_not_lose_it.sqf
new file mode 100644
index 0000000..b708afa
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/user_funct/do_not_lose_it.sqf
@@ -0,0 +1,76 @@
+/**
+ * Execute this script to prevent the object to be lost during the mission.
+ * Useful for mandatory objects like a flag pole with addAction.
+ * It must be executed from the initialisation line or at any other time on the server and all clients.
+ *
+ * The script does :
+ * It makes the object indestructible (from any kind of damage).
+ * It denies the ability to send/sell back the object to any creation factory (if applicable).
+ * If the object is loaded in a vehicle/cargo which has been destroyed, it will be unloaded/teleported to a given position.
+ * If the object was lifted to a crashed helicopter, it will be detached/teleported to a given position.
+ * If the object was towed to a destroyed vehicle, it will be untowed/teleported to a given position.
+ *
+ * @param 0 the object to protect and to not lose
+ * @param 1 (optional) choose where to restore the object if destroyed in transport cargo (default : "spawn_pos")
+ * set to "spawn_pos" to teleport the object on its initial spawn position
+ * set to "exact_spawn_pos" to teleport the object on its exact initial spawn position and direction (no collision check)
+ * set to "cargo_pos" to unload the object around the destroyed cargo
+ * set to any marker name to teleport the object to the marker position
+ *
+ * @usage nul = [my_object] execVM "R3F_LOG\USER_FUNCT\do_not_lose_it.sqf";
+ * @usage nul = [my_object, "spawn_pos"] execVM "R3F_LOG\USER_FUNCT\do_not_lose_it.sqf";
+ * @usage nul = [my_object, "cargo_pos"] execVM "R3F_LOG\USER_FUNCT\do_not_lose_it.sqf";
+ * @usage nul = [my_object, ""] execVM "R3F_LOG\USER_FUNCT\do_not_lose_it.sqf";
+ *
+ * @usage You can replace "my_object" by "this" if you put the line in the initialization line in the mission editor.
+ */
+
+private ["_objet", "_pos_respawn"];
+
+_objet = _this select 0;
+_pos_respawn = if (count _this > 1) then {_this select 1} else {"spawn_pos"};
+
+if (!isNull _objet) then
+{
+ waitUntil {!isNil "R3F_LOG_active"};
+
+ if (R3F_LOG_active) then
+ {
+ _objet addEventHandler ["HandleDamage", {0}];
+
+ if (isServer) then
+ {
+ // Attendre le mutex
+ waitUntil
+ {
+ if (R3F_LOG_mutex_local_verrou) then
+ {
+ false
+ }
+ else
+ {
+ R3F_LOG_mutex_local_verrou = true;
+ true
+ }
+ };
+
+ R3F_LOG_liste_objets_a_proteger pushBack _objet;
+
+ R3F_LOG_mutex_local_verrou = false;
+
+ if (_pos_respawn == "spawn_pos" || _pos_respawn == "exact_spawn_pos") then
+ {
+ _objet setVariable ["R3F_LOG_pos_respawn", getPosASL _objet, false];
+
+ if (_pos_respawn == "exact_spawn_pos") then
+ {
+ _objet setVariable ["R3F_LOG_dir_respawn", getDir _objet, false];
+ };
+ }
+ else
+ {
+ _objet setVariable ["R3F_LOG_pos_respawn", _pos_respawn, false];
+ };
+ };
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/user_funct/dump_creation_factory_categories.sqf b/mpmissions/Exile.Altis/R3F_LOG/user_funct/dump_creation_factory_categories.sqf
new file mode 100644
index 0000000..fe08c03
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/user_funct/dump_creation_factory_categories.sqf
@@ -0,0 +1,68 @@
+/**
+ * Dump to the RPT file the list of all existing categories that can be allowed/denied to a creation factory.
+ * This is a helper function to define your own white/black list for a creation factory.
+ * See USER_FUNCT\init_creation_factory.sqf and the PDF documentation for more information.
+ * Note : the RPT file is located here : C:\Users\\AppData\Local\Arma 3\. See https://community.bistudio.com/wiki/RPT
+ *
+ * @param 0 (optional) true to also dump the display name and number of entries as a comment, false to hide (default : true)
+ * @param 1 (optional) true to dump the empty categories (i.e. categories with no entry in CfgVehicles) (default : false)
+ *
+ * @usage execute the following line in the BIS' debug console or the init line of the player
+ * @usage nul = [] execVM "R3F_LOG\USER_FUNCT\dump_creation_factory_categories.sqf";
+ *
+ * @usage to not dump the comments after the class names, set the optional param 0 to false
+ * @usage nul = [false] execVM "R3F_LOG\USER_FUNCT\dump_creation_factory_categories.sqf";
+ *
+ * @usage to dump all categories, including empty ones, set param 1 to true
+ * @usage nul = [true, true] execVM "R3F_LOG\USER_FUNCT\dump_creation_factory_categories.sqf";
+ */
+
+waitUntil {!isNil "R3F_LOG_active"};
+
+private ["_comment", "_montrer_categories_vides", "_retour_liste_cfgVehicles_par_categories", "_cfgVehicles_categories", "_cfgVehicles_par_categories", "_nb_categories", "_idx_categorie", "_align_comma", "_x"];
+
+_comment = if (count _this > 0) then {_this select 0} else {true};
+_montrer_categories_vides = if (count _this > 1) then {_this select 1} else {false};
+
+_retour_liste_cfgVehicles_par_categories = [objNull, _montrer_categories_vides] call R3F_LOG_FNCT_recuperer_liste_cfgVehicles_par_categories;
+
+_cfgVehicles_categories = _retour_liste_cfgVehicles_par_categories select 0;
+_cfgVehicles_par_categories = _retour_liste_cfgVehicles_par_categories select 1;
+
+diag_log text "R3F_LOG_CFG_CF_your_own_categories_list =";
+diag_log text "[";
+
+_nb_categories = count _cfgVehicles_categories;
+for [{_idx_categorie = 0}, {_idx_categorie < _nb_categories}, {_idx_categorie = _idx_categorie+1}] do
+{
+ if (_comment) then
+ {
+ // Formatage du tableau sans virgule pour le dernier élément + alignement des commentaires
+ _align_comma = if (_idx_categorie != _nb_categories-1) then {","} else {" "};
+ for "_x" from 1 to (32 - count toArray (_cfgVehicles_categories select _idx_categorie)) do {_align_comma = _align_comma + " ";};
+
+ // Dump des infos de la catégorie
+ diag_log text format
+ [
+ " ""%1""%2 // %3 (%4 entries)",
+ _cfgVehicles_categories select _idx_categorie,
+ _align_comma,
+ getText (configFile >> "CfgVehicleClasses" >> (_cfgVehicles_categories select _idx_categorie) >> "displayName"),
+ count (_cfgVehicles_par_categories select _idx_categorie)
+ ];
+ }
+ else
+ {
+ _align_comma = if (_idx_categorie != _nb_categories-1) then {","} else {""};
+
+ // Dump des infos de la catégorie
+ diag_log text format
+ [
+ " ""%1""%2",
+ _cfgVehicles_categories select _idx_categorie,
+ _align_comma
+ ];
+ };
+};
+
+diag_log text "];";
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/user_funct/init_creation_factory.sqf b/mpmissions/Exile.Altis/R3F_LOG/user_funct/init_creation_factory.sqf
new file mode 100644
index 0000000..619ab57
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/user_funct/init_creation_factory.sqf
@@ -0,0 +1,32 @@
+/**
+ * Initialize a vehicle or an object to be a creation factory (object spawning system)
+ *
+ * @param 0 the creation factory, can be a mobile vehicle or any object
+ * @param 1 (optional) creation credits limitation, -1 for unlimited credits (default : -1)
+ * @param 2 (optional) side to allow accessing to the factory (default : all sides allowed)
+ * @param 3 (optional) list of class names of allowed categories (white list)
+ * if param not set, all the categories are allowed, except those in the black list defined in config_creation_factory.sqf
+ * if string "FULL", use the white list R3F_LOG_CFG_CF_whitelist_full_categories (config_creation_factory.sqf)
+ * if string "MEDIUM", use the white list R3F_LOG_CFG_CF_whitelist_medium_categories (config_creation_factory.sqf)
+ * if string "LIGHT", use the white list R3F_LOG_CFG_CF_whitelist_light_categories (config_creation_factory.sqf)
+ * if array of CfgVehicleClasses entries (class names, e.g. : ["Furniture", "Fortifications"]), use this array as white list
+ *
+ * @usage nul = [my_factory] execVM "R3F_LOG\USER_FUNCT\init_creation_factory.sqf"; // Unlimited credits, all sides allowed, all categories except black list in config_creation_factory.sqf
+ * @usage nul = [my_factory, 10000] execVM "R3F_LOG\USER_FUNCT\init_creation_factory.sqf"; // 10000 credits, all sides allowed, all categories except black list in config_creation_factory.sqf
+ * @usage nul = [my_factory, -1, independent] execVM "R3F_LOG\USER_FUNCT\init_creation_factory.sqf"; // Unlimited credits, allow to GUER side, all categories except black list
+ * @usage nul = [my_factory, -1, nil, "MEDIUM"] execVM "R3F_LOG\USER_FUNCT\init_creation_factory.sqf"; // All sides allowed, use white list MEDIUM in config_creation_factory.sqf
+ * @usage nul = [my_factory, -1, nil, ["Car", "Armored"]] execVM "R3F_LOG\USER_FUNCT\init_creation_factory.sqf"; // Allow only categories "Car" and "Armored"
+ * @usage You can replace "my_factory" by "this" if you put the line in the initialization line in the mission editor.
+ *
+ * @note the categories are the same as in the mission editor. Class names can be found in the BIS' config viewer in the config file CfgVehicleClasses.
+ */
+
+if (!isDedicated) then
+{
+ waitUntil {!isNil "R3F_LOG_active"};
+
+ if (R3F_LOG_active) then
+ {
+ _this call R3F_LOG_FNCT_usine_init;
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/user_funct/watch_objects_to_not_lose.sqf b/mpmissions/Exile.Altis/R3F_LOG/user_funct/watch_objects_to_not_lose.sqf
new file mode 100644
index 0000000..de554af
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/user_funct/watch_objects_to_not_lose.sqf
@@ -0,0 +1,7 @@
+/**
+ * THIS SCRIPT HAS BEEN REMOVED. PLEASE USE "R3F_LOG\USER_FUNCT\do_not_lose_it.sqf".
+ */
+
+sleep 1;
+systemChat "ERROR : The logistics script ""USER_FUNCT\watch_objects_to_not_lose.sqf"" has been removed. Please use ""USER_FUNCT\do_not_lose_it.sqf"".";
+diag_log "ERROR : The logistics script ""USER_FUNCT\watch_objects_to_not_lose.sqf"" has been removed. Please use ""USER_FUNCT\do_not_lose_it.sqf"".";
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/creer_objet.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/creer_objet.sqf
new file mode 100644
index 0000000..4d1310b
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/creer_objet.sqf
@@ -0,0 +1,171 @@
+/**
+ * Créer un objet - appelé deuis l'interface de l'usine de création
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ disableSerialization; // A cause des displayCtrl
+
+ #include "dlg_constantes.h"
+ private ["_usine", "_classe", "_cout", "_objet", "_pos_degagee", "_action_confirmee", "_est_deplacable"];
+
+ _usine = uiNamespace getVariable "R3F_LOG_dlg_LO_usine";
+
+ if (lbCurSel R3F_LOG_IDC_dlg_LO_liste_objets == -1) exitWith {R3F_LOG_mutex_local_verrou = false;};
+ _classe = lbData [R3F_LOG_IDC_dlg_LO_liste_objets, lbCurSel R3F_LOG_IDC_dlg_LO_liste_objets];
+
+ if (_classe != "") then
+ {
+ _cout = [_classe] call R3F_LOG_FNCT_determiner_cout_creation;
+ _est_deplacable = ([_classe] call R3F_LOG_FNCT_determiner_fonctionnalites_logistique) select R3F_LOG_IDX_can_be_moved_by_player;
+
+ // L'usine a-t-elle assez de crédits ?
+ if (_usine getVariable "R3F_LOG_CF_credits" == -1 || _usine getVariable "R3F_LOG_CF_credits" >= _cout) then
+ {
+ // Recherche d'une position dégagée. Les véhicules doivent être créé au niveau du sol sinon ils ne peuvent être utilisés.
+ if (_classe isKindOf "AllVehicles") then
+ {
+ private ["_rayon", "_bbox", "_bbox_dim"];
+
+ systemChat STR_R3F_LOG_action_creer_en_cours;
+ sleep 0.5;
+
+ _bbox = [_classe] call R3F_LOG_FNCT_3D_get_bounding_box_depuis_classname;
+ _bbox_dim = (vectorMagnitude (_bbox select 0)) max (vectorMagnitude (_bbox select 1));
+
+ // Recherche d'une position dégagée (on augmente progressivement le rayon jusqu'à trouver une position)
+ for [{_rayon = 5 max (2*_bbox_dim); _pos_degagee = [];}, {count _pos_degagee == 0 && _rayon <= 30 + (8*_bbox_dim)}, {_rayon = _rayon + 10 + (2*_bbox_dim)}] do
+ {
+ _pos_degagee = [
+ _bbox_dim,
+ _usine modelToWorld [0, if (_usine isKindOf "AllVehicles") then {(boundingBoxReal _usine select 0 select 1) - 2 - 0.3*_rayon} else {0}, 0],
+ _rayon,
+ 100 min (5 + _rayon^1.2)
+ ] call R3F_LOG_FNCT_3D_tirer_position_degagee_sol;
+ };
+ }
+ else
+ {
+ _pos_degagee = [] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel;
+ };
+
+ if (count _pos_degagee > 0) then
+ {
+ // Si l'objet n'est ni un véhicule, ni déplaçable manuellement, on demande confirmation de création
+ if (!(_classe isKindOf "AllVehicles") && !_est_deplacable) then
+ {
+ _action_confirmee = [STR_R3F_LOG_action_decharger_deplacable_exceptionnel, "Warning", true, true] call BIS_fnc_GUImessage;
+ }
+ else
+ {
+ _action_confirmee = true;
+ };
+
+ if (_action_confirmee) then
+ {
+ // Déduction des crédits (si limité)
+ if (_usine getVariable "R3F_LOG_CF_credits" != -1) then
+ {
+ _usine setVariable ["R3F_LOG_CF_credits", 0 max ((_usine getVariable "R3F_LOG_CF_credits") - _cout), true];
+ };
+
+ _objet = _classe createVehicle _pos_degagee;
+ _objet setPos _pos_degagee;
+ _objet setVectorDirAndUp [[-cos getDir _usine, sin getDir _usine, 0] vectorCrossProduct surfaceNormal _pos_degagee, surfaceNormal _pos_degagee];
+ _objet setVelocity [0, 0, 0];
+
+ if !(isNull _objet) then
+ {
+ // Désactivation du bouton fermer car la création est engagée
+ (findDisplay R3F_LOG_IDD_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_btn_fermer) ctrlEnable false;
+
+ // Mémoriser que cet objet a été créé depuis une usine
+ _objet setVariable ["R3F_LOG_CF_depuis_usine", true, true];
+
+ [_objet, player] call R3F_LOG_FNCT_definir_proprietaire_verrou;
+
+ sleep 0.5;
+
+ // Informer tout le monde qu'il y a un nouvel objet
+ R3F_LOG_PUBVAR_nouvel_objet_a_initialiser = true;
+ publicVariable "R3F_LOG_PUBVAR_nouvel_objet_a_initialiser";
+
+ // Prise en compte de l'objet dans l'environnement du joueur (accélérer le retour des addActions)
+ _objet spawn
+ {
+ sleep 4;
+ R3F_LOG_PUBVAR_reveler_au_joueur = _this;
+ publicVariable "R3F_LOG_PUBVAR_reveler_au_joueur";
+ ["R3F_LOG_PUBVAR_reveler_au_joueur", R3F_LOG_PUBVAR_reveler_au_joueur] spawn R3F_LOG_FNCT_PUBVAR_reveler_au_joueur;
+ };
+
+ // Si l'objet créé est un drone, on y place des IA en équipage
+ if (getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ {
+ createVehicleCrew _objet;
+ sleep 0.5;
+ };
+
+ if (!(_objet isKindOf "AllVehicles") || _est_deplacable) then
+ {
+ R3F_LOG_mutex_local_verrou = false;
+ [_objet, player, 0, true] spawn R3F_LOG_FNCT_objet_deplacer;
+ }
+ else
+ {
+ sleep 0.4; // Car la prise en compte n'est pas instantannée
+
+ // Si l'objet a été créé assez loin, on indique sa position relative
+ if (_objet distance _usine > 40) then
+ {
+ systemChat format [STR_R3F_LOG_action_creer_fait + " (%2)",
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName"),
+ format ["%1m %2deg", round (_objet distance _usine), round ([_usine, _objet] call BIS_fnc_dirTo)]
+ ];
+ }
+ else
+ {
+ systemChat format [STR_R3F_LOG_action_creer_fait, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ R3F_LOG_mutex_local_verrou = false;
+ };
+
+ closeDialog 0;
+ }
+ else
+ {
+ hintC format ["ERROR : ""%1"" is not an instanciable objet.", _classe];
+ R3F_LOG_mutex_local_verrou = false;
+ };
+ }
+ else
+ {
+ R3F_LOG_mutex_local_verrou = false;
+ };
+ }
+ else
+ {
+ hintC format ["ERROR : no empty position found around. Creation canceled. Move out objects around the factory and try again."];
+ R3F_LOG_mutex_local_verrou = false;
+ };
+ }
+ else
+ {
+ hintC STR_R3F_LOG_action_creer_pas_assez_credits;
+ R3F_LOG_mutex_local_verrou = false;
+ };
+ }
+ else {R3F_LOG_mutex_local_verrou = false;};
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/determiner_cout_creation.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/determiner_cout_creation.sqf
new file mode 100644
index 0000000..930bb58
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/determiner_cout_creation.sqf
@@ -0,0 +1,30 @@
+/**
+ * Retourne le coût de création d'un objet
+ *
+ * @param 0 la classe d'objet pour lequel déterminer le coût de création
+ *
+ * @return le coût de création de l'objet
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_classe", "_categorie_toLower", "_idx_facteur_cout", "_facteur_cout", "_cout_creation"];
+
+_classe = _this select 0;
+
+_categorie_toLower = toLower getText (configFile >> "CfgVehicles" >> _classe >> "vehicleClass");
+
+// Recherche de l'éventuel facteur de coût de création
+_facteur_cout = 1;
+{
+ if (_categorie_toLower == toLower (_x select 0)) exitWith {_facteur_cout = _x select 1;};
+} forEach R3F_LOG_CFG_CF_creation_cost_factor;
+
+// Formule de calcul de coût
+_cout_creation = _facteur_cout * (1 max ceil (0.01 * getNumber (configFile >> "CfgVehicles" >> _classe >> "cost")));
+
+_cout_creation
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/dlg_constantes.h b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/dlg_constantes.h
new file mode 100644
index 0000000..464d6ab
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/dlg_constantes.h
@@ -0,0 +1,93 @@
+/**
+ * Constantes pour rendre les définitions des boîtes de dialogue plus lisible et maintenable
+ */
+
+#define R3F_LOG_ID_usine_creation_START 65860
+
+#define R3F_LOG_IDD_dlg_liste_objets (R3F_LOG_ID_usine_creation_START + 1)
+
+#define R3F_LOG_IDC_dlg_LO_titre (R3F_LOG_ID_usine_creation_START + 2)
+#define R3F_LOG_IDC_dlg_LO_credits_restants (R3F_LOG_ID_usine_creation_START + 3)
+#define R3F_LOG_IDC_dlg_LO_liste_categories (R3F_LOG_ID_usine_creation_START + 4)
+#define R3F_LOG_IDC_dlg_LO_liste_objets (R3F_LOG_ID_usine_creation_START + 5)
+#define R3F_LOG_IDC_dlg_LO_btn_creer (R3F_LOG_ID_usine_creation_START + 6)
+#define R3F_LOG_IDC_dlg_LO_btn_fermer (R3F_LOG_ID_usine_creation_START + 7)
+#define R3F_LOG_IDC_dlg_LO_infos_titre (R3F_LOG_ID_usine_creation_START + 8)
+#define R3F_LOG_IDC_dlg_LO_infos (R3F_LOG_ID_usine_creation_START + 9)
+
+// Control types
+#define CT_STATIC 0
+#define CT_BUTTON 1
+#define CT_EDIT 2
+#define CT_SLIDER 3
+#define CT_COMBO 4
+#define CT_LISTBOX 5
+#define CT_TOOLBOX 6
+#define CT_CHECKBOXES 7
+#define CT_PROGRESS 8
+#define CT_HTML 9
+#define CT_STATIC_SKEW 10
+#define CT_ACTIVETEXT 11
+#define CT_TREE 12
+#define CT_STRUCTURED_TEXT 13
+#define CT_CONTEXT_MENU 14
+#define CT_CONTROLS_GROUP 15
+#define CT_SHORTCUT_BUTTON 16 // Arma 2 - textured button
+
+#define CT_XKEYDESC 40
+#define CT_XBUTTON 41
+#define CT_XLISTBOX 42
+#define CT_XSLIDER 43
+#define CT_XCOMBO 44
+#define CT_ANIMATED_TEXTURE 45
+#define CT_OBJECT 80
+#define CT_OBJECT_ZOOM 81
+#define CT_OBJECT_CONTAINER 82
+#define CT_OBJECT_CONT_ANIM 83
+#define CT_LINEBREAK 98
+#define CT_USER 99
+#define CT_MAP 100
+#define CT_MAP_MAIN 101
+#define CT_List_N_Box 102 // Arma 2 - N columns list box
+
+// Static styles
+#define ST_POS 0x0F
+#define ST_HPOS 0x03
+#define ST_VPOS 0x0C
+#define ST_LEFT 0x00
+#define ST_RIGHT 0x01
+#define ST_CENTER 0x02
+#define ST_DOWN 0x04
+#define ST_UP 0x08
+#define ST_VCENTER 0x0c
+
+#define ST_TYPE 0xF0
+#define ST_SINGLE 0
+#define ST_MULTI 16
+#define ST_TITLE_BAR 32
+#define ST_PICTURE 48
+#define ST_FRAME 64
+#define ST_BACKGROUND 80
+#define ST_GROUP_BOX 96
+#define ST_GROUP_BOX2 112
+#define ST_HUD_BACKGROUND 128
+#define ST_TILE_PICTURE 144
+#define ST_WITH_RECT 160
+#define ST_LINE 176
+
+#define ST_SHADOW 0x100
+#define ST_NO_RECT 0x200
+#define ST_KEEP_ASPECT_RATIO 0x800
+
+#define ST_TITLE ST_TITLE_BAR + ST_CENTER
+
+// Slider styles
+#define SL_DIR 0x400
+#define SL_VERT 0
+#define SL_HORZ 0x400
+
+#define SL_TEXTURES 0x10
+
+// Listbox styles
+#define LB_TEXTURES 0x10
+#define LB_MULTI 0x20
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/dlg_liste_objets.h b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/dlg_liste_objets.h
new file mode 100644
index 0000000..c62bc89
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/dlg_liste_objets.h
@@ -0,0 +1,274 @@
+/**
+ * Interface d'affichage du contenu du véhicule
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "dlg_constantes.h"
+
+class R3F_LOG_dlg_liste_objets
+{
+ idd = R3F_LOG_IDD_dlg_liste_objets;
+ name = "R3F_LOG_dlg_liste_objets";
+ movingEnable = false;
+
+ onUnload = "call compile preprocessFile ""R3F_LOG\usine_creation\memoriser_dlg_liste_objets.sqf"";";
+
+ controlsBackground[] = {R3F_LOG_dlg_LO_titre_fond};
+ objects[] = {};
+ controls[] =
+ {
+ R3F_LOG_dlg_LO_titre,
+ R3F_LOG_dlg_LO_credits_restants,
+ R3F_LOG_dlg_LO_liste_categories,
+ R3F_LOG_dlg_LO_liste_objets,
+ R3F_LOG_dlg_LO_btn_creer,
+ R3F_LOG_dlg_LO_btn_fermer,
+ R3F_LOG_dlg_LO_infos_titre_fond,
+ R3F_LOG_dlg_LO_infos_titre,
+ R3F_LOG_dlg_LO_infos
+ };
+
+ // Définition des classes de base
+ class R3F_LOG_dlg_LO_texte
+ {
+ idc = -1;
+ type = CT_STATIC;
+ style = ST_LEFT;
+ x = 0.0; w = 0.3;
+ y = 0.0; h = 0.03;
+ sizeEx = 0.023;
+ colorBackground[] = {0,0,0,0};
+ colorText[] = {1,1,1,1};
+ font = "PuristaMedium";
+ text = "";
+ };
+
+ class R3F_LOG_dlg_LO_btn
+ {
+ idc = -1;
+ type = CT_SHORTCUT_BUTTON;
+ style = ST_CENTER;
+
+ text = "btn";
+ action = "";
+
+ x = 0; w = 0.195;
+ y = 0; h = 0.045;
+
+ font = "PuristaLight";
+ size = 0.038;
+ sizeEx = 0.038;
+
+ animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)";
+ animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)";
+ animTextureOver = "#(argb,8,8,3)color(1,1,1,0.5)";
+ animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)";
+ animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)";
+ animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)";
+ textureNoShortcut = "#(argb,8,8,3)color(0,0,0,0)";
+ colorBackground[] = {0,0,0,0.8};
+ colorBackground2[] = {1,1,1,0.5};
+ colorBackgroundFocused[] = {1,1,1,0.5};
+ color[] = {1,1,1,1};
+ color2[] = {1,1,1,1};
+ colorText[] = {1,1,1,1};
+ colorFocused[] = {1,1,1,1};
+ colorDisabled[] = {1,1,1,0.25};
+ period = 0.6;
+ periodFocus = 0.6;
+ periodOver = 0.6;
+ shadow = 0;
+
+ class HitZone
+ {
+ left = 0.000;
+ top = 0.000;
+ right = 0.000;
+ bottom = 0.000;
+ };
+
+ class ShortcutPos
+ {
+ left = 0.000;
+ top = 0.000;
+ w = 0.023;
+ h = 0.050;
+ };
+
+ class TextPos
+ {
+ left = 0.010;
+ top = 0.000;
+ right = 0.000;
+ bottom = 0.000;
+ };
+
+ soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",0.09,1};
+ soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1};
+ soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick",0.09,1};
+ soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1};
+
+ class Attributes
+ {
+ font = "PuristaLight";
+ color = "#E5E5E5";
+ align = "left";
+ shadow = "false";
+ };
+
+ class AttributesImage
+ {
+ font = "PuristaLight";
+ color = "#E5E5E5";
+ align = "left";
+ };
+ };
+
+ class R3F_LOG_dlg_LO_liste
+ {
+ type = CT_LISTBOX;
+ style = ST_MULTI;
+ idc = -1;
+ text = "";
+ w = 0.275;
+ h = 0.04;
+ wholeHeight = 0.45;
+ rowHeight = 0.035;
+ font = "PuristaSemibold";
+ sizeEx = 0.03;
+ soundSelect[] = {"",0.1,1};
+ soundExpand[] = {"",0.1,1};
+ soundCollapse[] = {"",0.1,1};
+ arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
+ arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
+ maxHistoryDelay = 1;
+ autoScrollSpeed = 0;
+ autoScrollDelay = 0;
+ autoScrollRewind = 0;
+
+ shadow = 0;
+ colorShadow[] = {0,0,0,0.5};
+ colorText[] = {1,1,1,1.0};
+ colorDisabled[] = {1,1,1,0.25};
+ colorScrollbar[] = {1,0,0,0};
+ colorSelect[] = {0,0,0,1};
+ colorSelect2[] = {0,0,0,1};
+ colorSelectBackground[] = {0.95,0.95,0.95,1};
+ colorSelectBackground2[] = {1,1,1,0.75};
+ colorBackground[] = {0,0,0,0.75};
+ period = 1.2;
+
+ class ComboScrollBar
+ {
+ color[] = {1,1,1,1};
+ colorActive[] = {1,1,1,1};
+ colorDisabled[] = {1,1,1,0.3};
+ thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
+ arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
+ arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
+ border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
+ };
+
+ class ListScrollBar
+ {
+ color[] = {1,1,1,1};
+ colorActive[] = {1,1,1,1};
+ colorDisabled[] = {1,1,1,0.3};
+ thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
+ arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
+ arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
+ border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
+ };
+ };
+ // FIN Définition des classes de base
+
+ class R3F_LOG_dlg_LO_titre_fond : R3F_LOG_dlg_LO_texte
+ {
+ x = safeZoneX + 0.005; w = 0.40;
+ y = safeZoneY + 0.005; h = 0.07;
+ colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])","(profilenamespace getvariable ['GUI_BCG_RGB_A',0.8])"};
+ };
+
+ class R3F_LOG_dlg_LO_titre : R3F_LOG_dlg_LO_texte
+ {
+ idc = R3F_LOG_IDC_dlg_LO_titre;
+ x = safeZoneX + 0.005; w = 0.40;
+ y = safeZoneY + 0.005; h = 0.04;
+ sizeEx = 0.05;
+ text = "";
+ };
+
+ class R3F_LOG_dlg_LO_credits_restants : R3F_LOG_dlg_LO_texte
+ {
+ idc = R3F_LOG_IDC_dlg_LO_credits_restants;
+ x = safeZoneX + 0.005; w = 0.40;
+ y = safeZoneY + 0.045; h = 0.03;
+ sizeEx = 0.03;
+ text = "";
+ };
+
+ class R3F_LOG_dlg_LO_liste_categories : R3F_LOG_dlg_LO_liste
+ {
+ idc = R3F_LOG_IDC_dlg_LO_liste_categories;
+ type = CT_COMBO;
+ x = safeZoneX + 0.005; w = 0.40;
+ y = safeZoneY + 0.080; h = 0.045;
+ onLBSelChanged = "call R3F_LOG_FNCT_usine_remplir_liste_objets;";
+ };
+
+ class R3F_LOG_dlg_LO_liste_objets : R3F_LOG_dlg_LO_liste
+ {
+ idc = R3F_LOG_IDC_dlg_LO_liste_objets;
+ x = safeZoneX + 0.005; w = 0.40;
+ y = safeZoneY + 0.130; h = safeZoneH - 0.185;
+ onLBDblClick = "0 spawn R3F_LOG_FNCT_usine_creer_objet;";
+ onLBSelChanged = "[(_this select 0) lbData (_this select 1)] call R3F_LOG_VIS_FNCT_voir_objet;";
+ };
+
+ class R3F_LOG_dlg_LO_btn_creer : R3F_LOG_dlg_LO_btn
+ {
+ idc = R3F_LOG_IDC_dlg_LO_btn_creer;
+ x = safeZoneX + 0.005; y = safeZoneH + safeZoneY - 0.050;
+ text = "";
+ action = "0 spawn R3F_LOG_FNCT_usine_creer_objet;";
+ };
+
+ class R3F_LOG_dlg_LO_btn_fermer : R3F_LOG_dlg_LO_btn
+ {
+ idc = R3F_LOG_IDC_dlg_LO_btn_fermer;
+ x = safeZoneX + 0.005 + 0.205; y = safeZoneH + safeZoneY - 0.050;
+ text = "";
+ action = "closeDialog 0;";
+ };
+
+ class R3F_LOG_dlg_LO_infos_titre_fond : R3F_LOG_dlg_LO_texte
+ {
+ x = safeZoneX + safeZoneW - 0.005 - 0.35; w = 0.35;
+ y = safeZoneY + 0.005; h = 0.055;
+ colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])","(profilenamespace getvariable ['GUI_BCG_RGB_A',0.8])"};
+ };
+
+ class R3F_LOG_dlg_LO_infos_titre : R3F_LOG_dlg_LO_texte
+ {
+ idc = R3F_LOG_IDC_dlg_LO_infos_titre;
+ x = safeZoneX + safeZoneW - 0.005 - 0.35; w = 0.35;
+ y = safeZoneY + 0.005; h = 0.045;
+ sizeEx = 0.05;
+ text = "";
+ };
+
+ class R3F_LOG_dlg_LO_infos : R3F_LOG_dlg_LO_texte
+ {
+ idc = R3F_LOG_IDC_dlg_LO_infos;
+ type = CT_STRUCTURED_TEXT;
+ x = safeZoneX + safeZoneW - 0.005 - 0.35; w = 0.35;
+ y = safeZoneY + 0.065; h = 0.44;
+ size = 0.033;
+ colorBackground[] = {0,0,0,0.75};
+ };
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/memoriser_dlg_liste_objets.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/memoriser_dlg_liste_objets.sqf
new file mode 100644
index 0000000..7840877
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/memoriser_dlg_liste_objets.sqf
@@ -0,0 +1,21 @@
+/**
+ * Enregistre les valeurs des champs avant fermeture de la boîte de dialogue de l'usine de création.
+ * ouvrir_usine.sqf s'en servira pour la préremplir à l'ouverture
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+disableSerialization; // A cause des displayCtrl
+
+private ["_dlg_liste_objets"];
+
+#include "dlg_constantes.h"
+
+_dlg_liste_objets = findDisplay R3F_LOG_IDD_dlg_liste_objets;
+
+(uiNamespace getVariable "R3F_LOG_dlg_LO_usine") setVariable ["R3F_LOG_CF_mem_idx_categorie", lbCurSel (_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_liste_categories)];
+(uiNamespace getVariable "R3F_LOG_dlg_LO_usine") setVariable ["R3F_LOG_CF_mem_idx_objet", lbCurSel (_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_liste_objets)];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/ouvrir_usine.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/ouvrir_usine.sqf
new file mode 100644
index 0000000..b3f95eb
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/ouvrir_usine.sqf
@@ -0,0 +1,95 @@
+/**
+ * Ouvre la boîte de dialogue du contenu de l'usine
+ *
+ * @param 0 l'usine qu'il faut ouvrir
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "dlg_constantes.h"
+
+disableSerialization; // A cause des displayCtrl
+
+private ["_usine", "_credits_usine", "_dlg_liste_objets", "_ctrl_liste_categories", "_sel_categorie"];
+
+R3F_LOG_objet_selectionne = objNull;
+
+_usine = _this select 0;
+uiNamespace setVariable ["R3F_LOG_dlg_LO_usine", _usine];
+
+call R3F_LOG_VIS_FNCT_demarrer_visualisation;
+
+// Pré-calculer une fois pour toutes les usines la liste des objets du CfgVehicles classés par catégorie
+if (isNil {_usine getVariable "R3F_LOG_CF_cfgVehicles_par_categories"}) then
+{
+ private ["_retour_liste_cfgVehicles_par_categories"];
+
+ _retour_liste_cfgVehicles_par_categories = [_usine] call R3F_LOG_FNCT_recuperer_liste_cfgVehicles_par_categories;
+
+ _usine setVariable ["R3F_LOG_CF_cfgVehicles_categories", + (_retour_liste_cfgVehicles_par_categories select 0)];
+ _usine setVariable ["R3F_LOG_CF_cfgVehicles_par_categories", + (_retour_liste_cfgVehicles_par_categories select 1)];
+};
+
+createDialog "R3F_LOG_dlg_liste_objets";
+_dlg_liste_objets = findDisplay R3F_LOG_IDD_dlg_liste_objets;
+
+/**** DEBUT des traductions des labels ****/
+(_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_titre) ctrlSetText STR_R3F_LOG_dlg_LO_titre;
+(_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_btn_creer) ctrlSetText STR_R3F_LOG_dlg_LO_btn_creer;
+(_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_btn_fermer) ctrlSetText STR_R3F_LOG_dlg_LO_btn_fermer;
+(_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_infos_titre) ctrlSetText STR_R3F_LOG_nom_fonctionnalite_proprietes;
+/**** FIN des traductions des labels ****/
+
+_ctrl_liste_categories = _dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_liste_categories;
+_sel_categorie = 0 max (_usine getVariable "R3F_LOG_CF_mem_idx_categorie");
+
+// Insertion de chaque catégories disponibles dans la liste
+{
+ private ["_categorie", "_config", "_nom"];
+
+ _categorie = _x;
+ _config = configFile >> "CfgVehicleClasses" >> _categorie;
+ _nom = getText (_config >> "displayName");
+
+ _index = _ctrl_liste_categories lbAdd format ["%1", _nom];
+ _ctrl_liste_categories lbSetData [_index, _categorie];
+} forEach (_usine getVariable "R3F_LOG_CF_cfgVehicles_categories");
+
+_ctrl_liste_categories lbSetCurSel _sel_categorie;
+
+while {!isNull _dlg_liste_objets} do
+{
+ _credits_usine = _usine getVariable "R3F_LOG_CF_credits";
+
+ // Activer le bouton de création que s'il y a assez de crédits
+ (_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_btn_creer) ctrlEnable (_credits_usine != 0);
+
+ if (_credits_usine == -1) then
+ {
+ (_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_credits_restants) ctrlSetText (format [STR_R3F_LOG_dlg_LO_credits_restants, "unlimited"]);
+ }
+ else
+ {
+ (_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_credits_restants) ctrlSetText (format [STR_R3F_LOG_dlg_LO_credits_restants, _credits_usine]);
+ };
+
+ // Afficher les infos de l'objet
+ if (lbCurSel R3F_LOG_IDC_dlg_LO_liste_objets != -1) then
+ {
+ (_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_infos) ctrlSetStructuredText ([lbData [R3F_LOG_IDC_dlg_LO_liste_objets, lbCurSel R3F_LOG_IDC_dlg_LO_liste_objets]] call R3F_LOG_FNCT_formater_fonctionnalites_logistique);
+ };
+
+ // Fermer la boîte de dialogue si l'usine n'est plus accessible
+ if (!alive _usine || (_usine getVariable "R3F_LOG_CF_disabled")) then
+ {
+ closeDialog 0;
+ };
+
+ sleep 0.15;
+};
+
+call R3F_LOG_VIS_FNCT_terminer_visualisation;
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/recuperer_liste_cfgvehicles_par_categories.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/recuperer_liste_cfgvehicles_par_categories.sqf
new file mode 100644
index 0000000..69c61ad
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/recuperer_liste_cfgvehicles_par_categories.sqf
@@ -0,0 +1,78 @@
+/**
+ * Récupère les liste des catégories (CfgVehicleClasses) et pour chacune d'elles les véhicules associés (CfgVehicles)
+ *
+ * @param 0 (optionnel) l'éventuelle usine pour laquelle récupérer les catégories autorisées (en fonction de la white ou black list)
+ * @param 1 (optionnel) true pour conserver les catégories vides (cà d sans entrée dans le CfgVehicles) (défaut : false)
+ *
+ * @return tableau au format [tableau des catégories, tableau 2D des véhicules associés à chaque catégorie]
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+private ["_usine", "_montrer_categories_vides", "_nb_config", "_idx_categorie", "_idx_config", "_config"];
+private ["_cfgVehicles_categories", "_cfgVehicles_categories_toLower", "_cfgVehicles_par_categories", "_clean_cfgVehicles_categories", "_clean_cfgVehicles_par_categories"];
+
+_usine = if (count _this > 0) then {_this select 0} else {objNull};
+_montrer_categories_vides = if (count _this > 1) then {_this select 1} else {false};
+
+_cfgVehicles_categories = [];
+_cfgVehicles_categories_toLower = [];
+_cfgVehicles_par_categories = [];
+
+// Récupération de la liste des catégories de véhicules
+_nb_config = count (configFile >> "CfgVehicleClasses");
+for [{_idx_config = 0}, {_idx_config < _nb_config}, {_idx_config = _idx_config+1}] do
+{
+ _config = (configFile >> "CfgVehicleClasses") select _idx_config;
+ if (isClass _config) then
+ {
+ // Si la catégorie est autorisé (en fonction de la white ou black list)
+ if (isNull _usine || {(_usine getVariable "R3F_LOG_CF_blackwhitelist_mode" == "white") isEqualTo (toLower configName _config in (_usine getVariable "R3F_LOG_CF_blackwhitelist_categories"))}) then
+ {
+ _cfgVehicles_categories pushBack (configName _config);
+ _cfgVehicles_categories_toLower pushBack (toLower configName _config);
+ _cfgVehicles_par_categories pushBack [];
+ };
+ };
+};
+
+// Création de la liste des véhicules, classés par catégorie
+_nb_config = count (configFile >> "CfgVehicles");
+for [{_idx_config = 0}, {_idx_config < _nb_config}, {_idx_config = _idx_config+1}] do
+{
+ _config = (configFile >> "CfgVehicles") select _idx_config;
+ if (isClass _config) then
+ {
+ // Objet instanciable
+ if (getNumber (_config >> "scope") == 2 && !(configName _config isKindOf "Man")) then
+ {
+ // Si l'objet correspond à une side valide
+ if (isNull _usine || {getNumber (_config >> "side") in (_usine getVariable "R3F_LOG_CF_num_sides")}) then
+ {
+ _idx_categorie = _cfgVehicles_categories_toLower find (toLower getText (_config >> "vehicleClass"));
+
+ if (_idx_categorie != -1) then
+ {
+ (_cfgVehicles_par_categories select _idx_categorie) pushBack (configName _config);
+ };
+ };
+ };
+ };
+};
+
+// Suppression des catégories ne possédant aucun objet
+_clean_cfgVehicles_categories = [];
+_clean_cfgVehicles_par_categories = [];
+{
+ if (_montrer_categories_vides || count (_cfgVehicles_par_categories select _forEachIndex) > 0) then
+ {
+ _clean_cfgVehicles_categories pushBack _x;
+ _clean_cfgVehicles_par_categories pushBack (_cfgVehicles_par_categories select _forEachIndex);
+ };
+} forEach _cfgVehicles_categories;
+
+[_clean_cfgVehicles_categories, _clean_cfgVehicles_par_categories]
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/remplir_liste_objets.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/remplir_liste_objets.sqf
new file mode 100644
index 0000000..1a09e1c
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/remplir_liste_objets.sqf
@@ -0,0 +1,86 @@
+/**
+ * Enregistre les valeurs des champs avant fermeture de la boîte de dialogue de l'usine de création.
+ * ouvrir_usine.sqf s'en servira pour la préremplir à l'ouverture
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+disableSerialization; // A cause des displayCtrl
+
+private ["_usine", "_dlg_liste_objets", "_ctrl_liste_objets", "_sel_categorie", "_sel_objet"];
+
+#include "dlg_constantes.h"
+
+_usine = uiNamespace getVariable "R3F_LOG_dlg_LO_usine";
+
+_dlg_liste_objets = findDisplay R3F_LOG_IDD_dlg_liste_objets;
+
+_ctrl_liste_objets = _dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_liste_objets;
+
+_sel_categorie = lbCurSel (_dlg_liste_objets displayCtrl R3F_LOG_IDC_dlg_LO_liste_categories);
+_sel_objet = 0 max (_usine getVariable "R3F_LOG_CF_mem_idx_objet");
+_usine setVariable ["R3F_LOG_CF_mem_idx_objet", 0];
+
+lbClear _ctrl_liste_objets;
+
+if (count (_usine getVariable "R3F_LOG_CF_cfgVehicles_par_categories") > 0) then
+{
+ // Insertion de chaque type d'objets disponibles dans la liste
+ {
+ private ["_classe", "_config", "_nom", "_icone", "_cout", "_tab_icone", "_index"];
+
+ _classe = _x;
+ _config = configFile >> "CfgVehicles" >> _classe;
+ _nom = getText (_config >> "displayName");
+ _icone = getText (_config >> "icon");
+ _cout = [_classe] call R3F_LOG_FNCT_determiner_cout_creation;
+
+ // Icône par défaut
+ if (_icone == "") then
+ {
+ _icone = "\A3\ui_f\data\map\VehicleIcons\iconObject_ca.paa";
+ };
+
+ // Si le chemin commence par A3\ ou a3\, on rajoute un \ au début
+ _tab_icone = toArray toLower _icone;
+ if (count _tab_icone >= 3 &&
+ {
+ _tab_icone select 0 == (toArray "a" select 0) &&
+ _tab_icone select 1 == (toArray "3" select 0) &&
+ _tab_icone select 2 == (toArray "\" select 0)
+ }) then
+ {
+ _icone = "\" + _icone;
+ };
+
+ // Si icône par défaut, on rajoute le chemin de base par défaut
+ _tab_icone = toArray _icone;
+ if (_tab_icone select 0 != (toArray "\" select 0)) then
+ {
+ _icone = format ["\A3\ui_f\data\map\VehicleIcons\%1_ca.paa", _icone];
+ };
+
+ // Si pas d'extension de fichier, on rajoute ".paa"
+ _tab_icone = toArray _icone;
+ if (count _tab_icone >= 4 && {_tab_icone select (count _tab_icone - 4) != (toArray "." select 0)}) then
+ {
+ _icone = _icone + ".paa";
+ };
+
+ _index = _ctrl_liste_objets lbAdd format ["%1 (%2 cred.)", _nom, [_cout] call R3F_LOG_FNCT_formater_nombre_entier_milliers];
+ _ctrl_liste_objets lbSetPicture [_index, _icone];
+ _ctrl_liste_objets lbSetData [_index, _classe];
+ } forEach (_usine getVariable "R3F_LOG_CF_cfgVehicles_par_categories" select _sel_categorie);
+
+ // Ajout d'une ligne vide car l'affichage des listes de BIS est bugué (dernier élément masqué).....
+ _ctrl_liste_objets lbSetData [_ctrl_liste_objets lbAdd "", ""];
+
+ // Sélectionner l'objet mémoriser en le plaçant visuellement au centre de la liste
+ _ctrl_liste_objets lbSetCurSel (lbSize _ctrl_liste_objets - 1);
+ _ctrl_liste_objets lbSetCurSel (_sel_objet - 8 max 0);
+ _ctrl_liste_objets lbSetCurSel _sel_objet;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_deplace.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_deplace.sqf
new file mode 100644
index 0000000..6b367d0
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_deplace.sqf
@@ -0,0 +1,79 @@
+/**
+ * Revendre l'objet déplacé par le joueur à une usine
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_objet", "_usine"];
+
+ _objet = R3F_LOG_joueur_deplace_objet;
+ _usine = [_objet, 5] call R3F_LOG_FNCT_3D_cursorTarget_virtuel;
+
+ if (!isNull _usine && {
+ !(_usine getVariable ["R3F_LOG_CF_disabled", true]) && alive _usine && (vectorMagnitude velocity _usine < 6) &&
+ (abs ((getPosASL _usine select 2) - (getPosASL player select 2)) < 2.5)
+ }) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_remorque", objNull])) then
+ {
+ if (count (_objet getVariable ["R3F_LOG_objets_charges", []]) == 0) then
+ {
+ _objet setVariable ["R3F_LOG_est_transporte_par", _usine, true];
+
+ // Faire relacher l'objet au joueur
+ R3F_LOG_joueur_deplace_objet = objNull;
+ waitUntil {_objet getVariable "R3F_LOG_est_deplace_par" != player};
+
+ // Suppression de l'équipage IA dans le cas d'un drone
+ if (getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ {
+ {if (!isPlayer _x) then {_objet deleteVehicleCrew _x;};} forEach crew _objet;
+ };
+
+ deleteVehicle _objet;
+
+ // Si l'usine n'a pas de crédits illimité et que le taux d'occasion n'est pas nul
+ if (_usine getVariable "R3F_LOG_CF_credits" != -1 && R3F_LOG_CFG_CF_sell_back_bargain_rate > 0) then
+ {
+ private ["_cout_neuf", "_valeur_occasion"];
+
+ _cout_neuf = [typeOf _objet] call R3F_LOG_FNCT_determiner_cout_creation;
+ _valeur_occasion = ceil (R3F_LOG_CFG_CF_sell_back_bargain_rate * (1 - damage _objet) * _cout_neuf);
+
+ // Ajout de la valeur d'occasion de l'objet dans les crédits de l'usine
+ _usine setVariable ["R3F_LOG_CF_credits", (_usine getVariable "R3F_LOG_CF_credits") + _valeur_occasion, true];
+
+ systemChat format [STR_R3F_LOG_action_revendre_fait + " (+%2 credits)",
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName"), [_valeur_occasion] call R3F_LOG_FNCT_formater_nombre_entier_milliers];
+ }
+ else
+ {
+ systemChat format [STR_R3F_LOG_action_revendre_fait,
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC STR_R3F_LOG_action_revendre_decharger_avant;
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_direct.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_direct.sqf
new file mode 100644
index 0000000..d4b35d2
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_direct.sqf
@@ -0,0 +1,122 @@
+/**
+ * Revendre l'objet sélectionné (R3F_LOG_objet_selectionne) à une usine
+ *
+ * @param 0 l'usine
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_objet", "_usine", "_distance_usine"];
+
+ _objet = _this select 0;
+
+ // Recherche de l'usine la plus proche
+ _usine = objNull;
+ _distance_usine = 1E39;
+ {
+ if (
+ _objet distance _x < 22 && !(_x getVariable "R3F_LOG_CF_disabled") &&
+ _x getVariable ["R3F_LOG_CF_side_addAction", side group player] == side group player &&
+ _objet distance _x < _distance_usine
+ ) then
+ {
+ _usine = _x;
+ _distance_usine = _objet distance _x;
+ };
+ } forEach R3F_LOG_CF_liste_usines;
+
+ if (!isNull _usine && !isNull _objet) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_est_transporte_par", objNull]) && (isNull (_objet getVariable ["R3F_LOG_est_deplace_par", objNull]) || (!alive (_objet getVariable ["R3F_LOG_est_deplace_par", objNull])) || (!isPlayer (_objet getVariable ["R3F_LOG_est_deplace_par", objNull])))) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_remorque", objNull])) then
+ {
+ if (count crew _objet == 0 || getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ {
+ if (_objet distance _usine <= 30) then
+ {
+ if (count (_objet getVariable ["R3F_LOG_objets_charges", []]) == 0) then
+ {
+ _objet setVariable ["R3F_LOG_est_transporte_par", _usine, true];
+
+ systemChat STR_R3F_LOG_action_revendre_en_cours;
+
+ sleep 2;
+
+ // Gestion conflit d'accès
+ if (_objet getVariable "R3F_LOG_est_transporte_par" == _usine && !(_objet in (_usine getVariable "R3F_LOG_objets_charges"))) then
+ {
+ // Suppression de l'équipage IA dans le cas d'un drone
+ if (getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ {
+ {if (!isPlayer _x) then {_objet deleteVehicleCrew _x;};} forEach crew _objet;
+ };
+
+ deleteVehicle _objet;
+
+ // Si l'usine n'a pas de crédits illimité et que le taux d'occasion n'est pas nul
+ if (_usine getVariable "R3F_LOG_CF_credits" != -1 && R3F_LOG_CFG_CF_sell_back_bargain_rate > 0) then
+ {
+ private ["_cout_neuf", "_valeur_occasion"];
+
+ _cout_neuf = [typeOf _objet] call R3F_LOG_FNCT_determiner_cout_creation;
+ _valeur_occasion = ceil (R3F_LOG_CFG_CF_sell_back_bargain_rate * (1 - damage _objet) * _cout_neuf);
+
+ // Ajout de la valeur d'occasion de l'objet dans les crédits de l'usine
+ _usine setVariable ["R3F_LOG_CF_credits", (_usine getVariable "R3F_LOG_CF_credits") + _valeur_occasion, true];
+
+ systemChat format [STR_R3F_LOG_action_revendre_fait + " (+%2 credits)",
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName"), [_valeur_occasion] call R3F_LOG_FNCT_formater_nombre_entier_milliers];
+ }
+ else
+ {
+ systemChat format [STR_R3F_LOG_action_revendre_fait,
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ _objet setVariable ["R3F_LOG_est_transporte_par", objNull, true];
+ hintC format ["ERROR : " + STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC STR_R3F_LOG_action_revendre_decharger_avant;
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_trop_loin, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_joueur_dans_objet, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ };
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_selection.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_selection.sqf
new file mode 100644
index 0000000..91ed580
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/revendre_selection.sqf
@@ -0,0 +1,110 @@
+/**
+ * Revendre l'objet sélectionné (R3F_LOG_objet_selectionne) à une usine
+ *
+ * @param 0 l'usine
+ *
+ * Copyright (C) 2014 Team ~R3F~
+ *
+ * This program is free software under the terms of the GNU General Public License version 3.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+if (R3F_LOG_mutex_local_verrou) then
+{
+ hintC STR_R3F_LOG_mutex_action_en_cours;
+}
+else
+{
+ R3F_LOG_mutex_local_verrou = true;
+
+ private ["_objet", "_usine"];
+
+ _objet = R3F_LOG_objet_selectionne;
+ _usine = _this select 0;
+
+ if (!(isNull _objet) && !(_objet getVariable "R3F_LOG_disabled")) then
+ {
+ if (isNull (_objet getVariable "R3F_LOG_est_transporte_par") && (isNull (_objet getVariable "R3F_LOG_est_deplace_par") || (!alive (_objet getVariable "R3F_LOG_est_deplace_par")) || (!isPlayer (_objet getVariable "R3F_LOG_est_deplace_par")))) then
+ {
+ if (isNull (_objet getVariable ["R3F_LOG_remorque", objNull])) then
+ {
+ if (count crew _objet == 0 || getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ {
+ if (_objet distance _usine <= 30) then
+ {
+ if (count (_objet getVariable ["R3F_LOG_objets_charges", []]) == 0) then
+ {
+ _objet setVariable ["R3F_LOG_est_transporte_par", _usine, true];
+
+ systemChat STR_R3F_LOG_action_revendre_en_cours;
+
+ sleep 2;
+
+ // Gestion conflit d'accès
+ if (_objet getVariable "R3F_LOG_est_transporte_par" == _usine && !(_objet in (_usine getVariable "R3F_LOG_objets_charges"))) then
+ {
+ // Suppression de l'équipage IA dans le cas d'un drone
+ if (getNumber (configFile >> "CfgVehicles" >> (typeOf _objet) >> "isUav") == 1) then
+ {
+ {if (!isPlayer _x) then {_objet deleteVehicleCrew _x;};} forEach crew _objet;
+ };
+
+ deleteVehicle _objet;
+
+ // Si l'usine n'a pas de crédits illimité et que le taux d'occasion n'est pas nul
+ if (_usine getVariable "R3F_LOG_CF_credits" != -1 && R3F_LOG_CFG_CF_sell_back_bargain_rate > 0) then
+ {
+ private ["_cout_neuf", "_valeur_occasion"];
+
+ _cout_neuf = [typeOf _objet] call R3F_LOG_FNCT_determiner_cout_creation;
+ _valeur_occasion = ceil (R3F_LOG_CFG_CF_sell_back_bargain_rate * (1 - damage _objet) * _cout_neuf);
+
+ // Ajout de la valeur d'occasion de l'objet dans les crédits de l'usine
+ _usine setVariable ["R3F_LOG_CF_credits", (_usine getVariable "R3F_LOG_CF_credits") + _valeur_occasion, true];
+
+ systemChat format [STR_R3F_LOG_action_revendre_fait + " (+%2 credits)",
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName"), [_valeur_occasion] call R3F_LOG_FNCT_formater_nombre_entier_milliers];
+ }
+ else
+ {
+ systemChat format [STR_R3F_LOG_action_revendre_fait,
+ getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ _objet setVariable ["R3F_LOG_est_transporte_par", objNull, true];
+ hintC format ["ERROR : " + STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC STR_R3F_LOG_action_revendre_decharger_avant;
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_trop_loin, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_joueur_dans_objet, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_remorque_en_cours, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ }
+ else
+ {
+ hintC format [STR_R3F_LOG_objet_en_cours_transport, getText (configFile >> "CfgVehicles" >> (typeOf _objet) >> "displayName")];
+ };
+ };
+
+ R3F_LOG_objet_selectionne = objNull;
+
+ R3F_LOG_mutex_local_verrou = false;
+};
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/R3F_LOG/usine_creation/usine_init.sqf b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/usine_init.sqf
new file mode 100644
index 0000000..11975d2
--- /dev/null
+++ b/mpmissions/Exile.Altis/R3F_LOG/usine_creation/usine_init.sqf
@@ -0,0 +1,127 @@
+/**
+ * Initialise et configure une usine de création
+ *
+ * @param 0 l'usine
+ * @param 1 (optionnel) son crédit de création, -1 pour un crédit infinie (défaut : -1)
+ * @param 2 (optionnel) side pour laquelle autoriser l'accès (défaut : accès pour toutes les sides)
+ * @param 3 (optionnel) liste des noms de classes des catégories autorisés (white list)
+ * si non renseigné, toutes les catégories non présentes l'éventuelle black list saisie dans config_creation_factory.sqf
+ * si chaîne de caractères "FULL", utilisation de la liste R3F_LOG_CFG_CF_whitelist_full_categories (config_creation_factory.sqf)
+ * si chaîne de caractères "MEDIUM", utilisation de la liste R3F_LOG_CFG_CF_whitelist_medium_categories (config_creation_factory.sqf)
+ * si chaîne de caractères "LIGHT", utilisation de la liste R3F_LOG_CFG_CF_whitelist_light_categories (config_creation_factory.sqf)
+ * si tableau de noms de classes du CfgVehicleClasses (ex : ["Furniture", "Fortifications"]), utilisation de la liste fournie
+ */
+
+private ["_usine", "_credits_usine", "_num_side", "_param3", "_blackwhitelist_categories_toLower"];
+
+_usine = _this select 0;
+
+// Récupération du paramètre optionnel de crédits
+if (count _this > 1 && {!isNil {_this select 1}}) then
+{
+ if (typeName (_this select 1) != "SCALAR") then
+ {
+ systemChat "ERROR : credits parameter passed to ""init creation factory"" is not a number.";
+ diag_log text "ERROR : credits parameter passed to ""init creation factory"" is not a number.";
+ _this set [1, -1];
+ };
+
+ _credits_usine = _this select 1;
+}
+else {_credits_usine = -1};
+
+// Si une side est spécifiée, on l'autorise, ainsi que les sides civil et neutre
+if (count _this > 2 && {!isNil {_this select 2}}) then
+{
+ if (typeName (_this select 2) != "SIDE") then
+ {
+ systemChat "ERROR : side parameter passed to ""init creation factory"" is not a side.";
+ diag_log text "ERROR : side parameter passed to ""init creation factory"" is not a side.";
+ _this set [2, civilian];
+ };
+
+ _num_side = switch (_this select 2) do
+ {
+ case east: {0};
+ case west: {1};
+ case independent: {2};
+ case civilian: {3};
+ default {4};
+ };
+
+ _usine setVariable ["R3F_LOG_CF_num_sides", [_num_side, 3, 4], false];
+ _usine setVariable ["R3F_LOG_CF_side_addAction", _this select 2, false];
+}
+// Par défaut, toutes les sides sont autorisées
+else
+{
+ _usine setVariable ["R3F_LOG_CF_num_sides", [0, 1, 2, 3, 4], false];
+ // R3F_LOG_CF_side_addAction reste nil
+};
+
+/** Crédits de création, -1 pour un crédit infinie */
+if (isNil {_usine getVariable "R3F_LOG_CF_credits"}) then
+{
+ _usine setVariable ["R3F_LOG_CF_credits", _credits_usine, false];
+};
+
+if (isNil {_usine getVariable "R3F_LOG_CF_disabled"}) then
+{
+ _usine setVariable ["R3F_LOG_CF_disabled", false, false];
+};
+
+// Gestion de la configuration black/white liste des catégories accessibles
+if (isNil {_usine getVariable "R3F_LOG_CF_blackwhitelist_categories"}) then
+{
+ if (count _this > 3 && {!isNil {_this select 3}}) then
+ {
+ _param3 = _this select 3;
+
+ _usine setVariable ["R3F_LOG_CF_blackwhitelist_mode", "white", false];
+
+ // Param 3 parmi "FULL" ou "LIGHT" : utilisation de la white list correspondante dans le config_creation_factory.sqf
+ if (typeName _param3 == "STRING") then
+ {
+ _usine setVariable ["R3F_LOG_CF_blackwhitelist_categories", switch (_param3) do {
+ case "LIGHT": {R3F_LOG_CFG_CF_whitelist_light_categories};
+ case "MEDIUM": {R3F_LOG_CFG_CF_whitelist_medium_categories};
+ case "FULL": {R3F_LOG_CFG_CF_whitelist_full_categories};
+ default {R3F_LOG_CFG_CF_whitelist_full_categories};
+ }];
+ }
+ else
+ {
+ // White list personnalisée en param 3
+ if (typeName _param3 == "ARRAY") then
+ {
+ _usine setVariable ["R3F_LOG_CF_blackwhitelist_categories", _param3, false];
+ };
+ };
+ }
+ else
+ {
+ // Par défaut, autoriser tout sauf la black list du config_creation_factory.sqf
+ _usine setVariable ["R3F_LOG_CF_blackwhitelist_mode", "black", false];
+ _usine setVariable ["R3F_LOG_CF_blackwhitelist_categories", R3F_LOG_CFG_CF_blacklist_categories, false];
+ };
+
+ // Conversion des catégories en lettres minuscules
+ _blackwhitelist_categories_toLower = [];
+ {
+ _blackwhitelist_categories_toLower pushBack toLower _x;
+ } forEach (_usine getVariable "R3F_LOG_CF_blackwhitelist_categories");
+ _usine setVariable ["R3F_LOG_CF_blackwhitelist_categories", _blackwhitelist_categories_toLower, false];
+};
+
+// Initialisation des variables mémorisant les valeurs saisies dans l'interface entre deux ouvertures
+_usine setVariable ["R3F_LOG_CF_mem_idx_categorie", 0];
+_usine setVariable ["R3F_LOG_CF_mem_idx_objet", 0];
+
+/** Tableau contenant toutes les usines créées */
+R3F_LOG_CF_liste_usines pushBack _usine;
+
+_usine addAction [("" + STR_R3F_LOG_action_ouvrir_usine + ""), {_this call R3F_LOG_FNCT_usine_ouvrir_usine}, nil, 5, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_ouvrir_usine_valide"];
+
+_usine addAction [("" + STR_R3F_LOG_action_revendre_usine_deplace + ""), {_this call R3F_LOG_FNCT_usine_revendre_deplace}, nil, 7, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_revendre_usine_deplace_valide"];
+
+_usine addAction [("" + STR_R3F_LOG_action_revendre_usine_selection + ""), {_this call R3F_LOG_FNCT_usine_revendre_selection}, nil, 6, false, true, "", "!R3F_LOG_mutex_local_verrou && R3F_LOG_objet_addAction == _target && R3F_LOG_action_revendre_usine_selection_valide"];
\ No newline at end of file
diff --git a/mpmissions/Exile.Altis/config.cpp b/mpmissions/Exile.Altis/config.cpp
index 694c218..72820b8 100644
--- a/mpmissions/Exile.Altis/config.cpp
+++ b/mpmissions/Exile.Altis/config.cpp
@@ -76,1543 +76,37 @@ class CfgCraftingRecipes
};
class CfgExileArsenal
{
- class Exile_Uniform_BambiOverall { quality = 1; price = 1; sellPrice = 1; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Civillian Clothing
- ///////////////////////////////////////////////////////////////////////////////
- class U_C_Journalist { quality = 1; price = 20; };
- class U_C_Poloshirt_blue { quality = 1; price = 20; };
- class U_C_Poloshirt_burgundy { quality = 1; price = 20; };
- class U_C_Poloshirt_salmon { quality = 1; price = 20; };
- class U_C_Poloshirt_stripped { quality = 1; price = 20; };
- class U_C_Poloshirt_tricolour { quality = 1; price = 20; };
- class U_C_Poor_1 { quality = 1; price = 20; };
- class U_C_Poor_2 { quality = 1; price = 20; };
- class U_C_Poor_shorts_1 { quality = 1; price = 20; };
- class U_C_Scientist { quality = 1; price = 20; };
- class U_OrestesBody { quality = 1; price = 40; };
- class U_Rangemaster { quality = 1; price = 40; };
- class U_NikosAgedBody { quality = 1; price = 40; };
- class U_NikosBody { quality = 1; price = 40; };
- class U_Competitor { quality = 1; price = 40; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Soldier Uniforms
- ///////////////////////////////////////////////////////////////////////////////
- class U_B_CombatUniform_mcam { quality = 2; price = 40; };
- class U_B_CombatUniform_mcam_tshirt { quality = 2; price = 40; };
- class U_B_CombatUniform_mcam_vest { quality = 2; price = 40; };
- class U_B_CombatUniform_mcam_worn { quality = 2; price = 40; };
- class U_B_CTRG_1 { quality = 2; price = 40; };
- class U_B_CTRG_2 { quality = 2; price = 40; };
- class U_B_CTRG_3 { quality = 2; price = 40; };
- class U_I_CombatUniform { quality = 2; price = 40; };
- class U_I_CombatUniform_shortsleeve { quality = 2; price = 40; };
- class U_I_CombatUniform_tshirt { quality = 2; price = 40; };
- class U_I_OfficerUniform { quality = 2; price = 40; };
- class U_O_CombatUniform_ocamo { quality = 2; price = 40; };
- class U_O_CombatUniform_oucamo { quality = 2; price = 40; };
- class U_O_OfficerUniform_ocamo { quality = 3; price = 80; };
- class U_B_SpecopsUniform_sgg { quality = 3; price = 80; };
- class U_O_SpecopsUniform_blk { quality = 3; price = 80; };
- class U_O_SpecopsUniform_ocamo { quality = 3; price = 80; };
- class U_I_G_Story_Protagonist_F { quality = 3; price = 100; };
- class Exile_Uniform_Woodland { quality = 3; price = 150; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Guerilla Uniforms
- ///////////////////////////////////////////////////////////////////////////////
- class U_C_HunterBody_grn { quality = 2; price = 40; };
- class U_IG_Guerilla1_1 { quality = 2; price = 40; };
- class U_IG_Guerilla2_1 { quality = 2; price = 60; };
- class U_IG_Guerilla2_2 { quality = 2; price = 40; };
- class U_IG_Guerilla2_3 { quality = 2; price = 40; };
- class U_IG_Guerilla3_1 { quality = 2; price = 40; };
- class U_BG_Guerilla2_1 { quality = 2; price = 40; };
- class U_IG_Guerilla3_2 { quality = 2; price = 40; };
- class U_BG_Guerrilla_6_1 { quality = 2; price = 60; };
- class U_BG_Guerilla1_1 { quality = 2; price = 40; };
- class U_BG_Guerilla2_2 { quality = 2; price = 40; };
- class U_BG_Guerilla2_3 { quality = 2; price = 40; };
- class U_BG_Guerilla3_1 { quality = 2; price = 40; };
- class U_BG_leader { quality = 3; price = 40; };
- class U_IG_leader { quality = 3; price = 40; };
- class U_I_G_resistanceLeader_F { quality = 3; price = 100; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Ghillie Suits
- ///////////////////////////////////////////////////////////////////////////////
- class U_B_FullGhillie_ard { quality = 4; price = 150; };
- class U_B_FullGhillie_lsh { quality = 4; price = 150; };
- class U_B_FullGhillie_sard { quality = 4; price = 150; };
- class U_B_GhillieSuit { quality = 3; price = 100; };
- class U_I_FullGhillie_ard { quality = 4; price = 150; };
- class U_I_FullGhillie_lsh { quality = 4; price = 150; };
- class U_I_FullGhillie_sard { quality = 4; price = 150; };
- class U_I_GhillieSuit { quality = 3; price = 100; };
- class U_O_FullGhillie_ard { quality = 6; price = 150; };
- class U_O_FullGhillie_lsh { quality = 6; price = 150; };
- class U_O_FullGhillie_sard { quality = 6; price = 150; };
- class U_O_GhillieSuit { quality = 5; price = 100; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Wet Suits
- ///////////////////////////////////////////////////////////////////////////////
- class U_I_Wetsuit { quality = 3; price = 80; };
- class U_O_Wetsuit { quality = 3; price = 80; };
- class U_B_Wetsuit { quality = 3; price = 80; };
- class U_B_survival_uniform { quality = 3; price = 80; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Bandolliers
- ///////////////////////////////////////////////////////////////////////////////
- class V_BandollierB_blk { quality = 1; price = 20; };
- class V_BandollierB_cbr { quality = 1; price = 20; };
- class V_BandollierB_khk { quality = 1; price = 20; };
- class V_BandollierB_oli { quality = 1; price = 20; };
- class V_BandollierB_rgr { quality = 1; price = 20; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Chestrigs
- ///////////////////////////////////////////////////////////////////////////////
- class V_Chestrig_blk { quality = 1; price = 30; };
- class V_Chestrig_khk { quality = 1; price = 30; };
- class V_Chestrig_oli { quality = 1; price = 30; };
- class V_Chestrig_rgr { quality = 1; price = 30; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Vests
- ///////////////////////////////////////////////////////////////////////////////
- class V_Press_F { quality = 1; price = 10; };
- class V_Rangemaster_belt { quality = 1; price = 6; };
- class V_TacVest_blk { quality = 2; price = 50; };
- class V_TacVest_blk_POLICE { quality = 3; price = 50; };
- class V_TacVest_brn { quality = 2; price = 50; };
- class V_TacVest_camo { quality = 2; price = 50; };
- class V_TacVest_khk { quality = 2; price = 50; };
- class V_TacVest_oli { quality = 2; price = 50; };
- class V_TacVestCamo_khk { quality = 2; price = 50; };
- class V_TacVestIR_blk { quality = 2; price = 50; };
- class V_I_G_resistanceLeader_F { quality = 2; price = 50; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Harnesses
- ///////////////////////////////////////////////////////////////////////////////
- class V_HarnessO_brn { quality = 1; price = 40; };
- class V_HarnessO_gry { quality = 1; price = 40; };
- class V_HarnessOGL_brn { quality = 1; price = 30; };
- class V_HarnessOGL_gry { quality = 1; price = 30; };
- class V_HarnessOSpec_brn { quality = 1; price = 40; };
- class V_HarnessOSpec_gry { quality = 1; price = 40; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Plate Carriers
- ///////////////////////////////////////////////////////////////////////////////
- class V_PlateCarrier1_blk { quality = 1; price = 80; };
- class V_PlateCarrier1_rgr { quality = 1; price = 80; };
- class V_PlateCarrier2_rgr { quality = 2; price = 100; };
- class V_PlateCarrier3_rgr { quality = 2; price = 100; };
- class V_PlateCarrierGL_blk { quality = 6; price = 500; };
- class V_PlateCarrierGL_mtp { quality = 6; price = 500; };
- class V_PlateCarrierGL_rgr { quality = 6; price = 500; };
- class V_PlateCarrierH_CTRG { quality = 2; price = 100; };
- class V_PlateCarrierIA1_dgtl { quality = 2; price = 80; };
- class V_PlateCarrierIA2_dgtl { quality = 2; price = 100; };
- class V_PlateCarrierIAGL_dgtl { quality = 3; price = 400; };
- class V_PlateCarrierIAGL_oli { quality = 3; price = 400; };
- class V_PlateCarrierL_CTRG { quality = 2; price = 100; };
- class V_PlateCarrierSpec_blk { quality = 5; price = 200; };
- class V_PlateCarrierSpec_mtp { quality = 5; price = 200; };
- class V_PlateCarrierSpec_rgr { quality = 5; price = 200; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Caps
- ///////////////////////////////////////////////////////////////////////////////
- class H_Cap_blk { quality = 1; price = 6; };
- class H_Cap_blk_Raven { quality = 1; price = 6; };
- class H_Cap_blu { quality = 1; price = 6; };
- class H_Cap_brn_SPECOPS { quality = 1; price = 6; };
- class H_Cap_grn { quality = 1; price = 6; };
- class H_Cap_headphones { quality = 1; price = 6; };
- class H_Cap_khaki_specops_UK { quality = 1; price = 6; };
- class H_Cap_oli { quality = 1; price = 6; };
- class H_Cap_press { quality = 1; price = 6; };
- class H_Cap_red { quality = 1; price = 6; };
- class H_Cap_tan { quality = 1; price = 6; };
- class H_Cap_tan_specops_US { quality = 1; price = 6; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Glasses
- ///////////////////////////////////////////////////////////////////////////////
- class G_Spectacles { quality = 1; price = 6; };
- class G_Spectacles_Tinted { quality = 1; price = 6; };
- class G_Combat { quality = 1; price = 6; };
- class G_Lowprofile { quality = 1; price = 6; };
- class G_Shades_Black { quality = 1; price = 6; };
- class G_Shades_Green { quality = 1; price = 6; };
- class G_Shades_Red { quality = 1; price = 6; };
- class G_Squares { quality = 1; price = 6; };
- class G_Squares_Tinted { quality = 1; price = 6; };
- class G_Sport_BlackWhite { quality = 1; price = 6; };
- class G_Sport_Blackyellow { quality = 1; price = 6; };
- class G_Sport_Greenblack { quality = 1; price = 6; };
- class G_Sport_Checkered { quality = 1; price = 6; };
- class G_Sport_Red { quality = 1; price = 6; };
- class G_Tactical_Black { quality = 1; price = 6; };
- class G_Aviator { quality = 1; price = 6; };
- class G_Lady_Mirror { quality = 1; price = 6; };
- class G_Lady_Dark { quality = 1; price = 6; };
- class G_Lady_Red { quality = 1; price = 6; };
- class G_Lady_Blue { quality = 1; price = 6; };
- class G_Diving { quality = 1; price = 6; };
- class G_B_Diving { quality = 1; price = 6; };
- class G_O_Diving { quality = 1; price = 6; };
- class G_I_Diving { quality = 1; price = 6; };
- class G_Goggles_VR { quality = 1; price = 6; };
- class G_Balaclava_blk { quality = 2; price = 10; };
- class G_Balaclava_oli { quality = 2; price = 10; };
- class G_Balaclava_combat { quality = 2; price = 10; };
- class G_Balaclava_lowprofile { quality = 2; price = 10; };
- class G_Bandanna_blk { quality = 1; price = 6; };
- class G_Bandanna_oli { quality = 1; price = 6; };
- class G_Bandanna_khk { quality = 1; price = 6; };
- class G_Bandanna_tan { quality = 1; price = 6; };
- class G_Bandanna_beast { quality = 1; price = 6; };
- class G_Bandanna_shades { quality = 1; price = 6; };
- class G_Bandanna_sport { quality = 1; price = 6; };
- class G_Bandanna_aviator { quality = 1; price = 6; };
- class G_Shades_Blue { quality = 1; price = 6; };
- class G_Sport_Blackred { quality = 1; price = 6; };
- class G_Tactical_Clear { quality = 1; price = 6; };
- class G_Balaclava_TI_blk_F { quality = 2; price = 15; };
- class G_Balaclava_TI_tna_F { quality = 2; price = 15; };
- class G_Balaclava_TI_G_blk_F { quality = 2; price = 15; };
- class G_Balaclava_TI_G_tna_F { quality = 2; price = 15; };
- class G_Combat_Goggles_tna_F { quality = 1; price = 6; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Military Caps
- ///////////////////////////////////////////////////////////////////////////////
- class H_MilCap_blue { quality = 1; price = 8; };
- class H_MilCap_dgtl { quality = 1; price = 8; };
- class H_MilCap_mcamo { quality = 1; price = 8; };
- class H_MilCap_ocamo { quality = 1; price = 8; };
- class H_MilCap_oucamo { quality = 1; price = 8; };
- class H_MilCap_rucamo { quality = 1; price = 8; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Beanies
- ///////////////////////////////////////////////////////////////////////////////
- class H_Watchcap_blk { quality = 1; price = 6; };
- class H_Watchcap_camo { quality = 1; price = 6; };
- class H_Watchcap_khk { quality = 1; price = 6; };
- class H_Watchcap_sgg { quality = 1; price = 6; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Bandannas
- ///////////////////////////////////////////////////////////////////////////////
- class H_Bandanna_camo { quality = 1; price = 4; };
- class H_Bandanna_cbr { quality = 1; price = 4; };
- class H_Bandanna_gry { quality = 1; price = 4; };
- class H_Bandanna_khk { quality = 1; price = 4; };
- class H_Bandanna_khk_hs { quality = 1; price = 4; };
- class H_Bandanna_mcamo { quality = 1; price = 4; };
- class H_Bandanna_sgg { quality = 1; price = 4; };
- class H_Bandanna_surfer { quality = 1; price = 4; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Boonie Hats
- ///////////////////////////////////////////////////////////////////////////////
- class H_Booniehat_dgtl { quality = 1; price = 6; };
- class H_Booniehat_dirty { quality = 1; price = 6; };
- class H_Booniehat_grn { quality = 1; price = 6; };
- class H_Booniehat_indp { quality = 1; price = 6; };
- class H_Booniehat_khk { quality = 1; price = 6; };
- class H_Booniehat_khk_hs { quality = 1; price = 6; };
- class H_Booniehat_mcamo { quality = 1; price = 6; };
- class H_Booniehat_tan { quality = 1; price = 6; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Hats
- ///////////////////////////////////////////////////////////////////////////////
- class H_Hat_blue { quality = 1; price = 6; };
- class H_Hat_brown { quality = 1; price = 6; };
- class H_Hat_camo { quality = 1; price = 6; };
- class H_Hat_checker { quality = 1; price = 6; };
- class H_Hat_grey { quality = 1; price = 6; };
- class H_Hat_tan { quality = 1; price = 6; };
- class H_StrawHat { quality = 1; price = 6; };
- class H_StrawHat_dark { quality = 1; price = 6; };
- class Exile_Headgear_SantaHat { quality = 1; price = 10; };
- class Exile_Headgear_SafetyHelmet { quality = 1; price = 20; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Berets
- ///////////////////////////////////////////////////////////////////////////////
- class H_Beret_02 { quality = 2; price = 6; };
- class H_Beret_blk { quality = 2; price = 6; };
- class H_Beret_blk_POLICE { quality = 2; price = 6; };
- class H_Beret_brn_SF { quality = 2; price = 6; };
- class H_Beret_Colonel { quality = 3; price = 8; };
- class H_Beret_grn { quality = 2; price = 6; };
- class H_Beret_grn_SF { quality = 2; price = 6; };
- class H_Beret_ocamo { quality = 2; price = 6; };
- class H_Beret_red { quality = 2; price = 6; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Shemags
- ///////////////////////////////////////////////////////////////////////////////
- class H_Shemag_khk { quality = 1; price = 10; };
- class H_Shemag_olive { quality = 1; price = 10; };
- class H_Shemag_olive_hs { quality = 1; price = 10; };
- class H_Shemag_tan { quality = 1; price = 10; };
- class H_ShemagOpen_khk { quality = 1; price = 10; };
- class H_ShemagOpen_tan { quality = 1; price = 10; };
- class H_TurbanO_blk { quality = 1; price = 10; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Light Helmets
- ///////////////////////////////////////////////////////////////////////////////
- class H_HelmetB_light { quality = 2; price = 20; };
- class H_HelmetB_light_black { quality = 2; price = 20; };
- class H_HelmetB_light_desert { quality = 2; price = 20; };
- class H_HelmetB_light_grass { quality = 2; price = 20; };
- class H_HelmetB_light_sand { quality = 2; price = 20; };
- class H_HelmetB_light_snakeskin { quality = 2; price = 20; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Helmets
- ///////////////////////////////////////////////////////////////////////////////
- class H_HelmetIA { quality = 3; price = 40; };
- class H_HelmetIA_camo { quality = 3; price = 40; };
- class H_HelmetIA_net { quality = 3; price = 40; };
- class H_HelmetB { quality = 3; price = 60; };
- class H_HelmetB_black { quality = 3; price = 60; };
- class H_HelmetB_camo { quality = 3; price = 80; }; // This one is awesome!
- class H_HelmetB_desert { quality = 3; price = 60; };
- class H_HelmetB_grass { quality = 3; price = 60; };
- class H_HelmetB_paint { quality = 3; price = 60; };
- class H_HelmetB_plain_blk { quality = 3; price = 60; };
- class H_HelmetB_sand { quality = 3; price = 60; };
- class H_HelmetB_snakeskin { quality = 3; price = 60; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Spec Ops Helmets
- ///////////////////////////////////////////////////////////////////////////////
- class H_HelmetSpecB { quality = 4; price = 80; };
- class H_HelmetSpecB_blk { quality = 4; price = 80; };
- class H_HelmetSpecB_paint1 { quality = 4; price = 80; };
- class H_HelmetSpecB_paint2 { quality = 4; price = 80; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Super Helmets
- ///////////////////////////////////////////////////////////////////////////////
- class H_HelmetO_ocamo { quality = 5; price = 150; };
- class H_HelmetO_oucamo { quality = 5; price = 150; };
- class H_HelmetSpecO_blk { quality = 5; price = 100; };
- class H_HelmetSpecO_ocamo { quality = 5; price = 100; };
- class H_HelmetLeaderO_ocamo { quality = 5; price = 200; };
- class H_HelmetLeaderO_oucamo { quality = 5; price = 200; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Pointer Attachments
- ///////////////////////////////////////////////////////////////////////////////
- class acc_flashlight { quality = 1; price = 4; };
- class acc_pointer_IR { quality = 1; price = 10; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Bitpod Attachments
- ///////////////////////////////////////////////////////////////////////////////
- class bipod_01_F_blk { quality = 2; price = 10; };
- class bipod_01_F_mtp { quality = 2; price = 10; };
- class bipod_01_F_snd { quality = 2; price = 10; };
- class bipod_02_F_blk { quality = 2; price = 10; };
- class bipod_02_F_hex { quality = 2; price = 10; };
- class bipod_02_F_tan { quality = 2; price = 10; };
- class bipod_03_F_blk { quality = 2; price = 10; };
- class bipod_03_F_oli { quality = 2; price = 10; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Muzzle Attachments
- ///////////////////////////////////////////////////////////////////////////////
- class muzzle_snds_338_black { quality = 5; price = 50; };
- class muzzle_snds_338_green { quality = 5; price = 50; };
- class muzzle_snds_338_sand { quality = 5; price = 50; };
- class muzzle_snds_93mmg { quality = 4; price = 50; };
- class muzzle_snds_93mmg_tan { quality = 4; price = 50; };
- class muzzle_snds_acp { quality = 1; price = 10; };
- class muzzle_snds_B { quality = 3; price = 20; };
- class muzzle_snds_H { quality = 2; price = 20; };
- class muzzle_snds_H_MG { quality = 2; price = 20; };
- class muzzle_snds_H_SW { quality = 2; price = 20; };
- class muzzle_snds_L { quality = 1; price = 10; };
- class muzzle_snds_M { quality = 1; price = 10; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // UAVS
- ///////////////////////////////////////////////////////////////////////////////
- class I_UavTerminal { quality = 4; price = 750; };
- class I_UAV_01_backpack_F { quality = 4; price = 3000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Static MGs
- ///////////////////////////////////////////////////////////////////////////////
- class O_HMG_01_weapon_F { quality = 4; price = 5000; };
- class O_HMG_01_support_F { quality = 4; price = 1000; };
- // Does not seem to work with HMG01, only the lower version does
- //class O_HMG_01_support_high_F { quality = QUALITY_LEVEL_9000; price = 5000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Optic Attachments
- ///////////////////////////////////////////////////////////////////////////////
- class optic_Aco { quality = 1; price = 70; };
- class optic_ACO_grn { quality = 1; price = 70; };
- class optic_ACO_grn_smg { quality = 1; price = 70; };
- class optic_Aco_smg { quality = 1; price = 70; };
- class optic_AMS { quality = 5; price = 300; };
- class optic_AMS_khk { quality = 5; price = 300; };
- class optic_AMS_snd { quality = 5; price = 300; };
- class optic_Arco { quality = 1; price = 100; };
- class optic_DMS { quality = 2; price = 150; };
- class optic_Hamr { quality = 3; price = 200; };
- class optic_Holosight { quality = 1; price = 50; };
- class optic_Holosight_smg { quality = 1; price = 50; };
- class optic_KHS_blk { quality = 4; price = 300; };
- class optic_KHS_hex { quality = 4; price = 300; };
- class optic_KHS_old { quality = 4; price = 300; };
- class optic_KHS_tan { quality = 4; price = 300; };
- class optic_LRPS { quality = 5; price = 300; };
- class optic_MRCO { quality = 1; price = 100; };
- class optic_MRD { quality = 1; price = 10; };
- class optic_Nightstalker { quality = 6; price = 1000; };
- class optic_NVS { quality = 4; price = 500; };
- class optic_SOS { quality = 2; price = 200; };
- //class optic_tws { quality = QUALITY_LEVEL_9000; price = 1500; };
- //class optic_tws_mg { quality = QUALITY_LEVEL_9000; price = 1500; };
- class optic_Yorris { quality = 1; price = 10; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Hardware
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Item_Rope { quality = 1; price = 20; };
- class Exile_Item_DuctTape { quality = 1; price = 300; };
- class Exile_Item_ExtensionCord { quality = 1; price = 40; };
- class Exile_Item_FuelCanisterEmpty { quality = 1; price = 40; };
- class Exile_Item_JunkMetal { quality = 1; price = 400; };
- class Exile_Item_LightBulb { quality = 1; price = 20; };
- class Exile_Item_MetalBoard { quality = 1; price = 600; };
- //class Exile_Item_MetalHedgehogKit { quality = 1; price = 1200; };
- class Exile_Item_SafeKit { quality = 4; price = 25000; };
- class Exile_Item_CodeLock { quality = 1; price = 5000; };
- //class Exile_Item_Laptop { quality = 2; price = 9000; };
- //class Exile_Item_BaseCameraKit { quality = 2; price = 5000; };
- class Exile_Item_CamoTentKit { quality = 1; price = 250; };
- class Exile_Item_MetalPole { quality = 1; price = 800; };
- //class Exile_Item_MetalScrews { quality = 1; price = 100; };
- //class Exile_Item_MetalWire { quality = 1; price = 100; };
- //class Exile_Item_Cement { quality = 1; price = 20; };
- //class Exile_Item_Sand { quality = 1; price = 20; };
- //class Exile_Item_CarWheel { quality = 1; price = 1000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Food
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Item_EMRE { quality = 3; price = 54; }; //75, 60
- class Exile_Item_GloriousKnakworst { quality = 3; price = 40; }; //60, 30
- class Exile_Item_Surstromming { quality = 3; price = 34; }; //55, 25
- class Exile_Item_SausageGravy { quality = 3; price = 30; }; //50, 25
- class Exile_Item_Catfood { quality = 2; price = 24; }; //40, 40
- class Exile_Item_ChristmasTinner { quality = 3; price = 20; }; //40, 60
- class Exile_Item_BBQSandwich { quality = 3; price = 20; }; //40, 60
- class Exile_Item_MacasCheese { quality = 3; price = 20; }; //40, 60
- class Exile_Item_Dogfood { quality = 2; price = 18; }; //30, 30
- class Exile_Item_BeefParts { quality = 2; price = 18; }; //30, 30
- class Exile_Item_Cheathas { quality = 2; price = 18; }; //30, 30
- class Exile_Item_Noodles { quality = 1; price = 14; }; //25, 50
- class Exile_Item_SeedAstics { quality = 1; price = 12; }; //20, 40
- class Exile_Item_Raisins { quality = 1; price = 10; }; //15, 30
- class Exile_Item_Moobar { quality = 1; price = 8; }; //10, 30
- class Exile_Item_InstantCoffee { quality = 1; price = 20; }; //5, 10
- class Exile_Item_Can_Empty { quality = 1; price = 1; sellPrice = 1; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Drinks
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Item_PlasticBottleCoffee { quality = 3; price = 70; sellPrice = 10; };//100, 60
- class Exile_Item_PowerDrink { quality = 3; price = 60; }; //95, 10
- class Exile_Item_PlasticBottleFreshWater { quality = 2; price = 50; sellPrice = 4; }; //80, 15
- class Exile_Item_Beer { quality = 1; price = 50; }; //75, 30
- class Exile_Item_EnergyDrink { quality = 1; price = 40; }; //75, 20
- class Exile_Item_ChocolateMilk { quality = 1; price = 25; }; //75, 20
- class Exile_Item_MountainDupe { quality = 1; price = 30; }; //50, 20
- class Exile_Item_PlasticBottleEmpty { quality = 1; price = 4; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // First Aid
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Item_InstaDoc { quality = 5; price = 1250; };
- class Exile_Item_Vishpirin { quality = 3; price = 300; };
- class Exile_Item_Bandage { quality = 2; price = 100; };
- class Exile_Item_Heatpack { quality = 1; price = 50; };
-
- //class Exile_Item_Defibrillator { quality = 1; price = 7500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Tools
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Item_Matches { quality = 1; price = 60; };
- class Exile_Item_CookingPot { quality = 2; price = 80; };
- class Exile_Melee_Axe { quality = 2; price = 100; };
- class Exile_Melee_SledgeHammmer { quality = 3; price = 500; };
- class Exile_Item_CanOpener { quality = 1; price = 80; };
- class Exile_Item_Handsaw { quality = 2; price = 500; };
- class Exile_Item_Pliers { quality = 2; price = 350; };
- class Exile_Item_Grinder { quality = 2; price = 1250; };
- class Exile_Item_Foolbox { quality = 2; price = 4000; };
- //class Exile_Item_CordlessScrewdriver { quality = 1; price = 750; };
- //class Exile_Item_FireExtinguisher { quality = 1; price = 650; };
- //class Exile_Item_Hammer { quality = 1; price = 600; };
- //class Exile_Item_OilCanister { quality = 1; price = 1750; };
- //class Exile_Item_Screwdriver { quality = 1; price = 250; };
- //class Exile_Item_Shovel { quality = 1; price = 700; };
- //class Exile_Item_Wrench { quality = 1; price = 250; };
- //class Exile_Item_SleepingMat { quality = 1; price = 1250; };
- //class Exile_Item_ToiletPaper { quality = 1; price = 5; };
- //class Exile_Item_ZipTie { quality = 1; price = 250; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Navigation
- ///////////////////////////////////////////////////////////////////////////////
- class ItemWatch { quality = 1; price = 2; };
- class ItemGPS { quality = 2; price = 40; };
- class ItemMap { quality = 1; price = 6; };
- class ItemCompass { quality = 1; price = 6; };
- class ItemRadio { quality = 1; price = 40; };
- class Binocular { quality = 1; price = 40; };
- class Rangefinder { quality = 3; price = 200; };
- class Laserdesignator { quality = 6; price = 750; };
- class Laserdesignator_02 { quality = 6; price = 750; };
- class Laserdesignator_03 { quality = 6; price = 750; };
- class NVGoggles { quality = 2; price = 100; };
- class NVGoggles_INDEP { quality = 2; price = 100; };
- class NVGoggles_OPFOR { quality = 2; price = 100; };
- class Exile_Item_XM8 { quality = 2; price = 20; };
- class Exile_Item_MobilePhone { quality = 6; price = 500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Watch out for a Walter fart! He has gas!
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Headgear_GasMask { quality = 4; price = 500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Rebreather
- ///////////////////////////////////////////////////////////////////////////////
- class V_RebreatherB { quality = 2; price = 250; };
- class V_RebreatherIA { quality = 2; price = 250; };
- class V_RebreatherIR { quality = 2; price = 250; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Pilot Stuff
- ///////////////////////////////////////////////////////////////////////////////
- class B_Parachute { quality = 3; price = 150; };
- class H_CrewHelmetHeli_B { quality = 3; price = 150; };
- class H_CrewHelmetHeli_I { quality = 3; price = 150; };
- class H_CrewHelmetHeli_O { quality = 3; price = 150; };
- class H_HelmetCrew_I { quality = 3; price = 100; };
- class H_HelmetCrew_B { quality = 3; price = 100; };
- class H_HelmetCrew_O { quality = 3; price = 100; };
- class H_PilotHelmetHeli_B { quality = 4; price = 100; };
- class H_PilotHelmetHeli_I { quality = 4; price = 100; };
- class H_PilotHelmetHeli_O { quality = 4; price = 100; };
- class U_B_HeliPilotCoveralls { quality = 4; price = 80; };
- class U_B_PilotCoveralls { quality = 2; price = 60; };
- class U_I_HeliPilotCoveralls { quality = 2; price = 60; };
- class U_I_pilotCoveralls { quality = 2; price = 60; };
- class U_O_PilotCoveralls { quality = 2; price = 60; };
- class H_PilotHelmetFighter_B { quality = 5; price = 150; };
- class H_PilotHelmetFighter_I { quality = 5; price = 150; };
- class H_PilotHelmetFighter_O { quality = 5; price = 150; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Backpacks
- ///////////////////////////////////////////////////////////////////////////////
- class B_HuntingBackpack { quality = 3; price = 70; };
- class B_OutdoorPack_blk { quality = 1; price = 80; };
- class B_OutdoorPack_blu { quality = 1; price = 80; };
- class B_OutdoorPack_tan { quality = 1; price = 80; };
- class B_AssaultPack_blk { quality = 1; price = 90; };
- class B_AssaultPack_cbr { quality = 1; price = 90; };
- class B_AssaultPack_dgtl { quality = 1; price = 90; };
- class B_AssaultPack_khk { quality = 1; price = 90; };
- class B_AssaultPack_mcamo { quality = 1; price = 90; };
- class B_AssaultPack_rgr { quality = 1; price = 90; };
- class B_AssaultPack_sgg { quality = 1; price = 90; };
- class B_FieldPack_blk { quality = 2; price = 120; };
- class B_FieldPack_cbr { quality = 2; price = 120; };
- class B_FieldPack_ocamo { quality = 2; price = 120; };
- class B_FieldPack_oucamo { quality = 2; price = 120; };
- class B_TacticalPack_blk { quality = 2; price = 150; };
- class B_TacticalPack_rgr { quality = 2; price = 150; };
- class B_TacticalPack_ocamo { quality = 2; price = 150; };
- class B_TacticalPack_mcamo { quality = 2; price = 150; };
- class B_TacticalPack_oli { quality = 2; price = 150; };
- class B_Kitbag_cbr { quality = 3; price = 200; };
- class B_Kitbag_mcamo { quality = 3; price = 200; };
- class B_Kitbag_sgg { quality = 3; price = 200; };
- class B_Bergen_blk { quality = 3; price = 200; };
- class B_Bergen_mcamo { quality = 3; price = 200; };
- class B_Bergen_rgr { quality = 3; price = 200; };
- class B_Bergen_sgg { quality = 3; price = 200; };
- class B_Carryall_cbr { quality = 4; price = 300; };
- class B_Carryall_khk { quality = 4; price = 300; };
- class B_Carryall_mcamo { quality = 4; price = 300; };
- class B_Carryall_ocamo { quality = 4; price = 300; };
- class B_Carryall_oli { quality = 4; price = 300; };
- class B_Carryall_oucamo { quality = 4; price = 300; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Ammunition
- ///////////////////////////////////////////////////////////////////////////////
- class 100Rnd_65x39_caseless_mag { quality = 2; price = 30; };
- class 100Rnd_65x39_caseless_mag_Tracer { quality = 2; price = 40; };
- class 10Rnd_127x54_Mag { quality = 4; price = 30; };
- // Broken in Arma
- class 10Rnd_338_Mag { quality = 5; price = 30; };
-
- class 10Rnd_762x54_Mag { quality = 3; price = 30; };
- //class 10Rnd_762x51_Mag { quality = 1; price = 30; };
- class 10Rnd_93x64_DMR_05_Mag { quality = 4; price = 40; };
- class 11Rnd_45ACP_Mag { quality = 1; price = 8; };
- class 150Rnd_762x54_Box { quality = 3; price = 20; };
- class 150Rnd_762x54_Box_Tracer { quality = 3; price = 30; };
- class 16Rnd_9x21_Mag { quality = 1; price = 20; };
- class 200Rnd_65x39_cased_Box { quality = 2; price = 30; };
- class 200Rnd_65x39_cased_Box_Tracer { quality = 2; price = 30; };
- class 150Rnd_93x64_Mag { quality = 6; price = 50; };
- class 130Rnd_338_Mag { quality = 5; price = 40; };
- class 20Rnd_556x45_UW_mag { quality = 1; price = 20; };
- class 20Rnd_762x51_Mag { quality = 2; price = 20; };
- class 30Rnd_45ACP_Mag_SMG_01 { quality = 1; price = 10; };
- class 30Rnd_45ACP_Mag_SMG_01_Tracer_Green { quality = 1; price = 10; };
- class 30Rnd_45ACP_Mag_SMG_01_Tracer_Yellow { quality = 1; price = 10; };
- class 30Rnd_45ACP_Mag_SMG_01_Tracer_Red { quality = 1; price = 10; };
- class 30Rnd_556x45_Stanag { quality = 1; price = 20; };
- class 30Rnd_556x45_Stanag_Tracer_Green { quality = 1; price = 20; };
- class 30Rnd_556x45_Stanag_green { quality = 1; price = 20; };
- class 30Rnd_556x45_Stanag_Tracer_Red { quality = 1; price = 20; };
- class 30Rnd_556x45_Stanag_Tracer_Yellow { quality = 1; price = 20; };
- class 30Rnd_556x45_Stanag_red { quality = 1; price = 20; };
- class 30Rnd_65x39_caseless_green { quality = 2; price = 20; };
- class 30Rnd_65x39_caseless_green_mag_Tracer { quality = 2; price = 30; };
- class 30Rnd_65x39_caseless_mag { quality = 2; price = 20; };
- class 30Rnd_65x39_caseless_mag_Tracer { quality = 2; price = 30; };
- class 30Rnd_9x21_Mag { quality = 1; price = 40; };
- class 30Rnd_9x21_Yellow_Mag { quality = 1; price = 40; };
- class 30Rnd_9x21_Green_Mag { quality = 1; price = 40; };
- class 30Rnd_9x21_Red_Mag { quality = 1; price = 40; };
- class 5Rnd_127x108_APDS_Mag { quality = 6; price = 50; };
- class 5Rnd_127x108_Mag { quality = 6; price = 40; };
- class 6Rnd_45ACP_Cylinder { quality = 1; price = 8; };
- class 6Rnd_GreenSignal_F { quality = 1; price = 30; };
- class 6Rnd_RedSignal_F { quality = 1; price = 30; };
- class 7Rnd_408_Mag { quality = 6; price = 10; };
- class 9Rnd_45ACP_Mag { quality = 1; price = 6; };
-
- // Price for bullet cam magazines is normal magazine price + 20 pop tabs per bullet
- class Exile_Magazine_5Rnd_127x108_Bullet_Cam_Mag { quality = 6; price = 40 + 5 * 20; };
- class Exile_Magazine_5Rnd_127x108_APDS_Bullet_Cam_Mag { quality = 6; price = 40 + 10 * 20; };
- class Exile_Magazine_10Rnd_93x64_DMR_05_Bullet_Cam_Mag { quality = 6; price = 40 + 10 * 20; };
- class Exile_Magazine_7Rnd_408_Bullet_Cam_Mag { quality = 6; price = 10 + 7 * 20; };
- class Exile_Magazine_10Rnd_338_Bullet_Cam_Mag { quality = 6; price = 30 + 10 * 20; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Flares
- ///////////////////////////////////////////////////////////////////////////////
- class Chemlight_blue { quality = 1; price = 2; };
- class Chemlight_green { quality = 1; price = 2; };
- class Chemlight_red { quality = 1; price = 2; };
- class FlareGreen_F { quality = 1; price = 6; };
- class FlareRed_F { quality = 1; price = 6; };
- class FlareWhite_F { quality = 1; price = 6; };
- class FlareYellow_F { quality = 1; price = 6; };
- class UGL_FlareGreen_F { quality = 2; price = 8; };
- class UGL_FlareRed_F { quality = 2; price = 8; };
- class UGL_FlareWhite_F { quality = 2; price = 8; };
- class UGL_FlareYellow_F { quality = 2; price = 8; };
- class 3Rnd_UGL_FlareGreen_F { quality = 3; price = 8*3; };
- class 3Rnd_UGL_FlareRed_F { quality = 3; price = 8*3; };
- class 3Rnd_UGL_FlareWhite_F { quality = 3; price = 8*3; };
- class 3Rnd_UGL_FlareYellow_F { quality = 3; price = 8*3; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Smokes
- ///////////////////////////////////////////////////////////////////////////////
- class SmokeShell { quality = 1; price = 6; };
- class SmokeShellBlue { quality = 1; price = 6; };
- class SmokeShellGreen { quality = 1; price = 6; };
- class SmokeShellOrange { quality = 1; price = 6; };
- class SmokeShellPurple { quality = 1; price = 6; };
- class SmokeShellRed { quality = 1; price = 6; };
- class SmokeShellYellow { quality = 1; price = 6; };
- class 1Rnd_Smoke_Grenade_shell { quality = 2; price = 8; };
- class 1Rnd_SmokeBlue_Grenade_shell { quality = 2; price = 8; };
- class 1Rnd_SmokeGreen_Grenade_shell { quality = 2; price = 8; };
- class 1Rnd_SmokeOrange_Grenade_shell { quality = 2; price = 8; };
- class 1Rnd_SmokePurple_Grenade_shell { quality = 2; price = 8; };
- class 1Rnd_SmokeRed_Grenade_shell { quality = 2; price = 8; };
- class 1Rnd_SmokeYellow_Grenade_shell { quality = 2; price = 8; };
- class 3Rnd_Smoke_Grenade_shell { quality = 3; price = 8*3; };
- class 3Rnd_SmokeBlue_Grenade_shell { quality = 3; price = 8*3; };
- class 3Rnd_SmokeGreen_Grenade_shell { quality = 3; price = 8*3; };
- class 3Rnd_SmokeOrange_Grenade_shell { quality = 3; price = 8*3; };
- class 3Rnd_SmokePurple_Grenade_shell { quality = 3; price = 8*3; };
- class 3Rnd_SmokeRed_Grenade_shell { quality = 3; price = 8*3; };
- class 3Rnd_SmokeYellow_Grenade_shell { quality = 3; price = 8*3; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Explosives
- ///////////////////////////////////////////////////////////////////////////////
- class HandGrenade { quality = 3; price = 40; };
- class MiniGrenade { quality = 2; price = 30; };
- class B_IR_Grenade { quality = 1; price = 50; };
- class O_IR_Grenade { quality = 1; price = 50; };
- class I_IR_Grenade { quality = 1; price = 50; };
- class 1Rnd_HE_Grenade_shell { quality = 2; price = 70; };
- class 3Rnd_HE_Grenade_shell { quality = 3; price = 70*3; };
- class APERSBoundingMine_Range_Mag { quality = 3; price = 500; };
- class APERSMine_Range_Mag { quality = 3; price = 600; };
- class APERSTripMine_Wire_Mag { quality = 3; price = 300; };
- class ClaymoreDirectionalMine_Remote_Mag { quality = 3; price = 350; };
- class DemoCharge_Remote_Mag { quality = 4; price = 700; };
- class IEDLandBig_Remote_Mag { quality = 3; price = 600; };
- class IEDLandSmall_Remote_Mag { quality = 3; price = 300; };
- class IEDUrbanBig_Remote_Mag { quality = 3; price = 800; };
- class IEDUrbanSmall_Remote_Mag { quality = 3; price = 400; };
- class SatchelCharge_Remote_Mag { quality = 5; price = 1000; };
- class SLAMDirectionalMine_Wire_Mag { quality = 3; price = 700; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Pistols
- ///////////////////////////////////////////////////////////////////////////////
- class hgun_ACPC2_F { quality = 1; price = 50; };
- class hgun_P07_F { quality = 1; price = 50; };
- class hgun_Pistol_heavy_01_F { quality = 2; price = 80; };
- class hgun_Pistol_heavy_02_F { quality = 2; price = 80; };
- class hgun_Pistol_Signal_F { quality = 1; price = 100; };
- class hgun_Rook40_F { quality = 1; price = 50; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Sub Machine Guns
- ///////////////////////////////////////////////////////////////////////////////
- class hgun_PDW2000_F { quality = 1; price = 100; };
- class SMG_01_F { quality = 1; price = 150; };
- class SMG_02_F { quality = 1; price = 150; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Light Machine Guns
- ///////////////////////////////////////////////////////////////////////////////
- class arifle_MX_SW_Black_F { quality = 2; price = 250; };
- class arifle_MX_SW_F { quality = 2; price = 250; };
- class LMG_Mk200_F { quality = 2; price = 300; };
- class LMG_Zafir_F { quality = 3; price = 350; };
- class MMG_01_hex_F { quality = 6; price = 800; };
- class MMG_01_tan_F { quality = 6; price = 800; };
- class MMG_02_black_F { quality = 6; price = 450; };
- class MMG_02_camo_F { quality = 5; price = 450; };
- class MMG_02_sand_F { quality = 5; price = 450; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Assault Rifles
- ///////////////////////////////////////////////////////////////////////////////
- class arifle_Katiba_C_F { quality = 2; price = 150; };
- class arifle_Katiba_F { quality = 2; price = 150; };
- class arifle_Katiba_GL_F { quality = 2; price = 200; };
- class arifle_Mk20_F { quality = 1; price = 150; };
- class arifle_Mk20_GL_F { quality = 1; price = 200; };
- class arifle_Mk20_GL_plain_F { quality = 1; price = 200; };
- class arifle_Mk20_plain_F { quality = 1; price = 150; };
- class arifle_Mk20C_F { quality = 1; price = 150; };
- class arifle_Mk20C_plain_F { quality = 1; price = 150; };
- class arifle_MX_Black_F { quality = 2; price = 450; };
- class arifle_MX_F { quality = 2; price = 450; };
- class arifle_MX_GL_Black_F { quality = 2; price = 450; };
- class arifle_MX_GL_F { quality = 2; price = 450; };
- class arifle_MXC_Black_F { quality = 2; price = 350; };
- class arifle_MXC_F { quality = 2; price = 350; };
- class arifle_SDAR_F { quality = 1; price = 650; };
- class arifle_TRG20_F { quality = 1; price = 250; };
- class arifle_TRG21_F { quality = 1; price = 250; };
- class arifle_TRG21_GL_F { quality = 1; price = 350; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Sniper Rifles
- ///////////////////////////////////////////////////////////////////////////////
- class arifle_MXM_Black_F { quality = 2; price = 550; };
- class arifle_MXM_F { quality = 2; price = 550; };
- class srifle_DMR_01_F { quality = 3; price = 600; };
- class srifle_DMR_02_camo_F { quality = 3; price = 800; };
- class srifle_DMR_02_F { quality = 3; price = 800; };
- class srifle_DMR_02_sniper_F { quality = 3; price = 800; };
- class srifle_DMR_03_F { quality = 3; price = 750; };
- class srifle_DMR_03_khaki_F { quality = 3; price = 750; };
- class srifle_DMR_03_multicam_F { quality = 3; price = 750; };
- class srifle_DMR_03_tan_F { quality = 3; price = 750; };
- class srifle_DMR_03_woodland_F { quality = 3; price = 750; };
- class srifle_DMR_04_F { quality = 4; price = 700; };
- class srifle_DMR_04_Tan_F { quality = 4; price = 700; };
- class srifle_DMR_05_blk_F { quality = 4; price = 850; };
- class srifle_DMR_05_hex_F { quality = 4; price = 850; };
- class srifle_DMR_05_tan_f { quality = 4; price = 850; };
- class srifle_DMR_06_camo_F { quality = 5; price = 800; };
- class srifle_DMR_06_olive_F { quality = 5; price = 800; };
- class srifle_EBR_F { quality = 3; price = 700; };
- class srifle_GM6_camo_F { quality = 6; price = 900; };
- class srifle_GM6_F { quality = 6; price = 900; };
- class srifle_LRR_camo_F { quality = 6; price = 850; };
- class srifle_LRR_F { quality = 6; price = 850; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // ArmA 2 Weapons
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Weapon_AK107 { quality = 1; price = 300; };
- class Exile_Weapon_AK107_GL { quality = 2; price = 400; };
- class Exile_Weapon_AK74 { quality = 2; price = 350; };
- class Exile_Weapon_AK74_GL { quality = 2; price = 400; };
- class Exile_Weapon_AK47 { quality = 3; price = 500; };
- class Exile_Weapon_AKM { quality = 3; price = 500; };
- class Exile_Weapon_AKS { quality = 3; price = 500; };
- class Exile_Weapon_AKS_Gold { quality = 3; price = 550; };
- class Exile_Weapon_DMR { quality = 3; price = 650; };
- class Exile_Weapon_LeeEnfield { quality = 1; price = 250; };
- class Exile_Weapon_CZ550 { quality = 2; price = 400; };
- class Exile_Weapon_SVD { quality = 4; price = 800; };
- class Exile_Weapon_SVDCamo { quality = 4; price = 850; };
- class Exile_Weapon_VSSVintorez { quality = 3; price = 600; };
- class Exile_Weapon_RPK { quality = 2; price = 250; };
- class Exile_Weapon_PK { quality = 3; price = 300; };
- class Exile_Weapon_PKP { quality = 3; price = 350; };
- class Exile_Weapon_Colt1911 { quality = 1; price = 100; };
- class Exile_Weapon_Makarov { quality = 1; price = 100; };
- class Exile_Weapon_Taurus { quality = 1; price = 100; };
- class Exile_Weapon_TaurusGold { quality = 1; price = 150; };
- class Exile_Weapon_M1014 { quality = 2; price = 200; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // ArmA 2 Ammunition
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Magazine_30Rnd_762x39_AK { quality = 3; price = 20; };
- class Exile_Magazine_30Rnd_545x39_AK { quality = 1; price = 20; };
- class Exile_Magazine_30Rnd_545x39_AK_Green { quality = 1; price = 20; };
- class Exile_Magazine_30Rnd_545x39_AK_Red { quality = 1; price = 20; };
- class Exile_Magazine_30Rnd_545x39_AK_White { quality = 1; price = 20; };
- class Exile_Magazine_30Rnd_545x39_AK_Yellow { quality = 1; price = 20; };
- class Exile_Magazine_45Rnd_545x39_RPK_Green { quality = 1; price = 20; };
- class Exile_Magazine_75Rnd_545x39_RPK_Green { quality = 1; price = 20; };
- class Exile_Magazine_20Rnd_762x51_DMR { quality = 3; price = 20; };
- class Exile_Magazine_20Rnd_762x51_DMR_Yellow { quality = 3; price = 20; };
- class Exile_Magazine_20Rnd_762x51_DMR_Red { quality = 3; price = 20; };
- class Exile_Magazine_20Rnd_762x51_DMR_Green { quality = 3; price = 20; };
- class Exile_Magazine_10Rnd_303 { quality = 1; price = 20; };
- class Exile_Magazine_100Rnd_762x54_PK_Green { quality = 3; price = 20; };
- class Exile_Magazine_7Rnd_45ACP { quality = 1; price = 20; };
- class Exile_Magazine_8Rnd_9x18 { quality = 1; price = 20; };
- class Exile_Magazine_6Rnd_45ACP { quality = 1; price = 20; };
- class Exile_Magazine_5Rnd_22LR { quality = 1; price = 20; };
- class Exile_Magazine_10Rnd_762x54 { quality = 1; price = 20; };
- class Exile_Magazine_10Rnd_9x39 { quality = 1; price = 20; };
- class Exile_Magazine_20Rnd_9x39 { quality = 1; price = 20; };
- class Exile_Magazine_8Rnd_74Slug { quality = 1; price = 20; };
- class Exile_Magazine_8Rnd_74Pellets { quality = 1; price = 20; }; // broken?
-
- ///////////////////////////////////////////////////////////////////////////////
- // Apex Items & Weapons
- ///////////////////////////////////////////////////////////////////////////////
- class hgun_Pistol_01_F { quality = 1; price = 65; };
- class hgun_P07_khk_F { quality = 1; price = 65; };
- class SMG_05_F { quality = 1; price = 150; };
- class LMG_03_F { quality = 2; price = 300; };
- class arifle_MX_khk_F { quality = 2; price = 450; };
- class arifle_MX_GL_khk_F { quality = 2; price = 500; };
- class arifle_MXC_khk_F { quality = 2; price = 350; };
- class arifle_MXM_khk_F { quality = 2; price = 500; };
- class srifle_LRR_tna_F { quality = 6; price = 850; };
- class srifle_GM6_ghex_F { quality = 6; price = 900; };
- class srifle_DMR_07_blk_F { quality = 4; price = 750; };
- class srifle_DMR_07_hex_F { quality = 4; price = 750; };
- class srifle_DMR_07_ghex_F { quality = 4; price = 750; };
- class arifle_AK12_F { quality = 3; price = 650; };
- class arifle_AK12_GL_F { quality = 3; price = 700; };
- class arifle_AKM_F { quality = 3; price = 400; };
- class arifle_AKM_FL_F { quality = 3; price = 400; };
- class arifle_AKS_F { quality = 3; price = 350; };
- class arifle_ARX_blk_F { quality = 5; price = 900; };
- class arifle_ARX_ghex_F { quality = 5; price = 900; };
- class arifle_ARX_hex_F { quality = 5; price = 900; };
- class arifle_CTAR_blk_F { quality = 2; price = 450; };
- class arifle_CTAR_hex_F { quality = 2; price = 450; };
- class arifle_CTAR_ghex_F { quality = 2; price = 450; };
- class arifle_CTAR_GL_blk_F { quality = 2; price = 450; };
- class arifle_CTARS_blk_F { quality = 2; price = 450; };
- class arifle_CTARS_ghex_F { quality = 2; price = 450; };
- class arifle_CTARS_hex_F { quality = 2; price = 450; };
- class arifle_SPAR_01_blk_F { quality = 1; price = 400; };
- class arifle_SPAR_01_khk_F { quality = 1; price = 400; };
- class arifle_SPAR_01_snd_F { quality = 1; price = 400; };
- class arifle_SPAR_01_GL_blk_F { quality = 1; price = 500; };
- class arifle_SPAR_01_GL_khk_F { quality = 1; price = 500; };
- class arifle_SPAR_01_GL_snd_F { quality = 1; price = 500; };
- class arifle_SPAR_02_blk_F { quality = 2; price = 550; };
- class arifle_SPAR_02_khk_F { quality = 2; price = 550; };
- class arifle_SPAR_02_snd_F { quality = 2; price = 550; };
- class arifle_SPAR_03_blk_F { quality = 3; price = 600; };
- class arifle_SPAR_03_khk_F { quality = 3; price = 600; };
- class arifle_SPAR_03_snd_F { quality = 3; price = 600; };
- class muzzle_snds_H_khk_F { quality = 2; price = 50; };
- class muzzle_snds_H_snd_F { quality = 2; price = 50; };
- class muzzle_snds_58_blk_F { quality = 1; price = 20; };
- class muzzle_snds_m_khk_F { quality = 1; price = 15; };
- class muzzle_snds_m_snd_F { quality = 1; price = 15; };
- class muzzle_snds_B_khk_F { quality = 3; price = 50; };
- class muzzle_snds_B_snd_F { quality = 3; price = 50; };
- class muzzle_snds_58_wdm_F { quality = 1; price = 20; };
- class muzzle_snds_65_TI_blk_F { quality = 2; price = 75; };
- class muzzle_snds_65_TI_hex_F { quality = 2; price = 75; };
- class muzzle_snds_65_TI_ghex_F { quality = 2; price = 75; };
- class muzzle_snds_H_MG_blk_F { quality = 2; price = 20; };
- class muzzle_snds_H_MG_khk_F { quality = 2; price = 20; };
- class optic_Arco_blk_F { quality = 1; price = 100; };
- class optic_Arco_ghex_F { quality = 1; price = 100; };
- class optic_DMS_ghex_F { quality = 2; price = 150; };
- class optic_Hamr_khk_F { quality = 3; price = 200; };
- class optic_ERCO_blk_F { quality = 1; price = 125; };
- class optic_ERCO_khk_F { quality = 1; price = 125; };
- class optic_ERCO_snd_F { quality = 1; price = 125; };
- class optic_SOS_khk_F { quality = 2; price = 200; };
- class optic_LRPS_tna_F { quality = 5; price = 300; };
- class optic_LRPS_ghex_F { quality = 5; price = 300; };
- class optic_Holosight_blk_F { quality = 1; price = 50; };
- class optic_Holosight_khk_F { quality = 1; price = 50; };
- class optic_Holosight_smg_blk_F { quality = 1; price = 50; };
- class bipod_01_F_khk { quality = 2; price = 10; };
- class O_NVGoggles_hex_F { quality = 3; price = 150; };
- class O_NVGoggles_urb_F { quality = 3; price = 150; };
- class O_NVGoggles_ghex_F { quality = 3; price = 150; };
- class NVGoggles_tna_F { quality = 2; price = 100; };
- //class NVGogglesB_blk_F { quality = 1; price = 1000; }; //Normal NightV but fullscreen thermal
- //class NVGogglesB_grn_F { quality = 1; price = 1000; }; //Normal NightV but fullscreen thermal
- //class NVGogglesB_gry_F { quality = 1; price = 1000; }; //Normal NightV but fullscreen thermal
- //class Laserdesignator_01_khk_F { quality = 1; price = 1000; }; //Thermal
- //class Laserdesignator_02_ghex_F { quality = 1; price = 1000; }; //Thermal
- class U_B_T_Soldier_F { quality = 2; price = 40; };
- class U_B_T_Soldier_AR_F { quality = 2; price = 40; };
- class U_B_T_Soldier_SL_F { quality = 2; price = 40; };
- class U_B_T_Sniper_F { quality = 3; price = 100; };
- class U_B_T_FullGhillie_tna_F { quality = 4; price = 150; };
- class U_B_CTRG_Soldier_F { quality = 2; price = 40; };
- class U_B_CTRG_Soldier_2_F { quality = 2; price = 40; };
- class U_B_CTRG_Soldier_3_F { quality = 2; price = 40; };
- class U_B_GEN_Soldier_F { quality = 2; price = 35; };
- class U_B_GEN_Commander_F { quality = 2; price = 35; };
- class U_O_T_Soldier_F { quality = 2; price = 40; };
- class U_O_T_Officer_F { quality = 3; price = 40; };
- class U_O_T_Sniper_F { quality = 3; price = 100; };
- class U_O_T_FullGhillie_tna_F { quality = 4; price = 150; };
- class U_O_V_Soldier_Viper_F { quality = 4; price = 150; };
- class U_O_V_Soldier_Viper_hex_F { quality = 4; price = 150; };
- class U_I_C_Soldier_Para_1_F { quality = 2; price = 30; };
- class U_I_C_Soldier_Para_2_F { quality = 2; price = 30; };
- class U_I_C_Soldier_Para_3_F { quality = 2; price = 30; };
- class U_I_C_Soldier_Para_4_F { quality = 2; price = 30; };
- class U_I_C_Soldier_Para_5_F { quality = 2; price = 30; };
- class U_I_C_Soldier_Bandit_1_F { quality = 1; price = 15; };
- class U_I_C_Soldier_Bandit_2_F { quality = 1; price = 15; };
- class U_I_C_Soldier_Bandit_3_F { quality = 1; price = 15; };
- class U_I_C_Soldier_Bandit_4_F { quality = 1; price = 15; };
- class U_I_C_Soldier_Bandit_5_F { quality = 1; price = 15; };
- class U_I_C_Soldier_Camo_F { quality = 2; price = 30; };
- class U_C_man_sport_1_F { quality = 1; price = 10; };
- class U_C_man_sport_2_F { quality = 1; price = 10; };
- class U_C_man_sport_3_F { quality = 1; price = 10; };
- class U_C_Man_casual_1_F { quality = 1; price = 10; };
- class U_C_Man_casual_2_F { quality = 1; price = 10; };
- class U_C_Man_casual_3_F { quality = 1; price = 10; };
- class U_C_Man_casual_4_F { quality = 1; price = 10; };
- class U_C_Man_casual_5_F { quality = 1; price = 10; };
- class U_C_Man_casual_6_F { quality = 1; price = 10; };
- class U_B_CTRG_Soldier_urb_1_F { quality = 2; price = 40; };
- class U_B_CTRG_Soldier_urb_2_F { quality = 2; price = 40; };
- class U_B_CTRG_Soldier_urb_3_F { quality = 2; price = 40; };
- class H_Helmet_Skate { quality = 2; price = 20; };
- class H_HelmetB_TI_tna_F { quality = 4; price = 100; };
- //class H_HelmetO_ViperSP_hex_F { quality = 4; price = 1000; }; //Themal
- //class H_HelmetO_ViperSP_ghex_F { quality = 4; price = 1000; }; //Themal
- class H_HelmetB_tna_F { quality = 3; price = 50; };
- class H_HelmetB_Enh_tna_F { quality = 4; price = 100; };
- class H_HelmetB_Light_tna_F { quality = 2; price = 20; };
- class H_HelmetSpecO_ghex_F { quality = 5; price = 100; };
- class H_HelmetLeaderO_ghex_F { quality = 5; price = 175; };
- class H_HelmetO_ghex_F { quality = 5; price = 75; };
- class H_HelmetCrew_O_ghex_F { quality = 3; price = 75; };
- class H_MilCap_tna_F { quality = 1; price = 8; };
- class H_MilCap_ghex_F { quality = 1; price = 8; };
- class H_Booniehat_tna_F { quality = 1; price = 4; };
- class H_Beret_gen_F { quality = 2; price = 12; };
- class H_MilCap_gen_F { quality = 1; price = 10; };
- class H_Cap_oli_Syndikat_F { quality = 1; price = 6; };
- class H_Cap_tan_Syndikat_F { quality = 1; price = 6; };
- class H_Cap_blk_Syndikat_F { quality = 1; price = 6; };
- class H_Cap_grn_Syndikat_F { quality = 1; price = 6; };
- class H_FakeHeadgear_Syndikat_F { quality = 1; price = 6; };
- class V_TacChestrig_grn_F { quality = 1; price = 15; };
- class V_TacChestrig_oli_F { quality = 1; price = 15; };
- class V_TacChestrig_cbr_F { quality = 1; price = 15; };
- class V_PlateCarrier1_tna_F { quality = 3; price = 50; };
- class V_PlateCarrier2_tna_F { quality = 3; price = 60; };
- class V_PlateCarrierSpec_tna_F { quality = 5; price = 100; };
- class V_PlateCarrierGL_tna_F { quality = 6; price = 500; };
- class V_HarnessO_ghex_F { quality = 2; price = 50; };
- class V_HarnessOGL_ghex_F { quality = 1; price = 30; };
- class V_BandollierB_ghex_F { quality = 1; price = 10; };
- class V_TacVest_gen_F { quality = 1; price = 25; };
- class V_PlateCarrier1_rgr_noflag_F { quality = 2; price = 50; };
- class V_PlateCarrier2_rgr_noflag_F { quality = 2; price = 60; };
- class B_Bergen_Base_F { quality = 5; price = 400; };
- class B_Bergen_mcamo_F { quality = 5; price = 400; };
- class B_Bergen_dgtl_F { quality = 5; price = 400; };
- class B_Bergen_hex_F { quality = 5; price = 400; };
- class B_Bergen_tna_F { quality = 5; price = 400; };
- class B_AssaultPack_tna_F { quality = 1; price = 90; };
- class B_Carryall_ghex_F { quality = 4; price = 300; };
- class B_FieldPack_ghex_F { quality = 2; price = 120; };
- class B_ViperHarness_base_F { quality = 3; price = 250; };
- class B_ViperHarness_blk_F { quality = 3; price = 250; };
- class B_ViperHarness_ghex_F { quality = 3; price = 250; };
- class B_ViperHarness_hex_F { quality = 3; price = 250; };
- class B_ViperHarness_khk_F { quality = 3; price = 250; };
- class B_ViperHarness_oli_F { quality = 3; price = 250; };
- class B_ViperLightHarness_base_F { quality = 2; price = 200; };
- class B_ViperLightHarness_blk_F { quality = 2; price = 200; };
- class B_ViperLightHarness_ghex_F { quality = 2; price = 200; };
- class B_ViperLightHarness_hex_F { quality = 2; price = 200; };
- class B_ViperLightHarness_khk_F { quality = 2; price = 200; };
- class B_ViperLightHarness_oli_F { quality = 2; price = 200; };
-
- class 30Rnd_9x21_Mag_SMG_02 {quality = 1; price = 10; };
- class 30Rnd_9x21_Mag_SMG_02_Tracer_Red {quality = 1; price = 15; };
- class 30Rnd_9x21_Mag_SMG_02_Tracer_Yellow {quality = 1; price = 15; };
- class 30Rnd_9x21_Mag_SMG_02_Tracer_Green {quality = 1; price = 15; };
- class 30Rnd_580x42_Mag_F {quality = 2; price = 15; };
- class 30Rnd_580x42_Mag_Tracer_F {quality = 2; price = 15; };
- class 100Rnd_580x42_Mag_F {quality = 2; price = 15; };
- class 100Rnd_580x42_Mag_Tracer_F {quality = 2; price = 15; };
- class 20Rnd_650x39_Cased_Mag_F {quality = 4; price = 20; };
- class 10Rnd_50BW_Mag_F {quality = 5; price = 35; };
- class 150Rnd_556x45_Drum_Mag_F {quality = 2; price = 75; };
- class 150Rnd_556x45_Drum_Mag_Tracer_F {quality = 2; price = 75; };
- class 30Rnd_762x39_Mag_F {quality = 3; price = 25; };
- class 30Rnd_762x39_Mag_Green_F {quality = 3; price = 25; };
- class 30Rnd_762x39_Mag_Tracer_F {quality = 3; price = 25; };
- class 30Rnd_762x39_Mag_Tracer_Green_F {quality = 3; price = 25; };
- class 30Rnd_545x39_Mag_F {quality = 1; price = 10; };
- class 30Rnd_545x39_Mag_Green_F {quality = 1; price = 10; };
- class 30Rnd_545x39_Mag_Tracer_F {quality = 1; price = 10; };
- class 30Rnd_545x39_Mag_Tracer_Green_F {quality = 1; price = 10; };
- class 200Rnd_556x45_Box_F {quality = 1; price = 90; };
- class 200Rnd_556x45_Box_Red_F {quality = 1; price = 90; };
- class 200Rnd_556x45_Box_Tracer_F {quality = 1; price = 90; };
- class 200Rnd_556x45_Box_Tracer_Red_F {quality = 1; price = 90; };
- class 10Rnd_9x21_Mag {quality = 1; price = 10; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // BIKES
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Bike_OldBike { quality = 1; price = 40; };
- class Exile_Bike_MountainBike { quality = 1; price = 50; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // QUAD BIKES
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Bike_QuadBike_Black { quality = 1; price = 2500; };
- class Exile_Bike_QuadBike_Blue { quality = 1; price = 2500; };
- class Exile_Bike_QuadBike_Red { quality = 1; price = 2500; };
- class Exile_Bike_QuadBike_White { quality = 1; price = 2500; };
- class Exile_Bike_QuadBike_Nato { quality = 1; price = 2500; };
- class Exile_Bike_QuadBike_Csat { quality = 1; price = 2500; };
- class Exile_Bike_QuadBike_Fia { quality = 1; price = 2500; };
- class Exile_Bike_QuadBike_Guerilla01 { quality = 1; price = 2500; };
- class Exile_Bike_QuadBike_Guerilla02 { quality = 1; price = 2500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // KARTS
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Kart_BluKing { quality = 1; price = 1100; };
- class Exile_Car_Kart_RedStone { quality = 1; price = 1100; };
- class Exile_Car_Kart_Vrana { quality = 1; price = 1100; };
- class Exile_Car_Kart_Green { quality = 1; price = 1100; };
- class Exile_Car_Kart_Blue { quality = 1; price = 1100; };
- class Exile_Car_Kart_Orange { quality = 1; price = 1100; };
- class Exile_Car_Kart_White { quality = 1; price = 1100; };
- class Exile_Car_Kart_Yellow { quality = 1; price = 1100; };
- class Exile_Car_Kart_Black { quality = 1; price = 1100; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // MOTOR BOATS
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Boat_MotorBoat_Police { quality = 1; price = 700; };
- class Exile_Boat_MotorBoat_Orange { quality = 1; price = 700; };
- class Exile_Boat_MotorBoat_White { quality = 1; price = 700; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // RUBBER DUCKS
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Boat_RubberDuck_CSAT { quality = 1; price = 500; };
- class Exile_Boat_RubberDuck_Digital { quality = 1; price = 500; };
- class Exile_Boat_RubberDuck_Orange { quality = 1; price = 500; };
- class Exile_Boat_RubberDuck_Blue { quality = 1; price = 500; };
- class Exile_Boat_RubberDuck_Black { quality = 1; price = 500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // SDV
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Boat_SDV_CSAT { quality = 2; price = 11000; };
- class Exile_Boat_SDV_Digital { quality = 2; price = 11000; };
- class Exile_Boat_SDV_Grey { quality = 2; price = 11000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // UH-1H Huey
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Chopper_Huey_Green { quality = 2; price = 21000; };
- class Exile_Chopper_Huey_Desert { quality = 2; price = 21000; };
- class Exile_Chopper_Huey_Armed_Green { quality = 2; price = 25000; };
- class Exile_Chopper_Huey_Armed_Desert { quality = 2; price = 25000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Hellcat
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Chopper_Hellcat_Green { quality = 3; price = 27500; };
- class Exile_Chopper_Hellcat_FIA { quality = 3; price = 27500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Hummingbird
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Chopper_Hummingbird_Green { quality = 3; price = 23000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Hummingbird (Civillian)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Chopper_Hummingbird_Civillian_Blue { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Red { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_ION { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_BlueLine { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Digital { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Elliptical { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Furious { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_GrayWatcher { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Jeans { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Light { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Shadow { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Sheriff { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Speedy { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Sunset { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Vrana { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Wasp { quality = 1; price = 17000; };
- class Exile_Chopper_Hummingbird_Civillian_Wave { quality = 1; price = 17000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Huron
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Chopper_Huron_Black { quality = 5; price = 50000; };
- class Exile_Chopper_Huron_Green { quality = 5; price = 50000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Mohawk
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Chopper_Mohawk_FIA { quality = 4; price = 45000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Orca
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Chopper_Orca_CSAT { quality = 3; price = 28000; };
- class Exile_Chopper_Orca_Black { quality = 3; price = 28000; };
- class Exile_Chopper_Orca_BlackCustom { quality = 3; price = 28000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Taru
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Chopper_Taru_Transport_CSAT { quality = 3; price = 17000; };
- class Exile_Chopper_Taru_Transport_Black { quality = 3; price = 17000; };
-
- class Exile_Chopper_Taru_CSAT { quality = 4; price = 33000; };
- class Exile_Chopper_Taru_Black { quality = 4; price = 33000; };
-
- class Exile_Chopper_Taru_Covered_CSAT { quality = 4; price = 43000; };
- class Exile_Chopper_Taru_Covered_Black { quality = 4; price = 43000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Cessna
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Plane_Cessna { quality = 1; price = 16500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // An-2
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Plane_AN2_Green { quality = 2; price = 17000; };
- class Exile_Plane_AN2_White { quality = 2; price = 17000; };
- class Exile_Plane_AN2_Stripe { quality = 2; price = 17000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Hatchback
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Hatchback_Beige { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Green { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Blue { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_BlueCustom { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_BeigeCustom { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Yellow { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Grey { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Black { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Dark { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Rusty1 { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Rusty2 { quality = 3; price = 12000; };
- class Exile_Car_Hatchback_Rusty3 { quality = 3; price = 12000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Golf
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Golf_Red { quality = 1; price = 8000; };
- class Exile_Car_Golf_Black { quality = 1; price = 8000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Ikarus
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Ikarus_Blue { quality = 1; price = 17000; };
- class Exile_Car_Ikarus_Red { quality = 1; price = 17000; };
- class Exile_Car_Ikarus_Party { quality = 1; price = 17000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Ural (Open)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Ural_Open_Blue { quality = 2; price = 25000; };
- class Exile_Car_Ural_Open_Yellow { quality = 2; price = 25000; };
- class Exile_Car_Ural_Open_Worker { quality = 2; price = 25000; };
- class Exile_Car_Ural_Open_Military { quality = 2; price = 25000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Ural (Covered)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Ural_Covered_Blue { quality = 2; price = 28000; };
- class Exile_Car_Ural_Covered_Yellow { quality = 2; price = 28000; };
- class Exile_Car_Ural_Covered_Worker { quality = 2; price = 28000; };
- class Exile_Car_Ural_Covered_Military { quality = 2; price = 28000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // V3S
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_V3S_Open { quality = 2; price = 28000; };
- class Exile_Car_V3S_Covered { quality = 2; price = 28000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // SUVXL
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_SUVXL_Black { quality = 3; price = 20000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Tractor
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Tractor_Red { quality = 1; price = 2000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Tractor (Old)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_OldTractor_Red { quality = 1; price = 1200; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Tow Tractor
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_TowTractor_White { quality = 1; price = 1800; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Octavius
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Octavius_White { quality = 2; price = 6000; };
- class Exile_Car_Octavius_Black { quality = 2; price = 6000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // UAZ
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_UAZ_Green { quality = 2; price = 7000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // UAZ (Open)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_UAZ_Open_Green { quality = 2; price = 8000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Land Rover
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_LandRover_Red { quality = 3; price = 11000; };
- class Exile_Car_LandRover_Urban { quality = 3; price = 11000; };
- class Exile_Car_LandRover_Green { quality = 3; price = 11000; };
- class Exile_Car_LandRover_Sand { quality = 3; price = 11000; };
- class Exile_Car_LandRover_Desert { quality = 3; price = 11000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Land Rover (Ambulance)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_LandRover_Ambulance_Green { quality = 3; price = 12000; };
- class Exile_Car_LandRover_Ambulance_Desert { quality = 3; price = 12000; };
- class Exile_Car_LandRover_Ambulance_Sand { quality = 3; price = 12000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Lada
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Lada_Green { quality = 2; price = 6000; };
- class Exile_Car_Lada_Taxi { quality = 2; price = 6000; };
- class Exile_Car_Lada_Red { quality = 2; price = 6000; };
- class Exile_Car_Lada_White { quality = 2; price = 6000; };
- class Exile_Car_Lada_Hipster { quality = 2; price = 6000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Volha
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Volha_Blue { quality = 2; price = 6000; };
- class Exile_Car_Volha_White { quality = 2; price = 6000; };
- class Exile_Car_Volha_Black { quality = 2; price = 6000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Hatchback (Sport)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Hatchback_Sport_Red { quality = 4; price = 14000; };
- class Exile_Car_Hatchback_Sport_Blue { quality = 4; price = 14000; };
- class Exile_Car_Hatchback_Sport_Orange { quality = 4; price = 14000; };
- class Exile_Car_Hatchback_Sport_White { quality = 4; price = 14000; };
- class Exile_Car_Hatchback_Sport_Beige { quality = 4; price = 14000; };
- class Exile_Car_Hatchback_Sport_Green { quality = 4; price = 14000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // HEMMT
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_HEMMT { quality = 3; price = 48000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Hunter
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Hunter { quality = 5; price = 26500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Ifrit
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Ifrit { quality = 4; price = 23000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Offroad
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Offroad_Red { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Beige { quality = 3; price = 16000; };
- class Exile_Car_Offroad_White { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Blue { quality = 3; price = 16000; };
- class Exile_Car_Offroad_DarkRed { quality = 3; price = 16000; };
- class Exile_Car_Offroad_BlueCustom { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla01 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla02 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla03 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla04 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla05 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla06 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla07 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla08 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla09 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla10 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla11 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Guerilla12 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Rusty1 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Rusty2 { quality = 3; price = 16000; };
- class Exile_Car_Offroad_Rusty3 { quality = 3; price = 16000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Offroad (Armed)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Offroad_Armed_Guerilla01 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla02 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla03 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla04 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla05 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla06 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla07 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla08 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla09 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla10 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla11 { quality = 5; price = 25000; };
- class Exile_Car_Offroad_Armed_Guerilla12 { quality = 5; price = 25000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Offroad (Repair)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Offroad_Repair_Civillian { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Red { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Beige { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_White { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Blue { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_DarkRed { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_BlueCustom { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla01 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla02 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla03 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla04 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla05 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla06 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla07 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla08 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla09 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla10 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla11 { quality = 4; price = 12500; };
- class Exile_Car_Offroad_Repair_Guerilla12 { quality = 4; price = 12500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Strider
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Strider { quality = 6; price = 44000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // SUV
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_SUV_Red { quality = 3; price = 14000; };
- class Exile_Car_SUV_Black { quality = 3; price = 14000; };
- class Exile_Car_SUV_Grey { quality = 3; price = 14000; };
- class Exile_Car_SUV_Orange { quality = 3; price = 14000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // SUV (Armed)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_SUV_Armed_Black { quality = 4; price = 25000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // BRDM2
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_BRDM2_HQ { quality = 5; price = 25000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // BTR40
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_BTR40_MG_Green { quality = 6; price = 38000; };
- class Exile_Car_BTR40_MG_Camo { quality = 6; price = 38000; };
- class Exile_Car_BTR40_Green { quality = 2; price = 15000; };
- class Exile_Car_BTR40_Camo { quality = 2; price = 15000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // HMMWV
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_HMMWV_M134_Green { quality = 5; price = 33000; };
- class Exile_Car_HMMWV_M134_Desert { quality = 5; price = 33000; };
- class Exile_Car_HMMWV_M2_Green { quality = 6; price = 40000; };
- class Exile_Car_HMMWV_M2_Desert { quality = 6; price = 40000; };
- class Exile_Car_HMMWV_MEV_Green { quality = 3; price = 21000; };
- class Exile_Car_HMMWV_MEV_Desert { quality = 3; price = 21000; };
- class Exile_Car_HMMWV_UNA_Green { quality = 3; price = 21000; };
- class Exile_Car_HMMWV_UNA_Desert { quality = 3; price = 21000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Tempest
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Tempest { quality = 4; price = 48300; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Van
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Van_Black { quality = 2; price = 12000; };
- class Exile_Car_Van_White { quality = 2; price = 12000; };
- class Exile_Car_Van_Red { quality = 2; price = 12000; };
- class Exile_Car_Van_Guerilla01 { quality = 2; price = 12000; };
- class Exile_Car_Van_Guerilla02 { quality = 2; price = 12000; };
- class Exile_Car_Van_Guerilla03 { quality = 2; price = 12000; };
- class Exile_Car_Van_Guerilla04 { quality = 2; price = 12000; };
- class Exile_Car_Van_Guerilla05 { quality = 2; price = 12000; };
- class Exile_Car_Van_Guerilla06 { quality = 2; price = 12000; };
- class Exile_Car_Van_Guerilla07 { quality = 2; price = 12000; };
- class Exile_Car_Van_Guerilla08 { quality = 2; price = 12000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Van (Box)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Van_Box_Black { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_White { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Red { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Guerilla01 { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Guerilla02 { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Guerilla03 { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Guerilla04 { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Guerilla05 { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Guerilla06 { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Guerilla07 { quality = 3; price = 17000; };
- class Exile_Car_Van_Box_Guerilla08 { quality = 3; price = 17000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Van (Fuel)
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Van_Fuel_Black { quality = 3; price = 15000; };
- class Exile_Car_Van_Fuel_White { quality = 3; price = 15000; };
- class Exile_Car_Van_Fuel_Red { quality = 3; price = 15000; };
- class Exile_Car_Van_Fuel_Guerilla01 { quality = 3; price = 15000; };
- class Exile_Car_Van_Fuel_Guerilla02 { quality = 3; price = 15000; };
- class Exile_Car_Van_Fuel_Guerilla03 { quality = 3; price = 15000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Zamak
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_Zamak { quality = 4; price = 43000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Water Scooter
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Boat_WaterScooter { quality = 2; price = 800; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // RHIB
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Boat_RHIB { quality = 3; price = 1500; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Ceaser BTT
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Plane_Ceasar { quality = 2; price = 15000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // V-44 X Blackfish
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Plane_BlackfishInfantry { quality = 6; price = 60000; };
- class Exile_Plane_BlackfishVehicle { quality = 6; price = 60000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Prowler
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_ProwlerLight { quality = 3; price = 22000; };
- class Exile_Car_ProwlerUnarmed { quality = 3; price = 22000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Qilin
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_QilinUnarmed { quality = 3; price = 21000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // MB 4WD
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Car_MB4WD { quality = 2; price = 15000; };
- class Exile_Car_MB4WDOpen { quality = 2; price = 15000; };
-
- ///////////////////////////////////////////////////////////////////////////////
- // Flags
- ///////////////////////////////////////////////////////////////////////////////
- class Exile_Item_FlagStolen1 { quality = 1; price = 5000; sellPrice = 5000; };
- class Exile_Item_FlagStolen2 { quality = 1; price = 10000; sellPrice = 10000; };
- class Exile_Item_FlagStolen3 { quality = 1; price = 15000; sellPrice = 15000; };
- class Exile_Item_FlagStolen4 { quality = 1; price = 20000; sellPrice = 20000; };
- class Exile_Item_FlagStolen5 { quality = 1; price = 25000; sellPrice = 25000; };
- class Exile_Item_FlagStolen6 { quality = 1; price = 30000; sellPrice = 30000; };
- class Exile_Item_FlagStolen7 { quality = 1; price = 35000; sellPrice = 35000; };
- class Exile_Item_FlagStolen8 { quality = 1; price = 40000; sellPrice = 40000; };
- class Exile_Item_FlagStolen9 { quality = 1; price = 45000; sellPrice = 45000; };
- class Exile_Item_FlagStolen10 { quality = 1; price = 50000; sellPrice = 50000; };
+ #include "TRADERS\APEX\ItemListAPEX.hpp"
+ #include "TRADERS\ARMA3V\ItemListARMA3V.hpp"
+ #include "TRADERS\ARMA3W\ItemListARMA3W.hpp"
+ #include "TRADERS\EBM\ItemListEBM.hpp"
+ #include "TRADERS\Exile\ItemListExile.hpp"
+ //#include "TRADERS\PODS\ItemListPODS.hpp"
+ /*#include "TRADERS\CUSTOM\ItemListCUSTOM.hpp"
+ #include "TRADERS\BPOINT\ItemListBPOINT.hpp"
+ #include "TRADERS\CUNITS\ItemListCUNITS.hpp"
+ #include "TRADERS\CUPV\ItemListCUPV.hpp"
+ #include "TRADERS\CUPW\ItemListCUPW.hpp"
+ #include "TRADERS\FFAA\ItemListFFAA.hpp"
+ #include "TRADERS\FHQ\ItemListFHQ.hpp"
+ #include "TRADERS\FMP\ItemListFMP.hpp"
+ #include "TRADERS\FOX\ItemListFOX.hpp"
+ #include "TRADERS\HAP\ItemListHAP.hpp"
+ #include "TRADERS\HVP\ItemListHVP.hpp"
+ #include "TRADERS\HWP\ItemListHWP.hpp"
+ #include "TRADERS\Jonzie\ItemListJonzie.hpp"
+ #include "TRADERS\JETS\ItemListJETS.hpp"
+ #include "TRADERS\KA\ItemListKA.hpp"
+ #include "TRADERS\MASV\ItemListMASV.hpp"
+ #include "TRADERS\MASW\ItemListMASW.hpp"
+ #include "TRADERS\NIA\ItemListNIA.hpp"
+ #include "TRADERS\R3FW\ItemListR3FW.hpp"
+ #include "TRADERS\RHSGREF\ItemListGREF.hpp"
+ #include "TRADERS\RHSSAF\ItemListRHSSAF.hpp"
+ #include "TRADERS\RHSV\ItemListRHSV.hpp"
+ #include "TRADERS\RHSW\ItemListRHSW.hpp"
+ #include "TRADERS\TRYK\ItemListTRYK.hpp"
+ //#include "TRADERS\HLC\ItemListHLC.hpp" //should use NIArms */
};
@@ -2220,12 +714,12 @@ class CfgInteractionMenus
class Actions
{
- class Mount: ExileAbstractAction
+ /*class Mount: ExileAbstractAction
{
title = "Mount";
condition = "(isNull (attachedTo ExileClientInteractionObject)) && ((ExileClientInteractionObject getvariable ['ExileOwnerUID',1]) isEqualTo 1)";
action = "_this call ExileClient_object_supplyBox_mount";
- };
+ };*/
class Install: ExileAbstractAction
{
@@ -2234,12 +728,12 @@ class CfgInteractionMenus
action = "_this call ExileClient_object_supplyBox_install";
};
- class Unmount: ExileAbstractAction
+ /*class Unmount: ExileAbstractAction
{
title = "Unmount";
condition = "!(isNull (attachedTo ExileClientInteractionObject)) && ((ExileClientInteractionObject getvariable ['ExileOwnerUID',1]) isEqualTo 1)";
action = "_this call ExileClient_object_supplyBox_unmount";
- };
+ };*/
};
};
@@ -2557,7 +1051,12 @@ class CfgInteractionModels
"watertank_01_f",
"watertank_02_f",
"watertank_03_f",
- "watertank_04_f"
+ "watertank_04_f",
+
+ //Extended Base Mod
+ "Tank_rust_F",
+ "Sink_F",
+ "Waterpump_01_F"
};
};
@@ -2715,7 +1214,7 @@ class CfgPlayer
// https://community.bistudio.com/wiki/Arma_3_Stamina
// Set to -1 if you want to use Arma 3 default value
// setCustomAimCoef
- customAimCoefficient = 0.5;
+ customAimCoefficient = 0.0;
// 0 or 1
enableFatigue = 0;
@@ -2822,1603 +1321,42 @@ class CfgTerritories
};
class CfgTraderCategories
{
- class Community
- {
- name = "Community Items";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community2
- {
- name = "Community Items 2";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community3
- {
- name = "Community Items 3";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community4
- {
- name = "Community Items 4";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community5
- {
- name = "Community Items 5";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community6
- {
- name = "Community Items 6";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community7
- {
- name = "Community Items 7";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community8
- {
- name = "Community Items 8";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community9
- {
- name = "Community Items 9";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Community10
- {
- name = "Community Items 10";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- // Add your items here <3
- };
- };
-
- class Uniforms
- {
- name = "Uniforms";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\uniform_ca.paa";
- items[] =
- {
- "U_C_Journalist",
- "U_C_Poloshirt_blue",
- "U_C_Poloshirt_burgundy",
- "U_C_Poloshirt_salmon",
- "U_C_Poloshirt_stripped",
- "U_C_Poloshirt_tricolour",
- "U_C_Poor_1",
- "U_C_Poor_2",
- "U_C_Poor_shorts_1",
- "U_C_Scientist",
- "U_OrestesBody",
- "U_Rangemaster",
- "U_NikosAgedBody",
- "U_NikosBody",
- "U_Competitor",
- "U_B_CombatUniform_mcam",
- "U_B_CombatUniform_mcam_tshirt",
- "U_B_CombatUniform_mcam_vest",
- "U_B_CombatUniform_mcam_worn",
- "U_B_CTRG_1",
- "U_B_CTRG_2",
- "U_B_CTRG_3",
- "U_I_CombatUniform",
- "U_I_CombatUniform_shortsleeve",
- "U_I_CombatUniform_tshirt",
- "U_I_OfficerUniform",
- "U_O_CombatUniform_ocamo",
- "U_O_CombatUniform_oucamo",
- "U_O_OfficerUniform_ocamo",
- "U_B_SpecopsUniform_sgg",
- "U_O_SpecopsUniform_blk",
- "U_O_SpecopsUniform_ocamo",
- "U_I_G_Story_Protagonist_F",
- "Exile_Uniform_Woodland",
- "U_C_HunterBody_grn",
- "U_IG_Guerilla1_1",
- "U_IG_Guerilla2_1",
- "U_IG_Guerilla2_2",
- "U_IG_Guerilla2_3",
- "U_IG_Guerilla3_1",
- "U_BG_Guerilla2_1",
- "U_IG_Guerilla3_2",
- "U_BG_Guerrilla_6_1",
- "U_BG_Guerilla1_1",
- "U_BG_Guerilla2_2",
- "U_BG_Guerilla2_3",
- "U_BG_Guerilla3_1",
- "U_BG_leader",
- "U_IG_leader",
- "U_I_G_resistanceLeader_F",
- /*"U_B_FullGhillie_ard",
- "U_B_FullGhillie_lsh",
- "U_B_FullGhillie_sard",
- "U_B_GhillieSuit",
- "U_I_FullGhillie_ard",
- "U_I_FullGhillie_lsh",
- "U_I_FullGhillie_sard",
- "U_I_GhillieSuit",
- "U_O_FullGhillie_ard",
- "U_O_FullGhillie_lsh",
- "U_O_FullGhillie_sard",
- "U_O_GhillieSuit",*/
- "U_I_Wetsuit",
- "U_O_Wetsuit",
- "U_B_Wetsuit",
- "U_B_survival_uniform",
- "U_B_HeliPilotCoveralls",
- "U_I_HeliPilotCoveralls",
- "U_B_PilotCoveralls",
- "U_I_pilotCoveralls",
- "U_O_PilotCoveralls",
- //Apex
- "U_B_T_Soldier_F",
- "U_B_T_Soldier_AR_F",
- "U_B_T_Soldier_SL_F",
- //"U_B_T_Sniper_F",
- //"U_B_T_FullGhillie_tna_F",
- "U_B_CTRG_Soldier_F",
- "U_B_CTRG_Soldier_2_F",
- "U_B_CTRG_Soldier_3_F",
- "U_B_GEN_Soldier_F",
- "U_B_GEN_Commander_F",
- "U_O_T_Soldier_F",
- "U_O_T_Officer_F",
- //"U_O_T_Sniper_F",
- //"U_O_T_FullGhillie_tna_F",
- "U_O_V_Soldier_Viper_F",
- "U_O_V_Soldier_Viper_hex_F",
- "U_I_C_Soldier_Para_1_F",
- "U_I_C_Soldier_Para_2_F",
- "U_I_C_Soldier_Para_3_F",
- "U_I_C_Soldier_Para_4_F",
- "U_I_C_Soldier_Para_5_F",
- "U_I_C_Soldier_Bandit_1_F",
- "U_I_C_Soldier_Bandit_2_F",
- "U_I_C_Soldier_Bandit_3_F",
- "U_I_C_Soldier_Bandit_4_F",
- "U_I_C_Soldier_Bandit_5_F",
- "U_I_C_Soldier_Camo_F",
- "U_C_man_sport_1_F",
- "U_C_man_sport_2_F",
- "U_C_man_sport_3_F",
- "U_C_Man_casual_1_F",
- "U_C_Man_casual_2_F",
- "U_C_Man_casual_3_F",
- "U_C_Man_casual_4_F",
- "U_C_Man_casual_5_F",
- "U_C_Man_casual_6_F",
- "U_B_CTRG_Soldier_urb_1_F",
- "U_B_CTRG_Soldier_urb_2_F",
- "U_B_CTRG_Soldier_urb_3_F"
- };
- };
-
- class Vests
- {
- name = "Vests";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\vest_ca.paa";
- items[] =
- {
- "V_Press_F",
- "V_Rangemaster_belt",
- "V_TacVest_blk",
- "V_TacVest_blk_POLICE",
- "V_TacVest_brn",
- "V_TacVest_camo",
- "V_TacVest_khk",
- "V_TacVest_oli",
- "V_TacVestCamo_khk",
- "V_TacVestIR_blk",
- "V_I_G_resistanceLeader_F",
- "V_BandollierB_blk",
- "V_BandollierB_cbr",
- "V_BandollierB_khk",
- "V_BandollierB_oli",
- "V_BandollierB_rgr",
- "V_Chestrig_blk",
- "V_Chestrig_khk",
- "V_Chestrig_oli",
- "V_Chestrig_rgr",
- "V_HarnessO_brn",
- "V_HarnessO_gry",
- "V_HarnessOGL_brn",
- "V_HarnessOGL_gry",
- "V_HarnessOSpec_brn",
- "V_HarnessOSpec_gry",
- "V_PlateCarrier1_blk",
- "V_PlateCarrier1_rgr",
- "V_PlateCarrier2_rgr",
- "V_PlateCarrier3_rgr",
- "V_PlateCarrierGL_blk",
- "V_PlateCarrierGL_mtp",
- "V_PlateCarrierGL_rgr",
- "V_PlateCarrierH_CTRG",
- "V_PlateCarrierIA1_dgtl",
- "V_PlateCarrierIA2_dgtl",
- "V_PlateCarrierIAGL_dgtl",
- "V_PlateCarrierIAGL_oli",
- "V_PlateCarrierL_CTRG",
- "V_PlateCarrierSpec_blk",
- "V_PlateCarrierSpec_mtp",
- "V_PlateCarrierSpec_rgr",
- //Apex
- "V_TacChestrig_grn_F",
- "V_TacChestrig_oli_F",
- "V_TacChestrig_cbr_F",
- "V_PlateCarrier1_tna_F",
- "V_PlateCarrier2_tna_F",
- "V_PlateCarrierSpec_tna_F",
- "V_PlateCarrierGL_tna_F",
- "V_HarnessO_ghex_F",
- "V_HarnessOGL_ghex_F",
- "V_BandollierB_ghex_F",
- "V_TacVest_gen_F",
- "V_PlateCarrier1_rgr_noflag_F",
- "V_PlateCarrier2_rgr_noflag_F"
- };
- };
-
- class Headgear
- {
- name = "Headgear";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\headgear_ca.paa";
- items[] =
- {
- "Exile_Headgear_SantaHat",
- "Exile_Headgear_SafetyHelmet",
- "H_Cap_blk",
- "H_Cap_blk_Raven",
- "H_Cap_blu",
- "H_Cap_brn_SPECOPS",
- "H_Cap_grn",
- "H_Cap_headphones",
- "H_Cap_khaki_specops_UK",
- "H_Cap_oli",
- "H_Cap_press",
- "H_Cap_red",
- "H_Cap_tan",
- "H_Cap_tan_specops_US",
- "H_Watchcap_blk",
- "H_Watchcap_camo",
- "H_Watchcap_khk",
- "H_Watchcap_sgg",
- "H_MilCap_blue",
- "H_MilCap_dgtl",
- "H_MilCap_mcamo",
- "H_MilCap_ocamo",
- "H_MilCap_oucamo",
- "H_MilCap_rucamo",
- "H_Bandanna_camo",
- "H_Bandanna_cbr",
- "H_Bandanna_gry",
- "H_Bandanna_khk",
- "H_Bandanna_khk_hs",
- "H_Bandanna_mcamo",
- "H_Bandanna_sgg",
- "H_Bandanna_surfer",
- "H_Booniehat_dgtl",
- "H_Booniehat_dirty",
- "H_Booniehat_grn",
- "H_Booniehat_indp",
- "H_Booniehat_khk",
- "H_Booniehat_khk_hs",
- "H_Booniehat_mcamo",
- "H_Booniehat_tan",
- "H_Hat_blue",
- "H_Hat_brown",
- "H_Hat_camo",
- "H_Hat_checker",
- "H_Hat_grey",
- "H_Hat_tan",
- "H_StrawHat",
- "H_StrawHat_dark",
- "H_Beret_02",
- "H_Beret_blk",
- "H_Beret_blk_POLICE",
- "H_Beret_brn_SF",
- "H_Beret_Colonel",
- "H_Beret_grn",
- "H_Beret_grn_SF",
- "H_Beret_ocamo",
- "H_Beret_red",
- "H_Shemag_khk",
- "H_Shemag_olive",
- "H_Shemag_olive_hs",
- "H_Shemag_tan",
- "H_ShemagOpen_khk",
- "H_ShemagOpen_tan",
- "H_TurbanO_blk",
- "H_HelmetB",
- "H_HelmetB_black",
- "H_HelmetB_camo",
- "H_HelmetB_desert",
- "H_HelmetB_grass",
- "H_HelmetB_light",
- "H_HelmetB_light_black",
- "H_HelmetB_light_desert",
- "H_HelmetB_light_grass",
- "H_HelmetB_light_sand",
- "H_HelmetB_light_snakeskin",
- "H_HelmetB_paint",
- "H_HelmetB_plain_blk",
- "H_HelmetB_sand",
- "H_HelmetB_snakeskin",
- "H_HelmetCrew_B",
- "H_HelmetCrew_I",
- "H_HelmetCrew_O",
- "H_HelmetIA",
- "H_HelmetIA_camo",
- "H_HelmetIA_net",
- "H_HelmetLeaderO_ocamo",
- "H_HelmetLeaderO_oucamo",
- "H_HelmetO_ocamo",
- "H_HelmetO_oucamo",
- "H_HelmetSpecB",
- "H_HelmetSpecB_blk",
- "H_HelmetSpecB_paint1",
- "H_HelmetSpecB_paint2",
- "H_HelmetSpecO_blk",
- "H_HelmetSpecO_ocamo",
- "H_CrewHelmetHeli_B",
- "H_CrewHelmetHeli_I",
- "H_CrewHelmetHeli_O",
- "H_HelmetCrew_I",
- "H_HelmetCrew_B",
- "H_HelmetCrew_O",
- "H_PilotHelmetHeli_B",
- "H_PilotHelmetHeli_I",
- "H_PilotHelmetHeli_O",
- //Apex
- "H_Helmet_Skate",
- "H_HelmetB_TI_tna_F",
- //"H_HelmetO_ViperSP_hex_F",
- //"H_HelmetO_ViperSP_ghex_F",
- "H_HelmetB_tna_F",
- "H_HelmetB_Enh_tna_F",
- "H_HelmetB_Light_tna_F",
- "H_HelmetSpecO_ghex_F",
- "H_HelmetLeaderO_ghex_F",
- "H_HelmetO_ghex_F",
- "H_HelmetCrew_O_ghex_F",
- "H_MilCap_tna_F",
- "H_MilCap_ghex_F",
- "H_Booniehat_tna_F",
- "H_Beret_gen_F",
- "H_MilCap_gen_F",
- "H_Cap_oli_Syndikat_F",
- "H_Cap_tan_Syndikat_F",
- "H_Cap_blk_Syndikat_F",
- "H_Cap_grn_Syndikat_F"
- };
- };
-
-class Glasses
- {
- name = "Glasses";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\Goggles_ca.paa";
- items[] =
- {
- "G_Spectacles",
- "G_Spectacles_Tinted",
- "G_Combat",
- "G_Lowprofile",
- "G_Shades_Black",
- "G_Shades_Green",
- "G_Shades_Red",
- "G_Squares",
- "G_Squares_Tinted",
- "G_Sport_BlackWhite",
- "G_Sport_Blackyellow",
- "G_Sport_Greenblack",
- "G_Sport_Checkered",
- "G_Sport_Red",
- "G_Tactical_Black",
- "G_Aviator",
- "G_Lady_Mirror",
- "G_Lady_Dark",
- "G_Lady_Red",
- "G_Lady_Blue",
- "G_Diving",
- "G_B_Diving",
- "G_O_Diving",
- "G_I_Diving",
- "G_Goggles_VR",
- "G_Balaclava_blk",
- "G_Balaclava_oli",
- "G_Balaclava_combat",
- "G_Balaclava_lowprofile",
- "G_Bandanna_blk",
- "G_Bandanna_oli",
- "G_Bandanna_khk",
- "G_Bandanna_tan",
- "G_Bandanna_beast",
- "G_Bandanna_shades",
- "G_Bandanna_sport",
- "G_Bandanna_aviator",
- "G_Shades_Blue",
- "G_Sport_Blackred",
- "G_Tactical_Clear",
- "G_Balaclava_TI_blk_F",
- "G_Balaclava_TI_tna_F",
- "G_Balaclava_TI_G_blk_F",
- "G_Balaclava_TI_G_tna_F",
- "G_Combat_Goggles_tna_F"
- };
- };
-
- class PointerAttachments
- {
- name = "Pointer Attachments";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "acc_flashlight",
- "acc_pointer_IR"
- };
- };
-
- class BipodAttachments
- {
- name = "Bipod Attachments";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itembipod_ca.paa";
- items[] =
- {
- "bipod_01_F_blk",
- "bipod_01_F_mtp",
- "bipod_01_F_snd",
- "bipod_02_F_blk",
- "bipod_02_F_hex",
- "bipod_02_F_tan",
- "bipod_03_F_blk",
- "bipod_03_F_oli",
- //Apex
- "bipod_01_F_khk"
- };
- };
-
- class MuzzleAttachments
- {
- name = "Suppressor Attachments";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemmuzzle_ca.paa";
- items[] =
- {
- "muzzle_snds_338_black",
- "muzzle_snds_338_green",
- "muzzle_snds_338_sand",
- "muzzle_snds_93mmg",
- "muzzle_snds_93mmg_tan",
- "muzzle_snds_acp",
- "muzzle_snds_B",
- "muzzle_snds_H",
- "muzzle_snds_H_MG",
- "muzzle_snds_H_SW",
- "muzzle_snds_L",
- "muzzle_snds_M",
- //Apex
- "muzzle_snds_H_khk_F",
- "muzzle_snds_H_snd_F",
- "muzzle_snds_58_blk_F",
- "muzzle_snds_m_khk_F",
- "muzzle_snds_m_snd_F",
- "muzzle_snds_B_khk_F",
- "muzzle_snds_B_snd_F",
- "muzzle_snds_58_wdm_F",
- "muzzle_snds_65_TI_blk_F",
- "muzzle_snds_65_TI_hex_F",
- "muzzle_snds_65_TI_ghex_F",
- "muzzle_snds_H_MG_blk_F",
- "muzzle_snds_H_MG_khk_F"
- };
- };
-
- class UAVs
- {
- name = "Unmanned Aerial Vehicles";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\gps_ca.paa";
- items[] =
- {
- "I_UavTerminal",
- "I_UAV_01_backpack_F"
- };
- };
-
- class StaticMGs
- {
- name = "Static Machine Guns";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "O_HMG_01_support_F",
- //"O_HMG_01_support_high_F", // Does not seem to work with HMG01, only the lower version does
- "O_HMG_01_weapon_F"
- };
- };
-
- class OpticAttachments
- {
- name = "Scopes";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemoptic_ca.paa";
- items[] =
- {
- "optic_Aco",
- "optic_ACO_grn",
- "optic_ACO_grn_smg",
- "optic_Aco_smg",
- "optic_AMS",
- "optic_AMS_khk",
- "optic_AMS_snd",
- "optic_Arco",
- "optic_DMS",
- "optic_Hamr",
- "optic_Holosight",
- "optic_Holosight_smg",
- "optic_KHS_blk",
- "optic_KHS_hex",
- "optic_KHS_old",
- "optic_KHS_tan",
- "optic_LRPS",
- "optic_MRCO",
- "optic_MRD",
- "optic_Nightstalker",
- "optic_NVS",
- "optic_SOS",
- //"optic_tws",
- //"optic_tws_mg",
- "optic_Yorris",
- //Apex
- "optic_Arco_blk_F",
- "optic_Arco_ghex_F",
- "optic_DMS_ghex_F",
- "optic_Hamr_khk_F",
- "optic_ERCO_blk_F",
- "optic_ERCO_khk_F",
- "optic_ERCO_snd_F",
- "optic_SOS_khk_F",
- "optic_LRPS_tna_F",
- "optic_LRPS_ghex_F",
- "optic_Holosight_blk_F",
- "optic_Holosight_khk_F",
- "optic_Holosight_smg_blk_F"
- };
- };
-
- class Hardware
- {
- name = "Hardware";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
-
- "Exile_Item_DuctTape",
- "Exile_Item_ExtensionCord",
- "Exile_Item_FuelCanisterEmpty",
- "Exile_Item_JunkMetal",
- "Exile_Item_LightBulb",
- "Exile_Item_MetalBoard",
- "Exile_Item_MetalPole",
- "Exile_Item_SafeKit",
- "Exile_Item_CamoTentKit",
- "Exile_Item_CodeLock"
-
- /*
- --Not for Sale--
- "Exile_Item_MetalScrews",
- "Exile_Item_MetalWire",
- "Exile_Item_Laptop",
- "Exile_Item_BaseCameraKit",
- "Exile_Item_MetalHedgehogKit",
- "Exile_Item_Cement",
- "Exile_Item_Sand",
- "Exile_Item_MobilePhone",
- --Unused--
- "Exile_Item_CordlessScrewdriver",
- "Exile_Item_FireExtinguisher",
- "Exile_Item_OilCanister",
- "Exile_Item_Hammer",
- "Exile_Item_Carwheel",
- "Exile_Item_SleepingMat",
- "Exile_Item_Defibrillator",
- "Exile_Item_Wrench",
- "Exile_Item_Rope"
- */
- };
- };
-
- class Food
- {
- name = "Fast Food";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Item_EMRE",
- "Exile_Item_GloriousKnakworst",
- "Exile_Item_Surstromming",
- "Exile_Item_SausageGravy",
- "Exile_Item_Catfood",
- "Exile_Item_ChristmasTinner",
- "Exile_Item_BBQSandwich",
- "Exile_Item_MacasCheese",
- "Exile_Item_Dogfood",
- "Exile_Item_BeefParts",
- "Exile_Item_Cheathas",
- "Exile_Item_Noodles",
- "Exile_Item_SeedAstics",
- "Exile_Item_Raisins",
- "Exile_Item_Moobar",
- "Exile_Item_InstantCoffee"
- };
- };
-
- class Drinks
- {
- name = "Drinks";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Item_PlasticBottleCoffee",
- "Exile_Item_PowerDrink",
- "Exile_Item_PlasticBottleFreshWater",
- "Exile_Item_Beer",
- "Exile_Item_EnergyDrink",
- "Exile_Item_ChocolateMilk",
- "Exile_Item_MountainDupe",
- "Exile_Item_PlasticBottleEmpty"
- };
- };
-
- class Tools
- {
- name = "Tools";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Item_Matches",
- "Exile_Item_CookingPot",
- "Exile_Item_CanOpener",
- "Exile_Item_Handsaw",
- "Exile_Item_Pliers",
- "Exile_Item_Grinder",
- "Exile_Item_Foolbox",
-
- /*
- "Exile_Item_CordlessScrewdriver",
- "Exile_Item_FireExtinguisher",
- "Exile_Item_Hammer",
- "Exile_Item_OilCanister",
- "Exile_Item_Screwdriver",
- "Exile_Item_Shovel",
- "Exile_Item_Wrench",
- "Exile_Item_SleepingMat",
- "Exile_Item_ToiletPaper",
- "Exile_Item_ZipTie",
- */
-
- "Binocular",
- "Rangefinder",
- /*
- "Laserdesignator",
- "Laserdesignator_02",
- "Laserdesignator_03",
- */
- "NVGoggles",
- "NVGoggles_INDEP",
- "NVGoggles_OPFOR",
- "ItemGPS",
- "ItemMap",
- "ItemCompass",
- "ItemRadio",
- "ItemWatch",
- "Exile_Item_XM8",
-
- //Apex
- "O_NVGoggles_hex_F",
- "O_NVGoggles_urb_F",
- "O_NVGoggles_ghex_F",
- "NVGoggles_tna_F"
- };
- };
-
- class FirstAid
- {
- name = "FirstAid";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Item_InstaDoc",
- "Exile_Item_Bandage",
- "Exile_Item_Vishpirin",
- "Exile_Item_Heatpack"
-
- // Not available in 0.9.4!
- //"Exile_Item_Defibrillator"
- };
- };
-
- class Navigation
- {
- name = "Special Environment";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "B_Parachute",
- "V_RebreatherB",
- "V_RebreatherIA",
- "V_RebreatherIR",
- "Exile_Headgear_GasMask",
- "G_Diving",
- "G_B_Diving",
- "G_O_Diving",
- "G_I_Diving"
- };
- };
-
- class Backpacks
- {
- name = "Backpacks";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\backpack_ca.paa";
- items[] =
- {
- "B_AssaultPack_blk",
- "B_AssaultPack_cbr",
- "B_AssaultPack_dgtl",
- "B_AssaultPack_khk",
- "B_AssaultPack_mcamo",
- "B_AssaultPack_rgr",
- "B_AssaultPack_sgg",
- "B_Bergen_blk",
- "B_Bergen_mcamo",
- "B_Bergen_rgr",
- "B_Bergen_sgg",
- "B_Carryall_cbr",
- "B_Carryall_khk",
- "B_Carryall_mcamo",
- "B_Carryall_ocamo",
- "B_Carryall_oli",
- "B_Carryall_oucamo",
- "B_FieldPack_blk",
- "B_FieldPack_cbr",
- "B_FieldPack_ocamo",
- "B_FieldPack_oucamo",
- "B_HuntingBackpack",
- "B_Kitbag_cbr",
- "B_Kitbag_mcamo",
- "B_Kitbag_sgg",
- "B_OutdoorPack_blk",
- "B_OutdoorPack_blu",
- "B_OutdoorPack_tan",
- "B_TacticalPack_blk",
- "B_TacticalPack_mcamo",
- "B_TacticalPack_ocamo",
- "B_TacticalPack_oli",
- "B_TacticalPack_rgr",
- //Apex
- "B_Bergen_mcamo_F",
- "B_Bergen_dgtl_F",
- "B_Bergen_hex_F",
- "B_Bergen_tna_F",
- "B_AssaultPack_tna_F",
- "B_Carryall_ghex_F",
- "B_FieldPack_ghex_F",
- "B_ViperHarness_blk_F",
- "B_ViperHarness_ghex_F",
- "B_ViperHarness_hex_F",
- "B_ViperHarness_khk_F",
- "B_ViperHarness_oli_F",
- "B_ViperLightHarness_blk_F",
- "B_ViperLightHarness_ghex_F",
- "B_ViperLightHarness_hex_F",
- "B_ViperLightHarness_khk_F",
- "B_ViperLightHarness_oli_F"
- };
- };
-
- class Ammunition
- {
- name = "Ammunition";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\CargoMag_ca.paa";
- items[] =
- {
- "100Rnd_65x39_caseless_mag",
- "100Rnd_65x39_caseless_mag_Tracer",
- "10Rnd_127x54_Mag",
- "10Rnd_338_Mag",
- "10Rnd_762x54_Mag",
- "10Rnd_93x64_DMR_05_Mag",
- "11Rnd_45ACP_Mag",
- //"130Rnd_338_Mag", SPMG
- "150Rnd_762x54_Box",
- "150Rnd_762x54_Box_Tracer",
- //"150Rnd_93x64_Mag", // NAVID
- "16Rnd_9x21_Mag",
- "200Rnd_65x39_cased_Box",
- "200Rnd_65x39_cased_Box_Tracer",
- "20Rnd_556x45_UW_mag",
- "20Rnd_762x51_Mag",
- "30Rnd_45ACP_Mag_SMG_01",
- "30Rnd_45ACP_Mag_SMG_01_tracer_green",
- "30Rnd_45ACP_Mag_SMG_01_Tracer_Red",
- "30Rnd_45ACP_Mag_SMG_01_Tracer_Yellow",
- "30Rnd_556x45_Stanag",
- "30Rnd_556x45_Stanag_Tracer_Green",
- "30Rnd_556x45_Stanag_Tracer_Red",
- "30Rnd_556x45_Stanag_Tracer_Yellow",
- "30Rnd_65x39_caseless_green",
- "30Rnd_65x39_caseless_green_mag_Tracer",
- "30Rnd_65x39_caseless_mag",
- "30Rnd_65x39_caseless_mag_Tracer",
- "30Rnd_9x21_Mag",
- "30Rnd_9x21_Yellow_Mag",
- "30Rnd_9x21_Green_Mag",
- "30Rnd_9x21_Red_Mag",
- "5Rnd_127x108_APDS_Mag",
- "5Rnd_127x108_Mag",
- "6Rnd_45ACP_Cylinder",
- "6Rnd_GreenSignal_F",
- "6Rnd_RedSignal_F",
- "7Rnd_408_Mag",
- "9Rnd_45ACP_Mag",
- "Exile_Magazine_30Rnd_762x39_AK",
- "Exile_Magazine_30Rnd_545x39_AK_Green",
- "Exile_Magazine_30Rnd_545x39_AK_Red",
- "Exile_Magazine_30Rnd_545x39_AK_White",
- "Exile_Magazine_30Rnd_545x39_AK_Yellow",
- "Exile_Magazine_45Rnd_545x39_RPK_Green",
- "Exile_Magazine_75Rnd_545x39_RPK_Green",
- "Exile_Magazine_20Rnd_762x51_DMR",
- "Exile_Magazine_20Rnd_762x51_DMR_Yellow",
- "Exile_Magazine_20Rnd_762x51_DMR_Red",
- "Exile_Magazine_20Rnd_762x51_DMR_Green",
- "Exile_Magazine_10Rnd_303",
- "Exile_Magazine_100Rnd_762x54_PK_Green",
- "Exile_Magazine_7Rnd_45ACP",
- "Exile_Magazine_8Rnd_9x18",
- "Exile_Magazine_30Rnd_545x39_AK",
- "Exile_Magazine_6Rnd_45ACP",
- "Exile_Magazine_5Rnd_22LR",
- "Exile_Magazine_10Rnd_762x54",
- "Exile_Magazine_10Rnd_9x39",
- "Exile_Magazine_20Rnd_9x39",
- //"Exile_Magazine_8Rnd_74Pellets",
- "Exile_Magazine_8Rnd_74Slug",
- //Apex
- "30Rnd_9x21_Mag_SMG_02",
- "30Rnd_9x21_Mag_SMG_02_Tracer_Red",
- "30Rnd_9x21_Mag_SMG_02_Tracer_Yellow",
- "30Rnd_9x21_Mag_SMG_02_Tracer_Green",
- "30Rnd_580x42_Mag_F",
- "30Rnd_580x42_Mag_Tracer_F",
- "100Rnd_580x42_Mag_F",
- "100Rnd_580x42_Mag_Tracer_F",
- "20Rnd_650x39_Cased_Mag_F",
- "10Rnd_50BW_Mag_F",
- "150Rnd_556x45_Drum_Mag_F",
- "150Rnd_556x45_Drum_Mag_Tracer_F",
- "30Rnd_762x39_Mag_F",
- "30Rnd_762x39_Mag_Green_F",
- "30Rnd_762x39_Mag_Tracer_F",
- "30Rnd_762x39_Mag_Tracer_Green_F",
- "30Rnd_545x39_Mag_F",
- "30Rnd_545x39_Mag_Green_F",
- "30Rnd_545x39_Mag_Tracer_F",
- "30Rnd_545x39_Mag_Tracer_Green_F",
- "200Rnd_556x45_Box_F",
- "200Rnd_556x45_Box_Red_F",
- "200Rnd_556x45_Box_Tracer_F",
- "200Rnd_556x45_Box_Tracer_Red_F",
- "10Rnd_9x21_Mag",
- "Exile_Magazine_5Rnd_127x108_Bullet_Cam_Mag",
- "Exile_Magazine_10Rnd_93x64_DMR_05_Bullet_Cam_Mag",
- "Exile_Magazine_7Rnd_408_Bullet_Cam_Mag",
- "Exile_Magazine_10Rnd_338_Bullet_Cam_Mag"
- };
- };
-
- class Flares
- {
- name = "Flares";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Chemlight_blue",
- "Chemlight_green",
- "Chemlight_red",
- "FlareGreen_F",
- "FlareRed_F",
- "FlareWhite_F",
- "FlareYellow_F",
- "UGL_FlareGreen_F",
- "UGL_FlareRed_F",
- "UGL_FlareWhite_F",
- "UGL_FlareYellow_F",
- "3Rnd_UGL_FlareGreen_F",
- "3Rnd_UGL_FlareRed_F",
- "3Rnd_UGL_FlareWhite_F",
- "3Rnd_UGL_FlareYellow_F"
- };
- };
-
- class Smokes
- {
- name = "Smokes";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "SmokeShell",
- "SmokeShellBlue",
- "SmokeShellGreen",
- "SmokeShellOrange",
- "SmokeShellPurple",
- "SmokeShellRed",
- "SmokeShellYellow",
- "1Rnd_Smoke_Grenade_shell",
- "1Rnd_SmokeBlue_Grenade_shell",
- "1Rnd_SmokeGreen_Grenade_shell",
- "1Rnd_SmokeOrange_Grenade_shell",
- "1Rnd_SmokePurple_Grenade_shell",
- "1Rnd_SmokeRed_Grenade_shell",
- "1Rnd_SmokeYellow_Grenade_shell",
- "3Rnd_Smoke_Grenade_shell",
- "3Rnd_SmokeBlue_Grenade_shell",
- "3Rnd_SmokeGreen_Grenade_shell",
- "3Rnd_SmokeOrange_Grenade_shell",
- "3Rnd_SmokePurple_Grenade_shell",
- "3Rnd_SmokeRed_Grenade_shell",
- "3Rnd_SmokeYellow_Grenade_shell"
- };
- };
-
- class Explosives
- {
- name = "Explosives";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\cargothrow_ca.paa";
- items[] =
- {
- "HandGrenade",
- "MiniGrenade",
- "B_IR_Grenade",
- "O_IR_Grenade",
- "I_IR_Grenade",
- "1Rnd_HE_Grenade_shell",
- "3Rnd_HE_Grenade_shell",
- "APERSBoundingMine_Range_Mag",
- "APERSMine_Range_Mag",
- "APERSTripMine_Wire_Mag",
- "ClaymoreDirectionalMine_Remote_Mag",
- "DemoCharge_Remote_Mag",
- "IEDLandBig_Remote_Mag",
- "IEDLandSmall_Remote_Mag",
- "IEDUrbanBig_Remote_Mag",
- "IEDUrbanSmall_Remote_Mag",
- "SatchelCharge_Remote_Mag",
- "SLAMDirectionalMine_Wire_Mag"
- };
- };
-
- class Pistols
- {
- name = "Pistols";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\handgun_ca.paa";
- items[] =
- {
- "hgun_ACPC2_F",
- "hgun_P07_F",
- "hgun_Pistol_heavy_01_F",
- "hgun_Pistol_heavy_02_F",
- "hgun_Pistol_Signal_F",
- "hgun_Rook40_F",
- "Exile_Weapon_Colt1911",
- "Exile_Weapon_Makarov",
- "Exile_Weapon_Taurus",
- "Exile_Weapon_TaurusGold",
- //Apex
- "hgun_Pistol_01_F",
- "hgun_P07_khk_F"
- };
- };
-
- class SubMachineGuns
- {
- name = "Sub Machine Guns";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "hgun_PDW2000_F",
- "SMG_01_F",
- "SMG_02_F",
- "SMG_05_F"
- };
- };
-
- class LightMachineGuns
- {
- name = "Light Machine Guns";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "arifle_MX_SW_Black_F",
- "arifle_MX_SW_F",
- "LMG_Mk200_F",
- "LMG_Zafir_F",
- "LMG_03_F",
- "Exile_Weapon_RPK",
- "Exile_Weapon_PK",
- "Exile_Weapon_PKP"
-
- /*
- "MMG_01_hex_F",
- "MMG_01_tan_F",
- "MMG_02_black_F",
- "MMG_02_camo_F",
- "MMG_02_sand_F"
- */
- };
- };
-
- class AssaultRifles
- {
- name = "Assault Rifles";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "arifle_Katiba_C_F",
- "arifle_Katiba_F",
- "arifle_Katiba_GL_F",
- "arifle_Mk20_F",
- "arifle_Mk20_GL_F",
- "arifle_Mk20_GL_plain_F",
- "arifle_Mk20_plain_F",
- "arifle_Mk20C_F",
- "arifle_Mk20C_plain_F",
- "arifle_MX_Black_F",
- "arifle_MX_F",
- "arifle_MX_GL_Black_F",
- "arifle_MX_GL_F",
- "arifle_MXC_Black_F",
- "arifle_MXC_F",
- "arifle_SDAR_F",
- "arifle_TRG20_F",
- "arifle_TRG21_F",
- "arifle_TRG21_GL_F",
- "Exile_Weapon_AK107",
- "Exile_Weapon_AK107_GL",
- "Exile_Weapon_AK74",
- "Exile_Weapon_AK74_GL",
- "Exile_Weapon_AK47",
- "Exile_Weapon_AKS_Gold",
- //Apex
- "arifle_AK12_F",
- "arifle_AK12_GL_F",
- "arifle_AKM_F",
- "arifle_AKM_FL_F",
- "arifle_AKS_F",
- "arifle_ARX_blk_F",
- "arifle_ARX_ghex_F",
- "arifle_ARX_hex_F",
- "arifle_CTAR_blk_F",
- "arifle_CTAR_hex_F",
- "arifle_CTAR_ghex_F",
- "arifle_CTAR_GL_blk_F",
- "arifle_CTARS_blk_F",
- "arifle_CTARS_hex_F",
- "arifle_CTARS_ghex_F",
- "arifle_SPAR_01_blk_F",
- "arifle_SPAR_01_khk_F",
- "arifle_SPAR_01_snd_F",
- "arifle_SPAR_01_GL_blk_F",
- "arifle_SPAR_01_GL_khk_F",
- "arifle_SPAR_01_GL_snd_F",
- "arifle_SPAR_02_blk_F",
- "arifle_SPAR_02_khk_F",
- "arifle_SPAR_02_snd_F",
- "arifle_SPAR_03_blk_F",
- "arifle_SPAR_03_khk_F",
- "arifle_SPAR_03_snd_F",
- "arifle_MX_khk_F",
- "arifle_MX_GL_khk_F",
- "arifle_MXC_khk_F",
- "arifle_MXM_khk_F"
- };
- };
-
- class Shotguns
- {
- name = "Shotguns";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Weapon_M1014"
- };
- };
-
- class SniperRifles
- {
- name = "Sniper Rifles";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "arifle_MXM_Black_F",
- "arifle_MXM_F",
- "srifle_DMR_01_F",
- "srifle_DMR_02_camo_F",
- "srifle_DMR_02_F",
- "srifle_DMR_02_sniper_F",
- "srifle_DMR_03_F",
- "srifle_DMR_03_khaki_F",
- "srifle_DMR_03_multicam_F",
- "srifle_DMR_03_tan_F",
- "srifle_DMR_03_woodland_F",
- "srifle_DMR_04_F",
- "srifle_DMR_04_Tan_F",
- "srifle_DMR_05_blk_F",
- "srifle_DMR_05_hex_F",
- "srifle_DMR_05_tan_f",
- "srifle_DMR_06_camo_F",
- "srifle_DMR_06_olive_F",
- "srifle_EBR_F",
- "srifle_GM6_camo_F",
- "srifle_GM6_F",
- "srifle_LRR_camo_F",
- "srifle_LRR_F",
- "Exile_Weapon_CZ550",
- "Exile_Weapon_SVD",
- "Exile_Weapon_SVDCamo",
- "Exile_Weapon_VSSVintorez",
- "Exile_Weapon_DMR",
- "Exile_Weapon_LeeEnfield",
- //Apex
- "srifle_LRR_tna_F",
- "srifle_GM6_ghex_F",
- "srifle_DMR_07_blk_F",
- "srifle_DMR_07_hex_F",
- "srifle_DMR_07_ghex_F"
- };
- };
-
- class Bikes
- {
- name = "Bikes";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Bike_OldBike",
- "Exile_Bike_MountainBike"
- };
- };
-
- class Cars
- {
- name = "Cars";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Car_Kart_Black",
- "Exile_Bike_QuadBike_Black",
- "Exile_Car_OldTractor_Red",
- "Exile_Car_TowTractor_White",
- "Exile_Car_Tractor_Red",
- "Exile_Car_UAZ_Green",
- "Exile_Car_UAZ_Open_Green",
- "Exile_Car_Octavius_White",
- "Exile_Car_Golf_Red",
- "Exile_Car_LandRover_Green",
- "Exile_Car_LandRover_Ambulance_Green",
- "Exile_Car_Lada_Green",
- "Exile_Car_Volha_White",
- "Exile_Car_Hatchback_Rusty1",
- "Exile_Car_Hatchback_Rusty2",
- "Exile_Car_Hatchback_Rusty3",
- "Exile_Car_Hatchback_Sport_Red",
- "Exile_Car_SUV_Red",
- "Exile_Car_SUVXL_Black",
- "Exile_Car_SUV_Armed_Black",
- "Exile_Car_Offroad_Rusty1",
- "Exile_Car_Offroad_Rusty2",
- "Exile_Car_Offroad_Rusty3",
- "Exile_Car_Offroad_Repair_Civillian",
- "Exile_Car_Offroad_Armed_Guerilla01",
- "Exile_Car_BRDM2_HQ",
- "Exile_Car_BTR40_MG_Green",
- "Exile_Car_BTR40_Green",
- "Exile_Car_HMMWV_M134_Green",
- "Exile_Car_HMMWV_M2_Green",
- "Exile_Car_HMMWV_MEV_Green",
- "Exile_Car_HMMWV_UNA_Green",
- "Exile_Car_Strider",
- "Exile_Car_Hunter",
- "Exile_Car_Ifrit",
- "Exile_Car_ProwlerLight",
- "Exile_Car_ProwlerUnarmed",
- "Exile_Car_QilinUnarmed",
- "Exile_Car_MB4WD",
- "Exile_Car_MB4WDOpen"
- };
- };
-
- class Trucks
- {
- name = "Trucks";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Car_Van_Black",
- "Exile_Car_Van_Box_Black",
- "Exile_Car_Van_Fuel_Black",
- "Exile_Car_Ural_Open_Worker",
- "Exile_Car_Ural_Covered_Worker",
- "Exile_Car_V3S_Covered",
- "Exile_Car_Zamak",
- "Exile_Car_Tempest",
- "Exile_Car_HEMMT",
- "Exile_Car_Ikarus_Blue"
- };
- };
-
- class Choppers
- {
- name = "Helicopters";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Chopper_Hummingbird_Green",
- "Exile_Chopper_Hummingbird_Civillian_Wasp",
- "Exile_Chopper_Huey_Green",
- "Exile_Chopper_Huey_Armed_Green",
- "Exile_Chopper_Taru_Black",
- "Exile_Chopper_Taru_Covered_Black",
- "Exile_Chopper_Taru_Transport_Black",
- "Exile_Chopper_Orca_BlackCustom",
- "Exile_Chopper_Mohawk_FIA",
- "Exile_Chopper_Huron_Black",
- "Exile_Chopper_Hellcat_Green"
- };
- };
-
- class Boats
- {
- name = "Boats";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Boat_RubberDuck_CSAT",
- "Exile_Boat_RubberDuck_Digital",
- "Exile_Boat_RubberDuck_Orange",
- "Exile_Boat_RubberDuck_Blue",
- "Exile_Boat_RubberDuck_Black",
- "Exile_Boat_MotorBoat_Police",
- "Exile_Boat_MotorBoat_Orange",
- "Exile_Boat_MotorBoat_White",
- "Exile_Boat_SDV_CSAT",
- "Exile_Boat_SDV_Digital",
- "Exile_Boat_SDV_Grey",
- "Exile_Boat_WaterScooter",
- "Exile_Boat_RHIB"
- };
- };
-
- class Planes
- {
- name = "Planes";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "Exile_Plane_Cessna",
- "Exile_Plane_AN2_Green",
- "Exile_Plane_Ceasar",
- "Exile_Plane_BlackfishInfantry",
- "Exile_Plane_BlackfishVehicle"
- };
- };
-
- class Diving
- {
- name = "Diving";
- icon = "a3\ui_f\data\gui\Rsc\RscDisplayArsenal\itemacc_ca.paa";
- items[] =
- {
- "G_B_Diving",
- "G_O_Diving",
- "G_I_Diving",
- "V_RebreatherB",
- "V_RebreatherIA",
- "V_RebreatherIR",
- "U_I_Wetsuit",
- "U_O_Wetsuit",
- "U_B_Wetsuit"
- };
- };
+ #include "TRADERS\APEX\TraderCategoriesAPEX.hpp"
+ #include "TRADERS\ARMA3V\TraderCategoriesARMA3V.hpp"
+ #include "TRADERS\ARMA3W\TraderCategoriesARMA3W.hpp"
+ #include "TRADERS\EBM\TraderCategoriesEBM.hpp"
+ #include "TRADERS\Exile\TraderCategoriesExile.hpp"
+ /*#include "TRADERS\PODS\TraderCategoriesPODS.hpp"
+ #include "TRADERS\CUSTOM\TraderCategoriesCUSTOM.hpp"
+ #include "TRADERS\BPOINT\TraderCategoriesBPOINT.hpp"
+ #include "TRADERS\CUNITS\TraderCategoriesCUNITS.hpp"
+ #include "TRADERS\CUPV\TraderCategoriesCUPV.hpp"
+ #include "TRADERS\CUPW\TraderCategoriesCUPW.hpp"
+ #include "TRADERS\FFAA\TraderCategoriesFFAA.hpp"
+ #include "TRADERS\FHQ\TraderCategoriesFHQ.hpp"
+ #include "TRADERS\FMP\TraderCategoriesFMP.hpp"
+ #include "TRADERS\FOX\TraderCategoriesFOX.hpp"
+ #include "TRADERS\HAP\TraderCategoriesHAP.hpp"
+ #include "TRADERS\HVP\TraderCategoriesHVP.hpp"
+ #include "TRADERS\HWP\TraderCategoriesHWP.hpp"
+ #include "TRADERS\Jonzie\TraderCategoriesJonzie.hpp"
+ #include "TRADERS\JETS\TraderCategoriesJETS.hpp"
+ #include "TRADERS\KA\TraderCategoriesKA.hpp"
+ #include "TRADERS\MASV\TraderCategoriesMASV.hpp"
+ #include "TRADERS\MASW\TraderCategoriesMASW.hpp"
+ #include "TRADERS\NIA\TraderCategoriesNIA.hpp"
+ #include "TRADERS\R3FW\TraderCategoriesR3FW.hpp"
+ #include "TRADERS\RHSGREF\TraderCategoriesGREF.hpp"
+ #include "TRADERS\RHSSAF\TraderCategoriesRHSSAF.hpp"
+ #include "TRADERS\RHSV\TraderCategoriesRHSV.hpp"
+ #include "TRADERS\RHSW\TraderCategoriesRHSW.hpp"
+ #include "TRADERS\TRYK\TraderCategoriesTRYK.hpp"
+ //#include "TRADERS\HLC\TraderCategoriesHLC.hpp" //should use NIArms */
};
class CfgTraders
{
- /**
- * Weapons, scopes, silencers, ammo
- */
- class Exile_Trader_Armory
- {
- name = "ARMORY";
- showWeaponFilter = 1;
- categories[] =
- {
- "PointerAttachments",
- "BipodAttachments",
- "MuzzleAttachments",
- "OpticAttachments",
- "Ammunition",
- "Pistols",
- "Shotguns",
- "SubMachineGuns",
- "LightMachineGuns",
- "AssaultRifles",
- "SniperRifles"
- };
- };
-
- /**
- * Satchels, nades, UAVs, static MGs
- */
- class Exile_Trader_SpecialOperations
- {
- name = "SPECIAL OPERATIONS";
- showWeaponFilter = 1; // for noob tubes
- categories[] =
- {
- "Flares",
- "Smokes",
- "UAVs",
- "StaticMGs",
- "Explosives",
- "Navigation"
- };
- };
-
- /**
- * Uniforms, vests, helmets, backpacks
- */
- class Exile_Trader_Equipment
- {
- name = "EQUIPMENT";
- showWeaponFilter = 0;
- categories[] =
- {
- "Headgear",
- "Glasses",
- "Uniforms",
- "Vests",
- "Backpacks",
- "FirstAid"
- };
- };
-
- /**
- * Cans, cans, cans
- */
- class Exile_Trader_Food
- {
- name = "FAST FOOD";
- showWeaponFilter = 0;
- categories[] =
- {
- "Food",
- "Drinks"
- };
- };
-
- /**
- * Light bulbs, metal, etc.
- */
- class Exile_Trader_Hardware
- {
- name = "HARDWARE";
- showWeaponFilter = 0;
- categories[] =
- {
- "Hardware",
- "Tools"
- };
- };
-
- /**
- * Sells cars and general vehicles
- */
- class Exile_Trader_Vehicle
- {
- name = "VEHICLE";
- showWeaponFilter = 0;
- categories[] =
- {
- "Cars",
- "Trucks"
- };
- };
-
- /**
- * Sells choppers and planes
- */
- class Exile_Trader_Aircraft
- {
- name = "AIRCRAFT";
- showWeaponFilter = 0;
- categories[] =
- {
- "Choppers",
- "Planes"
- };
- };
-
- /**
- * Sells ships and boats
- */
- class Exile_Trader_Boat
- {
- name = "BOAT";
- showWeaponFilter = 0;
- categories[] =
- {
- "Boats"
- };
- };
-
- class Exile_Trader_Diving
- {
- name = "DIVERS";
- showWeaponFilter = 0;
- categories[] =
- {
- "Diving"
- };
- };
-
- /**
- * Sells Community Items
- */
- class Exile_Trader_CommunityCustoms
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community"
- };
- };
-
- class Exile_Trader_CommunityCustoms2
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community2"
- };
- };
-
- class Exile_Trader_CommunityCustoms3
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community3"
- };
- };
-
- class Exile_Trader_CommunityCustoms4
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community4"
- };
- };
-
- class Exile_Trader_CommunityCustoms5
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community5"
- };
- };
-
- class Exile_Trader_CommunityCustoms6
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community6"
- };
- };
-
- class Exile_Trader_CommunityCustoms7
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community7"
- };
- };
-
- class Exile_Trader_CommunityCustoms8
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community8"
- };
- };
-
- class Exile_Trader_CommunityCustoms9
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community9"
- };
- };
-
- class Exile_Trader_CommunityCustoms10
- {
- name = "COMMUNITY";
- showWeaponFilter = 0;
- categories[] =
- {
- "Community10"
- };
- };
+ #include "TRADERS\CfgTraders.hpp"
};
class CfgTrading
{
@@ -5330,7 +2268,7 @@ class CfgXM8
bambiState = 0; //Set to 1 to only allow players to deploy as a bambi.
blockInSafezone = 0; //Set to 1 to prevent players deploying said vehicle inside of safezones.
vehicleClass = "Exile_Bike_MountainBike";
- recipe[] = {{"Exile_Item_ExtensionCord",-1}};
+ recipe[] = {};
packable = 1;
autoCleanUp = 1;
quickFunction = "['ExAd_Bike'] call ExAd_XM8_DV_fnc_spawnVehicle";
diff --git a/mpmissions/Exile.Altis/description.ext b/mpmissions/Exile.Altis/description.ext
index 84a4807..a0c87b0 100644
--- a/mpmissions/Exile.Altis/description.ext
+++ b/mpmissions/Exile.Altis/description.ext
@@ -64,7 +64,7 @@ showHUD[] =
false, // Commanding menu
false, // Group Bar
true, // HUD Weapon Cursors
- false // Squad Radar
+ true // Squad Radar
};
#include "config.cpp"
@@ -79,7 +79,7 @@ showHUD[] =
#include "ExAdClient\ExAd.cpp"
//R3F Logistics
-//#include "R3F_LOG\desc_include.h"
+#include "R3F_LOG\desc_include.h"
class CfgFunctions
{
diff --git a/mpmissions/Exile.Altis/init.sqf b/mpmissions/Exile.Altis/init.sqf
index 94a703a..df2899e 100644
--- a/mpmissions/Exile.Altis/init.sqf
+++ b/mpmissions/Exile.Altis/init.sqf
@@ -1,3 +1,9 @@
//A3XAI Client
-#include "A3XAI_Client\A3XAI_initclient.sqf";
\ No newline at end of file
+#include "A3XAI_Client\A3XAI_initclient.sqf";
+
+//R3F Logistics
+[] execVM "R3F_LOG\init.sqf";
+
+//igiload
+[] execVM "IgiLoad\IgiLoadInit.sqf";
\ No newline at end of file