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